Esempio n. 1
0
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")
Esempio n. 2
0
    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)
Esempio n. 3
0
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")
Esempio n. 4
0
    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)
Esempio n. 5
0
    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()
Esempio n. 6
0
    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()
Esempio n. 7
0
    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()