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