From 16fd5af2898addbc1425592600855892bb753dfa Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Sun, 12 Sep 2021 18:16:34 +0200
Subject: [PATCH] update project

---
 agent_based/checkpoint_asg_interface.py      |  85 +++++++++----------
 checkpoint_asg_interface.mkp                 | Bin 4271 -> 4364 bytes
 packages/checkpoint_asg_interface            |   9 +-
 web/plugins/wato/checkpoint_asg_interface.py |  55 ++++++++++++
 4 files changed, 98 insertions(+), 51 deletions(-)
 create mode 100644 web/plugins/wato/checkpoint_asg_interface.py

diff --git a/agent_based/checkpoint_asg_interface.py b/agent_based/checkpoint_asg_interface.py
index e5b5421..732f4b1 100644
--- a/agent_based/checkpoint_asg_interface.py
+++ b/agent_based/checkpoint_asg_interface.py
@@ -11,6 +11,7 @@
 #
 # 2021-03-03: rewrite for CMK 2.0
 # 2021-09-10: changed render function to networkbandwidth
+# 2021-09-11: added WTO options
 #
 # sample snmpwalk (for one interface)
 # .1.3.6.1.4.1.2620.1.48.26.1.1.1.4.0 = Gauge32: 4
@@ -47,7 +48,7 @@
 
 import time
 
-from typing import Mapping, Dict, List, Tuple, NamedTuple
+from typing import Dict, List, NamedTuple
 
 from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
     DiscoveryResult,
@@ -111,26 +112,6 @@ def parse_checkpoint_asg_interface(string_table: List[StringTable]) -> Dict[str,
 
 
 def discovery_checkpoint_asg_interface(section: Dict[str, CheckPointASGInterface]) -> DiscoveryResult:
-    # sample section
-    # 
-    # {
-    #  'bond2': CheckPointASGInterface(asgNetIfIPv4Addr='-', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:81:05:09', asgNetIfInfo='Bond Master', asgNetIfState='(up)/(up)', asgNetIfSpeed='20G', asgNetIfMTU='NA', asgNetIfDuplex='Full', asgNetIfRx=3373103274, asgNetIfTx=5007776301),
-    #  'eth1-05': CheckPointASGInterface(asgNetIfIPv4Addr='-', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:81:05:09', asgNetIfInfo='Bond slave', asgNetIfState='(up)/(up)', asgNetIfSpeed='10G', asgNetIfMTU='1500', asgNetIfDuplex='Full', asgNetIfRx=1014183605, asgNetIfTx=3291515315),
-    #  'eth2-05': CheckPointASGInterface(asgNetIfIPv4Addr='-', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:81:05:09', asgNetIfInfo='Bond slave', asgNetIfState='(up)/(up)', asgNetIfSpeed='10G', asgNetIfMTU='1500', asgNetIfDuplex='Full', asgNetIfRx=2358951560, asgNetIfTx=1716293763),
-    #  'bond2.602': CheckPointASGInterface(asgNetIfIPv4Addr='10.9.9.1/25', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:81:05:09', asgNetIfInfo='Vlan', asgNetIfState='(up)/(up)', asgNetIfSpeed='NA', asgNetIfMTU='1500', asgNetIfDuplex='Full', asgNetIfRx=355320533, asgNetIfTx=4673143507),
-    #  'bond2.3001': CheckPointASGInterface(asgNetIfIPv4Addr='10.0.100.49/27', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:81:05:09', asgNetIfInfo='Vlan', asgNetIfState='(up)/(up)', asgNetIfSpeed='NA', asgNetIfMTU='1500', asgNetIfDuplex='Full', asgNetIfRx=2910413426, asgNetIfTx=229216384),
-    #  'bond3': CheckPointASGInterface(asgNetIfIPv4Addr='-', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:81:06:09', asgNetIfInfo='Bond Master', asgNetIfState='(up)/(up)', asgNetIfSpeed='20G', asgNetIfMTU='NA', asgNetIfDuplex='Full', asgNetIfRx=1479928728, asgNetIfTx=133617791),
-    #  'eth1-06': CheckPointASGInterface(asgNetIfIPv4Addr='-', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:81:06:09', asgNetIfInfo='Bond slave', asgNetIfState='(up)/(up)', asgNetIfSpeed='10G', asgNetIfMTU='1500', asgNetIfDuplex='Full', asgNetIfRx=214459394, asgNetIfTx=131774843),
-    #  'eth2-06': CheckPointASGInterface(asgNetIfIPv4Addr='-', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:81:06:09', asgNetIfInfo='Bond slave', asgNetIfState='(up)/(up)', asgNetIfSpeed='10G', asgNetIfMTU='1500', asgNetIfDuplex='Full', asgNetIfRx=1265469477, asgNetIfTx=1843158),
-    #  'bond3.998': CheckPointASGInterface(asgNetIfIPv4Addr='xx.yy.zz.129/28', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:81:06:09', asgNetIfInfo='Vlan', asgNetIfState='(up)/(up)', asgNetIfSpeed='NA', asgNetIfMTU='1500', asgNetIfDuplex='Full', asgNetIfRx=1470381718, asgNetIfTx=124676073),
-    #  'magg1': CheckPointASGInterface(asgNetIfIPv4Addr='10.0.100.9/27', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:6e:9b:dc', asgNetIfInfo='Bond Master', asgNetIfState='(up)/(up)', asgNetIfSpeed='20G', asgNetIfMTU='NA', asgNetIfDuplex='Full', asgNetIfRx=200631796, asgNetIfTx=384654797),
-    #  'eth1-Mgmt1': CheckPointASGInterface(asgNetIfIPv4Addr='-', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:6e:9b:dc', asgNetIfInfo='Bond slave', asgNetIfState='(Up)/(Up)', asgNetIfSpeed='10G', asgNetIfMTU='1500', asgNetIfDuplex='Full', asgNetIfRx=61520991, asgNetIfTx=44776128),
-    #  'eth2-Mgmt1': CheckPointASGInterface(asgNetIfIPv4Addr='-', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:6e:9b:dc', asgNetIfInfo='Bond slave', asgNetIfState='(Up)/(Up)', asgNetIfSpeed='10G', asgNetIfMTU='1500', asgNetIfDuplex='Full', asgNetIfRx=139110651, asgNetIfTx=339878254),
-    #  'Sync': CheckPointASGInterface(asgNetIfIPv4Addr='192.0.2.1/24', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:01:04:fe', asgNetIfInfo='Bond Master', asgNetIfState='(up)/(up)', asgNetIfSpeed='20G', asgNetIfMTU='NA', asgNetIfDuplex='Full', asgNetIfRx=24549684703, asgNetIfTx=14214325659),
-    #  'eth1-Sync': CheckPointASGInterface(asgNetIfIPv4Addr='-', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:01:04:fe', asgNetIfInfo='Bond slave', asgNetIfState='(down)/(down)', asgNetIfSpeed='10G', asgNetIfMTU='1500', asgNetIfDuplex='Full', asgNetIfRx=1228171, asgNetIfTx=1511513),
-    #  'eth2-Sync': CheckPointASGInterface(asgNetIfIPv4Addr='-', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:01:04:fe', asgNetIfInfo='Bond slave', asgNetIfState='(up)/(up)', asgNetIfSpeed='10G', asgNetIfMTU='1500', asgNetIfDuplex='Full', asgNetIfRx=24548432877, asgNetIfTx=14212801896)
-    # }
-    #
     for item in section.keys():
         yield Service(item=item, parameters={'asgNetIfSpeed': section[item].asgNetIfSpeed})
 
@@ -147,47 +128,53 @@ def check_checkpoint_asg_interface(item, params, section: Dict[str, CheckPointAS
     now = time.time()
     value_store = get_value_store()
 
-    try:
-        in_rate = get_rate(value_store, 'in', now, asg_interface.asgNetIfRx, raise_overflow=True, )
-    except GetRateError as exc:
-        yield IgnoreResults(str(exc))
-    else:
-        yield from check_levels(in_rate, metric_name='if_in_octets', render_func=render.networkbandwidth, label='In', )
-
-    out_rate = get_rate(value_store, 'out', now, asg_interface.asgNetIfTx, raise_overflow=True, )
-    yield from check_levels(out_rate, metric_name='if_out_octets', render_func=render.networkbandwidth, label='Out', )
+    for label, metric, value in [
+        ('In', 'if_in_octets', asg_interface.asgNetIfRx),
+        ('Out', 'if_out_octets', asg_interface.asgNetIfTx),
+    ]:
+        try:
+            value = get_rate(value_store, label, now, value, raise_overflow=True, )
+        except GetRateError as exc:
+            yield IgnoreResults(str(exc))
+        else:
+            yield from check_levels(value, metric_name=metric, render_func=render.networkbandwidth, label=label, )
 
     details = ''
-    details += '\nIPv4 Address: %s' % asg_interface.asgNetIfIPv4Addr
-    details += '\nIPv6 Address: %s' % asg_interface.asgNetIfIPv6Addr
-    details += '\nMAC Address: %s' % asg_interface.asgNetIfMACAddr
-    details += '\nType: %s' % asg_interface.asgNetIfInfo
-    details += '\nMTU: %s' % asg_interface.asgNetIfMTU
-    details += '\nDuplex: %s' % asg_interface.asgNetIfDuplex
+    details += f'\nIPv4 Address: {asg_interface.asgNetIfIPv4Addr}'
+    details += f'\nIPv6 Address: {asg_interface.asgNetIfIPv6Addr}'
+    details += f'\nMAC Address: {asg_interface.asgNetIfMACAddr}'
+    details += f'\nType: {asg_interface.asgNetIfInfo}'
+    details += f'\nMTU: {asg_interface.asgNetIfMTU}'
+    details += f'\nDuplex: {asg_interface.asgNetIfDuplex}'
 
     if not asg_interface.asgNetIfIPv4Addr == '-':
-        summary = 'IPv4: %s' % asg_interface.asgNetIfIPv4Addr
+        summary = f'IPv4: {asg_interface.asgNetIfIPv4Addr}'
     else:
         summary = 'IPv4: N/A'
 
     yield Result(state=State.OK, summary=summary, details=details)
 
-    yield_text = 'State: %s' % asg_interface.asgNetIfState
+    yield_text = f'State: {asg_interface.asgNetIfState}'
     if not asg_interface.asgNetIfState.lower() == '(up)/(up)':
-        yield Result(state=State.CRIT, summary=yield_text)
+        yield Result(state=State(params['state_not_up_up']), summary=yield_text)
     else:
         yield Result(state=State.OK, summary=yield_text)
 
     if not asg_interface.asgNetIfSpeed == inv_asgNetIfSpeed:
-        yield Result(state=State.WARN,
-                     summary='Speed: %s (%s expected)' % (asg_interface.asgNetIfSpeed, inv_asgNetIfSpeed))
+        yield Result(
+            state=State(params['state_speed_changed']),
+            summary=f'Speed: {asg_interface.asgNetIfSpeed} ({inv_asgNetIfSpeed} expected)'
+        )
     elif not asg_interface.asgNetIfSpeed == 'NA':
-        yield Result(state=State.OK, summary='Speed %s' % asg_interface.asgNetIfSpeed)
+        yield Result(state=State.OK, summary=f'Speed {asg_interface.asgNetIfSpeed}')
 
-    if not asg_interface.asgNetIfDuplex.lower():
-        yield Result(state=State.CRIT, summary='Duplex: %s (Full expected)' % asg_interface.asgNetIfDuplex)
+    if not asg_interface.asgNetIfDuplex.lower() == 'full':
+        yield Result(
+            state=State(params['state_not_full_duplex']),
+            summary=f'Duplex: {asg_interface.asgNetIfDuplex} (Full expected)'
+        )
     else:
-        yield Result(state=State.OK, summary='Duplex: %s' % asg_interface.asgNetIfDuplex)
+        yield Result(state=State.OK, summary=f'Duplex: {asg_interface.asgNetIfDuplex}')
 
 
 register.snmp_section(
@@ -225,6 +212,10 @@ register.check_plugin(
     service_name='ASG Interface %s',
     discovery_function=discovery_checkpoint_asg_interface,
     check_function=check_checkpoint_asg_interface,
-    check_default_parameters={},
+    check_default_parameters={
+        'state_not_full_duplex': 2,
+        'state_not_up_up': 2,
+        'state_speed_changed': 1,
+    },
     check_ruleset_name='checkpoint_asg_interface',
-)
\ No newline at end of file
+)
diff --git a/checkpoint_asg_interface.mkp b/checkpoint_asg_interface.mkp
index 8f761411c1f27b9b1ca53ae97818f0d6943510a6..c51fc3c95c7b473741b087ca78e73bbb6d9c3ef2 100644
GIT binary patch
literal 4364
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

literal 4271
zcmaLaRag@a!v*ls5~Cypq`R9@(mfg_Bqxj(MmH!aH5w@q7%56ir?iN~=&k|M>7N+v
z{a<{S-}_#j^E~JJcX5~#pFELemV;np?46<ZZZJ<54_{k|kCW}c3H5e_*h2-yM8rfy
zMMY$U{6&OBh2FZs0LRvrKFiV#zr`c);3g*NztddSe7{Y51Z6CK<+ta~l9nT5`j|k&
z8t;}cbHQer|1&~y6%dH!*C-BetSSn4lct8_9J=a^4J1E|L+%fPxNs^DrH^PUAKmg|
zFMs&zHZDts=uZSga$;SsZOFF=#SODdJxEIA)!D0)@0Is``p2h(s6er$UNZ9$NNw>?
z1j8AF$65I{nilkGQ^#4fW%C)%Q?5;t(`U|N@ej}gP1ar66cxqfHy5t@+$}p{J8`@+
z0WRr76t{to@ZJ~66(`YL5z)ZpnacWWRvE5rNbYbf5ChcKJ$<8C=8!O3(8HM>PPUjM
zFlGHrtp@aa3lNiA@y9#Rn=P+s0s*D}V<ayJSus&8BCJzJI7#RZgFIATwD!2_8s2dJ
zRPfJOY)!SWtznoy{_?KCZ!<RJQnIGUE~dDnh-Xe;YA921sLg>!LF+-nZjn^=Cz1J-
zG{sNAOr0X|DyukuRxNBZZae2u?$Um4C$@~C-3$3KF#BYOCiPrRyWHc-7nx?>FwjM~
zFHLO1jMei&<qj27!kis?hPmrW=Rw0CnFX46F?xtS9t=j{5%b|5gJ6}BJ;J0c?Nn|(
ziX!b-FwC2(&*iF1x901!KZP^q=3e3oIfMVqZ9X12r&ubs#}>2+uaAY|b{9M^=GWBr
z_hvOX8BLkY$Y9?c5k*2^A{}S-Im#E?SrVhk;u<GI)dFp_w5TV-HmFKjuMMI`7DIjX
zUa3yX)D(q659YMaZ4qOcU4_OpPBM|*Hr<_yIUDw&TaXlni{+5zm`A~K4BS3{qAEhg
zX2l_V<9Jgp^D%0A3?nm|ezP+~X5ie)HYQ1euVNXZ4afYGqsuly=A@clhTK+An6gp%
z>G>EPOURfGqWwI=KtH_z9JxQ@I^zzax3EaM&P*1Jb@(S0J4Yex2Dtl5HS+YvVHwO6
zXwxC017HdjX37@{e^z(FtZ-v@bRWm0(I+Y`mCTy^Yn9vv(MuOB!G#nk*eHrCr66<(
zrX6endF-#=+Q>SUai6@QGfa<8M15jdN#~*gULuSWXkdTJJr1pJ4to`=-RJ@r<M?kR
z7ww~xMi@Z(M$7b+dv-Knhugs0&7&<~=cQ-KWaCv0gpu)=+x%r-tin4?F1P6(%%h_4
z{sva4{~`rKGCo=dV*EQ^JVi$z)erSOgrddYv99#FcLg^)HoJe?_}m|Kf89x25ho6m
znv4lp-E=RCdfnaA4>-oU{S~axfvguq*e{cfbV4-rTb%OYtD?c0=|LuQ#2bCoXm&G;
zs6|VJUc-<V>NM775!r(!d^L$Hi`yamviC$_8+hL(4OLul_lGRM2nCzJh+D-@=(4GG
zW8fNcY$ccYq&j>ouaU$7GxJTPDo@4!&N+r9{%ZJW+1e=OE$|n7v3?xR5qCX~syot;
z07wSh`ZPNEe|r!7km*gOuSE6A_b^Hf;<Ut;JULn}5|dWnG3|QLuy8gv5refX-ush)
z+w^o4g;n+p?jmRUas4&U*wIp$X7=z}ZSl!xadYG!Aiimj)AjAQxBZjlpoO~m6Z_H|
zA~{jU3h_Ducq+C7><(_-GUq7}<Kic$AFy%NTBDcRdvpb6r8#joZA`L`ohs|^8=uTa
z6V958(BQG)cTU;SvRHXeR=ezmHfxQq*17*QdXIXVaQ=ryz`D_%E()u55X-l{e73e~
zmu^7h_`M7LDx6pTxM=;*@{^9|Z7XRI-Yy^tNE1xqlrMq5kRV<#t%!JDu}#t*R^hZz
z!u+0a*|cJrZiecmmLFQgh_BbqozMZINT4@=5EVdO#f3IIm5)$?$N9hM#cd}E%&>VM
zKMVS$kaH&a0UIMRZYzM0=B(-|%9Bb);Azi;pLIM<gPjPSH|yElXEXu(uW%o29M4od
zGl&C}U-%0)Y;7>GW8aC5IELr!&$1|^f{%p4!k`C+)Qlm%c{|@F7b8dA6m!-1>1!1y
zIf#wB6D~xPmEqtd#d8Ap{X(CnZhh>wwVdCfO>#!8$z~$Fo1m-pTm}wwJ0EpEUJ6co
zNzlPCmE-fRi!Jm6RCkb3pBB0E+h7m928{HQpq}5%vu?}>Njw0cX!_waa;OH<%Ze&7
zfFCrnFa4f3DKJoqcr!1Ni(?Z>7Mm<ZxWciST0i>x&oId8cBjPRpk8uki=&Y^uTXDd
zt+v2qA}Z*aZqfno>M`$LMXkRBVa3$03I2TcFj%KcFvd1~DfEV(vu8c@5vx$yq|E8#
zR&M$G#k4X8Zr@J+^eNq((PWdRHdgV6>I7<=mXUK?^OjcZp}(ZCTA7lsTx1%fpL^;;
z3O3)14!NbqzC3IbQ-gn*sVw>%Yr4d+<UId<GJDc<tg>a4nL$!?W%*U-vSh(Bb?7p+
zRq@-e%Iayt@rs;~Opg&g4FquXobINV)$x+8aQu=F35#Up{%O1=EXrA~Z9Fs3*Y%~u
z54d$y=kGEVh=a7QT3xM@nOkmTJFzt3gTLvZX*R>BU(91^VlPuh=9e|U?szJEYN`Gj
z{B(_de9O>||1R;P-0q98*olkSIJww;h4kvZ@*Yv>4%y&@(>Ztm?bQmN@>_*3fSYSf
zZmT9y&WD*LUyw#`i`ZQJIJyv=-{1q}<s}mo%;O^o&rzr6#t{f_Da+$PgtsZbMAE_z
za_KZdU%@d*T6&jD`i-5>vqJB5!9ElHW@zBo&m@K3C&GOuLjb<BOyzf)0FGgzLJ~gF
z<OpdkW6$8{8tPgqk(DHR?n(o1o~HC`kwVa^B3WsagcWRWjH5=w;U04jr)N`8faVD_
zh{dU2J)lQedg3VRqSYAqoWgbqHmOK04Q&N$#Km<Tgy}Go+@&b*J=)mTUSrUjAVJuR
zhl+s%8S9jIRwj~fGj|{H^xNI8zHklnN7-%{^h|@yN?g~Mfz*9EK|GlRf`>LA;)r{^
zY?sL<YPwD1H54GWWA>F7AvOcXhaUSCsufR;f6isZ1@hn2@$A~S=R7A07tqS8+YdN}
zKnE=TszG<!*2b8K=gu?Oo5qq{(~h~rs_K<mNhruZ%y%qC2+OZKi@Y4#0|{si{ISGl
zWs(TBh$el=6f)mQCD6LEY}e2GCI)N$>#~8OIO6h7IWu7BmpO^VE+5_ZQFSF|5!UHY
znRBz&d6=eTWnns7qkF8HNpBiuk5bP1px~)PUt4D9Y(YUcI(@<N@DMFza*<tQanwml
zAl#NKQYJQg@L6chrt|)xBpFLn$#q6r)lT$II=O*-J4N7wfjr3XT7!;#yHAvf=dyp+
z{0EW4Ho$6@ynC1K$3Ce!Y*2kzQP0MmvxKbb`?ClWToi{AOjY>AgP!^jXZ)Z6;Bq6)
z7qzq`<{vEij-ex5W%yZSKK|6|zSwUTr)nZ6KN)PIAH#kQWrGAH`JnezoH~S*ulM%A
zl38UL<<8*zcV0t}4oUgtn!pGm;}nFp4iY!-2d%_V>u1-2+UvXUFaK(1pnu0!e~kT|
z2TaC-_x!%NeT8hc#t|jy*-UKG{RMKGQ&|FK(z907DuN`(UTt7BZr)Sf>3IJ{pj0ow
z(=0tl&bBA7T4<-kV63Z*G4Hs;&FOwXJ$bjhyGjWT2n@Qvd00s-S?-}K1Q#!$WnnTh
zDQ7r?uER{BmwxaPRgT3sn?r6hEEn=BVDI52p1rM|rec?nuJw+VWBGM0bh8h+##YNK
zUi*USdnz~bME`p=s6d?8W~5R;iC5!bFRyJg+1YxnLV<PmTb`Je<6zQWL%}VqX`cYa
zrBDL-qNQ~MMXM%Ix7}AhpBeJ8q8^UYTjJm~&d$rqd6k9y5H(j%qL+c&agt9o`%<Fe
z#2xEAIUHnw?0>3PgqYqwNp3hz=OXQN*#A3wJDZIRZ0+f-f7v~+G;G~tFPgpSmVsuh
zKOLJ09rr2l6l6NK9o@Akm-zHc(@eeb;+XIvfyX1|ndIM-+vtDDlC*6fw&%?}*L&nT
zTICfK@0VduB(c?uXbkpir&UBk@a}DltJ-h4=C+`(K6-$1-E*}sA}JA#eG99<7t-je
zg&E^(E%`+v`m}Uk<W^mUQkwM)#aKf!+zg-UcII+0Ayab)z|I*HnYRk=+f}?9#=C7o
zW-)ERc!Ru66o5u<YuQxip0}k{0!-X6;OLVXjI5#0dgap1t|6t_eZH$ac%58`*V4<9
z)&4y*!D3sG|7crLcx2sc;j}?`hF=|4G5O<@gnAEZTfTdIpW;Dk(??8{JX(gFmrHqH
z2DfuiHe{-gOt{Mo#6i9I*I@pOg`M|aWCVkm(+ArxBwjR=xUmxi`HRNP!@S0&T4`+R
z2~_`Ixr#Ch$36hbq0a}4FPR0MF43Be_Lc|eVJ9Re8*hVq9`pN>8Mw?h5g{SV$Z(Zn
z3#+_j{v5SHF{pYWYbh`n8VA7gRLVX{O1DqnbfNW7F>W`<uaOoMEe+u0_86I5h!+@5
z#SPC{Z5jQ<96V(`%~eAdpiR|UPZn^=$yEc>yp<@w;yPbCs#ANrRqjDP4%?IEOdRQF
zB;wvG?zU>w`Dm1W1HwWve0?g&Ls}e)$=|&V{5zyK6i{^;Mw)2(&D;3ekiB+s70BsB
zui9O{$QIxO;`~#Pu-lqJmG|^(JgpIVgUffVA$WLa{(VN923NTJD2<&kYoWttg#*oI
zJdMZmyUin9B7=u`1|^M-!AA0wEupmNR#8sv<^fe#SjXge`&a6PPc$9~eiZqhoT`)(
zF34Mn>qkpvD$kr2y*ic^RlEabj7dcHp!+a!A3I;MfXE@8-l)8eu{9DF5=M=?qcsOP
zSbGY(8i{OQctZJV$C(3-gEs)?KHYXkg-`|j<BV&NoI)GqN2MDXOehuk`595950V`C
z<D1%!c*oG&Hd~nL<6g{R+}+mS#F{kFBM}iPVV4tu#(s3ct8)Oq?ugUh2+4OtPw>@q
z9o_<SRVWQ<FSe`L{;U`z)bdK`WqwrZx4qE0;Qm$au<%7JUJ7jdYZW&!P5fJL)1rlj
zRk}qPsVSa3HNZ7T1}o+Rqipo4;4o5+G3rl|TPkOA-`DfTco!<_kf7Gl3<~pvDg0&{
z{xKjs&x<uy@)qxz86u)27#U@z^fk`eso^xW40Z^v8MAtzNMQI|#xys*emC^X5?A4|
z9DQ^&{)%_MyB7{>Mj$Q=%Moi8k;*>BN6sa2MTyVv%QQJJ27XGZVXX1BwM(z|wR*jJ
zb!j-`YJGdcfE7*~wZ^&N%%j|4uCt=y&L?JEo?lc}bGE28EGg1Dgw~YA#|T0e-G_Kn
zoURr3n1f6Q0HpTkjvG*^@Xjk;YE$pu7gGD09n3>)&&Qz`@mi4i#i#&W$<_vyL7(1W
z|GCcBk!tG~!WFNrZDbG;Xl$7i9fP9&>{r@KONS@Kl7}}1^glbEqtzSK)HhnoS|GF*
zT967%#Z@W+$V<`71{73#jOP)Q<3Fg)&um!zS8xA=;{Qz#O;?x%L+Mw5A^_k&T`fn2

diff --git a/packages/checkpoint_asg_interface b/packages/checkpoint_asg_interface
index a7a370c..039db61 100644
--- a/packages/checkpoint_asg_interface
+++ b/packages/checkpoint_asg_interface
@@ -4,11 +4,12 @@
                 ' - 2021-03-03: rewrite for CMK 2.x\n',
  'download_url': 'http://thl-cmk.hopto.org/',
  'files': {'agent_based': ['checkpoint_asg_interface.py'],
-           'checkman': ['checkpoint_asg_interface']},
+           'checkman': ['checkpoint_asg_interface'],
+           'web': ['plugins/wato/checkpoint_asg_interface.py']},
  'name': 'checkpoint_asg_interface',
- 'num_files': 2,
+ 'num_files': 3,
  'title': 'Check Point Maestro SMO interfaces',
- 'version': '20201109.v0.1',
- 'version.min_required': '2.0.0b8',
+ 'version': '20210911.v0.2',
+ 'version.min_required': '2.0.0',
  'version.packaged': '2021.07.14',
  'version.usable_until': None}
\ No newline at end of file
diff --git a/web/plugins/wato/checkpoint_asg_interface.py b/web/plugins/wato/checkpoint_asg_interface.py
new file mode 100644
index 0000000..a7c7e7e
--- /dev/null
+++ b/web/plugins/wato/checkpoint_asg_interface.py
@@ -0,0 +1,55 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+#
+from cmk.gui.i18n import _
+from cmk.gui.valuespec import (
+    Dictionary,
+    TextAscii,
+    Tuple,
+    Integer,
+    Transform,
+    MonitoringState,
+)
+
+from cmk.gui.plugins.wato import (
+    CheckParameterRulespecWithItem,
+    rulespec_registry,
+    RulespecGroupCheckParametersNetworking,
+)
+
+
+def _parameter_valuespec_checkpoint_asg_interface():
+    return Transform(
+        Dictionary(elements=[
+            ('state_not_full_duplex',
+             MonitoringState(
+                 default_value=2,
+                 title=_('State if not Full duplex'),
+                 help=_('Monitoring state if interface not in Full duplex state'),
+             )),
+            ('state_not_up_up',
+             MonitoringState(
+                 default_value=2,
+                 title=_('State if not Up/Up'),
+                 help=_('Monitoring state if interface not in Up/Up state'),
+             )),
+            ('state_speed_changed',
+             MonitoringState(
+                 default_value=1,
+                 title=_('State if speed changed'),
+                 help=_('Monitoring state if interface is differs from discovery time'),
+             )),
+        ]))
+
+
+rulespec_registry.register(
+    CheckParameterRulespecWithItem(
+        check_group_name='checkpoint_asg_interface',
+        group=RulespecGroupCheckParametersNetworking,
+        match_type='dict',
+        parameter_valuespec=_parameter_valuespec_checkpoint_asg_interface,
+        title=lambda: _('Check Point ASG Cores'),
+        item_spec=lambda: TextAscii(title=_('Interface name'), ),
+
+    ))
-- 
GitLab