/dnx_netmods/syslog_client/syl_automate.py

https://github.com/DOWRIGHTTV/DNX-FWALL-CMD · Python · 94 lines · 46 code · 25 blank · 23 comment · 5 complexity · 75f4ff870160da391738321c3f5b6def MD5 · raw file

  1. #!/usr/bin/env python3
  2. import os, sys
  3. import threading
  4. HOME_DIR = os.environ.get('HOME_DIR', '/'.join(os.path.realpath(__file__).split('/')[:-3]))
  5. sys.path.insert(0, HOME_DIR)
  6. from dnx_gentools.def_constants import * # pylint: disable=unused-wildcard-import
  7. from dnx_sysmods.logging.log_main import LogHandler as Log
  8. from dnx_gentools.standard_tools import Initialize
  9. from dnx_sysmods.configure.file_operations import cfg_read_poller, load_configuration
  10. class Configuration:
  11. _service_setup = False
  12. def __init__(self, name):
  13. self.Initialize = Initialize(Log, name)
  14. @classmethod
  15. def service_setup(cls, SyslogService):
  16. '''start threads for tasks required by the syslog service. blocking until settings are loaded/initialized.'''
  17. if (cls._service_setup):
  18. raise RuntimeError('service setup should only be called once.')
  19. cls._service_setup = True
  20. self = cls(SyslogService.__name__)
  21. self.SyslogService = SyslogService
  22. self.Initialize.wait_for_threads(count=1)
  23. threading.Thread(target=self.get_settings).start()
  24. @cfg_read_poller('syslog_client')
  25. def get_settings(self, cfg_file):
  26. syslog = load_configuration(cfg_file)['syslog']
  27. SyslogService = self.SyslogService
  28. SyslogService.syslog_enabled = syslog['enabled']
  29. SyslogService.syslog_protocol = syslog['protocol']
  30. SyslogService.tls_enabled = syslog['tls']['enabled']
  31. SyslogService.self_signed_cert = syslog['tls']['self_signed']
  32. SyslogService.tcp_fallback = syslog['tcp']['fallback']
  33. SyslogService.udp_fallback = syslog['udp']['fallback']
  34. syslog_servers = syslog['servers']
  35. # if service is started without servers configured we will return here.
  36. if not syslog_servers: return
  37. names = ['primary', 'secondary']
  38. with SyslogService.server_lock:
  39. for name, cfg_server, mem_server in zip(names, syslog_servers.values(), SyslogService.syslog_servers):
  40. if (cfg_server['ip_address'] == mem_server.get('ip')): continue
  41. getattr(SyslogService.syslog_servers, name).update({
  42. 'ip': syslog_servers[name]['ip_address'],
  43. PROTO.UDP: True, PROTO.TCP: True, PROTO.DNS_TLS: True
  44. })
  45. def get_interface_settings(self):
  46. interface_settings = load_configuration('config.json')
  47. self.lan_int = interface_settings['settings']['interface']['inside']
  48. class Reachability:
  49. pass
  50. # def reachability(self):
  51. # while True:
  52. # syslog_servers = deepcopy(self.SyslogService.syslog_servers)
  53. # for server_ip in syslog_servers:
  54. # reach = await asyncio.create_subprocess_shell(
  55. # f'ping -c 2 {server_ip}',
  56. # stdout=asyncio.subprocess.PIPE,
  57. # stderr=asyncio.subprocess.PIPE)
  58. # await reach.communicate()
  59. # previous_status = self.SyslogService.syslog_servers[server_ip].get('reach')
  60. # if (reach.returncode == 0):
  61. # self.SyslogService.syslog_servers[server_ip].update({'reach': True})
  62. # else:
  63. # self.SyslogService.syslog_servers[server_ip].update({'reach': False})
  64. # current_status = self.SyslogService.syslog_servers[server_ip].get('reach')
  65. # if (current_status != previous_status):
  66. # message = (f'Syslog Server {server_ip} reachability status changed to {current_status}.')
  67. # self.SyslogService.Log.add_to_queue(message)
  68. # write_configuration(self.SyslogService.syslog_servers, 'syslog_server_status.json')
  69. # time.sleep(TEN_SEC)