From 1dff7d77e92b041f5e9a70a75c876c2735b368b8 Mon Sep 17 00:00:00 2001 From: "Th.L" <thl-cmk@outlook.com> Date: Sat, 10 Jul 2021 16:17:34 +0200 Subject: [PATCH] update project --- agent_based/inv_cisco_wlc_ap_cdp_cache.py | 76 +++++++++------------- inv_cisco_wlc_ap_cdp_cache.mkp | Bin 3453 -> 3357 bytes 2 files changed, 31 insertions(+), 45 deletions(-) diff --git a/agent_based/inv_cisco_wlc_ap_cdp_cache.py b/agent_based/inv_cisco_wlc_ap_cdp_cache.py index 5f58c84..dd2c095 100644 --- a/agent_based/inv_cisco_wlc_ap_cdp_cache.py +++ b/agent_based/inv_cisco_wlc_ap_cdp_cache.py @@ -1,5 +1,5 @@ #!/usr/bin/python -#!/usr/bin/env python3 +# !/usr/bin/env python3 # -*- coding: utf-8 -*- # # License: GNU General Public License v2 @@ -37,17 +37,6 @@ from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import ( ) -class Neighbour(NamedTuple): - ap_name: str - ap_address: str - neighbour_name: str - neighbour_address: str - neighbour_interface: str - neighbour_platform: str - duplex: str - speed: str - - def _render_ip_address(bytestring): bytestring_clean = bytestring.replace('"', '').replace('|4|', '').replace('.', ' ').strip().split(' ') try: @@ -63,7 +52,6 @@ _cdp_duplex = { 3: 'half duplex', } - _cdp_speed = { 0: 'N/A', 1: 'none', @@ -73,7 +61,6 @@ _cdp_speed = { 5: 'auto', } - _interface_displayhints = { 'ethernet': 'eth', 'fastethernet': 'Fa', @@ -104,9 +91,10 @@ def _get_short_if_name(ifname: str) -> str: return ifname -def parse_cisco_wlc_ap_cdp_cache(string_table: StringTable): # -> List[Neighbour]: - neighbours=[] - for deviceindex, apname, apaddresstype, apaddress, neighname, neighaddresstype, neighaddress, neighinterface, platform, duplex, speed in string_table: +def parse_cisco_wlc_ap_cdp_cache(string_table: StringTable): + neighbours = [] + for deviceindex, apname, apaddresstype, apaddress, neighname, neighaddresstype, neighaddress, neighinterface, \ + platform, duplex, speed in string_table: if int(apaddresstype) == 1: apaddress = _render_ip_address(apaddress) @@ -128,16 +116,10 @@ def parse_cisco_wlc_ap_cdp_cache(string_table: StringTable): # -> List[Neighbour def inventory_cisco_wlc_ap_cdp_cache(params, section) -> InventoryResult: - removecolumns = [] - remove_domain = False - domain_name = '' - use_short_if_name = False - - if params: - removecolumns = params.get('removecolumns', removecolumns) - remove_domain = params.get('remove_domain', remove_domain) - domain_name = params.get('domain_name', domain_name) - use_short_if_name = params.get('use_short_if_name', use_short_if_name) + removecolumns = params['removecolumns'] + remove_domain = params['remove_domain'] + domain_name = params['domain_name'] + use_short_if_name = params['use_short_if_name'] path = ['networking', 'wlan', 'controller', 'ap_cdp_cache'] @@ -170,29 +152,33 @@ register.snmp_section( name='inv_cisco_wlc_ap_cdp_cache', parse_function=parse_cisco_wlc_ap_cdp_cache, fetch= - SNMPTree( - base='.1.3.6.1.4.1.9.9.623.1.3.1.1', # ISCO-LWAPP-CDP-MIB::clcCdpApCacheEntry - oids=[ - '1', # clcCdpApCacheDeviceIndex (1) - '2', # clcCdpApCacheApName (2) - '3', # clcCdpApCacheApAddressType (3) - '4', # clcCdpApCacheApAddress (4) - '6', # clcCdpApCacheNeighName (6) - '7', # clcCdpApCacheNeighAddressType (7) - '8', # clcCdpApCacheNeighAddress (8) - '9', # clcCdpApCacheNeighInterface (9) - '12', # clcCdpApCachePlatform (12) - '15', # clcCdpApCacheDuplex (15) - '16', # clcCdpApCacheInterfaceSpeed (16) - ] - ), + SNMPTree( + base='.1.3.6.1.4.1.9.9.623.1.3.1.1', # CISCO-LWAPP-CDP-MIB::clcCdpApCacheEntry + oids=[ + '1', # clcCdpApCacheDeviceIndex + '2', # clcCdpApCacheApName + '3', # clcCdpApCacheApAddressType + '4', # clcCdpApCacheApAddress + '6', # clcCdpApCacheNeighName + '7', # clcCdpApCacheNeighAddressType + '8', # clcCdpApCacheNeighAddress + '9', # clcCdpApCacheNeighInterface + '12', # clcCdpApCachePlatform + '15', # clcCdpApCacheDuplex + '16', # clcCdpApCacheInterfaceSpeed + ] + ), detect=contains('.1.3.6.1.2.1.1.1.0', 'Cisco Controller'), # sysDescr ) register.inventory_plugin( name='inv_cisco_wlc_ap_cdp_cache', inventory_function=inventory_cisco_wlc_ap_cdp_cache, - inventory_default_parameters={}, + inventory_default_parameters={ + 'removecolumns': [], + 'remove_domain': False, + 'domain_name': '', + 'use_short_if_name': False, + }, inventory_ruleset_name='inv_cisco_wlc_ap_cdp_cache', ) - diff --git a/inv_cisco_wlc_ap_cdp_cache.mkp b/inv_cisco_wlc_ap_cdp_cache.mkp index 6df513ff5db0e7cf10938e6140980f43e12c3733..716d934748dcd524b8bd41d071daba1edddb5b7a 100644 GIT binary patch delta 3338 zcmV+l4fXQ<8l4&jABzYG{i~4%HGkVU63=J<6}%J+*$Z2d?L4{$d_XpRY;kQGwAtMc zsUav59djc~Iz5~i-Td!2Ls1ebOL3Y_bGJB7kk}$;hL0hCGm?g3!93jg&SU`{?(g$Y zp!(<VXn(jf+_#QK<I%y<(ZP;2w1!Ybtet0|EJ>Xhy7Cl*ln3`Wp|6IMrGJYsHYUVK z7yiIqUSBxrEX-0r46iS|FrB&K(&%@H;nBp6S(LIcK<>|{AI=C1Ry0V%cunSEOiozh zhUEA6C*=5yoV+?CuH!B!F*>A1M)&01=aY|v_rD*Xoeh9<@ZsIhJ@ZS@z}i^2Vh;KJ z`1~VThZ(dIOd7e!pr|K~=YQ?RbQ!KFNx~&1b4GnHX_FG1Ubu8vK<06{Bmreti%S?} z;4EpIT$X@(n9UR>CZ+M*aVh6d9zL>>HL?cQ*c={Au+!8dNft$@lF#sme+|vU+cwGJ zz&aWXtqBa^CT3|$gF=doObevA9mAWz4;|0WVjm5;NYf~p?ClBjn}3TiN<%Y@uQ>Od z`7{AGSSVLuYWvbjs0Y^<2H4(q(c<=v@7hjeyB_?a#m#7K%=&T<jT?H&g(5$@VnMRE zV)Q22yI)0rV~nV&&~W3V;T8q6I~)NT0LR(R%Lf`{OS>5C7z<LC`i0>3Mc%lgx#AU# z6R~H|MAp&JGFO&4mVYbFB@67B{ySqapIrmYWm*bH<ha*h0<X|xTKncuWyuof(x-M7 zqzo;48V2-k%l>D8|K=Y_82lIUe}8yb!+#)4<NveZ|89=|yA!h8j{m!TvMa$qGCv&t z+pzvi(179(fb0k1^Zj7_C3qmrJ^)ks+(?j$lhX>R$jm_oxPM^kD@29si`{$CY<C8- z0Hd7q8(<Whd^l$A0%nq3oF*JcJ1c7C04dlWxeQQ^Krd9J;G<Nhz$0fwc$66mbS$*w z=qPi@;0Rnn=KDC(0`;M2e7Ey|N752B5eT0j|3~}yUB&;=Xr%G~S?FFccuM;p@~MG) zy`%i|;6O|j7=L?sRNDXW;1KM8aP++XpOBr)jQQR@eB0{(ru5<;ds!0iU9w;=T0<ZZ zbY76Ehz2W?7muNQ@Z*5Ep~r%&3CYs=;3bxHUO>%z=F%Xc6Y}=-SMrtyG<JM)mR<VH zE$YZ>#95DdxG^E^!3Hq>`sqD{`V-RXM}g;+lTzdvS%1UBfwe!dUUL1FFAC>`uWSM< zn>Z1Hm7TjH&X<e59E?U25l(m@>(N^nqMt2;oaH65SmOzfn-bTjPLM@q)lbkaR4ts~ ziY8@LFf<R$ThhgymBy5k!Qh{yxUhYeq&=>H#~*`x<By!LAplub0Z6CAmRv5T#kZ6# z%kN-CCx3An>+m2cT}NO&BI@2lU;5+}e7$#`MLzB1OgPc#5KIv@n6i(Mz5`k?b2Tiq zb@|=e$9Jz@2VTGU{_{GeNx##30?jeKg8tGt*Nx%lIZSANb&jt6Q+ShKxnYn(T=?jA zO_(NXdvu<tJ@}l)FnheMyrFl+TKhzk%ulhsPJajF2*fI|lwzAjHW)XiNz%Q<ncxa~ z6E0j8*nC})sZ?afH1Z)}?HapApBP53D)@8%&w7!G1q4b^IO@V@<g>JkMZBprUQfz< z>6oTj91svP{|H&oy)b@A4Dtg8$=zk23=eyJ2`-^vqmQ#(AH8*Hl#<^ZKclbX7`Ag= zdw(SeGs1m}hb!zB2Kklq!g4lF_m0Iq{t&LR;5vXXT9m-9H0BVZkz7ucj`4AY<Ik(o zJE1;_DD0tj?E%~iOR9&~hs!9Dv<@w~WIr#Fi(sGPqq0!6S>96E9)sC-)(a>}$_^Mb zUC=n7Dc-HaccH|XJFtYMsy9wibH%QlOMj+RzGX!v?D>ZJb6To}MY?X_coP;Ji!6Y3 z=r!>Ck`+9-)CY)W0p$;d&PwStE6UDGZh-9Q5~6M_eP43A)b}&r;m;FKKtvR;e1|^( z`3*ls+0qGM?=4{mVa*38pV@r>T+!6#_ii?u+juw9Wpn(P5Li_`0*DHq`KsI9-GA*= zD=%rh<;!mo{SdKFso;`@YL<XkqOEKbgasn?qimjk!A+A_+EGmB>=rjr%Q`Wy={o85 zs%^vOLe})d8ye#lhOi_}ZdkhLDq0H$Nw^wAK4-8BTiU%)RLv9(V&~SnQD97CANoqO zfE~Tgh9+Ur$cYo$5@~h?#H5I<6Mq?I#URDKeHP;eyO@>J?a>tk7u;+2!NX&7_$eS4 z%_Uv-b2T{=|EloGCE}`_!#?>^P8Cc?3T*>Y<`~o`IrM<Bm0>8R1!z^e)g#j>z>+fm zB?Fpo(|?rJy-r<qeK1YhWuE2+WDco~YVJ)Zia@ISRZ(n!CB+j~VS$Zmp?{Qf6f>+c zm5mgtDpR#FR!SAiwXv7BECed!wuuy$28q(>DzETD6C!yy6QHY$R>?1Wy_yVPErkfb zC?)unEO006AU0HG3bComShsCs!LD<bu$&X>;&VF=oVB23B3i%*IFEdBedK}{hEi_K zBwkxQe5><{a>1KlaH~q3Qh%x7%Mz;My~Mpy2QpkJa?%9?0@y6Q3FB+nd>9Dba32G% z2*SWP^nDuRmGZoQRzY?-seA|L^Q3HEWmt94B|(^~gPcNWHraS_QMPhXU+Xg%!9BGl z085SV=uc^a`U!o?Mn(K+8odi^rr^znF&bc|uC&^F*lvSw-zFu&5q~&NyIQ7SCG?S$ z6os?9N)T-g!f0hl$A%+T24O~F)CG>7ss^@C%oQoS<31f+LejFvN7?0FOIMM^RXxQ& zDsV`ho=V?UCJ7J(YuS&I5ARWmdnq#smViR}s?WQD6F1%Ru8j8*{rNl#xajmg_nr&P zY3eSf%Dr1PZoK=N8h_@{9Gi#mcOQO#f}g|Dn3oOBA#7ptf;2oro=jZdJ@KOB=mZ;k zjWb>94VjlrFH`^)suZbLJdk*YfrQFDYG6K&PK%JR<Qq5g9p_Hz9DK6MzJDLP%6izq zdWuHf?8H$UYimDVZjn&Ae`@1?S8UbVOgGKmnQ)~w)`KRiaDNY4V{Dp_vi;BKK}&($ zwFrOe(G-^Xw0JhqtybFz*BAU)=qB=)7blhL=<()~b@B?|f8iZ|xp}JHmOoecrVUgH zmz!vtJFg2u2;hJRx4EN);l;_cip^@SdjfHDzg}7R>Ir${fCrK4We*KEXVR<q26wE8 z-_?5=XFg2;@_!#NFTKu=CQX_&Y0{)glO|1?G-=YLNt33hr5k$r-SR#Q`u6-!>p-9X zdLH_QMDo98|JM9Z3$s3R`;U&s<1y5atb@^!&i{N4dhu<^o<&+AX4G9}%*;~eCsmRi z78N;md_}1Vbkd`1DJi8-da4FCd>IsiHZ<8NWoD7*q<>UoBN%4&4%oyOz-IOK*Ob@s zgdb%qj&|8y<JfgECE_gP`CE8gfxl8PdX1;gwvcg6*J13@n4fhkUPJbkEQtO_y2E2y zB3sfT`pwA?PuWzNAJHeXM@<&45OKZ^;Kqr-NZdwtIJXyJl0K@p;{C(J7sQWd^$uBG z8E5=m4u8G@dYsZKMWwE{sCk^~jcgf3{b`xd@E3aDlxNe@%2SO+&d_OTs$%)8jY+vZ zEp3$?k87$-4N}zSZ!{mNvdA1#H1ao|LLsILwL@|By0XAlkGj4SQ<(V`&snpP4>OAz zin|-T6d~r}sN2WR*3X2sgRIId5Lv$-{C@G@_J5OsJKrt-JFtrX{{XiM!y(3h<Iz~h zfB%E=-wXKZ+!w7i;twt^H4^*<-1{d?42Y<kV?Zpf>^!|9UMr_JP}>TR8z76S>J{VJ z6Ant?^&56eJ$^JnoDHG3=`kLG$uIHH%gG{SnE2U-m)PG;xXha?di^#Iv#89al#YIs z-G8*(w^NaER!_UEQkA+zaw(u}={2O<+!;V+;Q%^$#*3UUTFp$AX~kW~6yUY_l&;(e z^?7oBJ%OrQOCG5~cs2dqO>94pGui<8Wv4zV=en!R{VGW_Px&rFn+8>33ig(CVMf2K zj|S+|yhh<7p@y4qTFZ&aljmw;T_sbd#(!L{yzV_i2K%{e&RnIFuwBFv_ir4&<NM)_ zO_x!+ZtVZ&C=Fxl5Y<eg8hf>$?i(d?@dJ5csh0z69L0kA5lZ1dr-+vhF5>!>l)JN0 zfy+CTOqHH*or;Uu)~VP`etOE~-})a5NSB$^ByX9uXYmx&xA{4q*Ww%x6!*4lhkJJ2 zPq!n){P7IaI-HwD+T5lCsAlR4L3P>&u>}{b2zO!QNr$Q70mex-sFKX8q`1k}Ts))_ zwx<t5a4}LHl4{bVNs}f`nlx$Bq)C$|O`0@m(xgd~CQX_&Y0{)glO|1?G-=YLNs}f` Unlx$Br0Ln{KQ^-0*Z_C{0E>B!cK`qY delta 3435 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 L!ygpSDJcE}O|rA9 -- GitLab