hddtemp.chart.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. # -*- coding: utf-8 -*-
  2. # Description: hddtemp netdata python.d module
  3. # Author: Pawel Krupa (paulfantom)
  4. import os
  5. from copy import deepcopy
  6. from bases.FrameworkServices.SocketService import SocketService
  7. # default module values (can be overridden per job in `config`)
  8. #update_every = 2
  9. priority = 60000
  10. retries = 60
  11. # default job configuration (overridden by python.d.plugin)
  12. # config = {'local': {
  13. # 'update_every': update_every,
  14. # 'retries': retries,
  15. # 'priority': priority,
  16. # 'host': 'localhost',
  17. # 'port': 7634
  18. # }}
  19. ORDER = ['temperatures']
  20. CHARTS = {
  21. 'temperatures': {
  22. 'options': ['disks_temp', 'Disks Temperatures', 'Celsius', 'temperatures', 'hddtemp.temperatures', 'line'],
  23. 'lines': [
  24. # lines are created dynamically in `check()` method
  25. ]}}
  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._keep_alive = False
  32. self.request = ""
  33. self.host = "127.0.0.1"
  34. self.port = 7634
  35. self.disks = list()
  36. def get_disks(self):
  37. try:
  38. disks = self.configuration['devices']
  39. self.info("Using configured disks {0}".format(disks))
  40. except (KeyError, TypeError):
  41. self.info("Autodetecting disks")
  42. return ["/dev/" + f for f in os.listdir("/dev") if len(f) == 3 and f.startswith("sd")]
  43. ret = list()
  44. for disk in disks:
  45. if not disk.startswith('/dev/'):
  46. disk = "/dev/" + disk
  47. ret.append(disk)
  48. if not ret:
  49. self.error("Provided disks cannot be found in /dev directory.")
  50. return ret
  51. def _check_raw_data(self, data):
  52. if not data.endswith('|'):
  53. return False
  54. if all(disk in data for disk in self.disks):
  55. return True
  56. return False
  57. def get_data(self):
  58. """
  59. Get data from TCP/IP socket
  60. :return: dict
  61. """
  62. try:
  63. raw = self._get_raw_data().split("|")[:-1]
  64. except AttributeError:
  65. self.error("no data received")
  66. return None
  67. data = dict()
  68. for i in range(len(raw) // 5):
  69. if not raw[i*5+1] in self.disks:
  70. continue
  71. try:
  72. val = int(raw[i*5+3])
  73. except ValueError:
  74. val = 0
  75. data[raw[i*5+1].replace("/dev/", "")] = val
  76. if not data:
  77. self.error("received data doesn't have needed records")
  78. return None
  79. return data
  80. def check(self):
  81. """
  82. Parse configuration, check if hddtemp is available, and dynamically create chart lines data
  83. :return: boolean
  84. """
  85. self._parse_config()
  86. self.disks = self.get_disks()
  87. data = self.get_data()
  88. if data is None:
  89. return False
  90. for name in data:
  91. self.definitions['temperatures']['lines'].append([name])
  92. return True