]> arthur.barton.de Git - netdata.git/blobdiff - python.d/hddtemp.chart.py
Changing hddtemp.chart.py to accept specified devices. Same way as [telegraph does...
[netdata.git] / python.d / hddtemp.chart.py
index 92b1b7a614113beb1b0a12725ba7b84d3c3e75c9..8fe592beb696ceda5e83fcdefbc0492675ddee63 100644 (file)
@@ -2,6 +2,7 @@
 # Description: hddtemp netdata python.d module
 # Author: Pawel Krupa (paulfantom)
 
+import os
 from base import SocketService
 
 # default module values (can be overridden per job in `config`)
@@ -32,11 +33,40 @@ CHARTS = {
 class Service(SocketService):
     def __init__(self, configuration=None, name=None):
         SocketService.__init__(self, configuration=configuration, name=name)
+        self._keep_alive = False
         self.request = ""
         self.host = "127.0.0.1"
         self.port = 7634
         self.order = ORDER
         self.definitions = CHARTS
+        self.disks = []
+
+    def _get_disks(self):
+        try:
+            disks = self.configuration['devices']
+            print(disks)
+        except (KeyError, TypeError) as e:
+            self.info("Autodetecting disks")
+            return ["/dev/" + f for f in os.listdir("/dev") if len(f) == 3 and f.startswith("sd")]
+
+        ret = []
+        for disk in disks:
+            if not disk.startswith('/dev/'):
+                disk = "/dev/" + disk
+            if os.path.exists(disk):
+                ret.append(disk)
+        if len(ret) == 0:
+            self.error("Provided disks cannot be found in /dev directory.")
+        return ret
+
+    def _check_raw_data(self, data):
+        if not data.endswith('|'):
+            return False
+
+        if all(disk in data for disk in self.disks):
+            return True
+
+        return False
 
     def _get_data(self):
         """
@@ -46,15 +76,23 @@ class Service(SocketService):
         try:
             raw = self._get_raw_data().split("|")[:-1]
         except AttributeError:
+            self.error("no data received")
             return None
         data = {}
         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
-        return data
+
+        if len(data) == 0:
+            self.error("received data doesn't have needed records")
+            return None
+        else:
+            return data
 
     def check(self):
         """
@@ -62,9 +100,10 @@ class Service(SocketService):
         :return: boolean
         """
         self._parse_config()
+        self.disks = self._get_disks()
+
         data = self._get_data()
         if data is None:
-            self.error("No data received")
             return False
 
         for name in data: