From 26ddf79a27c277525ef9debc891f926b0dc99534 Mon Sep 17 00:00:00 2001 From: "th.l" <thl-cmk@outlook.com> Date: Mon, 22 May 2023 22:01:51 +0200 Subject: [PATCH] update project --- agent_based/squid.py | 6 +++--- agents/bakery/squid.py | 2 -- agents/plugins/squid | 9 +++++---- gui/metrics/squid.py | 5 ++--- gui/wato/squid.py | 29 ----------------------------- packages/squid | 2 +- squid-2.0.3-2023-05-22.mkp | Bin 0 -> 4518 bytes squid.mkp | Bin 4686 -> 4518 bytes 8 files changed, 11 insertions(+), 42 deletions(-) create mode 100644 squid-2.0.3-2023-05-22.mkp diff --git a/agent_based/squid.py b/agent_based/squid.py index 2bf9847..2fdd9c3 100644 --- a/agent_based/squid.py +++ b/agent_based/squid.py @@ -56,14 +56,14 @@ def parse_squid(string_table) -> Dict[str, float]: except ValueError: continue if 'kbytes' in entry: - value = value * 1024 + 8 # change kbytes to bits + value = value * 1024 + 8 # change kbytes to bits section[entry] = value return section register.agent_section( - name="squid", + name='squid', parse_function=parse_squid, ) @@ -164,7 +164,7 @@ def check_squid(item, params, section: Dict[str, float]) -> CheckResult: for value in squid_map[item].keys(): entry = squid_map[item][value] levels_upper = params.get(entry['levels_upper'], None) - yield from check_levels_predictive( + yield from check_levels_predictive( label=entry['label'], value=section[value], levels=levels_upper, diff --git a/agents/bakery/squid.py b/agents/bakery/squid.py index 25a0191..dbaa895 100755 --- a/agents/bakery/squid.py +++ b/agents/bakery/squid.py @@ -29,8 +29,6 @@ def get_squid_files(conf) -> FileGenerator: yield Plugin( base_os=OS.LINUX, source=Path('squid'), - # interval=interval, - # timeout=timeout ) yield PluginConfig( diff --git a/agents/plugins/squid b/agents/plugins/squid index 03aa184..d88aaf6 100755 --- a/agents/plugins/squid +++ b/agents/plugins/squid @@ -2,13 +2,14 @@ # based on https://github.com/allangood/check_mk/tree/master/plugins/squid by Allan GooD: allan.cassaro@gmail.com # -# 2023-05-20: changed separator to :sep(0) -# changed section from check_squid to squid -# # https://etutorials.org/Server+Administration/Squid.+The+definitive+guide/Chapter+14.+Monitoring+Squid/14.2+The+Cache+Manager/ # # Table 14-1. Cache manager pages for squidclient mgr:<page> # +# 2023-05-20: changed separator to :sep(0) +# changed section from check_squid to squid +# 2023-05-22: fixed missing "<" in section name +# MK_CONFDIR="/etc/check_mk" @@ -22,7 +23,7 @@ fi if type squidclient > /dev/null 2>&1 ; then - echo "<<squid:sep(0)>>>" + echo "<<<squid:sep(0)>>>" # one squid instance squidclient -p "$port" -T2 mgr:5min | grep = diff --git a/gui/metrics/squid.py b/gui/metrics/squid.py index a6bd657..41df441 100644 --- a/gui/metrics/squid.py +++ b/gui/metrics/squid.py @@ -27,14 +27,13 @@ check_metrics['check_mk-squid'] = { 'predict_util': {'auto_graph': False}, } - metric_info['client_hits_per_second'] = {'title': _('Cache hits'), 'unit': '1/s', 'color': '11/a', } metric_info['client_requests_per_second'] = {'title': _('Requests'), 'unit': '1/s', 'color': '31/a', } metric_info['client_errors_per_second'] = {'title': _('Errors'), 'unit': '1/s', 'color': '21/a', } metric_info['predict_client_hits_per_second'] = {'title': _('Cache hits (Predicted)'), 'unit': '1/s', 'color': '52/a', } -metric_info['predict_client_requests_per_second'] = {'title': _('Requests (Predicted)'), 'unit': '1/s', 'color': '51/a', } - +metric_info['predict_client_requests_per_second'] = {'title': _('Requests (Predicted)'), 'unit': '1/s', + 'color': '51/a', } graph_info['squid_client'] = { 'title': _('Squid Client statistics'), diff --git a/gui/wato/squid.py b/gui/wato/squid.py index 50bc02a..f94de21 100644 --- a/gui/wato/squid.py +++ b/gui/wato/squid.py @@ -42,35 +42,6 @@ def _valuespec_squid(): return Dictionary( title=_('Squid Web Proxy (Linux)'), elements=[ - # ('client_requests', - # Tuple( - # title=_('Set levels for Client Requests'), - # elements=[ - # Integer(title=_('Warning at'), default_value=600, unit='/s'), - # Integer(title=_('Critical at'), default_value=800, unit='/s'), - # ])), - # not sure if client hits as upper levels are use full - # ('client_hits', - # Tuple( - # title=_('Set levels for Client Hits'), - # elements=[ - # Integer(title=_('Warning at'), default_value=600, unit='/s'), - # Integer(title=_('Critical at'), default_value=800, unit='/s'), - # ])), - # ('server_requests', - # Tuple( - # title=_('Set levels for Server Requests'), - # elements=[ - # Integer(title=_('Warning at'), default_value=600, unit='/s'), - # Integer(title=_('Critical at'), default_value=800, unit='/s'), - # ])), - # ('cpu_usage', - # Tuple( - # title=_('Set levels for Squid CPU usage'), - # elements=[ - # Float(title=_('Warning at'), default_value=60.0, unit='%'), - # Float(title=_('Critical at'), default_value=80.0, unit='%') - # ])), ('client_requests', Levels( title=_('Set levels for Client Requests'), diff --git a/packages/squid b/packages/squid index f238333..96c8476 100644 --- a/packages/squid +++ b/packages/squid @@ -12,7 +12,7 @@ 'gui': ['wato/squid.py', 'metrics/squid.py']}, 'name': 'squid', 'title': 'Squid3 Health Check', - 'version': '2.0.2-2023-05-21', + 'version': '2.0.3-2023-05-22', 'version.min_required': '2.1.0b1', 'version.packaged': '2.1.0p21', 'version.usable_until': None} \ No newline at end of file diff --git a/squid-2.0.3-2023-05-22.mkp b/squid-2.0.3-2023-05-22.mkp new file mode 100644 index 0000000000000000000000000000000000000000..fb912a247b4de607eef751901df98259ae2a2751 GIT binary patch literal 4518 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 W?&E*e$dy<;Nn7V0>%HN7_x=y6JG`*~ literal 0 HcmV?d00001 diff --git a/squid.mkp b/squid.mkp index ab2975478a692f0d9de368cfaa175e1679c7626e..fb912a247b4de607eef751901df98259ae2a2751 100644 GIT binary patch literal 4518 zcmZu!XE+;-<7|1&s!_EXdzMP<8bxZBQfepm-l-9L#VCqeQG4&!-myc?s7-09O;OaA znEAi|kH6=6@7vvdx-WOnvBi;+0!LhI3Gi?aZzo%zC`cG21{4(*6$1)O07XSXFc<fG z2WElrMJXh9<?6AN-S*RJp4UZoFUsR|vm3UP7i3Li;BX^Wwzwkp7>3wQni96`<KT-u zV%$A`BvP)$p@kUzB}TAdYUka(hoQ~{38*7%9-~svl;0@${?^1)FV50UoRy7nXrpg! zjiZE(g(VR??0(2Z-8f8MIMM~?>vl3^uD*GjO??nlik?yDGj0nGygmOK3%Zr^494#b z{7MAD5KG?!fJI~cjY@nUm{<CA^YM~Czc(FZxEu-*aE*|nG(hz*CU(IBaoj}DuTZI( z1N}H2bC@hy<Kn;hY6Z*_Y`w;?)WX=Ph<E$eywxf*tWa}%RH-Gv6kPVHs_3a@O0VUv za;0As4{^@SG<KU1KqNMgO*)|MqRf3-#0tf6Nc-b`t#`O?i5=UdZ(JtMtJ|2OK?_{f zvLeOZClSN*x9*rP3<(-cNnuOrvvHa=l0oQ6#swX!cg^4O1j7q#a%}B`OV<wAi}z`O z?i-~WBFToJ5d$+5^KrCh{YREOf0#;0*kP7xp-rRg!3pI6wn{>Uhe%8_CTF-53YK~* z4(4ku;?QW1Eu=b+=oS&Dyz1-gwi>>?S~wm}B1lOBC@TS|9Eu6vSpKx=W%UoSd`xC- zKW6GYXufG_6LcgOfGU4WMRJ3_1CL@uUg5zq!msb}I7eCiJ3RCTVS>Y7yl+BX<9!mF zc(93)Sxb1K<v!+XxlWvrc{Sqq`s=?;Th-nZYNK6ZZ^H~c4=GlJ7QV2#S`cKqV`RHF zk;&@4Jn*Yos_h&<Q7MZ&UH9(c!u_Dd)gX01u#hu5<4XeHE-2u!nb2=OEgJrjJfjhi zl)1t;mRe2Z)si6KrY1+I!>r)gdfwn2HlIKjJU>MvkH$+5;(UAYiBUsGg*SLHc5ji1 zCOm*8F>!z|fBW*xjhW5<8XYmUM!JCT@;j@#1}k3J*Kdpic3QUZDeD7h3Tt{w`vl2? zWjeBVRwAn`P3B2=7T5h3+X<+gBq`%F3+vZ=M4O#(*FPdM9N-X~Vn_+=LtuK&fY^Nf zjI5`f`?O>bOoZcHgPi^9WS7NNg}21Vo;XYIS&>@Gm}MV*iM>l)ZW?*S(-N<`7Kn16 zf)(<2LsX=}Kcx36KLGMljAS@m@Z=RAgH8~H^C+P2s!U@i@#Cj9z_vLB3R*5gLs7+8 zv8x<GMF@_R-dbEH?_dxf+g#E|yZJKGz^2z2?(?jghtFFBGx$8R3XY$R{(35H<w1?J z>Q|qu2S|r$km)l(^WH!!2NwC-ANI8OL*dhULkY?<e-g5GV?MUa7QRMg8?Npc6@OAF z=LzVURv;S4GyVK``q`g`vBzSeTTJ?UraH-&nNdcQp<VA&B+IQTuh|Q|-X>(h+bva& zwOH(xe5u^PI>bIS635@|vL++V$+pxiBR|G2FIv_4oTu5pfA$r$i~c>>9y-ek?NO9% z&vBRkxX>EOu6J^fz*lf-Hl#E|n>oZCXnEf=8YSmx*CrC_sTL&CISXBt(Rr2ayu`_q zbfnGFMwBbdFwGlTF3bN4WD$+fXrpWb)hgAg>8T?Hx`T(%>dh-Z#6Jup*z*tjs0Z~6 zpD#w+H89KwPC=;;_V%9_X)0~CO@1ecoj@aLs<MXV{ndvb>~ITvJ*A<TbQsO~U{^{j zX5n6z&L3wu?NlUnru)coqzTL$%#ESWy&wEt9PyWsI==gZoR&oD)yriOWwbaUj;-}_ z*%ac-sX5j`lHtP{*ErctmR0yp@Gr3@p<zyCTMNNHC<pSwgC&V3zohwO+e~&$nWT6l zAxiXab>E~nEz4!>DMA;^&$F9K+8;`YdU*+-dJlsrfqY!-uN<qCfxG6Q3`P<lDUqaR zs@}?Zg?Gu1wk+`*bL#yvwrcL0Iju?g(s$3w>kqU9-4izX9Jc37q&r%eb>&O#txK{J z<_nfh++H>7n)7OYH<^Xgt4Tii0eZ5_8h>OpI(qVZeq7f0po)Q9xAw=-8xb}YG4=r2 z??|eL<q%NHrVXR^jMew!43Mh(()R)GS#~8@49U5!I_i}tFs9^18@+m^^VLel%mziL z^5}~HDy-r>duS=*aUjye*Yl!Oyq=_<Neq%I?ud)rb~^<!72A)wqgzt6dKjMT=*0WJ zU*L3D;y#zQKV<jPS1`)!b{-bkQdOjfn8N@$Avjal2<d$;%Z@*gJWS0#ETC)q(_6rU zpkFqsFLuZz_KWzCsYLz-BL(|r4Z6AI*|}Z-E_!rI{DDS8IlpT>?@!9Xn4PRc%W1mG zyVT_dElG=s6`9%G@(vW`wDxhn*MOiL>1w8&se_5j9M{+*_3H-HC-oLd18pz!(gBL4 zfU-wRL=Ntm$rvE<tfFYJdNHMgyN>JhH&*=p786~wfaUu7=7Yxz$=EWdku2Zp^}~6^ zUZ-{p%``o~GMyf@jx%i5Xu4waubwsE`M@XRzj=?m8L-}z8f@HN<d3LlQ5x)F^qR-| zS8>h=s%OKCuM5BUJ=H-~+FDzZE~~p^e0Oh<RMW1D&?l&qh?I}2PxL(HDI_06#bG)` zi0=Os_jM3@jt!=rmVQDRxVh#2<G_HL*Cg#p(aEFQEMed9B)7BS*2T&^;zHrHgApy0 z&vb(zJ8{vtmV=hrL^JaL0YbN=5Ti|h(}pd;X>a^^dz?RU|ITkGX3sGJ&rCTqSnr5W z_K=ljwZ7RN{(qC;j<Q$zCZGo)s<zCtV`^cs*9kv^Q8f2Vc7veDk`%`4x6x#(mIIQ& z#aO|43#|_m#4gc4fs%33vVrqiFBo4)#0_XOu&v~`lrX6A0zJDuGyL57@9Y*!GoYjO zw9qs9OCc~XE1gc}jZ?=S(orSGZ(Otc_{2Af=rZFD7!%vU1?MaA*^EZ@TO^r)DaqzF z-M%=K{!ga=CWxR9Z)?gw-UYqA;p48vO>Dp1y;<jT!E-M+3f#?vE^{m(KAQbI6?jWW z=Fk7yp)&YWj%|czZ6<NX$*JJ<#><~0<WA<L?zK=Dr{x9FPx9T+Db)mtSFy1=X4G$U za{1Z#1;%431nW>@8rmVU5w)dC+^{S*Zhl5Swp0h>yVX{Guh?Pj@eCXe8kFb3d$PjU zjdD-x`f8Q&^JkdGlNd38W{6<m5V3X0ta>52M^uaybW>9XN)Wc5EuS57Q-uz^Ui*gl z{fb{0ObL@wfxW=ckYN-aEX@%sacqHHkJVm3?}9iwChbao!WG3MP(p{BdLlhrp+27H z?OhP(X($zjsqS~IG5m=ZqRv!R?EWdO1TxA|UN<6J2>h_v*2r7DKc9&RjC;R_9=yc+ zeX79^Mw8TOF*Cg?wvoVtXKoVV;MS(^hu&&%W4d_jqisq*nVd6{^`n7X$<yYIwHMs< zGPU;+BFZaZi>crYE_M>__yr3^PL`ais(ai&+2YS{vGTT;ez8aLLZYF{5eyrA(SOk> z*$nl*`{}F96HL6t9*7cJkGdUW+rItQlJ)q<HEB{i(N*bdn{@VF%Mi8?Gk)9ebz}`l zxqJA1307qK-Z?dls}HCTZ^3&SF~&7tGeTdW!*pGuMP!rPZ!5;AaIZ58uq1`c_$Ap( z+*<SuD!&XST$L*U1=v$LD1g-Rk?2kR2-ioP>6<IZ5=>NOl(|hjSw32`#!~#*h<gw7 z*M{v36DC3syTYnh$pF7iqXr76BteA`9v!u-kB&zxwfzZP)A<`Kw?s_aWVCsfUjA<& zba^^vj_>Dfh0BcyJ6+y0*5bWC#l1O5rSkDVk4@nlMBH9^1IjNLCOc?Ve{!rO3Bv!9 zWNO{QBTyF{USIX&zgVWQ(3x)z_}O2@qeuvi>64jw=7qB??`uLV@AK4mN^6Hlwmg85 zuyAr4_FL!{E$4^{V7!Gz%?-&*llf76lopQ0@el6;kDk+5i!(V&jNTnAk5bqY#}}1p z5&btJ!Q5%}r%k>2fm9#x%&cq_-)|2m!d;%7kZ1>y-K3p@6IC}N1n*`T0gQMLN9GD# z;&x~(K4|oMr8nC?$HVp@U?b2yn<((?xB)vNm3$*p5xR0}+MZYOyq&wt=k+H6GbIBf zBhPg9TD~stid2%Q^`^Ct<^fLo<<QY}hUEItg{=nz{z<WP%dtKED0AiX-8Z(|9;>_@ z3EOA90eeIqp4IDAe&5WryMHn7sVV7Bjms?0L)yD?EFy?FGdLll)u(*<D)~skWMs&- z$k|3H+xx&YGtvuQ(gKsyNiN<cL>^6v9U>|LOYgR~A%2K_@vDO;4wKwux_<`pVb#wj zAFXKOC(R_0>{^@Zxv`+B969MgjaAVh_x|aK3~V_a9Og2)bn4M-O!?JuA(ormIEilK z$@OJy`<2S2|3zaSa(PzdE@A5M&HHDJM=ZlqszAApCya$HcD>9EX;!*;085MSW!Hn% z=|EA+znoeruX>TkCZ7SN3%vTL=V&a0X8*Wc7RDL$COFiz(<C=1m?PYx%XGzw4!Ro| zjLA*NEiN1v>Ya&Rg2~MO0t$4F%ZW?f9<_OWaZ06>u;C)aI_6d-<X2DjLFAtiyvs~m zfA@;e;PG>sd1fP&J<&XE#(0l!TdM0&M}5~Ppnv92etK|ao@$A&k2|uhZGgE|Ip6-> zU^SQD@>vKdYvrwz%Ed^3LGPC+U)XEG#ywUzi8Szf#2mxZJ{RyD#cMkwK_7mhAf0lm zvD=tg^<&_lnHEdCYmw0is}9FII`4=tX{NN_`bZmh6m)9dFz5a$>6+qNMAqzTJfwq% zX9W7>GPOz--1>*qT~$5}7>h$c>9Js3-?I>du$RJVSu4!N)08qni+eg{fE?~`#WGNc zc>JDNj!BoFT(Oni#KdEH>5bzmGN7Pc^=E1|vWTH#pZ9Ukx{!Jvt5*Lw{M?ueUJCBP zRAy<-tU8&?ln@O-9?SLrc0+595H@=5s|5=LLshy=Pokq*Thirrxk7>0cpDpW5E}3F z84I4hL;K?sZ&H@CyLK|V%acuc!o}mW=l-zReQkCIr0t&(g}HlR2Il{LvMOIio5EAi z<O<flGCZKv?7xMEjYX!(gLfYA1*(@Rn<`iHNET<8%B7OYzNvpV!@HSnKalKp60r6R zVI<r}(>{6+C5IKtan-hrO0TV5F6GXu%R8(2j;!)6{7#BFC_K(I+0YO^P8fgf+VLUk z8)SG=wKbFDNw+4=$zgFA5t(mls(z+tF{cxufyJ1Do`g8XZCxAkP+HxFPSseYJ^>iN zXel`@O>4K?xd=He)G7T%xzsS1HfDetR$|9wLj~BP7_5zw)t*rasdw7C2+Vm2^C{Q0 zhxcaI>>#fX>Q}ZOOlp}W5>+1=So%x<_;N_|X4aq#IK_8J=R$E2U<mnCr`m&&*q3Tv zHWUT4BpDlOMCgpM!)BhG+QYP1?RS7?ESl3OMQ1u#tCD17xM$mJnmjsh#B)r*sfAom z1IiO-yY!W@(z88rw}AVuNJBo-p*{Uk$BWV^1(35V^Co7dKKFXLtW@BYYiiA-wTpV= zUQ3$-!>N7Y*D2OmmQrl9zFwnSLR0)M_;RYydR^ukDew9%P{pYM?40!(CsTq1{+7b8 zCMG&xul((*{j9jeo#HYhg(~TE4$^N%Ym>tQaN;%$`3Y1(y&x?1k4nVfA0~bqu7|8R zQs0L>f)lnzK5w+Y1jw7rCk^TZE6o`i&XhrF3u;4TO>M#}od3@JqT7-*?vAxDrv3Ds zzn$)%*=%23Z#TkOL-=he5s#6}&>VSym3=8F+|jP>!EpvDX*_rGa%iTz!eGkZ*$B@6 W?&E*e$dy<;Nn7V0>%HN7_x=y6JG`*~ literal 4686 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ni@B%8r^M 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 -- GitLab