From 3729ba5ca3d5146be20e285c314b5deddb787995 Mon Sep 17 00:00:00 2001 From: nebulon42 Date: Fri, 12 Nov 2021 20:49:09 +0100 Subject: [PATCH] add list_options setting, fixes #306 --- borgmatic/config/schema.yaml | 8 ++++++++ borgmatic/hooks/mysql.py | 1 + tests/unit/hooks/test_mysql.py | 18 ++++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/borgmatic/config/schema.yaml b/borgmatic/config/schema.yaml index f3fc0db..2427312 100644 --- a/borgmatic/config/schema.yaml +++ b/borgmatic/config/schema.yaml @@ -749,6 +749,14 @@ properties: configured to trust the configured username without a password. example: trustsome1 + list_options: + type: string + description: | + Additional mysql options to pass directly to + the mysql command that lists available + databases, without performing any validation on + them. See mysql documentation for details. + example: --defaults-extra-file=my.cnf options: type: string description: | diff --git a/borgmatic/hooks/mysql.py b/borgmatic/hooks/mysql.py index 99cd73e..dbd51d8 100644 --- a/borgmatic/hooks/mysql.py +++ b/borgmatic/hooks/mysql.py @@ -31,6 +31,7 @@ def database_names_to_dump(database, extra_environment, log_prefix, dry_run_labe show_command = ( ('mysql',) + + (tuple(database['list_options'].split(' ')) if 'list_options' in database else ()) + (('--host', database['hostname']) if 'hostname' in database else ()) + (('--port', str(database['port'])) if 'port' in database else ()) + (('--protocol', 'tcp') if 'hostname' in database or 'port' in database else ()) diff --git a/tests/unit/hooks/test_mysql.py b/tests/unit/hooks/test_mysql.py index 8e457a5..052b2ef 100644 --- a/tests/unit/hooks/test_mysql.py +++ b/tests/unit/hooks/test_mysql.py @@ -198,6 +198,24 @@ def test_dump_databases_runs_mysqldump_for_all_databases(): assert module.dump_databases(databases, 'test.yaml', {}, dry_run=False) == [process] +def test_database_names_to_dump_runs_mysql_with_list_options(): + database = {'name': 'all', 'list_options': '--defaults-extra-file=my.cnf'} + flexmock(module).should_receive('execute_command').with_args( + ( + 'mysql', + '--defaults-extra-file=my.cnf', + '--skip-column-names', + '--batch', + '--execute', + 'show schemas', + ), + output_log_level=None, + extra_environment=None, + ).and_return(('foo\nbar')).once() + + assert module.database_names_to_dump(database, None, 'test.yaml', '') == ('foo', 'bar') + + def test_dump_databases_errors_for_missing_all_databases(): databases = [{'name': 'all'}] process = flexmock()