3 ###############################################################################
5 # collecty - A system statistics collection daemon for IPFire #
6 # Copyright (C) 2015 IPFire development team #
8 # This program is free software: you can redistribute it and/or modify #
9 # it under the terms of the GNU General Public License as published by #
10 # the Free Software Foundation, either version 3 of the License, or #
11 # (at your option) any later version. #
13 # This program is distributed in the hope that it will be useful, #
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of #
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
16 # GNU General Public License for more details. #
18 # You should have received a copy of the GNU General Public License #
19 # along with this program. If not, see <http://www.gnu.org/licenses/>. #
21 ###############################################################################
23 from collecty
import _collecty
31 class GraphTemplateSensorsTemperature(base
.GraphTemplate
):
32 name
= "sensors-temperature"
36 _
= self
.locale
.translate
39 "DEF:value_kelvin=%(file)s:value:AVERAGE",
40 "DEF:critical_kelvin=%(file)s:critical:AVERAGE",
41 "DEF:high_kelvin=%(file)s:high:AVERAGE",
42 "DEF:low_kelvin=%(file)s:low:AVERAGE",
44 # Convert everything to celsius
45 "CDEF:value=value_kelvin,273.15,-",
46 "CDEF:critical=critical_kelvin,273.15,-",
47 "CDEF:high=high_kelvin,273.15,-",
48 "CDEF:low=low_kelvin,273.15,-",
50 # Change colour when the value gets above high
51 "CDEF:value_high=value,high,GT,value,UNKN,IF",
52 "CDEF:value_normal=value,high,GT,UNKN,value,IF",
54 # Get data points for the threshold lines
55 "VDEF:critical_line=critical,MINIMUM",
56 "VDEF:low_line=low,MAXIMUM",
58 # Draw the temperature value
59 "LINE3:value_high#ff0000",
60 "LINE2:value_normal#00ff00:%-15s" % _("Temperature"),
63 "GPRINT:value_cur:%%10.2lf °C\l",
64 "GPRINT:value_avg: %-15s %%6.2lf °C\l" % _("Average"),
65 "GPRINT:value_max: %-15s %%6.2lf °C\l" % _("Maximum"),
66 "GPRINT:value_min: %-15s %%6.2lf °C\l" % _("Minimum"),
72 "COMMENT:%s\:" % _("Temperature Thresholds"),
73 "HRULE:critical_line#000000:%-15s" % _("Critical"),
74 "GPRINT:critical_line:%%6.2lf °C\\r",
75 "HRULE:low_line#0000ff:%-15s" % _("Low"),
76 "GPRINT:low_line:%%6.2lf °C\\r",
80 def graph_title(self
):
81 _
= self
.locale
.translate
82 return _("Temperature (%s)") % self
.object.sensor
.name
85 def graph_vertical_label(self
):
86 _
= self
.locale
.translate
90 class GraphTemplateSensorsProcessorTemperature(base
.GraphTemplate
):
91 name
= "processor-temperature"
100 def get_temperature_sensors(self
):
101 return self
.plugin
.get_detected_sensor_objects("coretemp-*")
103 def get_objects(self
, *args
, **kwargs
):
104 sensors
= self
.get_temperature_sensors()
110 _
= self
.locale
.translate
116 for core
in self
.objects
:
117 id = "core%s" % counter
121 rrd_graph
+= core
.make_rrd_defs(id) + [
122 # Convert everything to celsius
123 "CDEF:%s_value_c=%s_value,273.15,-" % (id, id),
124 "CDEF:%s_critical_c=%s_critical,273.15,-" % (id, id),
125 "CDEF:%s_high_c=%s_high,273.15,-" % (id, id),
128 all_core_values
= ("%s_value_c" % id for id in ids
)
129 all_core_highs
= ("%s_high_c" % id for id in ids
)
132 # Compute the temperature of the processor
133 # by taking the average of all cores
134 "CDEF:all_value_c=%s,%s,AVG" % (",".join(all_core_values
), len(ids
)),
135 "CDEF:all_high_c=%s,MIN" % ",".join(all_core_highs
),
137 # Change colour when the value gets above high
138 "CDEF:all_value_c_high=all_value_c,all_high_c,GT,all_value_c,UNKN,IF",
139 "CDEF:all_value_c_normal=all_value_c,all_high_c,GT,UNKN,all_value_c,IF",
141 "LINE3:all_value_c_high#FF0000",
142 "LINE3:all_value_c_normal#000000:%-15s\l" % _("Temperature"),
144 "GPRINT:all_value_c_avg: %-15s %%6.2lf °C\l" % _("Average"),
145 "GPRINT:all_value_c_max: %-15s %%6.2lf °C\l" % _("Maximum"),
146 "GPRINT:all_value_c_min: %-15s %%6.2lf °C\l" % _("Minimum"),
149 for id, core
, colour
in zip(ids
, self
.objects
, self
.core_colours
):
151 # TODO these lines were supposed to be dashed, but that
152 # didn't really work here
153 "LINE2:%s_value_c%s:%-10s" % (id, colour
, core
.sensor
.label
),
156 # Draw the critical line
159 "HRULE:%s_critical_c_min#000000:%-15s" % (id, _("Critical")),
160 "GPRINT:%s_critical_c_min:%%6.2lf °C\\r",
167 def graph_title(self
):
168 _
= self
.locale
.translate
169 return _("Processor")
172 def graph_vertical_label(self
):
173 _
= self
.locale
.translate
174 return _("Temperature")
177 class SensorBaseObject(base
.Object
):
178 def init(self
, sensor
):
182 return "<%s %s (%s)>" % (self
.__class
__.__name
__, self
.sensor
.name
, self
.sensor
.label
)
186 return "-".join((self
.sensor
.name
, self
.sensor
.label
))
190 return self
.sensor
.type
193 class SensorTemperatureObject(SensorBaseObject
):
195 "DS:value:GAUGE:0:U",
196 "DS:critical:GAUGE:0:U",
202 assert self
.type == "temperature"
214 return self
.sensor
.critical
215 except AttributeError:
221 return self
.sensor
.minimum
222 except AttributeError:
228 return self
.sensor
.high
229 except AttributeError:
233 class SensorVoltageObject(SensorBaseObject
):
235 "DS:value:GAUGE:0:U",
236 "DS:minimum:GAUGE:0:U",
237 "DS:maximum:GAUGE:0:U",
241 assert self
.type == "voltage"
252 return self
.sensor
.minimum
253 except AttributeError:
259 return self
.sensor
.maximum
260 except AttributeError:
264 class SensorFanObject(SensorBaseObject
):
266 "DS:value:GAUGE:0:U",
267 "DS:minimum:GAUGE:0:U",
268 "DS:maximum:GAUGE:0:U",
272 assert self
.type == "fan"
283 return self
.sensor
.minimum
284 except AttributeError:
290 return self
.sensor
.maximum
291 except AttributeError:
295 class SensorsPlugin(base
.Plugin
):
297 description
= "Sensors Plugin"
300 GraphTemplateSensorsProcessorTemperature
,
301 GraphTemplateSensorsTemperature
,
305 # Initialise the sensors library.
306 _collecty
.sensors_init()
309 _collecty
.sensors_cleanup()
313 return self
.get_detected_sensor_objects()
315 def get_detected_sensor_objects(self
, what
=None):
316 for sensor
in _collecty
.get_detected_sensors(what
):
317 if sensor
.type == "temperature":
318 yield SensorTemperatureObject(self
, sensor
)
320 elif sensor
.type == "voltage":
321 yield SensorVoltageObject(self
, sensor
)
323 elif sensor
.type == "fan":
324 yield SensorFanObject(self
, sensor
)