]> arthur.barton.de Git - netdata.git/blob - python.d/hddtemp.chart.py
Merge pull request #762 from paulfantom/master
[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.disk_count = 1
43         self.exclude = []
44
45     def _get_disk_count(self):
46         all_disks = [f for f in os.listdir("/dev") if len(f) == 3 and f.startswith("sd")]
47         for disk in self.exclude:
48             try:
49                 all_disks.remove(disk)
50             except:
51                 self.debug("Disk not found")
52         return len(all_disks)
53
54     def _check_raw_data(self, data):
55         if not data.endswith('|'):
56             return False
57
58         if data.count('|') % (5 * self.disk_count) == 0:
59             return True
60
61         return False
62
63     def _get_data(self):
64         """
65         Get data from TCP/IP socket
66         :return: dict
67         """
68         try:
69             raw = self._get_raw_data().split("|")[:-1]
70         except AttributeError:
71             self.error("no data received")
72             return None
73         data = {}
74         for i in range(len(raw) // 5):
75             try:
76                 val = int(raw[i*5+3])
77             except ValueError:
78                 val = 0
79             data[raw[i*5+1].replace("/dev/", "")] = val
80
81         if len(data) == 0:
82             self.error("received data doesn't have needed records")
83             return None
84         else:
85             return data
86
87     def check(self):
88         """
89         Parse configuration, check if hddtemp is available, and dynamically create chart lines data
90         :return: boolean
91         """
92         self._parse_config()
93         try:
94             self.exclude = list(self.configuration['exlude'])
95         except (KeyError, TypeError) as e:
96             self.info("No excluded disks")
97             self.debug(str(e))
98
99         try:
100             self.disk_count = int(self.configuration['disk_count'])
101         except (KeyError, TypeError) as e:
102             self.info("Autodetecting number of disks")
103             self.disk_count = self._get_disk_count()
104             self.debug(str(e))
105
106         data = self._get_data()
107         if data is None:
108             return False
109
110         for name in data:
111             self.definitions[ORDER[0]]['lines'].append([name])
112
113         return True
114
115