From 25dff4ff6b1cd1c7b950f391aba67b32f43be204 Mon Sep 17 00:00:00 2001
From: OMD site cmk16x <thl-cmk@outlook.com>
Date: Fri, 3 Apr 2020 15:48:05 +0200
Subject: [PATCH] update project

---
 checks/iferrordetails                 | 251 ++++++++++++++++++++++++++
 iferrordetails.mkp                    | Bin 0 -> 3436 bytes
 packages/iferrordetails               |  11 ++
 web/plugins/metrics/iferrordetails.py | 145 +++++++++++++++
 4 files changed, 407 insertions(+)
 create mode 100644 checks/iferrordetails
 create mode 100644 iferrordetails.mkp
 create mode 100644 packages/iferrordetails
 create mode 100644 web/plugins/metrics/iferrordetails.py

diff --git a/checks/iferrordetails b/checks/iferrordetails
new file mode 100644
index 0000000..832242d
--- /dev/null
+++ b/checks/iferrordetails
@@ -0,0 +1,251 @@
+#!/usr/bin/python
+# -*- encoding: utf-8; py-indent-offset: 4 -*-
+#
+# Interface error details
+#
+# Author: Th.L.
+# Date  : 2020-04-03
+#
+# Monitor error details of ethernet like interfaces
+# Please use only for troubleshooting purposes
+#
+#
+# snmpwalk sample
+#
+# OMD[mysite]:~$ snmpwalk -v2c -c public isr-1100 -ObentU 1.3.6.1.2.1.10.7.10.1
+#
+#
+# OMD[mysite]:~$ snmpwalk -v2c -c public isr-1100 -m EtherLike-MIB 1.3.6.1.2.1.10.7.10.1
+#
+#
+# sample info
+#
+
+
+
+factory_settings['iferrordetails_defaults'] = {
+    'notFound': 3,
+}
+
+
+###########################################################################
+#
+#  DATA Parser function
+#
+###########################################################################
+
+
+def parse_iferrordetails(info):
+    def get_dot3StatsDuplexStatus(st):
+        name = {
+            1: 'unknown',
+            2: 'half duplex',
+            3: 'full duplex',
+        }
+        if st.isdigit():
+            return name.get(int(st), 'unkown')
+        else:
+            return 'no digit'
+
+    def get_dot3StatsRateControlAbility(st):
+        name = {
+            1: 'capable',
+            2: 'non capable',
+        }
+        if st.isdigit():
+            return name.get(int(st), 'unkown')
+        else:
+            return 'no digit'
+
+    def get_dot3StatsRateControlStatus(st):
+        name = {
+            1: 'off',
+            2: 'on',
+            3: 'unkown',
+        }
+        if st.isdigit():
+            return name.get(int(st), 'unkown')
+        else:
+            return 'no digit'
+
+    def get_ifOperStatus(st):
+        name = {
+            1: 'up',
+            2: 'down',
+            3: 'testing',
+            4: 'unknown',
+            5: 'dormant',
+            6: 'notPresent',
+            7: 'lowerLayerDown',
+        }
+        if st.isdigit():
+            return name.get(int(st), 'unkown')
+        else:
+            return 'no digit'
+
+
+    def get_short_if_name(st):
+        names = {'ethernet': 'Eth',
+                 'fastethernet': 'Fa',
+                 'gigabitethernet': 'Gi',
+                 'tengigabitethernet': 'Te',
+                 'fortygigabitethernet': 'Fo',
+                 'hundredgigabitethernet': 'Hu',
+                 'port-channel': 'Po',
+                 'tunnel': 'Tu',
+                 'loopback': 'Lo',
+                 'wlan-gigabitethernet': 'Wlan-Gi',
+                 }
+        for item in names.keys():
+            if st.lower().startswith(item):
+                st = st.lower().replace(item, names.get(item))
+        return st
+
+    errorDetailsList, interfaces = info
+
+    parsed = {}
+
+    for entry in errorDetailsList:
+        ifIndex, dot3StatsAlignmentErrors, dot3StatsFCSErrors, dot3StatsSingleCollisionFrames, \
+        dot3StatsMultipleCollisionFrames, dot3StatsSQETestErrors, dot3StatsDeferredTransmissions, \
+        dot3StatsLateCollisions, dot3StatsExcessiveCollisions, dot3StatsInternalMacTransmitErr, \
+        dot3StatsCarrierSenseErrors, dot3StatsFrameTooLongs, dot3StatsInternalMacReceiveErrors, \
+        dot3StatsSymbolErrors, dot3StatsDuplexStatus, dot3StatsRateControlAbility, \
+        dot3StatsRateControlStatus = entry
+
+        for interface in interfaces:
+            if ifIndex == interface[0]:
+                ifIndex, ifName, ifOperStatus = interface
+
+        if int(ifOperStatus) != 1:
+            dot3StatsDuplexStatus ='interface not up'
+        else:
+            dot3StatsDuplexStatus = get_dot3StatsDuplexStatus(dot3StatsDuplexStatus)
+
+
+
+        errorsDetails = {
+            'dot3StatsAlignmentErrors': int(dot3StatsAlignmentErrors),
+            'dot3StatsFCSErrors': int(dot3StatsFCSErrors),
+            'dot3StatsSingleCollisionFrames': int(dot3StatsSingleCollisionFrames),
+            'dot3StatsMultipleCollisionFrames': int(dot3StatsMultipleCollisionFrames),
+            'dot3StatsSQETestErrors': int(dot3StatsSQETestErrors),
+            'dot3StatsDeferredTransmissions': int(dot3StatsDeferredTransmissions),
+            'dot3StatsLateCollisions': int(dot3StatsLateCollisions),
+            'dot3StatsExcessiveCollisions': int(dot3StatsExcessiveCollisions),
+            'dot3StatsInternalMacTransmitErr': int(dot3StatsInternalMacTransmitErr),
+            'dot3StatsCarrierSenseErrors': int(dot3StatsCarrierSenseErrors),
+            'dot3StatsFrameTooLongs': int(dot3StatsFrameTooLongs),
+            'dot3StatsInternalMacReceiveErrors': int(dot3StatsInternalMacReceiveErrors),
+            'dot3StatsSymbolErrors': int(dot3StatsSymbolErrors),
+            'dot3StatsDuplexStatus': dot3StatsDuplexStatus,
+            'dot3StatsRateControlAbility': get_dot3StatsRateControlAbility(dot3StatsRateControlAbility),
+            'dot3StatsRateControlStatus': get_dot3StatsRateControlStatus(dot3StatsRateControlStatus),
+            'ifOperStatus': get_ifOperStatus(ifOperStatus),
+        }
+
+        parsed.update({'{}'.format(get_short_if_name(ifName)): errorsDetails})
+
+    return parsed
+
+
+###########################################################################
+#
+#  INVENTORY function
+#
+###########################################################################
+
+
+def inventory_iferrordetails(parsed):
+    for entry in parsed.keys():
+        yield entry, {}
+
+
+###########################################################################
+#
+#  CHECK function
+#
+###########################################################################
+
+
+def check_iferrordetails(item, params, parsed):
+
+    if item in parsed.keys():
+
+        errorDetails = parsed[item]
+        longoutput = ''
+        infotext = ''
+        perfdata = []
+        state = 0
+
+        infotext += 'Interface state: {}'.format(errorDetails['ifOperStatus'])
+        if errorDetails['ifOperStatus'].lower() == 'up':
+            infotext += ', duplex state: {}'.format(errorDetails['dot3StatsDuplexStatus'])
+
+        longoutput += '\nRate control: {}'.format( errorDetails['dot3StatsRateControlAbility'])
+        longoutput += '\nRate control state: {}'.format(errorDetails['dot3StatsRateControlStatus'])
+
+        perfdata = [
+            ('dot3statsalignmenterrors', errorDetails['dot3StatsAlignmentErrors']),
+            ('dot3statsfcserrors', errorDetails['dot3StatsFCSErrors']),
+            ('dot3statssinglecollisionframes', errorDetails['dot3StatsSingleCollisionFrames']),
+            ('dot3statsmultiplecollisionframes', errorDetails['dot3StatsMultipleCollisionFrames']),
+            ('dot3statssqetesterrors', errorDetails['dot3StatsSQETestErrors']),
+            ('dot3statsdeferredtransmissions', errorDetails['dot3StatsDeferredTransmissions']),
+            ('dot3statslatecollisions', errorDetails['dot3StatsLateCollisions']),
+            ('dot3statsexcessivecollisions', errorDetails['dot3StatsExcessiveCollisions']),
+            ('dot3statsinternalmactransmiterr', errorDetails['dot3StatsInternalMacTransmitErr']),
+            ('dot3statscarriersenseerrors', errorDetails['dot3StatsCarrierSenseErrors']),
+            ('dot3statsframetoolongs', errorDetails['dot3StatsFrameTooLongs']),
+            ('dot3statsinternalmacreceiveerrors', errorDetails['dot3StatsInternalMacReceiveErrors']),
+            ('dot3statssymbolerrors', errorDetails['dot3StatsSymbolErrors']),
+        ]
+
+        yield state, infotext + longoutput, perfdata
+
+    else:
+        yield params['notFound'], 'item missing'
+
+
+###########################################################################
+#
+#  CHECK info
+#
+###########################################################################
+
+
+check_info['iferrordetails'] = {
+    'check_function': check_iferrordetails,
+    'inventory_function': inventory_iferrordetails,
+    'service_description': 'Error details %s',
+    'has_perfdata': True,
+    'snmp_scan_function': lambda oid: oid('.1.3.6.1.2.1.10.7.10.1.1') != '',  # EtherLike-MIB::dot3PauseAdminMode
+    'group': 'iferrordetails',
+    'default_levels_variable': 'iferrordetails_defaults',
+    'parse_function': parse_iferrordetails,
+    'snmp_info': [('.1.3.6.1.2.1.10.7.2.1', [  # EtherLike-MIB::dot3StatsEntry
+                    OID_END,  # ifIndex
+                    '2',  # dot3StatsAlignmentErrors(2)
+                    '3',  # dot3StatsFCSErrors(3)
+                    '4',  # dot3StatsSingleCollisionFrames(4)
+                    '5',  # dot3StatsMultipleCollisionFrames(5)
+                    '6',  # dot3StatsSQETestErrors(6)
+                    '7',  # dot3StatsDeferredTransmissions(7)
+                    '8',  # dot3StatsLateCollisions(8)
+                    '9',  # dot3StatsExcessiveCollisions(9)
+                    '10',  # dot3StatsInternalMacTransmitErrors(10)
+                    '11',  # dot3StatsCarrierSenseErrors(11)
+                    '13',  # dot3StatsFrameTooLongs(13)
+                    '16',  # dot3StatsInternalMacReceiveErrors(16)
+                    '18',  # dot3StatsSymbolErrors(18)
+                    '19',  # dot3StatsDuplexStatus(19)
+                    '20',  # dot3StatsRateControlAbility(20)
+                    '21',  # dot3StatsRateControlStatus(21)
+                  ]),
+                  ('.1.3.6.1.2.1.2.2.1', ['1',  # ifIndex
+                                          '2',  # ifDescr
+                                          '8',  # ifOperStatus
+                                          ]),
+                  ]
+}
+
diff --git a/iferrordetails.mkp b/iferrordetails.mkp
new file mode 100644
index 0000000000000000000000000000000000000000..b218b10a4d2172fb0658777290403f111446efaa
GIT binary patch
literal 3436
zcma)*XFD4T13>NKsu831s@NmeHLCF_MX41dxQ*0aiCsHfl-d>4XlvGrpjNF=O|2T0
z)~MJk)My(srAFTS6W;Und_6}jgPA!O{LF=p>g(kh5)v5V;Th)YiwIRx1F3;P8X$G$
zaF8-cSydV7A4KyLh74Wo;-Yw8vA&*SuXd=szc&PqIKsaxaj6N<l@7QgQf6#uo-_DT
zGK#^+BriBV=9aizuDE!b&K*myg9)kdr^`cb2`E}Q@g{u^_ELenAACS-`m`H_6`S~=
z$EPOr{xkZm$cu7symu1)%$+l)RF)@_PfI;=hVWP7XKvc6FeY?xqT6P)uglB2`-LtM
zJw3SK9qm-iErtlKwtus0@%6|s!B0i5YFSG;Jqd*QCc4#X1EZXMTj9?oa?;EuHk=g#
zHQD=U_!Wm}IJ2?pB};5z*7g_EH{$P4K~7AxPp%kQH)YwFr5}jllgNyd2!M%bn46;9
z&C$_y*ZNo8Z1)6<4BFRbLT{01=5M+83{Kyn>}Rb{b^|c%!~D#l{2XTmw#hENL8y?f
zj~XGhq~;0F6o2>2Pdx`Eyk6<dkSN>UmmY$|AM|?=j?n4XeV-pfI+(xXMz|gze28~(
zb3!M7wo!y1#SSg=kGij=KK2g<JoV1}riMH|qjVW@>rUVCM!$PL;S!0^`=w4*KI=b+
z1I|=-seKh|RENOF{#2^;^(slBljZ$1L*c(=TAxdlzY0fKs~>7iT1)#R4wTm*PU(Wx
zVSN_juF6AT0I>p?_Mib7Vd{3Ww9el>w#sj#S_N|UG+poU1TTAlOE_dg+dX8LzP^l7
zzpxAPTnQBg2@G+MjBjs}i>Mxa76%E1M^p(a>>%D>d*+&|WKHSwE{osy0X>Y%{)53F
z_IG^pKgX{oKKj!3r*FM8o61Ss@b$Y=cI%s~8$;MKc6WftO3$@xS4#Q5mP^I2vL5D(
z>BmeqOzHf(WKk+(@_y4kq1g(DkF^BdHJ~>pMl!Ocmya)6M#<_M=;aLb6GYOv63ba#
zTNj1GVo;U^!-K6fJQG|s=ECPil7zm2<Wv^DCy7$~434S&tYX4sb}nz;=%RSa_1>k|
zJ89*i%{=Orgv{>BqU}scV(LGH63Id%nC!#ox{GVRi32N-Vw5S3VwqFTtom~z++o2A
zS*#F-XNqP?`r*=dwePT=_AB*8z(F7lKLet(^h0~I0e1_fWa3~c?JnzmP;}P&16|?)
z{U7O6l!F@OPL>Jh@!sx-Q={*-bG183++4yHQ9rDl=sc9Hh*ocC-3=x7-65i38S}NM
zk2l7B_=+scy>{X&*@53x9S_tmG^Lg9*{U%)<Rdck@rkXv6mo2xc;?jKbn}S7jmS`q
zO+fNDaQmb?0owr%hztFmYCR29k652_FyKyMp4L9<hDfu~3>y{qh%~WJ*Yrt@h~gn$
zMZSZ{LN~ir!HMRjjNq>9i0J)jWf<8v7sIW)h5+Q9B|NWhT-`1ASE5gi%ROXz@3C!*
z?8hGBj(<yJ?<rkctF1ZB@)C38q!sB{l<2E3*t+X{w$AK)1P<+u^o@$v%r?0+qVe>D
z=H6Lvj>#X#fa-?VX+<qE4`XL1p9(B|f(R|P8=l-6F4C(hy7QE8cSRf0nv4qySO#pZ
zK9U0ty?=TpI3DxNrU6I_q?0=bOtB!2rP%rhAt{`sh+6ZJ->UIr#|FxU!vgqskJu5+
z1OE_<Rdda|Gj9+Mae&X)pTUKT@^I6JR+<i8(vrvZ#GPL0jdZgDA$Vb9$LOA!ndqY)
zgsMYAL4vg-6Js{>GtvCNU-#xw2B6aJ1gLuth1sG&m=N{-!6Yt><tI<)i?@053EW3g
zI_?T&)$@O|SYs8O+g#J!ELmMn_*nl7vOTS&wiI^&{Sb{WGOgJ9JYPHJT_!Fb$?1QW
z;2A^G;u3Paan-Z?*f5GwGhN8cC)A1B)s@0&ySpjew)EV44!xQ8!koXY_qn;~Z`<?x
zT(`>bj|ck-JC6W!5xolDFDdx^97@o(5&ADxz6%EE%|YWZ5r#tA8Q+j|u|u9DK>=*l
zGpqes<eGh!wX7ej7<3wE=L3}ZXts`hV-uca(a4b@4fo}>GKJoZzS6Dj+0DYbG&{Nc
zx)dR%Tus>W$Ombq2bbL6mvj}nIuUHOf6y}n+IffOparlco^$}eD0m<+($!@hLRpVc
zzx<?5-<geR+66FuP0w<kUHT<Eh=_&oH2Ye&n!%tvw}Fs!yR$A?JA;~U?fm@mf_y?R
zB&$@7c!2*2#T!C44&C;0Mt~xt2LM2|c9ax1a14`w536d$<5+F2LUhY)P+V}^1Scsb
zPb&>5e#Oi=Nt`$oI8|8mjj`I$GJHzvOzadKHTc-nxKz+V5fwpdEVsl!w9@)`2Eye#
z+ZE)JPu-mQ&owa~6WXs0;EgK7g(d^9+h7bx`wX&FWBa1aR@Vj5l2kowCwZhJn%Il_
z{Wc?Fj;w$EJxVO0>-ugL9fij<k}Wq=QAyt%2=_B?$%o;HuYh(UE(+j2i^;fd?Td@!
zg`|FBogQH0g=XfW6PkU&u?Ee{>zk&+U-P=_xVI!{8Ps%`GMv=KGpLd26dXvZX2cH2
zT`R`2{)J-CASPG^h6pr2DMzTR_}k4>*)GqI9W0{~S=p^;4r_k+Z-%!dE*KXfA2^;4
zQ>gczKxeA+z>5o*bUnK4#hb;uMI<<i&+Lmv8W1>YD&Y(e|0`)lK0f{mi*M0R-N-Cx
z__hIXR2dwV@05~ExXBAk<6U!1t!6AfmYWAEsW5bYlIVT;%InFX9%eFMZHsq<?;P9S
zyokGDkMBaV^}ABU{R;1nX>RgGwYBfOsUEYIgSwaopvn03m)k=nkY;Pk0CZ|wVvtx%
zD_v*?LaVXZVNyerxvkx~w{mT1YCr?S%Yx;Nu&As$TG|F8etr=@i1fu!@*#{pWlEJ*
zaZA;2Th*33N~2u6Lv?PMPgk}F8-Dt!H}ixwxR+D#&MW2uu!}r0jr&?EVTJTIXIMmb
z-|>iqU54`$pc++yeWe|bO*0rdVOI-|*TaexWA%KpFi%ZmxA5C4BdjO&f=XKnG;w6h
z!>Y?G-Ob7qvy<miC_7(85w+26)}5v|{N9O|_S&>6M;RqClY8OY<sV8)n){to<WM6%
z&P?$IZXfO$z8wn$T3Hg^F4hJa$|fC};&~^6rZy#69gD>;qJ>u-rO0A3qVJ!bYIH|P
z7WNC)gGhn$wv(jKF0TBoP}GoX+XD~ykGw2`*J^{|e{TU>a`X@H0ea(Oz}=A%la0CH
zw%jR!a5o)$K;S%52M%9btlD>g<5fAet46ytt%Eoi1MXKMZ}MK=Zu#w|i_GGAWI|V{
z;nb1Mvot~%p>w+<n-`(~7a})v?vE4R|CGTi3heIQ5iKuJApYj%JLiIGw<g6*w{SnF
z`dQbkne;-4)i}hW0JwlFa(6BmTPpA&PtilnJ$?UaZzuVtG^({AF~!r_NKEoj?<>z$
z$XRn6(Y0zBkwFvU5sWV>Yddp!cC5WQ@!Lm}xJ57A_BK}7=l|vMapZ?iLd^LlzUe~j
zr@`s<$jVyXTXOs*A2Dife|oZ?bZs&Y7IdD!<WPFGOw|^gH$+i4J3oZ3P*bPwC+FVp
zpgzg5it52`%e4uV;=sl&WXMtb$b_GWY0PN|pQDazTxv1Xu2lFLOouC6FEA^1BAcN7
zRd9KjhyNGIKq?z_+q*M(3TTYRIZh!Md-H+EZ77VS)~>|+Sr`;GX%%Jp3I<Z?zY$jn
zUc4f5Rc*_>`;CTb&%w}A`q;kbc0+PxGmiS{g^QC4y<M1y$!;&j<xiniBvfk53PHZ@
z6#NZ0l@#O^BldMem7M-?9`h5$U~Uxytx}jolBW~)K1Eb>jE??9k;d6$p;t9w;V~+!
za%GeiFZ9vw&zFC5WyeA1A`UMpF5|ecwF@+yaIvAII==mbz4)`hVWBxXO?S$0anI*b
z>d|QY6m9iLl_w&5rzV0yU>B{EG)v2bwaWD63~Z7}j*m1LjJ!Fn>!B3_{#9!!I>DRX
zt8-xoXT)W*9({UiEu&+d`S*-0a24JeC$elOU|0bQe|-LXN2|^g2l-~>!)TOhGg~&|
zDgq-#nN`?^e-eCw`3*(dnP^H7<idI$DzDDx{A|pGjc<8$+f;nrwmX}{*pJ`j6|k>x
zGR|tUB(&-@^ndu_JSjUmS}%*Xmb7$+W1W>9EqCi>$5J1w0}f&={OZ&$$K(`m(XckI
z@X4rd)de;>mpazpwrd;l^;4K4^d8*T!j7*cAa!q{xs{!4j&e0wcz};Mz%n)5Da5jO
zW=w>_1X4W1xMEp>(+~DM<2WJw%A$owq;-QpvO2X9MJaefw1YmK<*azm*pMyyQ4_A|
zXs;DL%W2cyj%9j#8QmmEmmd){n<LTZiJjcz`Ze`O_jJg=ZEqs}+_?epo&TQgg{Ql1
l57O<Q>VPkdw(C2LhIw(b)fN9QhXb3`@fc=5nsOSN{{i-=w~qh-

literal 0
HcmV?d00001

diff --git a/packages/iferrordetails b/packages/iferrordetails
new file mode 100644
index 0000000..b6373da
--- /dev/null
+++ b/packages/iferrordetails
@@ -0,0 +1,11 @@
+{'author': u'Th.L. (thl-cmk[at]outlook[dot]com)',
+ 'description': u'Monitors interfaces error details\nPlease use only for troubleshooting purposes',
+ 'download_url': 'https://thl-cmk.hopto.org',
+ 'files': {'checks': ['iferrordetails'],
+           'web': ['plugins/metrics/iferrordetails.py']},
+ 'name': 'iferrordetails',
+ 'num_files': 2,
+ 'title': u'CInterface error details',
+ 'version': '20200403.v0.0.1',
+ 'version.min_required': '1.2.8b8',
+ 'version.packaged': '1.6.0p8'}
\ No newline at end of file
diff --git a/web/plugins/metrics/iferrordetails.py b/web/plugins/metrics/iferrordetails.py
new file mode 100644
index 0000000..80fb0dd
--- /dev/null
+++ b/web/plugins/metrics/iferrordetails.py
@@ -0,0 +1,145 @@
+#!/usr/bin/python
+# -*- encoding: utf-8; py-indent-offset: 4 -*-
+#
+# Interface error details metrics plugin
+#
+# Author: Th.L.
+# Date  : 2020-04-03
+#
+
+#####################################################################################################################
+#
+# define units
+#
+#####################################################################################################################
+
+
+######################################################################################################################
+#
+# map perfdata to metric, not really necessary but makes sure to use the right metrics
+#
+######################################################################################################################
+
+
+check_metrics['check_mk-iferrordetails'] = {
+    'dot3statsalignmenterrors': {'name': 'iferrordetails_dot3statsalignmenterrors',},
+    'dot3statsfcserrors': {'name': 'iferrordetails_dot3statsfcserrors',},
+    'dot3statssinglecollisionframes': {'name': 'iferrordetails_dot3statssinglecollisionframes',},
+    'dot3statsmultiplecollisionframes': {'name': 'iferrordetails_dot3statsmultiplecollisionframes',},
+    'dot3statssqetesterrors': {'name': 'iferrordetails_dot3statssqetesterrors',},
+    'dot3statsdeferredtransmissions': {'name': 'iferrordetails_dot3statsdeferredtransmissions',},
+    'dot3statslatecollisions': {'name': 'iferrordetails_dot3statslatecollisions',},
+    'dot3statsexcessivecollisions': {'name': 'iferrordetails_dot3statsexcessivecollisions',},
+    'dot3statsinternalmactransmiterr': {'name': 'iferrordetails_dot3statsinternalmactransmiterr',},
+    'dot3statscarriersenseerrors': {'name': 'iferrordetails_dot3statscarriersenseerrors',},
+    'dot3statsframetoolongs': {'name': 'iferrordetails_dot3statsframetoolongs',},
+    'dot3statsinternalmacreceiveerrors': {'name': 'iferrordetails_dot3statsinternalmacreceiveerrors',},
+    'dot3statssymbolerrors': {'name': 'iferrordetails_dot3statssymbolerrors',},
+}
+
+#####################################################################################################################
+#
+# define metrics for perfdata
+#
+#####################################################################################################################
+
+
+metric_info['iferrordetails_dot3statsalignmenterrors'] = {
+    'title' : _('Alignment errors'),
+    'unit'  : 'count',
+    'color' : '11/a',
+}
+metric_info['iferrordetails_dot3statsfcserrors'] = {
+    'title' : _('FCS errors'),
+    'unit'  : 'count',
+    'color' : '12/a',
+}
+metric_info['iferrordetails_dot3statssinglecollisionframes'] = {
+    'title' : _('Single collision frames'),
+    'unit'  : 'count',
+    'color' : '13/a',
+}
+metric_info['iferrordetails_dot3statsmultiplecollisionframes'] = {
+    'title' : _('Multiple collision frames'),
+    'unit'  : 'count',
+    'color' : '14/a',
+}
+metric_info['iferrordetails_dot3statssqetesterrors'] = {
+    'title' : _('sqe test errors'),
+    'unit'  : 'count',
+    'color' : '15/a',
+}
+metric_info['iferrordetails_dot3statsdeferredtransmissions'] = {
+    'title' : _('Deferred transmissions'),
+    'unit'  : 'count',
+    'color' : '16/a',
+}
+metric_info['iferrordetails_dot3statslatecollisions'] = {
+    'title' : _('Late collisions'),
+    'unit'  : 'count',
+    'color' : '21/a',
+}
+metric_info['iferrordetails_dot3statsexcessivecollisions'] = {
+    'title' : _('Excessive collisions'),
+    'unit'  : 'count',
+    'color' : '22/a',
+}
+metric_info['iferrordetails_dot3statsinternalmactransmiterr'] = {
+    'title' : _('internal MAC transmit errors'),
+    'unit'  : 'count',
+    'color' : '23/a',
+}
+metric_info['iferrordetails_dot3statscarriersenseerrors'] = {
+    'title' : _('Sarrier sense errors'),
+    'unit'  : 'count',
+    'color' : '24/a',
+}
+metric_info['iferrordetails_dot3statsframetoolongs'] = {
+    'title' : _('Frame too long'),
+    'unit'  : 'count',
+    'color' : '25/a',
+}
+metric_info['iferrordetails_dot3statsinternalmacreceiveerrors'] = {
+    'title' : _('Internal MAC receive errors'),
+    'unit'  : 'count',
+    'color' : '26/a',
+}
+metric_info['iferrordetails_dot3statssymbolerrors'] = {
+    'title' : _('Symbol errors'),
+    'unit'  : 'count',
+    'color' : '31/a',
+}
+
+
+######################################################################################################################
+#
+# how to graph perdata
+#
+######################################################################################################################
+
+graph_info.append({
+    'title': _('Interface error details'),
+    'metrics': [
+        ('iferrordetails_dot3statsalignmenterrors', 'line'),
+        ('iferrordetails_dot3statsfcserrors', 'line'),
+        ('iferrordetails_dot3statssinglecollisionframes', 'line'),
+        ('iferrordetails_dot3statsmultiplecollisionframes', 'line'),
+        ('iferrordetails_dot3statssqetesterrors', 'line'),
+        ('iferrordetails_dot3statsdeferredtransmissions', 'line'),
+        ('iferrordetails_dot3statslatecollisions', 'line'),
+        ('iferrordetails_dot3statsexcessivecollisions', 'line'),
+        ('iferrordetails_dot3statsinternalmactransmiterr', 'line'),
+        ('iferrordetails_dot3statscarriersenseerrors', 'line'),
+        ('iferrordetails_dot3statsframetoolongs', 'line'),
+        ('iferrordetails_dot3statsinternalmacreceiveerrors', 'line'),
+        ('iferrordetails_dot3statssymbolerrors', 'line'),
+    ],
+})
+
+
+######################################################################################################################
+#
+# define perf-o-meter
+#
+######################################################################################################################
+
-- 
GitLab