]> arthur.barton.de Git - netdata.git/blob - python.d/hddtemp.chart.py
Merge pull request #1165 from kesslerm/fix/python-plugin-crash
[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', 'Disks Temperatures', 'Celsius', 'temperatures', 'hddtemp.temperatures', '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             self.info("Using configured disks" + str(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             ret.append(disk)
57         if len(ret) == 0:
58             self.error("Provided disks cannot be found in /dev directory.")
59         return ret
60
61     def _check_raw_data(self, data):
62         if not data.endswith('|'):
63             return False
64
65         if all(disk in data for disk in self.disks):
66             return True
67
68         return False
69
70     def _get_data(self):
71         """
72         Get data from TCP/IP socket
73         :return: dict
74         """
75         try:
76             raw = self._get_raw_data().split("|")[:-1]
77         except AttributeError:
78             self.error("no data received")
79             return None
80         data = {}
81         for i in range(len(raw) // 5):
82             if not raw[i*5+1] in self.disks:
83                 continue
84             try:
85                 val = int(raw[i*5+3])
86             except ValueError:
87                 val = 0
88             data[raw[i*5+1].replace("/dev/", "")] = val
89
90         if len(data) == 0:
91             self.error("received data doesn't have needed records")
92             return None
93         else:
94             return data
95
96     def check(self):
97         """
98         Parse configuration, check if hddtemp is available, and dynamically create chart lines data
99         :return: boolean
100         """
101         self._parse_config()
102         self.disks = self._get_disks()
103
104         data = self._get_data()
105         if data is None:
106             return False
107
108         for name in data:
109             self.definitions[ORDER[0]]['lines'].append([name])
110
111         return True
112
113