From 554905ad503c0ca09a65fcf142f207fa4e9f5cf4 Mon Sep 17 00:00:00 2001
From: "Th.L" <thl-cmk@outlook.com>
Date: Mon, 22 Mar 2021 13:54:46 +0100
Subject: [PATCH] update project

---
 agent_based/cisco_asa_sensors.py | 175 ++++++++++++++++---------------
 cisco_asa_sensors.mkp            | Bin 3383 -> 3560 bytes
 packages/cisco_asa_sensors       |   2 +-
 3 files changed, 92 insertions(+), 85 deletions(-)

diff --git a/agent_based/cisco_asa_sensors.py b/agent_based/cisco_asa_sensors.py
index 03e7c20..fb528a4 100644
--- a/agent_based/cisco_asa_sensors.py
+++ b/agent_based/cisco_asa_sensors.py
@@ -1,7 +1,8 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
-#
-# License: GNU General Public License v2
+# Copyright (C) 2019 tribe29 GmbH - License: GNU General Public License v2
+# This file is part of Checkmk (https://checkmk.com). It is subject to the terms and
+# conditions defined in the file COPYING, which is part of this source code package.
 #
 # Author: thl-cmk[at]outlook[dot]com
 # URL   : https://thl-cmk.hopto.org
@@ -10,7 +11,7 @@
 # Monitor Cisco ASA Sensors (Temperature, Fan and Power supply)
 #
 # 2021-03-21: fixed params in cisco_asa_fan, removed params from cisco_asa_power
-#
+# 2021-03-22: code improvements
 #
 # sample snmpwalk
 # .1.3.6.1.2.1.47.1.1.1.1.7.1 = STRING: "Chassis"
@@ -117,7 +118,8 @@
 #  'power': {}}
 #
 
-from typing import Dict, List, NamedTuple
+
+from typing import Dict, List, NamedTuple, Mapping
 
 from .agent_based_api.v1.type_defs import (
     DiscoveryResult,
@@ -135,6 +137,12 @@ from .agent_based_api.v1 import (
     startswith,
 )
 
+from .utils.temperature import (
+    check_temperature,
+    TempParamType,
+    to_celsius,
+)
+
 
 # ##################################################################################################
 #
@@ -145,61 +153,70 @@ from .agent_based_api.v1 import (
 
 class CiscoAsaSensor(NamedTuple):
     value: float
-    status: State
+    state: State
     state_readable: str
     unit: str
 
 
-def parse_cisco_asa_sensors(string_table: List[StringTable]) -> Dict:
-    def get_state_readable(st: str) -> str:
-        states = {
-            '1': 'Ok',
-            '2': 'unavailable',
-            '3': 'nonoperational',
-        }
-        return states.get(st, st)
-
-    def get_sensor_status(st: str) -> State:
-        states = {
-            '1': State.OK,
-            '2': State.WARN,
-            '3': State.CRIT
-        }
-        return states.get(st, State.CRIT)
-
-    sensors: dict = {
-        'fan': {},
-        'temp': {},
-        'power': {},
+class CiscoAsaPowerSensor(NamedTuple):
+    state: State
+    state_readable: str
+
+
+class CiscoasaSensors(NamedTuple):
+    fan: Mapping[str, CiscoAsaSensor]
+    temp: Mapping[str, CiscoAsaSensor]
+    power: Mapping[str, CiscoAsaPowerSensor]
+
+
+def get_state_readable(st: str) -> str:
+    states = {
+        '1': 'Ok',
+        '2': 'unavailable',
+        '3': 'nonoperational',
+    }
+    return states.get(st, st)
+
+
+def get_sensor_state(st: str) -> State:
+    states = {
+        '1': State.OK,
+        '2': State.WARN,
+        '3': State.CRIT
     }
+    return states.get(st, State.CRIT)
+
+
+def parse_cisco_asa_sensors(string_table: List[StringTable]) -> CiscoasaSensors:
+    temp = {}
+    fan = {}
+    power = {}
 
     for sensorname, sensortype, sensorvalue, sensorstatus, sensorunits in string_table[0]:
         if sensorname != '':  # for asa context, there are no real sensors.
             if sensortype == '8':  # Temperature
-                sensors['temp'].update({sensorname.replace('Temperature ', ''): CiscoAsaSensor(
+                temp.update({sensorname.replace('Temperature ', ''): CiscoAsaSensor(
                     value=to_celsius(float(sensorvalue), sensorunits),
                     unit=sensorunits,
-                    status=get_sensor_status(sensorstatus),
+                    state=get_sensor_state(sensorstatus),
                     state_readable=get_state_readable(sensorstatus),
                 )})
 
             if sensortype == '10':  # Fan
-                sensors['fan'].update({sensorname.replace('Fan ', ''): CiscoAsaSensor(
+                fan.update({sensorname.replace('Fan ', ''): CiscoAsaSensor(
                     value=int(sensorvalue),
                     unit=sensorunits,
-                    status=get_sensor_status(sensorstatus),
+                    state=get_sensor_state(sensorstatus),
                     state_readable=get_state_readable(sensorstatus),
                 )})
 
             if sensortype == '12':  # Power supply
-                sensors['power'].update({sensorname.replace('Power ', ''): CiscoAsaSensor(
-                    value=0,
-                    unit='',
-                    status=get_sensor_status(sensorstatus),
+                power.update({sensorname.replace('Power ', ''): CiscoAsaPowerSensor(
+                    state=get_sensor_state(sensorstatus),
                     state_readable=get_state_readable(sensorstatus),
                 )})
 
-    return sensors
+    return CiscoasaSensors(temp=temp, fan=fan, power=power)
 
 
 register.snmp_section(
@@ -220,40 +237,34 @@ register.snmp_section(
     detect=startswith('.1.3.6.1.2.1.1.1.0', 'cisco adaptive security appliance')
 )
 
+
 # ##################################################################################################
 #
 # ASA SENSORS TEMPERATURE
 #
 # ##################################################################################################
 
-from .utils.temperature import (
-    check_temperature,
-    TempParamType,
-    to_celsius,
-)
-
 
-def discovery_cisco_asa_temp(section: Dict) -> DiscoveryResult:
-    for key in section['temp']:
-        yield Service(item=key)
+def discovery_cisco_asa_temp(section: CiscoasaSensors) -> DiscoveryResult:
+    yield from (Service(item=item) for item in section.temp.keys())
 
 
-def check_cisco_asa_temp(item, params: TempParamType, section) -> CheckResult:
+def check_cisco_asa_temp(item, params: TempParamType, section: CiscoasaSensors) -> CheckResult:
     try:
-        sensor = section['temp'][item]
-
-        yield Result(state=sensor.status, summary='Status: %s' % sensor.state_readable)
-
-        yield from check_temperature(
-            sensor.value,
-            dev_unit=sensor.unit,
-            dev_status=sensor.status,
-            dev_status_name=sensor.state_readable,
-            params=params,
-            unique_name='check_cisco_asa_temp.%s' % item,
-        )
+        sensor = section.temp[item]
     except KeyError:
-        pass
+        return
+
+    yield Result(state=sensor.state, summary='Status: %s' % sensor.state_readable)
+
+    yield from check_temperature(
+        sensor.value,
+        dev_unit=sensor.unit,
+        dev_status=sensor.state,
+        dev_status_name=sensor.state_readable,
+        params=params,
+        unique_name='check_cisco_asa_temp.%s' % item,
+    )
 
 
 register.check_plugin(
@@ -274,28 +285,26 @@ register.check_plugin(
 # ##################################################################################################
 
 
-def discovery_cisco_asa_fan(section: Dict) -> DiscoveryResult:
-    for key in section['fan']:
-        yield Service(item=key)
+def discovery_cisco_asa_fan(section: CiscoasaSensors) -> DiscoveryResult:
+    yield from (Service(item=item) for item in section.fan.keys())
 
 
-def check_cisco_asa_fan(item, params, section) -> CheckResult:
+def check_cisco_asa_fan(item, params, section: CiscoasaSensors) -> CheckResult:
     try:
-        sensor = section['fan'][item]
-
-        yield Result(state=sensor.status, summary='Status: %s' % sensor.state_readable)
+        sensor = section.fan[item]
+    except KeyError:
+        return
 
-        yield from check_levels(
-            sensor.value,
-            label='Speed',
-            levels_lower=params.get('lower', None),
-            levels_upper=params.get('upper', None),
-            metric_name='fan' if params.get('output_metrics') else None,
-            render_func=lambda v: '%s RPM' % str(v),
-        )
+    yield Result(state=sensor.state, summary='Status: %s' % sensor.state_readable)
 
-    except KeyError:
-        pass
+    yield from check_levels(
+        sensor.value,
+        label='Speed',
+        levels_lower=params.get('lower', None),
+        levels_upper=params.get('upper', None),
+        metric_name='fan' if params.get('output_metrics') else None,
+        render_func=lambda v: '%s RPM' % str(v),
+    )
 
 
 register.check_plugin(
@@ -315,19 +324,17 @@ register.check_plugin(
 #
 # ##################################################################################################
 
-def discovery_cisco_asa_power(section: Dict) -> DiscoveryResult:
-    for key in section['power']:
-        yield Service(item=key)
+def discovery_cisco_asa_power(section: CiscoasaSensors) -> DiscoveryResult:
+    yield from (Service(item=item) for item in section.power.keys())
 
 
-def check_cisco_asa_power(item, section) -> CheckResult:
+def check_cisco_asa_power(item, section: CiscoasaSensors) -> CheckResult:
     try:
-        sensor = section['power'][item]
-
-        yield Result(state=sensor.status, summary='Status: %s' % sensor.state_readable)
-
+        sensor = section.power[item]
     except KeyError:
-        pass
+        return
+
+    yield Result(state=sensor.state, summary='Status: %s' % sensor.state_readable)
 
 
 register.check_plugin(
diff --git a/cisco_asa_sensors.mkp b/cisco_asa_sensors.mkp
index f84efb0826041f01037723c2bd8b620005c11066..58899b6953a29e18fb52a3e31257d12667aeab09 100644
GIT binary patch
literal 3560
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
E03G%MdH?_b

literal 3383
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

diff --git a/packages/cisco_asa_sensors b/packages/cisco_asa_sensors
index c4b310d..7ac90b0 100644
--- a/packages/cisco_asa_sensors
+++ b/packages/cisco_asa_sensors
@@ -7,7 +7,7 @@
  'name': 'cisco_asa_sensors',
  'num_files': 4,
  'title': 'Cisco ASA Sensors',
- 'version': '20210318_v0.0.1',
+ 'version': '20210322_v0.0.2',
  'version.min_required': '2.0.0',
  'version.packaged': '2.0.0p1',
  'version.usable_until': None}
\ No newline at end of file
-- 
GitLab