Add validate-borgmatic-config command.
This commit is contained in:
commit
6a10022543
4 changed files with 92 additions and 1 deletions
2
AUTHORS
2
AUTHORS
|
@ -7,6 +7,6 @@ Johannes Feichtner: Support for user hooks
|
||||||
Michele Lazzeri: Custom archive names
|
Michele Lazzeri: Custom archive names
|
||||||
Nick Whyte: Support prefix filtering for archive consistency checks
|
Nick Whyte: Support prefix filtering for archive consistency checks
|
||||||
newtonne: Read encryption password from external file
|
newtonne: Read encryption password from external file
|
||||||
Robin `ypid` Schneider: Support additional options of Borg
|
Robin `ypid` Schneider: Support additional options of Borg and add validate-borgmatic-config command
|
||||||
Scott Squires: Custom archive names
|
Scott Squires: Custom archive names
|
||||||
Thomas LÉVEIL: Support for a keep_minutely prune option. Support for the --json option
|
Thomas LÉVEIL: Support for a keep_minutely prune option. Support for the --json option
|
||||||
|
|
56
borgmatic/commands/validate_config.py
Normal file
56
borgmatic/commands/validate_config.py
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
from argparse import ArgumentParser
|
||||||
|
import sys
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from borgmatic.config import collect, validate
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def parse_arguments(*arguments):
|
||||||
|
'''
|
||||||
|
Given command-line arguments with which this script was invoked, parse the arguments and return
|
||||||
|
them as an ArgumentParser instance.
|
||||||
|
'''
|
||||||
|
config_paths = collect.get_default_config_paths()
|
||||||
|
|
||||||
|
parser = ArgumentParser(description='Validate borgmatic configuration file(s).')
|
||||||
|
parser.add_argument(
|
||||||
|
'-c',
|
||||||
|
'--config',
|
||||||
|
nargs='+',
|
||||||
|
dest='config_paths',
|
||||||
|
default=config_paths,
|
||||||
|
help='Configuration filenames or directories, defaults to: {}'.format(
|
||||||
|
' '.join(config_paths)
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
return parser.parse_args(arguments)
|
||||||
|
|
||||||
|
|
||||||
|
def main(): # pragma: no cover
|
||||||
|
args = parse_arguments(*sys.argv[1:])
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.INFO, format='%(message)s')
|
||||||
|
|
||||||
|
config_filenames = tuple(collect.collect_config_filenames(args.config_paths))
|
||||||
|
if len(config_filenames) == 0:
|
||||||
|
logger.critical('No files to validate found')
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
found_issues = False
|
||||||
|
for config_filename in config_filenames:
|
||||||
|
try:
|
||||||
|
validate.parse_configuration(
|
||||||
|
config_filename, validate.schema_filename()
|
||||||
|
)
|
||||||
|
except (ValueError, OSError, validate.Validation_error) as error:
|
||||||
|
logging.critical('{}: Error parsing configuration file'.format(config_filename))
|
||||||
|
logging.critical(error)
|
||||||
|
found_issues = True
|
||||||
|
|
||||||
|
if found_issues:
|
||||||
|
sys.exit(1)
|
||||||
|
else:
|
||||||
|
logger.info('All given configuration files are valid: {}'.format(config_filenames))
|
1
setup.py
1
setup.py
|
@ -26,6 +26,7 @@ setup(
|
||||||
'borgmatic = borgmatic.commands.borgmatic:main',
|
'borgmatic = borgmatic.commands.borgmatic:main',
|
||||||
'upgrade-borgmatic-config = borgmatic.commands.convert_config:main',
|
'upgrade-borgmatic-config = borgmatic.commands.convert_config:main',
|
||||||
'generate-borgmatic-config = borgmatic.commands.generate_config:main',
|
'generate-borgmatic-config = borgmatic.commands.generate_config:main',
|
||||||
|
'validate-borgmatic-config = borgmatic.commands.validate_config:main',
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
obsoletes=['atticmatic'],
|
obsoletes=['atticmatic'],
|
||||||
|
|
|
@ -29,6 +29,36 @@ def generate_configuration(config_path, repository_path):
|
||||||
config_file.close()
|
config_file.close()
|
||||||
|
|
||||||
|
|
||||||
|
def validate_valid_configuration(config_path):
|
||||||
|
'''
|
||||||
|
Validate borgmatic configuration which is valid.
|
||||||
|
'''
|
||||||
|
subprocess.check_call(
|
||||||
|
'validate-borgmatic-config --config {}'.format(config_path).split(' ')
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def validate_invalid_configuration(config_path):
|
||||||
|
'''
|
||||||
|
Validate borgmatic configuration which is invalid.
|
||||||
|
'''
|
||||||
|
|
||||||
|
config = (
|
||||||
|
open(config_path)
|
||||||
|
.read()
|
||||||
|
.replace('keep_daily: 7', 'keep_daily: "7"')
|
||||||
|
)
|
||||||
|
config_file = open(config_path, 'w')
|
||||||
|
config_file.write(config)
|
||||||
|
config_file.close()
|
||||||
|
|
||||||
|
exit_code = subprocess.call(
|
||||||
|
'validate-borgmatic-config --config {}'.format(config_path).split(' ')
|
||||||
|
)
|
||||||
|
|
||||||
|
assert exit_code == 1
|
||||||
|
|
||||||
|
|
||||||
def test_borgmatic_command():
|
def test_borgmatic_command():
|
||||||
# Create a Borg repository.
|
# Create a Borg repository.
|
||||||
temporary_directory = tempfile.mkdtemp()
|
temporary_directory = tempfile.mkdtemp()
|
||||||
|
@ -41,7 +71,11 @@ def test_borgmatic_command():
|
||||||
|
|
||||||
try:
|
try:
|
||||||
config_path = os.path.join(temporary_directory, 'test.yaml')
|
config_path = os.path.join(temporary_directory, 'test.yaml')
|
||||||
|
invalid_config_path = os.path.join(temporary_directory, 'test_invalid.yaml')
|
||||||
generate_configuration(config_path, repository_path)
|
generate_configuration(config_path, repository_path)
|
||||||
|
generate_configuration(invalid_config_path, repository_path)
|
||||||
|
validate_valid_configuration(config_path)
|
||||||
|
validate_invalid_configuration(invalid_config_path)
|
||||||
|
|
||||||
subprocess.check_call(
|
subprocess.check_call(
|
||||||
'borgmatic -v 2 --config {} --init --encryption repokey'.format(config_path).split(' ')
|
'borgmatic -v 2 --config {} --init --encryption repokey'.format(config_path).split(' ')
|
||||||
|
|
Loading…
Reference in a new issue