From 8fc642a22604679effe4c5cd4afec643fd7c9997 Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Mon, 20 Feb 2023 20:02:20 +0100
Subject: [PATCH] update project

---
 CHANGELOG                           |   1 +
 agent_based/cisco_cellular_lte.py   |   4 +-
 cisco_cellular_lte.mkp              | Bin 12066 -> 12234 bytes
 gui/metrics/cisco_cellular_lte.py   | 113 ++++++++++++++++++
 gui/views/inv_cisco_cellular_lte.py |  51 ++++++++
 gui/wato/cisco_cellular_lte.py      | 173 ++++++++++++++++++++++++++++
 packages/cisco_cellular_lte         |  13 +--
 7 files changed, 347 insertions(+), 8 deletions(-)
 create mode 100644 gui/metrics/cisco_cellular_lte.py
 create mode 100644 gui/views/inv_cisco_cellular_lte.py
 create mode 100644 gui/wato/cisco_cellular_lte.py

diff --git a/CHANGELOG b/CHANGELOG
index 315d5dd..ca0721b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -4,3 +4,4 @@
             METRICS: fixed range for RSRP and RSRQ, added range for RSSI, added scalars for all
 2022-11-16: added band as metric on special request
             METRICS: added graph for current band
+2023-02-20: moved from ~/local/share/check_mk/... to ~/local/lib/check_mk...
diff --git a/agent_based/cisco_cellular_lte.py b/agent_based/cisco_cellular_lte.py
index 238688e..489989a 100644
--- a/agent_based/cisco_cellular_lte.py
+++ b/agent_based/cisco_cellular_lte.py
@@ -14,6 +14,7 @@
 # 2022-09-20: added WATO options
 # 2022-11-10: added upper_levels to perfdata for scalars in metrics
 # 2022-11-16: added band as metric on special request
+# 2023-02-20: moved gui files from ~/local/share/check_mk/... to ~/local/lib/check_mk...
 #
 # sample snmpwalk
 #
@@ -37,7 +38,8 @@
 # SNR -> Signal to Noise Ratio
 #
 # for Values https://usatcorp.com/faqs/understanding-lte-signal-strength-values/
-#
+# overview of all the quality metrics
+# https://help.venntelecom.com/support/solutions/articles/44001930601-how-to-interpret-ec-io-sinr-rssi-rscp-rsrp-rsrq-parameters-in-2g-3g-lte-routers
 
 import time
 from dataclasses import dataclass
diff --git a/cisco_cellular_lte.mkp b/cisco_cellular_lte.mkp
index 675e4ddf337ca8f78d2107bc55bf2a605177a619..63ce79a563dbe8c4d118c0ec9a9b4ea20d466688 100644
GIT binary patch
literal 12234
zcmb7~LvSVx@aAJX6Whj2Y-?hhZ*1E(C$??dwr$(V8}Iku+T$K}tDZw2`qb53)lc`2
zC<+FqYw!^O_5-kR0@&#TOsuV4tPLIYt({F6{xJVxVgB=nnbDP*k(u$2A)}3zJ;=4s
zx+5M>!=8uQ&|6rCt4ut1>VcePgyN{ek`ZClABG9nk26|qF*Nc@)v5x^1bQBCfG;5D
z)bN0RO8qH!DpiIurJ^dPV5_B*r(>^9k`z5cl$0ew5R`f_W4-rtPbFl@mi>*Y2xwNV
zX!EIL#qOHfIj!Y|b-&RGvQp9e8GO{4b0e7C`)O6e1iAf+*`mxj2d5tO;Gs$93GZaq
z(AB-tjkozKv)R*~v#~Qhq-TruS6j<)Vk-hr#XHzir?T6EFzc#QZPkXZoyolTB)dJ2
zFbSBE$z^VBXezZnSHt(QT&q#z?d6__)7GNLplmUzhfQ>8{TW14T}Mu_xLi!QP19H%
zcvQO)DkjyWXSzx@OSLhZsW%H9*AWb2pH4rH8R?iTx%=o~7FrRHY)&|@f4D%MG%gJ^
z+>TqA+!lqyq=aX0*S$~^mvwk*x3iz3c*F-BsO9u)@9!8O+frmUJ}Du0n3<_KJz_wb
zolA!v$Qly%=j^BB6J8pgNg(x_#nL6`>s519JbN~K>ocfNx?~SbN)O_4UCnUd?=XaT
zwyV{MGpoHHVZJj4*IYEi1m0c%l486kSrkYZt)qOtDCBo@5bl1Cd)r!`-JX7$J=sov
z+%~7xZhrhCfBZ;3f1<#zhZnzp#H750wgfQW*<XpCpR?#4o+UXJm&yLTKKVm#h2;?X
z>i0^zIBAeCTJ*GmmObp_uyP`C+9K&)w$)cqb+Hy0cOGHwB{pN7B`CttRDt~CF@~Tb
z_*1LTDJ>fQ0RW3_1H?ulrIJ$H;e+(!DRa7v_ygWb(s>U38bq&3qhs$%Km6>!fqVx)
zR?HwvPCq{^N)^cO4qy5~a+tZ*DN8}7&4f>WfY$C!|8KjM{X?pk-jc6BFNjVZP`5Nd
z0SnJJJB(cyTEJih^QE3PpD?olTZ^70Pw#afH6L5mTfm7|V>aK^x+iSB6JUTomB8E#
z>$Zu-^tS{@bASMQOhll?t4r+0e*JJj3V{;HLg%DYS~0$PIvM{S{w1LZKKASd&+=FH
z2BUF~@Gt-La_+8SocQ?&sO+n^8q?VW!^mh^NnRybGAub^Rn1yL^LOWol8vyLWxVMV
z)c8si%jRq?|Gio@1fap|lr!7x%HFDVg;xi=h#Dog%9XHx(YR#bf;k;7U^~OIgU*3<
zb72c36Pwr)zcKwXLMbNOGP|**={En@5H&7xY*RXbsrjcWja^0E0jpz>mUj$?!H(|O
z5ocXVVG$de8RTBA^W710!KM26LWskTgeeh`SMxC;?9dONd}z$6S<i26(e=CNS)nK;
z7Q|d|mk=<E`1M;n5pZJOO%p9VGG&0o<eaE`262$Qj8+FQ>Db<>r)6~$)GnD@oEhTa
zt*+!zu6B#wV7@|(V?tpF38~wQ=X%W>t#P%ULPWmkG1v*Z-m=8{cATo@A#kKEeTVpW
zi3)Ep3b8ktZ~j7&$qe3UVm?)mC^BofvZXC(q6`2d$rJ3shdIIlzYC_h%6sbbjW=f6
ztr_*cye!%01G~99KvSdubAAc2@z>QW;Pi0Ir|nsloh$0QBhGoGY-ywo(p58k&(^-L
zrWx`iEF*P(MZ#W*orJw<YoOqH%@T!#3H;{5ek({gr(9|`*vQ@sqwc7%>Yq}5%h4ou
zNfPqulEXq6b?u6@%Iv8V+rE#6EpsYf4;BLSD%z-9@xXr=jyAfrW!K=JT-S}q8iHG;
zG#<9qfcjC=0T1s4+<54=1MG3*b*USbb8lHiwej!7;@g`|=<BtnSyHT{HW6_zhn94)
zipT<lQu^)))rrv{y&KWAw7`<n-6`yY407?232?;KkCV@55hocI{iD2z&glxh_36NM
z*)tk673>n2&hZOZ!9WG{{;YEF)z2)7WftRz*rrIt5q1hs(%abB`JiLXcM!0LoiIzR
zkVK1ox1Ax^;8Xeqpg%k3G5R^gk!IzMc`Wkq*O&CW9VrW&lL^+B2$}4)P&g=*C-9-~
zu2UIEVrH}09YJWAO@U*WQN;pyNV4e8#~{6u%zbL&bojNIdi4)NiwWFnxHmv_c-@oJ
z?P%P9e3$F*METqgy+#_B6N=Tp1@@+of;M4B`LV0}jXg@}xb1^8Fi*H!dPGwhp(dF9
z4tS6%!aiVV>+tg<Pz;zYDJMMGIcMgvJKc|bxciR%MSDaZMAT?7q&fAJ4u!*Lr|a;M
zl8P`4zMuox^uQOUSCj`jhD=~dnC#)mobepcAY5N{9>7OOKs8nJYOB(=NW$vks-h9*
ze&k6XX%6@>D)1q`65{tQacdVfwmBqFOgIy&T<NVSaF91MS86ij@9AY2_cH5J8}D$P
z{*~ykq<2oDD(YV=d<@Y1vTS4joat!3f|jmv!@A(LEB0l-JFWNko6dvjH~3eSEBr8R
zZHkK-HRl7Euc9<fe+j}aB&kYk5G`KX8~9tP(eQHqaPfEkz&fi-z!&`HZl@0evl`cs
z3hq*LEpi~1^fMcgF^slwI3aFUPDMO(vc`|C%KMD)6}+G`?aR`g7sl~Lbf%NpO#dht
zr@3Nc9;)OPYQ4*(?aIx?8{c?E^@L_NdLmk)S5cEBE+ny}dx?H?(Lm;vd7+P5B>3rT
zXC8gqLW3Cvdog^Ao@XW9Z18(VuM#%_>*QL!5;eh4&xUDg3-J#uWhzeUC6drKRlA|A
zusdny0?GpV+cWOCI#@Ie)5RzUb7tIB49wAhoU{1Aw4DJrg2Wz-q1bSS#1UU}cCoDo
zs)w`+dyJ%aB*HL=&c(=*F=~W}2GYL0=vF9(acGR!90R`%e!ct-%xAWlyfuqyX*$Cd
z;!S1(6cSXB<RnNwfdyvDo~Gh`O-beSF|Lgk*?JQL4B<StPD;bOP7!)5IAMw2Xy8bu
zO%?|PA@1S26}9RFw!5t@lCerZ288w<8$R0BT`RtvWNeyeSnr^R8-hfgcH&^+C&@Xa
zfWtp@eQ<74@Nlt`$}GkiUkI+vv{>Q;ddLJMD3AnwH%?V57a|B`O)<P$vS8c1o})W;
z8QwJ2`Vo>k?IIUDs}cGEnRU@`_2B_I!%piq<*a|0t!yxrIDQ~n69qn4rT?Q>a+{~t
z<Vdy32Ro6HuIshj!7Qyyq|R5p%4PE#@w7Fh;;MI=_{PWpAjdD8A}YWDM!&+^<|maT
zr+D*KjX{nk{Xh6kA&+AF)r5wKn*;}$rXb1fuzztdXmx%tKj`UQE@2mwYLPO*YS3sT
z4stYTIjKg5?ZU&<U805E3x2^ebJ(Rtq-SVQJ8_1BdXbO^6olNVD&D$ilk#n%7`S`=
zY6`IC3E26_%^N~RUuF7%P$@l(ORsod%$9>@os<H2!1b~f%Y()qI{sHzcn)Y-)sz5`
zU=UOkmP3r@OJ>#@5|BZYv0i(=)dXKjb8!HnD%^r>Skok_WYY&ye@i6mVTb3VcK7ni
zH(#KuZs&R|TExq{p$sf(8O>v(NCCOx7Le0dQk6OoH@n9{08KUT+S;3{k4p2mcSTVc
zYD`R?)HR=q7Jf3CIejf`ul;POe$FXFF&wM}P0uK&*caE3KryRy$_*^hY60#@XpREj
zVEr|>y@*D*LIz|HQs|%KM(<QvF{JAX139W5$jA1*(zHp3(~6N{aLX<do@1`Z$cmfm
zvNuUeVK=(E!%v%0g1$&O50))U$tD@cMQM;4YzvQP2p^t+SykA(kbv4ziDb^PDpVJW
zBwpx|s~o%)mlR|49g6V0#C*{6i$V8Qs`zADd?@Y&LD;85<_ZRj@M{<&9&kn1?fg&r
zVrfN$>|$pcxJstt5JaR$?@_oM@=t$?j-BC;q^L@cR3g7MFaqSkQp;s_hF_<Z3${{h
zkAhx*mQE5ptSNxR&cu5^Qg=}!Oj4<+N0_Z-jDm6n0U?)xHtBI?CM<xP!<{a?X-Yiz
zi3wzEMy8MnqUKDAp!9w~66uO-xL=E(;H-;&wzK}vnjSj*Dh(ec`De@*W{pQk<;x$P
z`>fG_31FuT6Xk-#9FE6c18O-h8GH{EH+5^$>#%|LilQ{$Z(W}^2hYQq$XFCtyl1(C
z!pLLyIa%xcLo?*2m?>0M@kr<@kOkYhs#c2UDJIZCkkDAfYx6pO?MvCCg99Pe*@zz)
zI#9ST?;8+A%jY##@(A8&sr~8h84$+nQ+)yCJ$9;4o`h2upxkr_$B}2LOH!?Oi$c;7
zjoaT^l79pHet#Y}I>z^;1q#rlJY=pKUM2|551c7H70CbsbW}<LEmgpL_-)6bLG>3>
zH2{u#@qYqJ|B?lWnLOCmrSlf)`8INjJ`0*0)rJd_8aE!HuEOI+@slJVKuQ%jq_YOg
zSoe5;HXf5&>e6MxH0Q-)OAGbT3(z@(tIA-Q8BHY6E<&WBS$FL+4$Dwik#V#Ar63g3
zTr{~aUaVWxTSwU`9Q;QuQ2IeFpxKRyH#T^jhT101pBUxQWl0k^HqqZ$byS8v2vTkq
zXs-%W48B-WUcM3%`|07VNlkMNlb-yt``;oMQ$<SMCuu|I?~A?GqPzx2`MutR6rj;u
zpR-nOYb|44+nlqKZX?f;|4dc1tRsJUgdS_aoX*5c(Zs{p<QcfN{b=Gkn%Ul)vt){f
zUZiy?WkXrVb1g5gq(#SQF<)bqS7y#+v?Fd*K%S@DX=QFaK_y<;9V%X8023p?Cq%}G
zmW6rOjZ87UG}=~0#jYOB>>JA4!vQcpD4a};uK4TC#!!}@Ry<Ep?T?oVC+WeJbFuLS
z3Or?c)o(tZSEBQcpaZU63)9#u;|p3bZGrGjF~l#YR(0HpZrdqeB31Ty=`FkAsD>S!
zE+cuR%a(MbR-%K@xO9Y8JW~E)JJiL@Hsm{tRb8Nr4LBsGz|i*+8agU~IuRE7zQ=2e
z9ZF<CkxNNjzK;{7`RyICEoNLQ@5mO^dZJKf_#g#Yah$I(b3`g!Ru!h=kfahU2yB@g
zG@`Dw`JMw?Eo*SqGgUY!;EP_9aKsRq61K-cKFDKAkQ!Hid$b~P2>@(MqNaP8A*~v%
z%|7J_8Y6lqvwP_i4gKnHtR}#cIwhVBgOr0-Z?QN4*Ij3v^xd1B$zug7jtGdMe#A3q
zfW+8L&@PyfEg&lPVmwMg_EfOr)@}*Y>{B1kvcd7u8Lexqy>uh~JycE{z}uDny)YKd
zXP#q?eIrh{z+k48N0^5k5O0j$-|%ubU$WnTT5~xixQ$ecpBv(&&vjnvwYgwbYs)vu
z&BDO4NLxNL8M~onS8vkp97lJCJhG%so-$81f?_M{sTR$5IJ?q}^vjr0PDqK`H@On_
z{(WOtOP{B*$5ml><pkoG@DR4lFgRyUnr7Ia@}ueCgLp|Chiysp0iHuMAi>ieOGv<d
z=VG|Ze&}__C&Fe^Dm$3OK>N8b!$ZMYmd`|K=n<I3zOu9i$m|V}t}c@_`xUj+g($+O
zXz>gq+7N|JwoL#F$e*PWYaA9|GH+az__Z^k6!~>fSh*Bx{!_Dzw$hUR$90)~GMIEC
z%(#M%gN#Z&l&v1|UV3DwZHX}-W^=aEWpC{js*U(M(oRd3o#O56$pga~3JbO2A|R!w
zK?&BTrvmIBU|?dW;um_RCqmO#b7C6+^xwtixW(`ttdQ7*ZRZ`?3eZ8Fi%a6cM;*9q
z`|^j-24`GLbk%-vvJC>1$n#!S^<sX|aD|XAfETc1?0^l$U|H(@`^A1e1b4F8v2ZK2
zR~Fcd{IhYb)lT`s?dmmnlbMa29hE(@F4ybkY~N?~nWr7Y_36#>4c|nJJGwElM8Q@`
z?z)TBnv`IjABrFTPAQ049Ykk_i`Zk;I~LUhw^<>heip>~MAvakp(M>yCdPOi(fsCo
zv@M*)+p5BP`UK`>7+@gwyE0ImYeIhR!r7Sjr;CU<w_Tb`&uo8%bW9yv?Sa8H*0x=G
zFle5v(zrWAODX$aif-k|rhIr9a+t|5F<rMn$|{jxpU`N6elh$XD#ktv9*vO1p_#?E
zo{f4_ah4J2cGBZxc9MX;6pwpaol`vgjI|tn_}GscSv(@TalJ_@v+Cc2<;A<39=pfO
z_+HJ&<Co@J5`XhS@_lDz+v0pzwUyTtVJBr8nQ9{9fN~1$ml@gSPEL02Y<lE{XfiwU
zwesblb9gzH#IoyOORiuTJo_Hq{`_UA^?f_#C@sG~9^F`30j~L@_;0fG@hKcsvgy!0
zp9)zZ@E+=;(~*ihRtIV%Zz>u{iYSK!husv$axoHPkvIUmb`p#`4o!X&Y}+X>Y09k2
z7xoCcA#ZK`rcLS^1(F&;<xS|OpOTm3uujRqHNf^rqC3ebNBShMl&|i%sE;!HB8fdg
z2sAZvF9e#*6)xAD{krfR@b4@Ll(pG)Ro>X;r3~XPp}Cm%k@7&Pq)UOVw=73QM_hOe
zwVt;N=Dn*ng|{t=P&98GPhL{x5n~uN=Y8L|U?sZ!1o#zw@L19owUV>2cVBB4n*GWY
z*M!9Z>_LEQ#h`a~-q1-C8p-;#;;^)8>vi=fR7&sbmp)GGudk*L0o-R(fcnml;%@cw
zMz4xhwH96P57~eE_>S|;-1<o<AIyUGANU1XYazMwEfkB7vHZ>Ah8Ja1Oz?;t_blKe
z)c4BkNW^6_D{rB@fh?b0UJ89uNcFgU|8{-rDJFFA06KL=vtNn+y*bOzTrDSjN@dx5
z7_s5k%+j!tpuztW#`%G>6F5-y5aeK0wYD@jzo>erE~X;~p5GkTSdGe$wt>r#lnz?x
zKD`ScuBD$9keYT!2R6&7KemS9FN@S=uoK8d2?N%(ZB@5SgWbz3ENk$YI2z@o)HNMN
z^xMf6C>>0gjdDg9mc!jaVaZRywhE!`v$;UU4)&o7W^HdUnz0c(Xh(U4k6vcr*#_1d
zQkO&$02{0KwxZ((^ogw9K`q-m8*^n4IsMqx`+drix%nD8T*-BTa^w@c6|%R(!uf=;
z->Ziq!)!+HpBfzH83V4rS>rQ{_j<YtL9Mm(=$yo|)=A3T|6Sa@#31#87y$PYh8+5;
z=?rV+tRI4n*suD^l1bkuQVpD&O!y|24D8Ie*u88mNFmv;B>`Rn-L?M0=sN(>`i0-k
z_?-+m{gxtc>A`Eo6D<c_j;`o6_uSHIP4a$x6Gd;^nFE91UR>y!WoqR)F~tfrvf{`B
zmo^}zB!Ov~(%bDZYk^aT$wcT5Y{jI!bu@<;oaB^qzZ$ygvZ1rxULenBN(?@h>QvNo
zUSL$p2HN)-yo(V|MO8C8!D_r-(SSK1Vmxv>vngWoFzO8b55>rj+9<a)_BVHvO>G0H
zUKUd6+uR10Tfw`i;1<`km#YN3$0v^og0IB^naXo4w);b&n}Hz#)fxQ6w#5v(n1hc$
zI@Y7XA1x?T>AyqI(8!)t5Xlp*Z^t|EXLBzpYhz#>)$1H@{EQ~+ucNGtXCr>O7WZ?@
z{N5zHy87#r9jtHw>k8RO;8gWqCxY8S$9W0hX$ywY_FDKyq^{JaOS;8JL4u6~vCcBE
zkmH;?lUV*YqWKCoG|n4crwD{78?|l^IN@fCllp~m@9DKrd>K2<$~-?5E>wN=@9aHi
zE_4Ryn(wEEf9o86eytwl5V<Krxz0k`=R*=kV(vhM3ve*wA&=R%gXobPH<DBV^p;;O
zYJ-HpX3~0{qoeQINhw3rUi6cX0F3syO8>boyF+1H--Q2WxcV20AJ*AXEboE1jRg94
z7RmI)0z8Nd>2Oeax9u^V2El0#x!bsqviSINQt;<3h|4$0&}<wZPyp}HEsc424f!)2
z0)-Hw+n%E0m&b`DWrDFcV<cHw!<Ttjw<O+7?D^$!7IT`<ksG$-N$B~ZdFEI~)W><X
zzEKRCwEApBpp!UY;pl1S&r<)7(IDZKPf3)u2U%GZr|v5qB;@<MhRJ38;#NgFGoVFI
zDANa~D2kN!*B75;!OOj;0DQAR;D%qOD2BKb1SF>47gG`g5gA3SupKG`v1PcD07aXy
zu%K&|yv^?p0#tit@v@xXuVT~@Wj)N-GdTU$(w%<6{q%<B&QqRW3I7rkDgf@Go#8IB
zmglcUa$J2x{UEel+!yHP%w!5RXIE*0nE_-$<E%rF<;~9#lr0;gRket-PVKym_JLEI
zE<*O@g*>lRf1F_fKjN9L3tr&wQ2Ysma^euPC{ZxaS7<izLW8I>)CgOeTtg33ZK0<)
zJ$vS5aUsk*l#?z#5<ize^X;Z?0w}IWFk~uF&f-uWqHmj)ZO@QzNDPe7+CHEqBu(Lx
zHQR|=tgncROUe}6B<$28xd1QN7Lu#0H0LS==Z?fU#{0rQV~P~jV@G>HM4?~TKE*)?
z_gu3W0TClQ{eo69&ors$$$TrPI+p6cSP)2q&pP+8tW)1pD(hx5Rr__JP1yk3z^ECq
zt+ycJG1%m9&0gKT>O!4b>cFe75T*bLbqHz^Rx8@2YBwQ+YPLF8b{Ql;@H8PBU#MDG
z4Y>l-M@R@?xI(AD%*MtC*c<J(+i*O2zlsR>FR<V3GcVE05Tvk&l1X_v1xOY8fwwIz
z7#Kg_p&(*Kf4u+o@7|FGT#qZL_Z}kpN(+((dR+_nTiV};S?;Jb8gA#}YK_hxXSuJD
zP#3@pG!)n6#Zf^}7CoENwE2kOYQ;sjOKS0G;<hDZSSg0d5M;Wnr`8m*5T3lwz>>iI
zSDd8woUEm%8M+{nervi+mm|2rc{(tR1FuT20`;8*_8XdAu2xwb3AF6;+sWmW<g^eS
z1YwQBjCHx{HJp!)d$6Jo0t*(*%4!-{gjnL@@QfK4!&gRFNw|;4v=Ga$*fdR%jplDG
zGSRm8Y+{)6E??)9xLj}%J~9}u0JFYzDZwD;cKi~*Rdpqgh_sAm>oojly-lRW{-4dB
z*1hH=sEPdB?tWhB)5f3IBEO@#SGW#&uNc2baMN0um!I#`A4l-8@mvgg1ZfD>+VJ6t
z^*=IX&VE4!K1N9l8038jD%_c?qNiGxHB4X$P6dvRZAZrKi&WPZt1Epf^0>$i(BWLI
zZsp`})&Y&8!3@y<$hI>wQI^~B_s`OZmzK9&Ew|tS*I{(Osx3iQh;%JziD26>7=_Ol
z{&5>q7NYpKrrYdH1cczJo&mHMq=LX(NsQy=KGXWd!g9}Q!n6ZyZ0FQZA%vFxXkeGr
zYn8VFP+VoDJ$oucY^jlIsN0GM!rFVl92{%i#rJ4u9vMbPHw)|Hv=*pz>Y%TYOP~=y
zgABs;y5@XFPwS+?Hj~Mg;J{Rh98N^Q+Yq3FgF@~9s^{I}yJA$BNJCDwSTJ3WO&Pe0
z)&*yDuQKSra^l_YqMGa0IDUn+-afg3p^5B4Z?htzQf9s9FgZVipNnHyM~z2AI&3Yh
z<fdIahZc361+RtzqFqo|x^7VIc~G3NLPHE-_X?!#U5~Zc8!6#!3^L<%@<|uNKut75
zjaq#0#IM19jHdb!yV9Ar55ziZr4oF&LWK|8ASB_7tS<4;CCnYAsy7rt?cZLc$}=*g
z+u^(1vY+&G&&r%5naMA@UZIF!sz|oka;Wz%gse5*C+R*?#tYPo_!bECu=!WtqZFt%
z7J%|6add=#v$9arqD!W^l0YZ!i6AOWsbcvO7Uz%xTF6_O>%tq<u^=kcR7T@SH{K-;
z3jAjKKqr^W`9UY7;2E#N6TBqHCqm@vga(x>y}#yAHrd#U+1f9jXJI87BB>{N$%0J~
z);mY3mUQv5eyOJu_M49t^PXbrbh%b^>X1v6LWtGa;}Fa3ApSR7!zPm;IZwi}eCzeb
z5KlY-*NISgMh*?~p6XBur@#jYuHM3hc+1!*oetL-Yt$gb2$dpvzMwfxm}889<$)JT
z77FW0!G_Mc5GsC3Vv<Tm87c>LVY3tR6Cqtv4ji|E@F{$4(KX!yw1rx?XN<)i7PE=X
zIUjkHqatAK&t@ps!b9!P@YiPF+vQI)<;Y*wx5zyB^qj3X;0?653B-IvD}<f=#kt0v
zvv`w!XsT{BKNpWEvm-T^skB$1)mM_F!a(g`q)62K@w<kg`zq|9T@-_C>f4!w{f+_H
zEFWS{$CN=rDtKOhMyNPOp?Ks+Z!Tq=g^iGSCK6%P%U`Mg8c^;cTA8nsy+?!~XeD~{
zyH)lF;~N-rA3uk&MbgHmAJWX*@X_^Iq}?M|hs=-C+>5nylk4?Sp(&sT-JFIWc^2R;
z6=B7#(v%%LNmuB@27A76y63X(GkyMQj~&MKNqq^iD#aT4_*BfgxRI7dH$9A@j8HYF
zU`IC5)rooI#0E4%{VCARQQ=QC^V=0ZAUj9rqW(6dAAJV~aNHs<6gq-*&83D~??TSs
zsO^b8L+?vSDRM1jv#h>g>O{?kK~$uK^1cdn{3FxSxHt>?<_g~r6}@syyA(z^3J3XQ
zOX$Qu0XmC#V(c(abg<f@#FNRq2XhXMC9ct#{(%>Njg9Iow)cY7H+BGuN@ZSXt+rwc
zXGbXio85pw&Zh|>T~oazn_}g6>L>aV^1n!696~i<95~lOZDVCaCuMrn%Z=pp0OlB6
zm8UN*xealzR@#$qs>Trrvd8kjitWC@=ycfNX+=n{8?`t}p=A6K4baRCH{gMwUc+NX
z1xFSJY$qQIjrMo{b;MjEaV}03aICv**MO-*m8q85-<gG#aX?6@S6R8i1H*LQ6&bo)
zHxn+nh1Fm1AXqOU$=xBGUsxFbh_eJiAWPOg_miXSxd=~U3|J`-3A7q1<w+QRQ4Xvs
zn&1f$xWb#uI6{FM<n=ozf8j!nYdUd@t%d6)3n^~Txj13)%V@Pde`k%xeLZeuZ@$aE
z04%tnKD9v<zGju){%oGrJOYo8S2<`>ld0@T<8(B$J^I}@mRAK12dsq68!v0nIW&_#
zu)$6Wv6S(oyHJKT{(SPJW4p&RTeT@y7ESAP`HEaAlVT|_Q6=4JJuh7r16s8u(Y82*
z_k-4SN5I_6im#&&!ZbWW#2liyzPERJYIcId4Aba;D1=+>C*y<9nHaul?~m>=cC<hu
z)Jpq=C}G6sMf3Cv1>pNfmZ&bk+Z{b?`r{rBPcu4q;S2Ecf`Nf1N3AZ!d5d{4pJLvh
z8e#Neh>$8Adjx+TE;|C1aPsm#M?SQCb+yUn@u;(1X>$wqlJOo)ur{#ZfLf9~2@oB~
zqTnBjSb?eS-7^KPMACa3AFuFBY6Vx6NL{5{s5M_D#k*)d-D<f*-7csmkq34myMeWN
zH)qE(cd=r&sH-%d9?IfPq~%0>;79qeWYiAOyc>4x?N-!Dj;bFS@9HlVFd;1>Bg@+@
z@0O6;B<`~v0@z`2!q4NK?ybX_5M<h^$VWK#;oSyl3K>(oreGH|5g4|@qcoq=?(lY>
z7tqadJQtDmfg+#i*E$EuNX2Pog&h$_ROIey3>!)Z6EO;5D)nim^8img{4#l>oK=Df
zc_vgYja=Rd;P&i7X_mE&z%sD9^xzoh>2Ax_4u_|j;r9hZP_a>PX@ggilwC$B8sW>$
z<32HBDaKw_2W+tCQ7~W5HzuLqrFQH@CEy`p@aAjW_;M2|`^PD#ZRZaAS>X8h+T1dE
z+(6AUjA4HtUDf0Ez3{wp7~aZ1*Rv-pU*6yH9uvwr5C2Mek7@p2!bJh+1NCMmm&&X2
znYfCet)Cd07frhZH-{g$#+4n&F0E$8>Yu5P-hgDk<!^cG*pK|LT*n`;X1&@Lz-uqZ
zM$Go-_iJtf@8IB~V!hY=Y^_`iaC-M9Aat{%m9nEW^W{@en^)y%<rPjnn}MYb(bv9*
zjqQ$nY3=l5dsXL*e^|C`<gaa1uNHQVyIC;hOQa=osD-8U=75ud)>qX6XC><_@v0%E
zldgm1nCffDK11aHT)2JZg@F}_tyKhkmX21XrtX2XJ<Y~+?xRv`#!`>{cbFM9<&%4K
zky*v(Ii=u9iw!H_N*$FRQ^Rl`u)NwaspGT5CWu*SyiVN|A)9!5E0)W&gcp5>jj`8<
z{EK@FESmR_D$&UyAsN$Z)m7Po+llmq=K5!^GLPyRW>#}JP4j)Hm{eyM(j)qVl^7n<
zHc^I+u63H5CMceXfc_ZUjuz8;XzHLX5Qx^LNZQgKTPPL(q-1_}nZY2a<kltt<kbP&
zd)Dml!BwVC<$205Ss$wk?Ia1C5<E&Xs|Y&+r-==`vs8Zxa^ennn6o+NGObbg1Hxu5
z@7AHqkk%Fjx4Iu8zq+&kfgKPzKpw%dse|`)*}F`_3yB}B5idd}r!+M`%s&by(m~4r
zcpX8v6f54|an<qV?s)f6Ma^A%Q%_YI#aXEm#L*3D4H3Uh)=Z?X$(Tq5#Xz<NeMDT~
zi*#Xm(%n#(%-yYFUqqU+E=i6GMDKWR0@ciZJWQGx?@g@>qhDq#l0AzfS(i)9ZPS{5
z=iA?9pppd9h>&#PvQ9ljr-MF?#0mGr)o?1z^H7H3vZiI6tMyEC|GzZl|7qa!%*8DZ
z-=h`zoR!-jYgP0Qfy&MpEtcJ%H<pD&kJ#T1bmKmG$IFMWw?9o^xz%dY*FV-*!n;38
z)y*gj|7D>sO!`#<Ym{;D)Iv00H!kM2*VF))#VwDUvF!Dwp=<(k-gYgGVO-iwppJxB
zz%KXF?B7xQnXXU=Y%FLc+pAobqtK2s0hDh3dY3yf*Ip$yyL$3Ax28r+py%7i?IjkM
zEm1v7u`Y2Wa@|_Bw<@o07dB(OY%)3RYGGVNMvYpj)@#ZkN3qJW!x5{NJk1vY>@58C
z<tJw=I@UN{_<Be{es<skrajr}seI}0Ekh=Z;p{Vo?#Tq_#Uj-fWb&D<d3E?$l3Rw=
zyB)_pyOT9(#N$B5&9ZCFjC!5**wUDm0_J(rR(frX7rsGfjE1&QRe$kNw#H%AvM#j;
zui>opX**$xbnmDe$;9DJMKYXK$hSvVstweT%)OK^;i@S7Rn2{|<Nq+PD^xQu-<*q*
z$)oEN8j717?ZDmKpJ=p)#J6ZP{nnQ7|B9F?sx`%-aY%4C40aLU;n%aL9SXf3a_+9F
zV7*pyZJ^h!HxI9|h>o#sqW;8QTp-F9GkpR2X0pt3Rc$dh$(+=SPps&tyxf}tx<hb|
zutzWl3$<`ru}lY0R4=={ub8;xj+@5ru?w*f0oVqNb{eCbZUqe^S#Qzm4#gZBVR5vj
zUi;Ho5D1cY;dZ1|uu@d#@yMuC99Pdmp0nmq+A}*K)HW&8eT5cv0Btd-|LVKP>s<-C
zRpqTg0|QbwM$`6Y5H%!A>y`wPUGto6yud+s`Lz4&e70G;Mte1f-25uTZ+m2i+!Rqq
zqssq#x4^yKXbR7?XizBA9Ogrl=6W4q@S=OuZ95giseaigxx^6BEV~GYWQgSRlPt<+
z&xtD?4&_iZYaN<&x9su{N8Q2aeJbuRT`*}^cNf0XwC>$F^foHjs#g9k+L(OV`L+Ns
ziB?=w#aA%7bxOpT@`-L(4couy-w?RqO(O|KB&~aC3as<l+S8g1`u-K`WWw|EqKdKg
zPsp41UAK0wnAQzRAfESJzjBq+Rt<?aXnK2a?rl^b)qa6bv8ktSx_@|T0$)T9#$DlS
zOSAZuj|3xu7_b+WIzANq+@N*s+zH(9AL#sEW>$W#$TMJAs`Kjt{`_w|?knT-mJQt7
z=zG<?HM9S-_CNgVO}|sI_V}^a`@41h6WN7RJ7jsOre3-FcFEAPwaEeGNV(*H;3(i`
zWG9Haj^bnL-*%l5fEJu3?jZ;iF>#yipA>GaL(>#?bh6t#=B?y%0Y-$$!=y?!=Ro1e
zm4C8%{hz~JpSqT0Lu6*{q(hV6mT(936A4xLJriYBqHZW27&ru1fn3fBp#~Sz7A-6$
za>i$H`Vp9ZA2@z7TD<7HE|`;p97)3sOIAZh>le+&_14~<>Yu8bPhUFw(#Dbi1%FN(
z5LDWHf9{y8b#uc`OV|99xN_3Z>Z+Yzuf=<T81BOU-L~qN1cx6gWg1@lQd2eiGTwuW
zK%B9idbM8^f-CZ>RC>Hv)zy9r(v_3-&b(gGp_`|6vx{;!-hk$z<Io)L322|_VUF@O
z*>cV-T>j)7W81U1`>s1|jYvn1E&t9vA9vAw*g`>oyEm$$@qip0xS{;`D|h=w{cjFl
z1NELW$<Djfa4nT44n@p+u%2)P`7o^e9-d{Yt($w4-)hu!U{j@#s6EZM(nAF%>`PA&
z0e9Cvs9+7tcqrlB!%P!Un%5it|J+UVMRl@;gmtpVA!ehHt-UXAAag<(z*ZIuBD;H;
z2Fk8nVg?}!^;_==oM;%^upf!AX-Ymel`5QMCqH|bC_MeSc9C^I{r-GcHd|h+(SKVl
zZ+d*bx<&u^PQ!tK-d&E6<ca!n!+g3VQQxgLG1tA*MSwTDXgWUd6$;8dtg;0dAV8tZ
z<hIkX!yfeNx5IO@18Lm1J?JB%>0ZV!+t3H&dp{0v5zfN$p{G;ZOM%`8d<*|@ymgFX
zNe^meAh}$xmVZ&!ZigW1f~Rl7j;Ojvphb(72a03i@hjL#bPjo;=Ft!#*v&t#DXATe
zT_w1~>dcXb_@1nN)BYXrhRNE88XLV}1dI596aF1iyYWotw`m5XY*i!%HevbM5`F&F
z$H8?CwdU}X$Qfs5c0{iAiwR~K24nP%m2sVwaWg)kwa@=0hWe%O$%X@U4|<HU^}(gj
zhbbCJCA;^oJVBq<K0#lAk*krvGs44JA~ET_p&5gaxKwM@*QP_WGJ=p13rO~iAjAUh
z%T;esTeMNejdkrTMJiiV4tH4}G`~|0*`cj>E#CNwmUjF2mUio|S~xCiyKc^2H2cu5
z+-{o0AWD|HrCELYBON{_ow}^mg%P|g!M)G2H*K%PH8ysyv}WLZKrmvNN;%f^sL^s$
zR$q6ZOGzeOURiY@+*T?+hpJECaRirQMYpslRAMdEQD%)_5z;*bTI%wnm;YUfXrx(2
zvjVQSEe|RAQr`G_3kje*G4<5sMzrH;@63u?kE*?~plZ(#f6H{4I!_Cr*9xV4vm{*1
zQ-Q1>#PY*PHU??vMQZL<Hm#2}bkBQ&M~L}YF^~@(-`<)6!CX5$Aee#<n2gm+`dL;p
zm2hQ!BUIpY<1z?Z*{?OWJ5DT#xKpw4()FvKnt<`|l5WR2Nx@44Wt_4G>T)OyrSOhz
zbwr8POS<)Zrqz9ano9a^ThOs)-*zTmmBt^p*=LkSnGGtuxO=mw53s_f(@W1CmFK{F
zg{5_=)W#|tO*2cZp=%8q`c4&UI-q3qDxq~L7;kB<MA{i(O$84AGN(Pu;D>hCShc$E
zWBr=0nh7R>R2b^E3{6ypbFBdKZU(&}!S&XCIluC>^gtxzJ0ySJun*qa{)Z29cICyb
zKHHck5<ecw3^Yj4-JjeMkz-CG)rgQ|G4Sg%o;w%3QayN``({-QXrKB<!sR>tQ}vDN
zTS18mFY{XOe77Y%z!G`@ozVXhB#Ee`H);G_ZiS@^nVUt4wn+~i_D!)Dwb_*t3|xyt
zS8`kHe$}cLcXAtYoAbRzeWx`<d$*<pkCSMhejUp_bZU%Ge(>BM*X9x1=MW*Uaw6Rk
zeg*mz9xzTrk3zjUYC@m`8(fX{Eqk%wt$hm_-~_CihCtDw?9F7!IE(8An9S<B&%-^)
zdM8!uhYoZ!y#vnoD5brNT8Bu_@K;a8-FwdrN!shgKe7RY{8p&(w~8y><ADMJT=acY
z8-?V`YOhEfIuB$j!D{L6j=ammEM-I8H3^J;QK}MMjH;9xm58NF-FvR8{}AQMF(Pa_
z_;DJrb?V-$FOyKgJqlpus|A0-w~abN98OK8eaJ<E3fK(cgL6om$rgi|E_>QuJhvJK
z=M{urjcXcAu*5ic{c@vS+$`egbmFMqaCGgqvi`j+v=hIZxj~_O#K=EdaZq_IkCR+?
n>~bMlAF*#!GC2hI0C4;NGeZA2(}Y+0gZwqjTmm8p3i7`I&e1Jl

literal 12066
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
LCU}PshlKba^ga9L

diff --git a/gui/metrics/cisco_cellular_lte.py b/gui/metrics/cisco_cellular_lte.py
new file mode 100644
index 0000000..d469b91
--- /dev/null
+++ b/gui/metrics/cisco_cellular_lte.py
@@ -0,0 +1,113 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# License: GNU General Public License v2
+#
+# Author: thl-cmk[at]outlook[dot]com
+# URL   : https://thl-cmk.hopto.org
+# Date  : 2022-09-26
+# File  : metrics/cisco_cellular_lte.py
+#
+# Cisco Cellular LTE metrics plugin
+#
+# 2022-11-10: fixed range for RSRP and RSRQ
+#             added range for RSSI
+#             added scalars for all
+# 2022-11-16: added graph for current band
+#
+from cmk.gui.i18n import _
+
+from cmk.gui.plugins.metrics.utils import (
+    metric_info,
+    graph_info,
+    perfometer_info,
+    check_metrics,
+)
+check_metrics['check_mk-cisco_cellular'] = {
+    'cisco_cellular_rsrp': {'auto_graph': False},
+    'cisco_cellular_rsrq': {'auto_graph': False},
+    'cisco_cellular_rssi': {'auto_graph': False},
+    'cisco_cellular_band': {'auto_graph': False},
+}
+
+metric_info['cisco_cellular_rsrp'] = {
+    'title': _('RSRP'),
+    'unit': 'dbm',
+    'color': '22/a',
+}
+metric_info['cisco_cellular_rsrq'] = {
+    'title': _('RSRQ'),
+    'unit': 'db',
+    'color': '32/a',
+}
+metric_info['cisco_cellular_rssi'] = {
+    'title': _('RSSI'),
+    'unit': 'dbm',
+    # 'unit': 'count',
+    'color': '42/a',
+}
+
+metric_info['cisco_cellular_band'] = {
+    'title': _('Band'),
+    'unit': 'count',
+    'color': '12/b',
+}
+
+graph_info['cisco_cellular.rsrp'] = {
+    'title': _('Reference Signal Received Power (only with LTE)'),
+    'metrics': [
+        ('cisco_cellular_rsrp', 'area'),
+    ],
+    'scalars': [
+        ('cisco_cellular_rsrp:crit,-1,*', 'Critical'),
+        ('cisco_cellular_rsrp:warn,-1,*', 'Warning'),
+    ],
+    'range': ('cisco_cellular_rsrp:max,-', 1),
+}
+
+graph_info['cisco_cellular.rsrq'] = {
+    'title': _('Reference Signal Received Quality (only with LTE)'),
+    'metrics': [
+        ('cisco_cellular_rsrq', 'area'),
+    ],
+    'scalars': [
+        ('cisco_cellular_rsrq:crit,-1,*', 'Critical'),
+        ('cisco_cellular_rsrq:warn,-1,*', 'Critical'),
+    ],
+     'range': ('cisco_cellular_rsrq:max,-', 1),
+}
+
+graph_info['cisco_cellular.rssi'] = {
+    'title': _('Received Signal Strength Indicator'),
+    'metrics': [
+        ('cisco_cellular_rssi', 'area'),
+    ],
+    'scalars': [
+        ('cisco_cellular_rssi:crit,-1,*', 'Critical'),
+        ('cisco_cellular_rsrq:warn,-1,*', 'Critical'),
+    ],
+    'range': ('cisco_cellular_rssi:max,-', 1)
+}
+
+graph_info['cisco_cellular.band'] = {
+    'title': _('Band'),
+    'metrics': [
+        ('cisco_cellular_band', 'area'),
+    ],
+    'scalars': [
+        ('13#2196F3', 'LTE'),
+        ('12#558B2F', 'WCDMA-2100'),
+        ('11#689F38', 'WCDMA-1900'),
+        ('10#7CB342', 'WCDMA-850'),
+        ('9#8BC34A', 'WCDMA-800'),
+        ('8#2E7D32', 'GSM-1900'),
+        ('7#388E3C', 'GSM-1800'),
+        ('6#43A047', 'GSM-900'),
+        ('5#4CAF50', 'GSM-850'),
+        ('4#F9A825', 'none'),
+        ('3#FFA000', 'invalid'),
+        ('2#FFB300', 'unknown'),
+        ('1#00ACC1', 'UMTS'),
+    ],
+    'range': (0, 15)
+}
diff --git a/gui/views/inv_cisco_cellular_lte.py b/gui/views/inv_cisco_cellular_lte.py
new file mode 100644
index 0000000..5906358
--- /dev/null
+++ b/gui/views/inv_cisco_cellular_lte.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# License: GNU General Public License v2
+#
+# Author: thl-cmk[at]outlook[dot]com
+# URL   : https://thl-cmk.hopto.org
+# Date  : 2022-09-26
+# File  : view/inv_cisco_cellular_lte.py
+#
+# 2023-02-20: moved from ~/local/share/check_mk/... to ~/local/lib/check_mk...
+#
+
+from cmk.gui.i18n import _
+from cmk.gui.plugins.views.utils import (
+    inventory_displayhints,
+)
+from cmk.gui.plugins.views.inventory import declare_invtable_view
+
+inventory_displayhints.update({
+    '.networking.cellular:': {
+        'title': _('Cellular (LTE)'),
+        'keyorder': [
+            'imei',
+            'iccid',
+            'imsi',
+            'fsn',
+            'network',
+            'country',
+            'apn',
+            'service_type'
+        ],
+        'view': 'invcellularlte_of_host',
+    },
+    '.networking.cellular:*.iccid': {'short': _('ICC ID'), 'title': _('Integrated Circuit Card ID (ICC ID)')},
+    '.networking.cellular:*.imei': {'short': _('IMEI'), 'title': _('International Mobile Equipment Identifier (IMEI)')},
+    '.networking.cellular:*.imsi': {'short': _('IMSI'),
+                                    'title': _('International Mobile Subscriber Identifier (IMSI)')},
+    '.networking.cellular:*.msisdn': {
+        'short': _('MSISDN'),
+        'title': _('Mobile Subscriber Integrated Services Digital Network Number (MSISDN')
+    },
+    '.networking.cellular:*.fsn': {'short': _('FSN'), 'title': _('Factory serial Number (FSN)')},
+    '.networking.cellular:*.country': {'title': _('Country'), },
+    '.networking.cellular:*.network': {'title': _('Network'), },
+    '.networking.cellular:*.current_band': {'title': _('Current band'), },
+    '.networking.cellular:*.apn': {'short': _('APN'), 'title': _('Access Point Name (APN)')},
+    '.networking.cellular:*.service_type': {'title': _('Service type'), },
+})
+
+declare_invtable_view('invcellularlte', '.networking.cellular:', _('Cellular (LTE)'), _('Cellular (LTE)'))
diff --git a/gui/wato/cisco_cellular_lte.py b/gui/wato/cisco_cellular_lte.py
new file mode 100644
index 0000000..9f3c1b4
--- /dev/null
+++ b/gui/wato/cisco_cellular_lte.py
@@ -0,0 +1,173 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# License: GNU General Public License v2
+#
+# Author: thl-cmk[at]outlook[dot]com
+# URL   : https://thl-cmk.hopto.org
+# Date  : 2022-09-20
+# File  : wato/cisco_cellular_lte.py
+#
+# 2023-02-20: moved from ~/local/share/check_mk/... to ~/local/lib/check_mk...
+#
+
+from cmk.gui.i18n import _
+from cmk.gui.valuespec import (
+    Dictionary,
+    TextAscii,
+    MonitoringState,
+    FixedValue,
+    Integer,
+    Tuple,
+    DropdownChoice,
+)
+
+from cmk.gui.plugins.wato.utils import (
+    CheckParameterRulespecWithItem,
+    rulespec_registry,
+    RulespecGroupCheckParametersNetworking,
+    RulespecGroupCheckParametersDiscovery,
+    HostRulespec,
+)
+
+
+def _parameter_valuespec_cisco_cellular_lte():
+    return Dictionary(
+        elements=[
+            ('rsrp_levels_lower',
+             Tuple(
+                 title=_('Lower levels for RSRP'),
+                 help=_('Lower levels for RSRP (Reference Signal Received Power) in dBm'),
+                 elements=[
+                     Integer(title=_('Warning below'), default_value=-103, unit=_('dBm')),
+                     Integer(title=_('Critical below'), default_value=-112, unit=_('dBm')),
+                 ])),
+            ('rsrq_levels_lower',
+             Tuple(
+                 title=_('Lower levels for RSRQ'),
+                 help=_('Lower levels for RSRQ (Reference Signal Received Quality) in dB'),
+                 elements=[
+                     Integer(title=_('Warning below'), default_value=-9, unit=_('dB')),
+                     Integer(title=_('Critical below'), default_value=-13, unit=_('dB')),
+                 ])),
+            ('rssi_levels_lower',
+             Tuple(
+                 title=_('Lower levels for RSSI'),
+                 help=_('Lower levels for RSSI (Received Signal Strength Indicator) in dBm'),
+                 elements=[
+                     Integer(title=_('Warning below'), default_value=-75, unit=_('dBm')),
+                     Integer(title=_('Critical below'), default_value=-85, unit=_('dBm')),
+                 ])),
+            ('expected_band',
+             DropdownChoice(
+                 title=_('Expected Band'),
+                 help=_('The expected cellular band.'),
+                 default_value='12',
+                 choices=[
+                     ('12', 'LTE'),
+                     ('0', 'UMTS'),
+                     ('11', 'WCDMA-2100'),
+                     ('10', 'WCDMA-1900'),
+                     ('9', 'WCDMA-850'),
+                     ('8', 'WCDMA-800'),
+                     ('7', 'GSM-1900'),
+                     ('6', 'GSM-1800'),
+                     ('5', 'GSM-900'),
+                     ('4', 'GSM-850'),
+                     ('3', 'none'),
+                     ('2', 'invalid'),
+                     ('1', 'unknown'),
+                 ]
+             )),
+            ('state_not_expected_band',
+             MonitoringState(
+                 title=_('Monitoring state if current band is not expected band '),
+                 help=_('Monitoring state if the current band is not the expected band. Default is WARN.'),
+                 default_value=1,
+             )),
+            ('band_as_metric',
+             FixedValue(
+                 True,
+                 title=_('Show the current band as graph'),
+                 help=_(
+                     'This will output the current band as performance data. Then you get a graph where you can '
+                     'follow the band changes of the monitored device. Scalars are used to create a kind of '
+                     'legend for this graph'
+                 ),
+                 totext=_('')
+             )),
+            ('roaming_state',
+             MonitoringState(
+                 title=_('Monitoring state if the device is roaming'),
+                 help=_('Monitoring state if the device is roaming. Default is WARN.'),
+                 default_value=1,
+             )),
+            ('no_profile_state',
+             MonitoringState(
+                 title=_('Monitoring state if no SIM card associated'),
+                 help=_('Monitoring state if no SIM card associated with the interface. Default is WARN.'),
+                 default_value=1,
+             )),
+            ('connection_state',
+             MonitoringState(
+                 title=_('Monitoring state if the device is not connected'),
+                 help=_('Monitoring state if the device is not connected. Default is CRIT.'),
+                 default_value=1,
+             )),
+            ('modem_not_up_state',
+             MonitoringState(
+                 title=_('Monitoring state if the modem is not up'),
+                 help=_('Monitoring state if the the modem is not up. Default is CRIT.'),
+                 default_value=1,
+             )),
+            ('modem_not_online_state',
+             MonitoringState(
+                 title=_('Monitoring state if the modem is not online'),
+                 help=_('Monitoring state if the the modem is not online. Default is CRIT.'),
+                 default_value=1,
+             )),
+            ('CSCvt55347_fixed',
+             FixedValue(
+                 True,
+                 title=_('The device is not affected by Cisco Bug ID CSCvt55347.'),
+                 help=_('In the Cisco OS is a Bug that gives the wrong value for RSRQ. Enable this option if '
+                        'your device is not affected by this bug..'),
+                 totext=_('')
+             )),
+        ],
+    )
+
+
+rulespec_registry.register(
+    CheckParameterRulespecWithItem(
+        check_group_name='cisco_cellular_lte',
+        group=RulespecGroupCheckParametersNetworking,
+        match_type='dict',
+        parameter_valuespec=_parameter_valuespec_cisco_cellular_lte,
+        title=lambda: _('Cisco cellular LTE'),
+        item_spec=lambda: TextAscii(title=_('Interface name'), ),
+    ))
+
+
+def _valuespec_discovery_cisco_cellular_lte():
+    return Dictionary(
+            title=_('Cisco cellular LTE'),
+            elements=[
+                ('only_configured',
+                 FixedValue(
+                     False,
+                     title=_('Discover interfaces without associated SIM card'),
+                     help=_('If enabled the plugin will discover cellular interfaces without a associated SIM card.'),
+                     totext=_('')
+                 )),
+            ],
+        )
+
+
+rulespec_registry.register(
+    HostRulespec(
+        group=RulespecGroupCheckParametersDiscovery,
+        match_type='dict',
+        name='discovery_cisco_cellular_lte',
+        valuespec=_valuespec_discovery_cisco_cellular_lte,
+    ))
diff --git a/packages/cisco_cellular_lte b/packages/cisco_cellular_lte
index 12aea5a..7c4dad6 100644
--- a/packages/cisco_cellular_lte
+++ b/packages/cisco_cellular_lte
@@ -5,13 +5,12 @@
  'files': {'agent_based': ['cisco_cellular_lte.py',
                            'inv_cisco_cellular_lte.py'],
            'checkman': ['cisco_cellular_lte'],
-           'web': ['plugins/wato/cisco_cellular_lte.py',
-                   'plugins/metrics/cisco_cellular_lte.py',
-                   'plugins/views/inv_cisco_cellular_lte.py']},
+           'gui': ['metrics/cisco_cellular_lte.py',
+                   'views/inv_cisco_cellular_lte.py',
+                   'wato/cisco_cellular_lte.py']},
  'name': 'cisco_cellular_lte',
- 'num_files': 6,
  'title': 'Cisco cellular LTE',
- 'version': '20221116.v0.0.2',
- 'version.min_required': '2.0.0',
- 'version.packaged': '2021.09.20',
+ 'version': '20230220.v0.0.2a',
+ 'version.min_required': '2.1.0',
+ 'version.packaged': '2.1.0p21',
  'version.usable_until': None}
\ No newline at end of file
-- 
GitLab