def test_get_account_skey(self): config = {'account': {'skey': 'PASSWORD'}} Config.set_config(config) skey = Config.get_account_skey() self.assertEqual(skey, 'PASSWORD')
def test_create_tasks_one_server_multiple_endpoints(self, mock, _): server_to_writer = {'Main': 'writer_1'} config = { 'dls_settings': { 'proxy': { 'proxy_server': 'test.com', 'proxy_port': 1234 } }, 'account': { 'ikey': 'a', 'skey': 'a', 'hostname': 'a', 'endpoint_server_mappings': [ { 'endpoints': ['adminaction', 'auth', 'telephony', 'trustmonitor'], 'server': 'Main' } ], 'is_msp': False } } Config.set_config(config) create_tasks(server_to_writer) calls = [ call('adminaction', 'writer_1', 'duo_admin'), call('auth', 'writer_1', 'duo_admin'), call('telephony', 'writer_1', 'duo_admin'), call('trustmonitor', 'writer_1', 'duo_admin') ] self.assertEquals(mock.call_count, 4) mock.assert_has_calls(calls, any_order=True)
def test_create_tasks_multiple_servers_multiple_endpoints(self, mock, _): server_to_writer = {'Main': 'writer_1', 'Backup': 'writer_2'} config = { 'account': { 'ikey': 'a', 'skey': 'a', 'hostname': 'a', 'endpoint_server_mappings': [{ 'endpoints': ['auth', 'telephony'], 'server': 'Main' }, { 'endpoints': ['adminaction'], 'server': 'Backup' }] } } Config.set_config(config) create_tasks(server_to_writer) calls = [ call('adminaction', 'writer_2', 'duo_admin'), call('auth', 'writer_1', 'duo_admin'), call('telephony', 'writer_1', 'duo_admin') ] self.assertEquals(mock.call_count, 3) mock.assert_has_calls(calls, any_order=True)
def test_create_tasks_one_server_multiple_endpoints_msp(self, mock, mock_childaccount, mock_createadmin): server_to_writer = {'Main': 'writer_1'} config = { 'account': { 'ikey': 'a', 'skey': 'a', 'hostname': 'a', 'endpoint_server_mappings': [ { 'endpoints': ['adminaction', 'auth', 'telephony'], 'server': 'Main' } ], 'is_msp': True } } Config.set_config(config) create_tasks(server_to_writer) calls = [ call('adminaction', 'writer_1', duo_client.Accounts, '12345'), call('auth', 'writer_1', duo_client.Accounts, '12345'), call('telephony', 'writer_1', duo_client.Accounts, '12345'), call('adminaction', 'writer_1', duo_client.Accounts, '56789'), call('auth', 'writer_1', duo_client.Accounts, '56789'), call('telephony', 'writer_1', duo_client.Accounts, '56789') ] self.assertEqual(mock_childaccount.call_count, 1) self.assertEqual(mock.call_count, 6) mock.assert_has_calls(calls, any_order=True)
def test_get_account_hostname(self): config = {'account': {'hostname': 'internet.com'}} Config.set_config(config) hostname = Config.get_account_hostname() self.assertEqual(hostname, 'internet.com')
def test_set_config_normal(self): config = {'field_one': {'nested_field': True}, 'field_two': 100} Config.set_config(config) self.assertEqual(Config._config['field_one']['nested_field'], True) self.assertEqual(Config._config['field_two'], 100)
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_get_servers(self): config = {'servers': ['item1', 'item2']} Config.set_config(config) servers = Config.get_servers() self.assertEqual(servers, ['item1', 'item2'])
def test_get_account_ikey(self): config = {'account': {'ikey': 'ASDFF'}} Config.set_config(config) ikey = Config.get_account_ikey() self.assertEqual(ikey, 'ASDFF')
def test_get_checkpointing_enabled(self): config = {'dls_settings': {'checkpointing': {'enabled': False}}} Config.set_config(config) checkpointing_enabled = Config.get_checkpointing_enabled() self.assertEqual(checkpointing_enabled, False)
def test_get_checkpoint_dir(self): config = {'dls_settings': {'checkpointing': {'directory': '/tmp'}}} Config.set_config(config) checkpoint_dir = Config.get_checkpoint_dir() self.assertEqual(checkpoint_dir, '/tmp')
def test_get_log_filepath(self): config = {'dls_settings': {'log_filepath': '/dev/null'}} Config.set_config(config) log_filepath = Config.get_log_filepath() self.assertEqual(log_filepath, '/dev/null')
def test_get_log_format(self): config = {'dls_settings': {'log_format': 'JSON'}} Config.set_config(config) log_format = Config.get_log_format() self.assertEqual(log_format, 'JSON')
def test_set_config_twice(self): config = {'field_one': {'nested_field': True}, 'field_two': 100} Config.set_config(config) with self.assertRaises(RuntimeError): Config.set_config(config)
def test_get_value_with_invalid_keys(self): config = {'field_one': {'nested_field': True}, 'field_two': 100} Config.set_config(config) with self.assertRaises(ValueError): Config.get_value(['house_key', 'car_key'])
def test_get_account_block_list(self): config = {'account': {'block_list': ['thing1', 'blue fish']}} Config.set_config(config) block_list = Config.get_account_block_list() self.assertEqual(block_list, ['thing1', 'blue fish'])
def test_account_is_msp(self): config = {'account': {'is_msp': False}} Config.set_config(config) is_msp = Config.account_is_msp() self.assertEqual(is_msp, False)
def test_get_account_endpoint_server_mappings(self): config = {'account': {'endpoint_server_mappings': {'auth': 'ha.com'}}} Config.set_config(config) endpoint_server_mappings = Config.get_account_endpoint_server_mappings( ) self.assertEqual(endpoint_server_mappings, {'auth': 'ha.com'})
def test_get_value_normal(self): config = {'field_one': {'nested_field': True}, 'field_two': 100} Config.set_config(config) value_one = Config.get_value(['field_one', 'nested_field']) value_two = Config.get_value(['field_two']) self.assertEqual(value_one, True) self.assertEqual(value_two, 100)
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_tasks_one_server_per_endpoint(self, mock, _): server_to_writer = {'AuthServer': 'writer_1', 'AdminServer': 'writer_2', 'TelephonyServer': 'writer_3'} config = { 'account': { 'ikey': 'a', 'skey': 'a', 'hostname': 'a', 'endpoint_server_mappings': [ { 'endpoints': ['auth'], 'server': 'AuthServer' }, { 'endpoints': ['adminaction'], 'server': 'AdminServer' }, { 'endpoints': ['telephony'], 'server': 'TelephonyServer' } ], 'is_msp': False } } Config.set_config(config) create_tasks(server_to_writer) calls = [ call('adminaction', 'writer_2', 'duo_admin'), call('auth', 'writer_1', 'duo_admin'), call('telephony', 'writer_3', 'duo_admin') ] self.assertEquals(mock.call_count, 3) mock.assert_has_calls(calls, any_order=True)