tor.chart.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. # -*- coding: utf-8 -*-
  2. # Description: adaptec_raid netdata python.d module
  3. # Author: Federico Ceratto <federico.ceratto@gmail.com>
  4. # Author: Ilya Mashchenko (ilyam8)
  5. # SPDX-License-Identifier: GPL-3.0-or-later
  6. from bases.FrameworkServices.SimpleService import SimpleService
  7. try:
  8. import stem
  9. import stem.connection
  10. import stem.control
  11. STEM_AVAILABLE = True
  12. except ImportError:
  13. STEM_AVAILABLE = False
  14. DEF_PORT = 'default'
  15. DEF_ADDR = '127.0.0.1'
  16. ORDER = [
  17. 'traffic',
  18. ]
  19. CHARTS = {
  20. 'traffic': {
  21. 'options': [None, 'Tor Traffic', 'KiB/s', 'traffic', 'tor.traffic', 'area'],
  22. 'lines': [
  23. ['read', 'read', 'incremental', 1, 1024],
  24. ['write', 'write', 'incremental', 1, -1024],
  25. ]
  26. }
  27. }
  28. class Service(SimpleService):
  29. """Provide netdata service for Tor"""
  30. def __init__(self, configuration=None, name=None):
  31. super(Service, self).__init__(configuration=configuration, name=name)
  32. self.order = ORDER
  33. self.definitions = CHARTS
  34. self.port = self.configuration.get('control_port', DEF_PORT)
  35. self.addr = self.configuration.get('control_addr', DEF_ADDR)
  36. self.password = self.configuration.get('password')
  37. self.use_socket = isinstance(self.port, str) and self.port != DEF_PORT and not self.port.isdigit()
  38. self.conn = None
  39. self.alive = False
  40. def check(self):
  41. if not STEM_AVAILABLE:
  42. self.error('the stem library is missing')
  43. return False
  44. return self.connect()
  45. def get_data(self):
  46. if not self.alive and not self.reconnect():
  47. return None
  48. data = dict()
  49. try:
  50. data['read'] = self.conn.get_info('traffic/read')
  51. data['write'] = self.conn.get_info('traffic/written')
  52. except stem.ControllerError as error:
  53. self.debug(error)
  54. self.alive = False
  55. return data or None
  56. def authenticate(self):
  57. try:
  58. self.conn.authenticate(password=self.password)
  59. except stem.connection.AuthenticationFailure as error:
  60. self.error('authentication error: {0}'.format(error))
  61. return False
  62. return True
  63. def connect_via_port(self):
  64. try:
  65. self.conn = stem.control.Controller.from_port(address=self.addr, port=self.port)
  66. except (stem.SocketError, ValueError) as error:
  67. self.error(error)
  68. def connect_via_socket(self):
  69. try:
  70. self.conn = stem.control.Controller.from_socket_file(path=self.port)
  71. except (stem.SocketError, ValueError) as error:
  72. self.error(error)
  73. def connect(self):
  74. if self.conn:
  75. self.conn.close()
  76. self.conn = None
  77. if self.use_socket:
  78. self.connect_via_socket()
  79. else:
  80. self.connect_via_port()
  81. if self.conn and self.authenticate():
  82. self.alive = True
  83. return self.alive
  84. def reconnect(self):
  85. return self.connect()