hddtemp.chart.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. # -*- coding: utf-8 -*-
  2. # Description: hddtemp netdata python.d module
  3. # Author: Pawel Krupa (paulfantom)
  4. # Author: Ilya Mashchenko (ilyam8)
  5. # SPDX-License-Identifier: GPL-3.0-or-later
  6. import re
  7. from copy import deepcopy
  8. from bases.FrameworkServices.SocketService import SocketService
  9. ORDER = [
  10. 'temperatures',
  11. ]
  12. CHARTS = {
  13. 'temperatures': {
  14. 'options': ['disks_temp', 'Disks Temperatures', 'Celsius', 'temperatures', 'hddtemp.temperatures', 'line'],
  15. 'lines': [
  16. # lines are created dynamically in `check()` method
  17. ]}}
  18. RE = re.compile(r'\/dev\/([^|]+)\|([^|]+)\|([0-9]+|SLP|UNK)\|')
  19. class Disk:
  20. def __init__(self, id_, name, temp):
  21. self.id = id_.split('/')[-1]
  22. self.name = name.replace(' ', '_')
  23. self.temp = temp if temp.isdigit() else None
  24. def __repr__(self):
  25. return self.id
  26. class Service(SocketService):
  27. def __init__(self, configuration=None, name=None):
  28. SocketService.__init__(self, configuration=configuration, name=name)
  29. self.order = ORDER
  30. self.definitions = deepcopy(CHARTS)
  31. self.do_only = self.configuration.get('devices')
  32. self._keep_alive = False
  33. self.request = ""
  34. self.host = "127.0.0.1"
  35. self.port = 7634
  36. def get_disks(self):
  37. r = self._get_raw_data()
  38. if not r:
  39. return None
  40. m = RE.findall(r)
  41. if not m:
  42. self.error("received data doesn't have needed records")
  43. return None
  44. rv = [Disk(*d) for d in m]
  45. self.debug('available disks: {0}'.format(rv))
  46. if self.do_only:
  47. return [v for v in rv if v.id in self.do_only]
  48. return rv
  49. def get_data(self):
  50. """
  51. Get data from TCP/IP socket
  52. :return: dict
  53. """
  54. disks = self.get_disks()
  55. if not disks:
  56. return None
  57. return dict((d.id, d.temp) for d in disks)
  58. def check(self):
  59. """
  60. Parse configuration, check if hddtemp is available, and dynamically create chart lines data
  61. :return: boolean
  62. """
  63. self._parse_config()
  64. disks = self.get_disks()
  65. if not disks:
  66. return False
  67. for d in disks:
  68. dim = [d.id]
  69. self.definitions['temperatures']['lines'].append(dim)
  70. return True
  71. @staticmethod
  72. def _check_raw_data(data):
  73. return not bool(data)