]> arthur.barton.de Git - netdata.git/blob - 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
1 # -*- coding: utf-8 -*-
2 # Description: hddtemp netdata python.d module
3 # Author: Pawel Krupa (paulfantom)
4
5 import os
6 from base import SocketService
7
8 # default module values (can be overridden per job in `config`)
9 #update_every = 2
10 priority = 60000
11 retries = 60
12
13 # default job configuration (overridden by python.d.plugin)
14 # config = {'local': {
15 #             'update_every': update_every,
16 #             'retries': retries,
17 #             'priority': priority,
18 #             'host': 'localhost',
19 #             'port': 7634
20 #          }}
21
22 ORDER = ['temperatures']
23
24 CHARTS = {
25     'temperatures': {
26         'options': ['disks_temp', 'temperature', 'Celsius', 'Disks temperature', 'hddtemp.temp', 'line'],
27         'lines': [
28             # lines are created dynamically in `check()` method
29         ]}
30 }
31
32
33 class Service(SocketService):
34     def __init__(self, configuration=None, name=None):
35         SocketService.__init__(self, configuration=configuration, name=name)
36         self._keep_alive = False
37         self.request = ""
38         self.host = "127.0.0.1"
39         self.port = 7634
40         self.order = ORDER
41         self.definitions = CHARTS
42         self.disks = []
43
44     def _get_disks(self):
45         try:
46             disks = self.configuration['devices']
47             print(disks)
48         except (KeyError, TypeError) as e:
49             self.info("Autodetecting disks")
50             return ["/dev/" + f for f in os.listdir("/dev") if len(f) == 3 and f.startswith("sd")]
51
52         ret = []
53         for disk in disks:
54             if not disk.startswith('/dev/'):
55                 disk = "/dev/" + disk
56             if os.path.exists(disk):
57                 ret.append(disk)
58         if len(ret) == 0:
59             self.error("Provided disks cannot be found in /dev directory.")
60         return ret
61
62     def _check_raw_data(self, data):
63         if not data.endswith('|'):
64             return False
65
66         if all(disk in data for disk in self.disks):
67             return True
68
69         return False
70
71     def _get_data(self):
72         """
73         Get data from TCP/IP socket
74         :return: dict
75         """
76         try:
77             raw = self._get_raw_data().split("|")[:-1]
78         except AttributeError:
79             self.error("no data received")
80             return None
81         data = {}
82         for i in range(len(raw) // 5):
83             if not raw[i*5+1] in self.disks:
84                 continue
85             try:
86                 val = int(raw[i*5+3])
87             except ValueError:
88                 val = 0
89             data[raw[i*5+1].replace("/dev/", "")] = val
90
91         if len(data) == 0:
92             self.error("received data doesn't have needed records")
93             return None
94         else:
95             return data
96
97     def check(self):
98         """
99         Parse configuration, check if hddtemp is available, and dynamically create chart lines data
100         :return: boolean
101         """
102         self._parse_config()
103         self.disks = self._get_disks()
104
105         data = self._get_data()
106         if data is None:
107             return False
108
109         for name in data:
110             self.definitions[ORDER[0]]['lines'].append([name])
111
112         return True
113
114