diff options
author | lgz <ilyamaschenko@gmail.com> | 2018-06-18 20:31:59 +0900 |
---|---|---|
committer | lgz <ilyamaschenko@gmail.com> | 2018-06-18 20:31:59 +0900 |
commit | 2f2ba9c85050abdddd65317663b7a5c63287ff99 (patch) | |
tree | 9fbb9f5ebda30b27ba5c7d72f4030970ecb8bbca /python.d | |
parent | 9598db24cae63fd6241bb236e2fac55ae7b92d2f (diff) |
hddtemp: correctly parse /disk/by-id + refactor
Diffstat (limited to 'python.d')
-rw-r--r-- | python.d/hddtemp.chart.py | 110 |
1 files changed, 52 insertions, 58 deletions
diff --git a/python.d/hddtemp.chart.py b/python.d/hddtemp.chart.py index 1b8104d0ae..c93a1eab6f 100644 --- a/python.d/hddtemp.chart.py +++ b/python.d/hddtemp.chart.py @@ -1,27 +1,16 @@ # -*- coding: utf-8 -*- # Description: hddtemp netdata python.d module # Author: Pawel Krupa (paulfantom) +# Author: Ilya Mashchenko (l2isbad) # SPDX-License-Identifier: GPL-3.0+ -import os +import re + from copy import deepcopy from bases.FrameworkServices.SocketService import SocketService -# default module values (can be overridden per job in `config`) -#update_every = 2 -priority = 60000 -retries = 60 - -# default job configuration (overridden by python.d.plugin) -# config = {'local': { -# 'update_every': update_every, -# 'retries': retries, -# 'priority': priority, -# 'host': 'localhost', -# 'port': 7634 -# }} ORDER = ['temperatures'] @@ -32,6 +21,18 @@ CHARTS = { # lines are created dynamically in `check()` method ]}} +RE = re.compile(r'\/([a-zA-Z_0-9-]+)\|([a-zA-Z0-9- ]+)\|([0-9]+|SLP|UNK)\|') + + +class Disk: + def __init__(self, id_, name, temp): + self.id = id_.replace(' ', '_') + self.name = name.replace(' ', '_') + self.temp = temp if temp.isdigit() else 0 + + def __repr__(self): + return self.id + class Service(SocketService): def __init__(self, configuration=None, name=None): @@ -42,56 +43,43 @@ class Service(SocketService): self.request = "" self.host = "127.0.0.1" self.port = 7634 - self.disks = list() + self.do_only = self.configuration.get('devices') def get_disks(self): - try: - disks = self.configuration['devices'] - self.info("Using configured disks {0}".format(disks)) - except (KeyError, TypeError): - self.info("Autodetecting disks") - return ["/dev/" + f for f in os.listdir("/dev") if len(f) == 3 and f.startswith("sd")] - - ret = list() - for disk in disks: - if not disk.startswith('/dev/'): - disk = "/dev/" + disk - ret.append(disk) - if not ret: - self.error("Provided disks cannot be found in /dev directory.") - return ret - - def _check_raw_data(self, data): - if not data.endswith('|'): - return False + r = self._get_raw_data() + + if not r: + return None - if all(disk in data for disk in self.disks): - return True - return False + m = RE.findall(r) + + if not m: + self.error("received data doesn't have needed records") + return None + + rv = [Disk(*d) for d in m] + self.debug('available disks: {0}'.format(rv)) + + if self.do_only: + return [v for v in rv if v.id in self.do_only] + return rv def get_data(self): """ Get data from TCP/IP socket :return: dict """ - try: - raw = self._get_raw_data().split("|")[:-1] - except AttributeError: - self.error("no data received") + + disks = self.get_disks() + + if not disks: return None + data = dict() - for i in range(len(raw) // 5): - if not raw[i*5+1] in self.disks: - continue - try: - val = int(raw[i*5+3]) - except ValueError: - val = 0 - data[raw[i*5+1].replace("/dev/", "")] = val - - if not data: - self.error("received data doesn't have needed records") - return None + + for d in disks: + data[d.id] = d.temp + return data def check(self): @@ -100,12 +88,18 @@ class Service(SocketService): :return: boolean """ self._parse_config() - self.disks = self.get_disks() + disks = self.get_disks() - data = self.get_data() - if data is None: + if not disks: return False - for name in data: - self.definitions['temperatures']['lines'].append([name]) + for d in disks: + n = d.id if d.id.startswith('sd') else d.name + dim = [d.id, n] + self.definitions['temperatures']['lines'].append(dim) + return True + + @staticmethod + def _check_raw_data(data): + return not bool(data) |