def main(): """ Kicks off DuoLogSync by setting important variables, creating and running a Producer-Consumer pair for each log-type defined in a config file passed to the program. """ arg_parser = argparse.ArgumentParser(prog='duologsync', description="Path to config file") arg_parser.add_argument('ConfigPath', metavar='config-path', type=str, help='Config to start application') args = arg_parser.parse_args() # Handle shutting down the program via Ctrl-C signal.signal(signal.SIGINT, sigint_handler) # Create a config Dictionary from a YAML file located at args.ConfigPath config = Config.create_config(args.ConfigPath) Config.set_config(config) Program.setup_logging(Config.get_log_filepath()) # Dict of writers (server id: writer) to be used for consumer tasks server_to_writer = Writer.create_writers(Config.get_servers()) # List of Producer/Consumer objects as asyncio tasks to be run tasks = create_tasks(server_to_writer) # Run the Producers and Consumers asyncio.get_event_loop().run_until_complete(asyncio.gather(*tasks)) asyncio.get_event_loop().close() if Program.is_logging_set(): print(f"DuoLogSync: shutdown successfully. Check " f"{Config.get_log_filepath()} for program logs")
def test_create_config_normal(self): config_filepath = 'tests/resources/config_files/standard.yml' correct_config = { 'version': '1.0.0', 'dls_settings': { 'log_filepath': '/tmp/duologsync.log', 'log_format': 'JSON', 'api': { 'offset': 180, 'timeout': 120 }, 'checkpointing': { 'enabled': False, 'directory': '/tmp/dls_checkpoints' }, 'proxy': { 'proxy_server': 'test.com', 'proxy_port': 1234 } }, 'servers': [{ 'id': 'main server', 'hostname': 'mysiem.com', 'port': 8888, 'protocol': 'TCPSSL', 'cert_filepath': 'cert.crt' }, { 'id': 'backup', 'hostname': 'safesiem.org', 'port': 13031, 'protocol': 'UDP' }], 'account': { 'ikey': 'AAA101020K12K1K23', 'skey': 'jyJKYAGJKAYGDKJgyJygFUg9F9gyFuo9', 'hostname': 'api-test.first.duosecurity.com', 'endpoint_server_mappings': [{ 'endpoints': ['adminaction', 'auth'], 'server': 'main server' }, { 'endpoints': ['telephony'], 'server': 'backup' }], 'is_msp': True, 'block_list': [] } } config = Config.create_config(config_filepath) config['dls_settings']['api']['offset'] = 180 self.assertEqual(correct_config, config)
def main(): """ Kicks off DuoLogSync by setting important variables, creating and running a Producer-Consumer pair for each log-type defined in a config file passed to the program. """ arg_parser = argparse.ArgumentParser(prog='duologsync', description="Path to config file") arg_parser.add_argument('ConfigPath', metavar='config-path', type=str, help='Config to start application') args = arg_parser.parse_args() # Handle shutting down the program via Ctrl-C signal.signal(signal.SIGINT, sigint_handler) # Create a config Dictionary from a YAML file located at args.ConfigPath config = Config.create_config(args.ConfigPath) Config.set_config(config) # Do extra checks for Trust Monitor support is_dtm_in_config = check_for_specific_endpoint('trustmonitor', config) log_format = Config.get_log_format() is_msp = Config.account_is_msp() if (is_dtm_in_config and log_format != 'JSON'): Program.log(f"DuoLogSync: Trust Monitor endpoint only supports JSON", logging.WARNING) return if (is_dtm_in_config and is_msp): Program.log( f"DuoLogSync: Trust Monitor endpoint only supports non-msp", logging.WARNING) return Program.setup_logging(Config.get_log_filepath()) # Dict of writers (server id: writer) to be used for consumer tasks server_to_writer = Writer.create_writers(Config.get_servers()) # List of Producer/Consumer objects as asyncio tasks to be run tasks = create_tasks(server_to_writer) # Run the Producers and Consumers asyncio.get_event_loop().run_until_complete(asyncio.gather(*tasks)) asyncio.get_event_loop().close() if Program.is_logging_set(): print(f"DuoLogSync: shutdown successfully. Check " f"{Config.get_log_filepath()} for program logs")
def test_create_config_with_no_defaults_set(self): config_filepath = 'tests/resources/config_files/no_defaults_set.yml' config = Config.create_config(config_filepath) self.assertNotEqual(config['dls_settings']['log_filepath'], None) self.assertNotEqual(config['dls_settings']['log_format'], None) self.assertNotEqual(config['dls_settings']['api']['offset'], None) self.assertNotEqual(config['dls_settings']['api']['timeout'], None) self.assertNotEqual(config['dls_settings']['checkpointing']['enabled'], None) self.assertNotEqual( config['dls_settings']['checkpointing']['directory'], None) self.assertNotEqual(config['account']['is_msp'], None) self.assertNotEqual(config['account']['block_list'], None)
def test_create_config_with_bad_values(self, mock_initiate_shutdown): config_filepath = 'tests/resources/config_files/bad_values.yml' config = Config.create_config(config_filepath) mock_initiate_shutdown.assert_called_once()
def test_create_config_invalid_config(self, mock_initiate_shutdown): config_filepath = 'tests/resources/config_files/bad_config.yml' Config.create_config(config_filepath) mock_initiate_shutdown.assert_called_once()
def test_create_config_bad_filepath(self, mock_initiate_shutdown): config_filepath = 'absolute/nonsense/this/goes/nowhere.yml' Config.create_config(config_filepath) mock_initiate_shutdown.assert_called_once()