From 0553542f81932256cec123262de129c99b157011 Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Mon, 6 Mar 2023 06:22:53 +0100
Subject: [PATCH] update project

---
 agent_based/checkpoint_fw_connections.py |  63 +++++++++---------
 checkpoint_fw_connections.mkp            | Bin 4671 -> 4777 bytes
 gui/metrics/checkpoint_fw_connections.py |  32 ++++++++-
 gui/wato/checkpoint_fw_connections.py    |  79 ++++++++++-------------
 4 files changed, 96 insertions(+), 78 deletions(-)

diff --git a/agent_based/checkpoint_fw_connections.py b/agent_based/checkpoint_fw_connections.py
index ea85933..4af20aa 100644
--- a/agent_based/checkpoint_fw_connections.py
+++ b/agent_based/checkpoint_fw_connections.py
@@ -21,8 +21,11 @@
 #             added relative thresholds (idea and code based on cmk PR #312 by https://github.com/gradecke)
 #             added lower levels and admin_table_limit, removed default values except for 'levels_upper_relative'
 # 2023-03-04: changed for CMK 2.1 (moved gui files from local/share/.. to local/lib/..)
+#             removed default levels for Connection limits (Percent)
+#             removed dependencies between relative and absolute levels
+#             added predictive monitoring for current connections absolute and relative
 #
-#
+
 # sample string_table
 # [[[u'559684419', u'203840211', u'51093794', u'786231', u'815404655', u'0']], [[u'11172', u'27598', u'0']]]
 #
@@ -39,6 +42,7 @@ from cmk.base.plugins.agent_based.agent_based_api.v1 import (
     Service,
     Result,
     check_levels,
+    check_levels_predictive,
     State,
     SNMPTree,
     all_of,
@@ -99,10 +103,17 @@ def discovery_checkpoint_fw_connections(section: CheckpointFwConnections) -> Dis
 
 
 def check_checkpoint_fw_connections(params, section: CheckpointFwConnections) -> CheckResult:
-    fwConnTableLimit = params.get('admin_table_limit', section.fwConnTableLimit)
+    fwConnTableLimit = max(params.get('admin_table_limit', section.fwConnTableLimit), section.fwConnTableLimit)
 
     if fwConnTableLimit > 0:
-        yield from check_levels(
+        yield from check_levels_predictive(
+            value=section.fwCurrnetNumConn * 100 / fwConnTableLimit,
+            levels=params.get('levels_upper_relative'),
+            boundaries=(0, 100),
+            label='Connections relative',
+            render_func=render.percent,
+            metric_name='checkpoint_fw_connections_relative'
+        ) if isinstance(params.get('levels_upper_relative'), dict) else check_levels(
             value=section.fwCurrnetNumConn * 100 / fwConnTableLimit,
             levels_upper=params.get('levels_upper_relative'),
             levels_lower=params.get('levels_lower_relative'),
@@ -112,30 +123,20 @@ def check_checkpoint_fw_connections(params, section: CheckpointFwConnections) ->
             metric_name='checkpoint_fw_connections_relative'
         )
 
-    if fwConnTableLimit > 0 and 'levels_upper_relative' in params:
-        warn_pct, crit_pct = params['levels_upper_relative']
-        warn = fwConnTableLimit * warn_pct / 100
-        crit = fwConnTableLimit * crit_pct / 100
-        levels_upper = (warn, crit)
-    else:
-        # use absolute levels if no relative levels provided or no maximum set on CP
-        levels_upper = params.get('levels_upper_absolute', (None, None))
-
-    if section.fwConnTableLimit > 0 and 'levels_lower_relative' in params:
-        warn_pct, crit_pct = params['levels_lower_relative']
-        warn = fwConnTableLimit * warn_pct / 100
-        crit = fwConnTableLimit * crit_pct / 100
-        levels_lower = (warn, crit)
-    else:
-        # use absolute levels if no relative levels provided or no maximum set on CP
-        levels_lower = params.get('levels_lower_absolute', (None, None))
-
     for label, unit, metric, value, levels_upper, levels_lower in [
-        ('Current', '', 'fwcurrentnumconn', section.fwCurrnetNumConn, levels_upper, levels_lower),
-        ('Peak', '', 'fwpeaknumconn', section.fwPeakNumConn, (None, None), (None, None)),
-        ('Rate', '/s', 'fwconnectionrate', section.fwConnectionRate, (None, None), (None, None)),
+        ('Current', '', 'fwcurrentnumconn', section.fwCurrnetNumConn, params.get('levels_upper_absolute'),
+         params.get('levels_lower_absolute')),
+        ('Peak', '', 'fwpeaknumconn', section.fwPeakNumConn, None, None),
+        ('Rate', '/s', 'fwconnectionrate', section.fwConnectionRate, None, None),
     ]:
-        yield from check_levels(
+        yield from check_levels_predictive(
+            value=value,
+            label=label,
+            metric_name=f'checkpoint_fw_connections_{metric}',
+            render_func=lambda v: f'{v:.0f}{unit}',
+            levels=levels_upper,
+            boundaries=(0, None),
+        ) if isinstance(levels_upper, dict) else check_levels(
             value=value,
             label=label,
             metric_name=f'checkpoint_fw_connections_{metric}',
@@ -145,12 +146,12 @@ def check_checkpoint_fw_connections(params, section: CheckpointFwConnections) ->
             boundaries=(0, None),
         )
 
-    if fwConnTableLimit == 0:
+    if section.fwConnTableLimit == 0 and params.get('admin_table_limit', 0) == 0:
         yield Result(state=State.OK, summary=f'Table limit: automatically adjusted')
-    elif section.fwConnTableLimit == fwConnTableLimit:
-        yield Result(state=State.OK, summary=f'Table limit: {section.fwConnTableLimit}')
+    elif section.fwConnTableLimit > params.get('admin_table_limit', 0):
+        yield Result(state=State.OK, summary=f'Table limit: {section.fwConnTableLimit} (set on firewall)')
     else:
-        yield Result(state=State.OK, summary=f'Table limit: {section.fwConnTableLimit} (CMK admin limit')
+        yield Result(state=State.OK, summary=f'Table limit: {params.get("admin_table_limit", 0)} (CMK admin limit)')
 
     now_time = time.time()
     value_store = get_value_store()
@@ -212,7 +213,5 @@ register.check_plugin(
     discovery_function=discovery_checkpoint_fw_connections,
     check_function=check_checkpoint_fw_connections,
     check_ruleset_name='checkpoint_fw_connections',
-    check_default_parameters={
-        'levels_upper_relative': (80, 90),
-    }
+    check_default_parameters={},
 )
diff --git a/checkpoint_fw_connections.mkp b/checkpoint_fw_connections.mkp
index 4201b73e6891a94f92edcd26745ba6f61638831e..bef9fa5b7d8efc483098b26836661029620c9c4f 100644
GIT binary patch
delta 4719
zcmV-#5|Hh`B&j6_ABzYGtat^H2Qz;>{cqbivi;dW{s%r63)u%pmL11Q{ouvh%iiu4
z+mE1|z5O8#4B4V>U1Uk8kEBM?``h0PNlDa~EyryhdXKZ)Ru+fD(Qr6391Uf=OYg-u
z1_NL`8nJ%?ivJET#^V=*(a0DKFGj<2#2a5gGcjH~1H@ru1~BA{|DW(#Gvj|~?FHI|
zXg6#9jZQkz+Bscp?r+WL&Wj_*^X_jgFS=WJo37St5zV6EBC!3)_FU}s)^qL13&_=)
zF7C;-XS)&k#SZAB={RKJxh`EGDgil1b{N@<Q2*#^Em8oj^5)Ij4vFu?D;o&JJ`F+&
z!;@%DNqd0<`Z(S!8zyWE^aFne`JDz2_JUTnk<+S&37ZptOQQgunbc9gxw@7K_rp5G
zKYnhA`1<N?L(KOe$DkSNjTf0tGt{dLi3DaucVNarKtWyh2^LVVsd+C`K7b?%r~|6^
zKuP40$ecTrIQGVlNXK513M%G<X*-D4Z9dC?{&e%ccH(@{+x{Ex5oCYu&<E;-WC`nK
zQNd})oQIwhM>RtqNKAh23To2Yl%!HS@=w+V7GZTK=))|7_vkvFY0cumLDR5~B0rq;
z`@*8=YtN57-3wL>ducl~1T-)~E8u-LH(_zZ?^{h;*~>?HaqIq8yX(p9X{*>~eKvfZ
z^>_B|m7WYqJerZWyWfA^7i8EqHxwVM7L`3#WJeA|lMUik0qFrOnXsQjV|Zr3fBJ)N
zz<(pTT?diR0{X8QOpwKp^?`2WFnn`y5Aw@e{ox>o5QjKVv)GMnoRoK-OTT3H-v<A$
z|1<R5|3m+8oQ(?p|6&Zcl>dJY|KH~Rzda%C{r<n*BW=n3W2b*7x&M#u4#)nn#<PEv
zT>D2ib=tKa`lFlq-fBl%?Nw`BXq~^TbB;Bhu+HsO`nV@JG}(K7bh%%8x)VCW<J7vB
zy}pELndC}P&1zi<A~R0{SfI?ACxPF$?Oj&AeFt5^eK5o(?gNL~>nqyeD@Yq%1+ra>
ziL{ufK&%>1fjED{iX&FhQAo`>Kf!R(6UYdOn@AhMO~~!CmjE0$cAPIS6#U17v|w~}
zgwOB)ha<es`Tv1&F}hIx|2bfnDf_DPKW6hiz=>u5o}Y{PA6$%wJpMDr=L5qygZV#)
ztLL15LSD>c+p%`w?Q8!|;pKnz<1pyYZMW}lArN$1FUf!DUrq^i7oKIis|kst<>}>r
z6MuVZyA~LWQ*XHpX*3}tL~Ol;4sRe3b3-~IzrOo}{7PLKKsa<A&mDV_w2_A)L;Z<G
zn-fwWWCGG3AKt*eY(i?CKH&Te@f6|=jlt!qadtYmfSWi1go1$$ZQhbalU`s$$cW)t
zWl+g)lVyM4ZTRJEbI%wxEsI)}0W7g-1Thv5gQA7sk1fA%FE)PPWAUMmz-VyZ&QFK0
zCS`geWLrL>$G<`E`-TNbtl!YUerJOTFlD;nw{fsd-7{dcRkx0ToD2!MU0r4tU7E2I
z%|y5tc?BX%a{(d$b_Qw?fsTYbcI*kQP`gVXY<z!eT)=~Q79|UZnr`g(gm^Hz%B};q
z4?B&Bhntz;Fp`#OU1mZG-Hm@5E=-p!W0zs~a^vuB1L$))98H9(MAT(NT)q8`40WSd
zcv#L&7TK-?8m>LZf^gTis7XxM;$tu;N`OI7RdW4-ygVBW$$Xn?@yd?Y@mvQL@2>*W
z0)c<gZsk~x9BU(a6T{^hi;-tcZF<1Z#(Mx<Azt!eIx*~@=%)qsxx_S1U>0NiK1=x5
zxCqX0$rz)YdI<pxNQaY#(3r5uny(JWTbNEiT$=&y>pChBzvI|*_+5OGB7f4(;i|9(
zK#<oo04ovI6Y(k9o`ns}%xUyUVan1OVG@55TNW`+rC5E4jqL^Nvf-On(B0a-OiB^S
zCu6~?2GXIq@nN?TMo5593*5cEy^Xc=^H<}`(P;2W>ycO+8fTXy(6<5m1<vi&*~P07
z`*CqO9-i_0mxJ?>F&dwrvtNdG2m2DFH5d#ohMdmD`K!yc^^VyV*MrI7+g>&}c4B``
zEqmj8K|~^ZLtAX-EHg3}jv0m^J<*un;uz7^M_Gu*H(=&^<UQNsn@)?Pp#4P+*ZCei
z)aA%gx}KT7tv?JBTAdc3$Q96}0nfjQtvmnmfrg+T{F)nJK858wvupwd9k9sB<-51n
zHvtvDKqfP9$*<A9N8ux^J<;ZF(>8zDFqz3nJXgT4S2UUhDeYfr^Z|bSEeO0IYiA2?
z7J?QDv;b8U5V}v2mkv`v(O8Cg$^C4H3s?ieR+banFUmK5XR64Y2r|%W{ZBT*>~G$M
z8R%agr7h-!bzjQ2ZWjK80A9J}538=_HF&?8CYCd)Y5P6iRJWkKb1kqyT^fJAi#LcP
zw_whs;&$Gr@|IQ$#7lfL2<fcWUv=bFJz-1XR+8>rmz@5XE{)q7soqtH6_vFIw|ozx
zqAdm!WSTc2*d+?KlQc(NoR(f`I(p@4=v9cnR}y=Ve5@P>1rL0cIKMUS_=;ivrSlq8
z{S#jh<R7>Y*mXB!J)lt>xUGN6>FedEtyh{Z#y}<~9J`eftyASrt=y)7+9}@b_Nwtg
zs%3n*S%;4@FL%JZbv@XWl)JFob$wvU%01v_4L(j|2_J9f@pIFX;OB1U@TEx;$kLq>
zC)s>ToJesl$M1?|X(e`U*V5z{lR6DxYqMZ5xk_$r>R5^2=_F%v=Td(^9+(Pq6ZS}>
zaV48PsWd{M)f@AZAgY54>1d_6PD=;V%krvk;>*KcmdE^&7}=uaQjoSfCBNFqy&q#P
zZYqtMQw{PL0=sq6FAbW1$;QW+%8y+gn0E91=3eYtW&jc2v}5#er~-mx&Z#rit}624
zh4*~iGtY2KFy+^}&jWwXJRZ*h&oFm8-La#|Lg}Pq7iDjU;N>IJ1qEyJumnZkCD2B5
zv+>QQfU|J;L<l6dDXHqs8vZk;QTQv^5iqVG;C6AZ#R>NKWb|_4?B&D*VFtNP$#pdG
z?gm!1hJTiiVx!^48{{Ov+6z9icAk=rNlwzW^O9jp=p79WcgBB~55KB-%6Vygam@eD
zQ9`eRRQjQK#8kuqZ^>J&%oSBoygSxb@foVnFFv2OYO>s+C!aaummS*Zn47s}l7|Ud
zYM&n_y0QH78C9p)N7%xg0_|EY1z{J>OkNQWuqWSzn1sEm7go+N$v+N~Y3e)cyepYb
ziNUe}`&_rtWw?JuCFVgv2SZspWqVfr{co@?;?2ekwjk7-?B(Z#m~rH7z%VUf6T2m*
z_0JeK&X(5Y;kUDk(H|RdcpP(|>&E^<AUcaM`IRIkx+%*cJ#tX#soJHdYU5ME@R+<}
zjp9ACCT7<49%q;ef$$6e(ebYiXHD9|Lu+AE-;un*J>7o_>tD3+vb_tVg<oUu3LB0>
zzu2nnm*034`eDwwu47>XQs~JN)pcEq8<9d^n5DX&*@i^2<hd<vDs~}o^bs97l|pvf
z7?=n!7U`U(E;%r5*wka#zXS^~y$NF4O~({DQ8|rM&5%)0Q=Ss)>^FUaE!ntMnjPGD
zB&jeRbJc${Ax3Vb_e3nhO7a9olHZ>0$!CZpSXyB-&E@K4>Y}c0Nu$Mjn(26wS<Cwo
zOkGVieW0J|WB7Xne}?0s0sr8I&N80lCAs?h->!bUe*gO2&FS0Mf1ON9d4(KN&$dEo
z<g`9d5G!@gudi~y;r@QGzRLa1_V>f(Rqi<2-;sYUu5!=w{XNT_#(O)V!sq(kWsa|R
z%oLy3&F?i!+cciqRMaBO+#ypb7_CqdLzYG6mv%qAP<e|+Ag(FT8fQY_nc}=qvTSlE
z6U~sz1Pe1sSzyH-QE`~mOtEBiBeIvq#Snf1LWz1MC28))ynvKwzyISM`GwgiR>)r<
z)2)BflU;P-LJ&@h@w7C<)0M0q4^4Sa{1B@b^4yKs)m0Vz3B)Xsl$yu}xh45+L)vdo
zen{>U#14f3Xx8juc%S4gD+_Nx1%q(<`3t7+RaKG#1qu`>_|~wB?Qd51*{uHa+$hz5
zLU?mAR`s9H0Zr=Ozj6KN;Cwhp>p#bMe{g?sHXN$@&u6axr0xUZHK1oFq6#!u1B!Q`
z;iPfFr$F9c@_Evv=JTYo=u?cb=k!r1(%8w7qY(Sls=S~nm&x%uw1fy&#qoC&|L)6W
zaY+GbU*`pKNh_Af$!#Zl>(lr^C#{pLm<TPkJ-Bp}`k+~<HK{Zbz4bW4D%GT%=%jxo
zrStLFUyt8e1*X52Z}>D=dTc`?-xd6G(r~Yf!@p$d(aOTQlUA;WIEn)TIITYub4RA+
zGas%kh}LhvX2sWO`~XlKc{BD%@beeguF@~P#uSrRf;%XEIcZ5Eywwh8Q<I)DJuEuw
zXtQfhDpw^epT>d>wdjQ}P1r$H*uQ^AT5@;cIs6>|aNM73oY#Z7P2Y+h$Ys*6g3BMu
z9G+zyzT|r3dcg*4NUHcbws#6QpMS4myKwlg%;W&yUl!RM4Em;4G3gEY!MuJAKZRq5
z4fz?KAH@%QUr@tP@x)_8j?Rvg5PuI*!&2$AWka4u$MJ;kH|n&gc+Rt_9vy!*Z|psK
z4M)WjrcD)Tm@;$-OO5PU#evmBEZ4z;l8YB=SSlW@ZOqSLe7KzUS<uQ#mxe|&V<z+3
zM@y$NcDkx4h0nMYW*R@da3Z}Ye1bFV5zVpPj5H^77y$^q%mWDIt6lQL-z85NLfmEs
zr6+98*aVNR0DTZJyXrpm2`7Je5QY<CSKSh?o+wA2RZYv2CM6r-0A<^&`1|y1|LO6s
zpn+L&*@2oTcg$(r({&~x`D9&53GCI80FU_qXRHWsV00Vl4mn7kPg0tu0o-2Yfn5t0
zC3vp2S4j>EPGGjf$XwhXVxdYU8pn{})gi}F;B_g-P~bHm2V3f5DPVuu)-p{gY&dn(
z$Kzg|4(FI!&{NFcXGt~jzzn)Yq-h44#FZA()dtL2xcg&5lEIQYM;PQm&w*ix+sO{H
za&&KH!jfHY>_v_Ru6jGa7E~c2iNM-)mb@N`^J3_R+)O|Do{P1m6Ec+8yz6$qf<%vd
zrb=H@{Y(v?>U$FYcb0$u+xtC}Z-4&ZFh)k<{6AoiRQ^}xf9vzV$vN`cTrDd0S5MR~
z?N8zq&~;L@@c}D8e7g7(?9l6oZql<rl^F2gh;&kOD!;POzh8MwgFn_yj3<%d3EpJq
zt83D+FZX4Wb8Y-QIdEObAOCDK%U}juVfYva;`+54(G?BEFL8gU+gwqeF0RZ~<1|$!
zs`tuJj1q{J880zP`AT~H8hEjvCl<b=(W4jKgIEMImtK<9K4GWBvbvmEDvTY6#k!Ld
z`H*5Jr%vWLs6$y?GL^zn9!6CZYv)lC*>+CKpD<)$@-&xPsN6K=U`-t#`>+qOg*4*d
zUfY<T>`lBO;Jtt65Kw!|T$VRlgD_WXhMClP>x5B&|6^G6%NW9P?WF26i`;eEOS1Li
zAni{0=%~VJ<$KNMkJaEqXA*+CIIzHBE3j**bfqNkLrC(h_|XcWd{0AMEDMUC7N7)6
z#Mq;;&xTZTuxmJAdTFoXfPVu*77^)quCrxpQ~L0L9|wQFhez^J$Z-(Tu3(UtBZr{p
zjs+7EE!I27#gSk;>Lj0l@Cp*{;o%0?i<sy(_G%qr<#o2%7TwG_JU_-dKj_s80}9Fu
zoQ<kh%v+&4Rb~CMs>0%(x}#0Sj(mOY)cv>SCq4g4;-}J!lLiZbF_L_jf_>lxZYJM{
zIAB#&k9mKjlnO_>iXE9L-Yq2C{Tf0NA1FCmNIUhqy@S~{c|;Symeri1<*`u9+dGt?
zjg|(NK^)@h+cola=0LgP)y!s{IWO7lRQ`XOfs3QhL4tS&R9aKjx=}f9CFv{J2;re2
zkjGKP@AfUyV#4RRMVbW(O*F9l6&`{g`zh*yS?7O2fCRX9+Xb|aFw(meAvNHkZQ+-s
z2o`>`Uff!?s~v8;tN(SIeEFsa_%LibKC0lZF~u<|Ip1YbEPW35*pwd*w<NVw`4mg?
zjb^eCkv!WBl4qR4y@n){ZKr-*QZ_S*DPTH+@028?po3We;qqStOmWm2n*)b0o1!De
z&)Y_$BvU8i^iuGzCkG9h?jocI;v2se?icpg@n_vwhv`Av4HiyeU^l}|)>K1pBa^Jy
xc}x%6j!4A#wD7aHjZ*2Uj(&&fERzosBa<K!5|bbj3=F<&_+L4Go5cX2000-LRwMub

delta 4607
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

diff --git a/gui/metrics/checkpoint_fw_connections.py b/gui/metrics/checkpoint_fw_connections.py
index 62d926b..9800ac8 100644
--- a/gui/metrics/checkpoint_fw_connections.py
+++ b/gui/metrics/checkpoint_fw_connections.py
@@ -10,8 +10,8 @@
 # Check Point Firewall connections metrics plugins
 # checkpoint_fw_connections
 #
-# 2023-02-18: moved metrics file from ~/local/share/check_mk/... to ~/local/lib/check_mk/...
-#
+# 2023-03-04: moved metrics file from ~/local/share/check_mk/... to ~/local/lib/check_mk/...
+#             added predictive metrics
 
 from cmk.gui.i18n import _
 
@@ -19,8 +19,28 @@ from cmk.gui.plugins.metrics.utils import (
     metric_info,
     graph_info,
     perfometer_info,
+    check_metrics,
 )
 
+# for predictive monitoring
+check_metrics["check_mk-checkpoint_fw_connections"] = {
+    "predict_checkpoint_fw_connections_fwcurrentnumconn": {"auto_graph": False},
+    "predict_checkpoint_fw_connections_relative": {"auto_graph": False},
+}
+metric_info['predict_checkpoint_fw_connections_fwcurrentnumconn'] = {
+    'title': _('_Predicted connections (absolute)'),
+    'unit': 'count',
+    'color': '26/b',
+}
+
+metric_info['predict_checkpoint_fw_connections_relative'] = {
+    'title': _('_Predicted connections (relative)'),
+    'unit': '%',
+    'color': '36/b',
+}
+#
+
+# normal metrics
 metric_info['checkpoint_fw_connections_fwconnectionstcp'] = {
     'title': _('TCP connections'),
     'unit': '1/s',
@@ -72,6 +92,7 @@ metric_info['checkpoint_fw_connections_relative'] = {
 graph_info['checkpoint_fw_connections_fwpeaknumconn'] = {
     'title': _('Check Point Firewall Connections absolute'),
     'metrics': [
+        ('predict_checkpoint_fw_connections_fwcurrentnumconn', 'line'),
         ('checkpoint_fw_connections_fwcurrentnumconn', 'area'),
         ('checkpoint_fw_connections_fwpeaknumconn', 'line'),
     ],
@@ -79,11 +100,15 @@ graph_info['checkpoint_fw_connections_fwpeaknumconn'] = {
         ('checkpoint_fw_connections_fwcurrentnumconn:crit', _('crit')),
         ('checkpoint_fw_connections_fwcurrentnumconn:warn', _('warn')),
     ],
+    'optional_metrics': [
+       'predict_checkpoint_fw_connections_fwcurrentnumconn',
+    ],
 }
 
 graph_info['checkpoint_fw_connections_relative'] = {
     'title': _('Check Point Firewall Connections relative to connection table limit'),
     'metrics': [
+        ('predict_checkpoint_fw_connections_relative', 'line'),
         ('checkpoint_fw_connections_relative', 'area'),
     ],
     'scalars': [
@@ -91,6 +116,9 @@ graph_info['checkpoint_fw_connections_relative'] = {
         ('checkpoint_fw_connections_relative:warn', _('warn')),
     ],
     'range': (0, 110),
+    'optional_metrics': [
+        'predict_checkpoint_fw_connections_relative',
+    ],
 }
 
 graph_info['checkpoint_fw_connections_fwconnectionstcp'] = {
diff --git a/gui/wato/checkpoint_fw_connections.py b/gui/wato/checkpoint_fw_connections.py
index d72a8a2..a1bf473 100644
--- a/gui/wato/checkpoint_fw_connections.py
+++ b/gui/wato/checkpoint_fw_connections.py
@@ -7,10 +7,11 @@
 # URL   : https://thl-cmk.hopto.org
 # Date  : 2020-06-07
 #
-# 2023-02-18: moved wato file from ~/local/share/check_mk/... to ~/local/lib/check_mk/...
+# 2023-03-04: moved wato file from ~/local/share/check_mk/... to ~/local/lib/check_mk/...
+#             fix: CheckParameterRulespecWithItem -> CheckParameterRulespecWithoutItem
+#             changed levels_upper_absolute/levels_upper_relative from Tuple to Levels for predictive monitoring
 #
 
-
 from cmk.gui.i18n import _
 from cmk.gui.valuespec import (
     Dictionary,
@@ -19,66 +20,57 @@ from cmk.gui.valuespec import (
     Percentage,
 )
 from cmk.gui.plugins.wato.utils import (
-    CheckParameterRulespecWithItem,
+    CheckParameterRulespecWithoutItem,
     rulespec_registry,
     RulespecGroupCheckParametersNetworking,
+    Levels,
 )
 
 
 def _parameter_valuespec_checkpoint_fw_connections():
     return Dictionary(
         elements=[
-            ('levels_upper_absolute',
-             Tuple(
-                 title=_('Maximum number of firewall connections'),
-                 help=_('This rule sets upper limits to the current number of connections through '
-                        'a Checkpoint firewall.'),
-                 elements=[
-                     Integer(title=_('Warning at'), minvalue=0, unit=_('connections')),
-                     Integer(title=_('Critical at'), minvalue=0, unit=_('connections')),
-                 ])),
-            ('levels_lower_absolute',
-             Tuple(
-                 title=_('Minimum number of firewall connections'),
-                 help=_('This rule sets lower limits to the current number of connections through '
-                        'a Checkpoint firewall.'),
-                 elements=[
-                     Integer(title=_('Warning blow'), minvalue=0, unit=_('connections')),
-                     Integer(title=_('Critical below'), minvalue=0, unit=_('connections')),
-                 ])),
             ('admin_table_limit',
              Integer(
-                 title=_('Admin connection table limit'),
-                 help=_('This rule sets the maximum number of connections through the firewall. This is use full '
+                 title=_('Connection table limit'),
+                 help=_('This sets the maximum number of connections through the firewall. This is use full '
                         'if your firewall is set to automatic connection table limit and you still want '
-                        'relative metrics. This setting takes precedence over the the fwConnTableLimit '
-                        'configured on the firewall (only for monitoring purposes of curse). This value should match'
+                        'relative metrics. This setting takes precedence over the the onnection table limit '
+                        'configured on the firewall (only for monitoring purposes of curse). This value should match '
                         'the real values of your firewall, if not you might get relative values above 100%.'),
                  minvalue=0,
                  unit=_('connections'),
              )),
-            ('levels_upper_relative',
+            ('levels_upper_absolute',
+             Levels(
+                 title=_('Max. connections (Absolute)'),
+                 help=_('This sets the upper limits for the current number of connections through the firewall.'),
+                 unit=_('connections'),
+             )),
+            ('levels_lower_absolute',
              Tuple(
-                 title=_('Percentage of maximum connections (only used if a limit is defined on '
-                         'the Check Point device)'),
-                 help=_('This relative threshold can only be used if a maximum number is defined on '
-                        'the firewall side and then read from fwConnTableLimit. By default, this '
-                        'limit is not set in Check Point devices and this check than falls back to '
-                        'the absolute defaults or the ones defined above'),
+                 title=_('Min. connections (Absolute)'),
+                 help=_('This sets the lower limits for the current number of connections through the firewall. '
+                        '"Min. connections (Absolute)" will only be used if "Max. connections (Absolute)" is not using '
+                        'Predictive Levels.'),
                  elements=[
-                     Percentage(
-                         title=_('Warning at'), unit='%', minvalue=0.0, maxvalue=100.0, default_value=80.0),
-                     Percentage(
-                         title=_('Critical at'), unit='%', minvalue=0.0, maxvalue=100.0, default_value=90.0),
+                     Integer(title=_('Warning blow'), minvalue=0, unit=_('connections')),
+                     Integer(title=_('Critical below'), minvalue=0, unit=_('connections')),
                  ])),
+            ('levels_upper_relative',
+             Levels(
+                 title=_('Max. connections (Percentage)'),
+                 help=_('This relative threshold can only be used if a connection table limit is defined (on the '
+                        'firewall side or with the above "Connection table limit").By default, this limit is not '
+                        'set on Check Point devices.'),
+                 unit=_('%'),
+             )),
             ('levels_lower_relative',
              Tuple(
-                 title=_('Percentage of minimum connections (only used if a limit is defined on '
-                         'the Check Point device)'),
-                 help=_('This relative threshold can only be used if a maximum number is defined on '
-                        'the firewall side and then read from fwConnTableLimit. By default, this '
-                        'limit is not set in Check Point devices and this check than falls back to '
-                        'the absolute defaults or the ones defined above'),
+                 title=_('Min. connections (Percentage)'),
+                 help=_('This relative threshold can only be used if a maximum number is defined (on the '
+                        'firewall side or with the above "Connection table limit"). By default, this limit is not '
+                        'set on Check Point devices.'),
                  elements=[
                      Percentage(
                          title=_('Warning below'), unit='%', minvalue=0.0, maxvalue=100.0),
@@ -86,12 +78,11 @@ def _parameter_valuespec_checkpoint_fw_connections():
                          title=_('Critical below'), unit='%', minvalue=0.0, maxvalue=100.0),
                  ])),
         ],
-        # optional_keys=['levels_upper_relative'],
     )
 
 
 rulespec_registry.register(
-    CheckParameterRulespecWithItem(
+    CheckParameterRulespecWithoutItem(
         check_group_name='checkpoint_fw_connections',
         group=RulespecGroupCheckParametersNetworking,
         match_type='dict',
-- 
GitLab