tor.chart.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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. ORDER = [
  16. 'traffic',
  17. ]
  18. CHARTS = {
  19. 'traffic': {
  20. 'options': [None, 'Tor Traffic', 'KiB/s', 'traffic', 'tor.traffic', 'area'],
  21. 'lines': [
  22. ['read', 'read', 'incremental', 1, 1024],
  23. ['write', 'write', 'incremental', 1, -1024],
  24. ]
  25. }
  26. }
  27. class Service(SimpleService):
  28. """Provide netdata service for Tor"""
  29. def __init__(self, configuration=None, name=None):
  30. super(Service, self).__init__(configuration=configuration, name=name)
  31. self.order = ORDER
  32. self.definitions = CHARTS
  33. self.port = self.configuration.get('control_port', DEF_PORT)
  34. self.password = self.configuration.get('password')
  35. self.use_socket = isinstance(self.port, str) and self.port != DEF_PORT and not self.port.isdigit()
  36. self.conn = None
  37. self.alive = False
  38. def check(self):
  39. if not STEM_AVAILABLE:
  40. self.error('the stem library is missing')
  41. return False
  42. return self.connect()
  43. def get_data(self):
  44. if not self.alive and not self.reconnect():
  45. return None
  46. data = dict()
  47. try:
  48. data['read'] = self.conn.get_info('traffic/read')
  49. data['write'] = self.conn.get_info('traffic/written')
  50. except stem.ControllerError as error:
  51. self.debug(error)
  52. self.alive = False
  53. return data or None
  54. def authenticate(self):
  55. try:
  56. self.conn.authenticate(password=self.password)
  57. except stem.connection.AuthenticationFailure as error:
  58. self.error('authentication error: {0}'.format(error))
  59. return False
  60. return True
  61. def connect_via_port(self):
  62. try:
  63. self.conn = stem.control.Controller.from_port(port=self.port)
  64. except (stem.SocketError, ValueError) as error:
  65. self.error(error)
  66. def connect_via_socket(self):
  67. try:
  68. self.conn = stem.control.Controller.from_socket_file(path=self.port)
  69. except (stem.SocketError, ValueError) as error:
  70. self.error(error)
  71. def connect(self):
  72. if self.conn:
  73. self.conn.close()
  74. self.conn = None
  75. if self.use_socket:
  76. self.connect_via_socket()
  77. else:
  78. self.connect_via_port()
  79. if self.conn and self.authenticate():
  80. self.alive = True
  81. return self.alive
  82. def reconnect(self):
  83. return self.connect()