From 323cf83c06630f675e65270c0a90b1c42b30ca00 Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Sat, 3 Jun 2023 18:16:41 +0200
Subject: [PATCH] update project

---
 agent_based/inv_juniper_hw_modules.py    |  13 ++---
 gui/views/inv_juniper_hw_modules.py      |  42 +++++++++++++++
 gui/wato/inv_juniper_hw_modules.py       |  65 +++++++++++++++++++++++
 inv_juniper_hw_modules-0.02-20230603.mkp | Bin 0 -> 2892 bytes
 inv_juniper_hw_modules.mkp               | Bin 2924 -> 2892 bytes
 packages/inv_juniper_hw_modules          |  11 ++--
 6 files changed, 119 insertions(+), 12 deletions(-)
 create mode 100644 gui/views/inv_juniper_hw_modules.py
 create mode 100644 gui/wato/inv_juniper_hw_modules.py
 create mode 100644 inv_juniper_hw_modules-0.02-20230603.mkp

diff --git a/agent_based/inv_juniper_hw_modules.py b/agent_based/inv_juniper_hw_modules.py
index 842c215..9ed6bb7 100644
--- a/agent_based/inv_juniper_hw_modules.py
+++ b/agent_based/inv_juniper_hw_modules.py
@@ -9,10 +9,11 @@
 #
 # inventory of juniper hardware modules
 #
+# 2023-06-03: moved gui files to ~/local/lib/chek_mk/gui/plugins/...
+# 2023-06-03: fixed KeyError: 'serial_number'
+#
 
-
-import time
-from typing import List, NamedTuple, Optional, Dict
+from typing import List, Dict
 
 from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
     StringTable,
@@ -31,7 +32,7 @@ def parse_inv_juniper_hw_modules(string_table: List[StringTable]) -> List[Dict]:
     modules = []
 
     jnx_contents_entry, jnx_box_anatomy, sys_uptime = string_table
-    sys_uptime = int(sys_uptime[0][0]) / 100  # change to seconds
+    # sys_uptime = int(sys_uptime[0][0]) / 100  # change to seconds
     # first entry in jnx_contents_entry is the chassis without data (?)
     if jnx_contents_entry[0][5:9] == ['', '', '', '0']:
         box_class, box_descr, box_serial_no, box_revision, box_installed = jnx_box_anatomy[0]
@@ -44,7 +45,7 @@ def parse_inv_juniper_hw_modules(string_table: List[StringTable]) -> List[Dict]:
         chassis_id, chassis_descr, chassis_clei_code, model in jnx_contents_entry:
 
         index = f'{container_index}.{l1_index}.{l2_index}.{l3_index}'
-        installed = time.ctime(time.time() - sys_uptime + (int(installed))) if installed != '0' else None
+        # installed = time.ctime(time.time() - sys_uptime + (int(installed))) if installed != '0' else None
 
         module = {}
         for key, value in [
@@ -76,7 +77,7 @@ def inventory_hw_modules(params, section: List[Dict]) -> InventoryResult:
 
     for module in section:
         # do not add parts without serial number
-        if allparts is False and module['serial_number'] is None:
+        if allparts is False and module.get('serial_number') is None:
             continue
 
         key_columns = {'index': module['index']}
diff --git a/gui/views/inv_juniper_hw_modules.py b/gui/views/inv_juniper_hw_modules.py
new file mode 100644
index 0000000..f3e92fd
--- /dev/null
+++ b/gui/views/inv_juniper_hw_modules.py
@@ -0,0 +1,42 @@
+#!/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-06-02
+#
+
+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({
+    '.hardware.juniper-hw-modules:': {'title': _('Modules'),
+                                      'keyorder': ['index', 'description', 'serial_number', 'revision', 'part_no', ],
+                                      'view': 'invmodules_of_host',
+                                      },
+    '.hardware.juniper-hw-modules:*.index': {'title': _('Index'), },
+    '.hardware.juniper-hw-modules:*.serial_number': {'title': _('Serial number')},
+    '.hardware.juniper-hw-modules:*.description': {'title': _('Description')},
+    '.hardware.juniper-hw-modules:*.revision': {'title': _('Revision'), },
+    '.hardware.juniper-hw-modules:*.installed_at': {'title': _('Installed at'), },
+    '.hardware.juniper-hw-modules:*.part_no': {'title': _('Part No'), },
+    '.hardware.juniper-hw-modules:*.chassis_id': {'title': _('Chassis ID'), },
+    '.hardware.juniper-hw-modules:*.chassis_descr': {'title': _('Chassis description')},
+    '.hardware.juniper-hw-modules:*.chassis_clei_code': {'title': _('Chassis CLEI code'), },
+    '.hardware.juniper-hw-modules:*.model': {'title': _('Model'), },
+    '.hardware.juniper-hw-modules:*.type': {'title': _('Type (OID)'), },
+})
+
+declare_invtable_view(
+    'invmodules',
+    '.hardware.juniper-hw-modules:',
+    _('Juniper Hardware Modules'),
+    _('Juniper Hardware Modules')
+)
diff --git a/gui/wato/inv_juniper_hw_modules.py b/gui/wato/inv_juniper_hw_modules.py
new file mode 100644
index 0000000..45e8666
--- /dev/null
+++ b/gui/wato/inv_juniper_hw_modules.py
@@ -0,0 +1,65 @@
+#!/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-06-02
+#
+
+from cmk.gui.i18n import _
+from cmk.gui.plugins.wato.utils import (
+    HostRulespec,
+    rulespec_registry,
+)
+from cmk.gui.valuespec import (
+    Dictionary,
+    FixedValue,
+    ListChoice,
+)
+
+from cmk.gui.plugins.wato.inventory import (
+    RulespecGroupInventory,
+)
+
+_removecolumns = [
+    ('chassis_clei_code', 'Chassis CLEI code'),
+    ('chassis_descr', 'Chassis description'),
+    ('chassis_id', 'Chassis ID'),
+    # ('installed_at', 'Installed at'),
+    ('model', 'Model'),
+    ('type', 'Type (OID)'),
+]
+
+
+def _valuespec_inv_juniper_hw_modules():
+    return Dictionary(
+        title=_('Juniper hardware inventory'),
+        elements=[
+            ('allparts',
+             FixedValue(
+                 True,
+                 title=_('Inventory parts without serial number'),
+                 totext=_(''),
+                 default_value=False,
+             )),
+            ('removecolumns',
+             ListChoice(
+                 title=_('List of columns to remove'),
+                 help=_('information to remove from inventory'),
+                 choices=_removecolumns,
+                 default_value=[
+                 ],
+             )),
+        ],
+    )
+
+
+rulespec_registry.register(
+    HostRulespec(
+        group=RulespecGroupInventory,
+        match_type="dict",
+        name="inv_parameters:inv_juniper_hw_modules",
+        valuespec=_valuespec_inv_juniper_hw_modules,
+    ))
diff --git a/inv_juniper_hw_modules-0.02-20230603.mkp b/inv_juniper_hw_modules-0.02-20230603.mkp
new file mode 100644
index 0000000000000000000000000000000000000000..fe2581d20b321de4a22b447ba15d945d096f0c15
GIT binary patch
literal 2892
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

literal 0
HcmV?d00001

diff --git a/inv_juniper_hw_modules.mkp b/inv_juniper_hw_modules.mkp
index db46a7256243cc2aa4207c7f7ff9ad26c2b4b300..fe2581d20b321de4a22b447ba15d945d096f0c15 100644
GIT binary patch
literal 2892
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

literal 2924
zcma*UXCM>|0{~#XWhG>karP>OjB`Th$T*x$R(JL$BWI7#S-I@d*;3Bx5HiosmK~0g
zc{cBvXWsY!`}I8!FN%hSu_ey_AF`_#0`BJT<?8L|3wH^Cd%kt>_i*$RmzI>4mIO&k
zOCTg9B_yRJJl(x1_N+aP7qplObrHQ{p($<7(L#W{rlEk$7>_KaZVa<8-29`qx&2o@
z9R=4PI)+zgJ3NVBCIIN^*w!_IsAL);yWr#gmaBz0&W6J)%$_|GNko$=r^z`YT)C?g
zb9o<5>HTUQ(cYf5>L0LdFLNXx#a3NCKxR;%<uAefj2iCRdurF$Wri20D_fnnqE3D_
z_YiD{t|V~^0cs$4^v-`kyG%bz1_e$92r;*26d0;pJG)6q(K?4AoPkV<ke7HUJ6zad
z{l|VHi*YT(pXt)ULa>M+j`nKYXAgL4IFRt|arXY+`-T%!_HPD^t2(2wU;`GHalDSp
zaJx72cK3NRfpYfr<5y^izdcIhcvCM|t(SS8zHRA&fJ)nOl*7UNXSqRGz=`&rsy6Jh
z&vscbbAxeir_;ii%SthsQA}$Vq1?m-v*9@kD%pR3e0WY^u5!(zQ8$lu<e-i%f$zk6
zp?$x#pZ=qWA?vlF_4AzgOS<FpdLN8bJr&AsAzC(8WB`36LfuMl9T~Wm+P>s%U~P8~
zTq2)5gRoz*U3W-TTt-Zx(L>~pc=F%TEAnZEhsqwgG0wrtmu$Y(ykCe)!Kn;w9^YsY
zZkWu+rzX#P&d(90w-*c4l>Q~<egD+oj{*4|EG#V!f`S8fLlo&teBenL^r7;HF}b~*
zvacmF&0fft3aE*!C0P$JC0RQSgmamLw=bU;g+7bY5nP`o>+@knxw)5zFC*MNfGZKh
z(wXFlPuCqi!(o8y+;pPQWot)=>F*m0mhlc*WeO~>t^xTnOFkTO%~I>18r*(Kb5MSG
zz^bUSR|3HWEK`O6n?xqK@7(SxYg9u-EDEE>PojoJA$Z@j2e7TZmxJ#ci@>U-Yk#(!
z50j{Xh|oj+wtw5yVH#E9dSN~GDA6qj(a7WTRodTHP>3@tMV?@s;o4GPlRMWgXLhJQ
zgK{*7oE?MBY4D=LU3(35Bc{!ftBST2W#jS6T7}3A5-P1JZFP2Co8mu5YCdP!{h+xR
zbyBN6Cw`pS63_Y$AEw>kz!G%vy<AOj8nGokxUhA!Fr+UQ+c4(MHo7l^;@cL48Wqxq
zAgkSL=5=+S*_s1K=SlA_Zh9<q)loQN@-h?=>mDgA$74mrgp4~f%loMAA;{zUBpQ!c
zBTVS&XbJcywZqu~-ZT$)o*^f&oyH+wct*;6)`e}OxlPrh<w1%+h`pLu4|G?&b;s7d
zDdo2?g7ec#5$3noj9>FKop}e&+iPUm`Q>T6D|_^AO79S@gs3e)<S}qZ#JZcoBG{*!
z<}L55`s0K^TC}A4EyzFp&kb$*fB2)-F39ZO@{6@4BB!<y7r}Z?l5S8y+RE(sk9t1u
zPCDLb#&dqgZ*@J<eFduvV03=p@q7=vgyL<aP11oeTOTY}&ZQ}3aYB641V7KRhRm}*
z-gtjE9jCgu`iNBR8!m+zd6i|Wo3a<U<Xkjf(x|qQ+nZ|2m3S!FzNtFK%`BBX$(42V
zx?bj$jx+9ftT<hD3Zy-l98-VwZrPZTY9*?gVi*(Nx}_Tuqr0fYzHZc7owy0^7>kRJ
zGYfi5by5T|($4>!xkGogd!!bA$6X)xAVM(A`l0&wE}KY<Wx}~@Y@b#cqZgoKQdBWd
z+}vg3=2KJbMN@H&ST(mwFM!<_c8>X4O=NKI@n}NYVoh!i4IY<ufhpZecmV6o%2Owl
ziL#ImdZ#Kc>~v^iT~CM@p&Nk~vCvS<lVrt8W>bBx2Y5c_FnpA(A8A(iO%Gw~Yl-3j
zx%pI1NBe7+r2S<INA38|llo+)ItnzFHeAR&)5<@~7?CZhoqeq8K<`U@`Qv0!oz<eb
zxVo^Cxw`f1JA^5VM`c5lIejMcFGw(>1-??%D+L^t{(k8WMPsIJd^m)|4fX^Hd0yxY
z<77p(R8AcYcV7MaPbMGLeR+?V%gn5P*3IT#L{n=E{%6N<{>M>mF-~*#bMxR5Y%@Qt
zss`7ru*I{(d?6XzwCs2KM$ifP93pTmo~5Zc^=MujElB&(+cb021IL&75aco`QMv~c
z!@Kf>6bt3dl#;Y7Dtmk;c}=WXG+1H`c@u=yz#P3iR)+ef6ahKhn0TY+58xQ^TQ;EG
zTH*1&Czl!yU&hmADH`ItVfa^EpeVe0$f1%W+~jpSa69{*wQy!uzHyxwo6tS%VUezW
zl)nQVVDKUmF8Y%v$hxyN4vd$k5B!d|m$Edoh2ZUEpN75Tp)}J>lv>lBf`)zJ?c87w
z$08?g<>g#F{d1?1diDDHXp0!v$Q$sNmn@y%trzeZ)Y4d%lJMMnesCA}i4sbaw#`ET
zEKB8B*Tw!S^RYu1XhJJ~fw|?%KQnBHBZH|HjM4+fm$*&4E25se-d7>2hjN0Nt2uus
zpSV;kwR?FdqqHi@X+C$|P{1%)Mkmx{Eq0>`TJx)SAI;!5ZMu9P)Sx!kVz~`GIpaBN
zx?6WIq6B+@pDC0zk-36*FUVPBT<ccGCB(6>t2k|RZlNnuN47vY-*k5xK89t_cs+ru
z#5}x8uoWcF4-pu;jWlKf&>VKLX%bidGBiZ9pOhLnvtvZH|ITc2<kVd$N*{Rj&@>m<
zb36RZDsXeM&^h2QAY`l7Zn=D+xIlrUSdcmjkV`Ehne{yT51SxX9cUcyqFs_f90sD8
zYm4K8>7+n9{JvqK_mBk_cGlqkwM^Yf-$rr@DwHoMB)je=i)E6}ndc-GZ>lFFbZ$ze
zr28-fWME(49nAPYQA6ZVrWZ0~7C(tPR<#jboUW3RV?klYU_zkinCTkG6bi}UK?Fk9
z6a$_<vl&deSHb+^$Ta13JueeXxp)vS@rI-~QuzKz2n+~ngN3xJyU`uwVm2&zf@ON`
zhu|tB@Ugnf`4D2g!}tZpW?>ll`dH$_8%`7(Tb)?BrK*WwBSg<O?J$`DXiQjTd&{5j
zX>NHE7DGD)%H-z}R8m$^*$H|Gam*pv`=h@=V@&$tET@psv<WIe!q@g{OQt}f2cA!=
z478wTH)SUrNUTtStcZmEII{MqIzhxJJy!p0(3Nx#Y$Rd@%?ec3PfBiAwa)r?hJWJv
zu0POkRUw+U0H-99R})lS$J#;|ibLhnEpL60<v_nuy@=rArH|&*Eq6b8ll?a%tGWSF
z8Ffc|{aN94mUHhc*X(E36Csjjzf<)Kudrd#SPoi)c$4gEai6Tu@b!HH`G$J6gZoDM
zr=Ptnu*!{#1o*+rJJBT2GH_)eHo7ZzEz&+LvGFCq2d#n5Hgb)07PR*<RUpu>4l6dN
zz}u|0Z|Is=*4cuG7lr7?hV`UoN!|~F=`6#D80BcEdi>kdZv!TT+TGwJ->mKFg2_KE
zrYG|(eG6wJ3c019Ud!#mG-pDTmNre(2T*USUk^@HdpWc<4-gyZdf&CZ1fqvHR!X{u
z>ZRMQM!)QpudCQ-b;+G<amw6sJ~?9=n%;M7vf@<l;Giz-ZN{1y9G8dgT&KR+p9#7B
zP`XArW5P0TBa%p)2WhsZq!NECZ{qu>@_4f8GWi3w1&QH}S6K~ArW~7ZZK%?1Ng5Me
z`Hrl3>VCgH+|u6!^W}&^xNiF}&{rWRC@K-aAB1?tG1gKQ!lpEK=zj6pw?M)NJl2vG
zkea(+(>v5hDYby;N@*MxC~)p4tG~>ilH0pTzNL<}BaReUYuZIW(KR;s|B)t$y!70A
KM2bKPivI$S6VCbo

diff --git a/packages/inv_juniper_hw_modules b/packages/inv_juniper_hw_modules
index 7f722a6..cb0413e 100644
--- a/packages/inv_juniper_hw_modules
+++ b/packages/inv_juniper_hw_modules
@@ -2,12 +2,11 @@
  'description': 'Inventory of Juniper networks hardware modules\n',
  'download_url': 'https://thl-cmk.hopto.org',
  'files': {'agent_based': ['inv_juniper_hw_modules.py'],
-           'web': ['plugins/views/inv_juniper_hw_modules.py',
-                   'plugins/wato/inv_juniper_hw_modules.py']},
+           'gui': ['views/inv_juniper_hw_modules.py',
+                   'wato/inv_juniper_hw_modules.py']},
  'name': 'inv_juniper_hw_modules',
- 'num_files': 3,
  'title': 'Juniper networks hardware inventory',
- 'version': '20220602.v.0.01',
- 'version.min_required': '2.0.0',
- 'version.packaged': '2021.09.20',
+ 'version': '0.02-20230603',
+ 'version.min_required': '2.1.0b1',
+ 'version.packaged': '2.1.0p21',
  'version.usable_until': None}
\ No newline at end of file
-- 
GitLab