diff --git a/NEWS b/NEWS index 7d375749c..25df1b711 100644 --- a/NEWS +++ b/NEWS @@ -1,10 +1,12 @@ -1.4.22.dev0-files +1.4.23.dev0 + * #274: Add ~/.config/borgmatic.d as another configuration directory default. * Removed `borg --list --stats` option from `create`and `prune` actions at verbosity 1 * The `--stats` now always requires to use the `borgmatic --stats` option to be enabled. * New option `--files` to (re-)add the `borg` `--list` at verbosity 1 -1.4.22.dev0 - * #276: Disable colored output when "--json" flag is used, so as to produce valid JSON ouput. +1.4.22 + * #276, #285: Disable colored output when "--json" flag is used, so as to produce valid JSON ouput. + * After a backup of a database dump in directory format, properly remove the dump directory. * In "borgmatic --help", don't expand $HOME in listing of default "--config" paths. 1.4.21 diff --git a/README.md b/README.md index 09f4e6564..9d0881171 100644 --- a/README.md +++ b/README.md @@ -20,9 +20,11 @@ location: - /home - /etc - # Paths to local or remote repositories. + # Paths of local or remote repositories to backup to. repositories: - - user@backupserver:sourcehostname.borg + - 1234@usw-s001.rsync.net:backups.borg + - k8pDxu32@k8pDxu32.repo.borgbase.com:repo + - /var/lib/backups/backups.borg retention: # Retention policy for how many backups to keep. diff --git a/borgmatic/config/collect.py b/borgmatic/config/collect.py index ef04bd499..97c941062 100644 --- a/borgmatic/config/collect.py +++ b/borgmatic/config/collect.py @@ -17,6 +17,7 @@ def get_default_config_paths(expand_home=True): '/etc/borgmatic/config.yaml', '/etc/borgmatic.d', '%s/borgmatic/config.yaml' % user_config_directory, + '%s/borgmatic.d' % user_config_directory, ] diff --git a/borgmatic/hooks/dump.py b/borgmatic/hooks/dump.py index 54db1d265..bd5ea084f 100644 --- a/borgmatic/hooks/dump.py +++ b/borgmatic/hooks/dump.py @@ -1,6 +1,7 @@ import glob import logging import os +import shutil from borgmatic.borg.create import DEFAULT_BORGMATIC_SOURCE_DIRECTORY @@ -83,7 +84,10 @@ def remove_database_dumps(dump_path, databases, database_type_name, log_prefix, if dry_run: continue - os.remove(dump_filename) + if os.path.isdir(dump_filename): + shutil.rmtree(dump_filename) + else: + os.remove(dump_filename) dump_file_dir = os.path.dirname(dump_filename) if len(os.listdir(dump_file_dir)) == 0: diff --git a/docs/how-to/make-per-application-backups.md b/docs/how-to/make-per-application-backups.md index cd2574608..8d08ac2c0 100644 --- a/docs/how-to/make-per-application-backups.md +++ b/docs/how-to/make-per-application-backups.md @@ -27,9 +27,10 @@ for each configuration file one at a time. In other words, borgmatic does not perform any merging of configuration files by default. If you'd like borgmatic to merge your configuration files, see below about configuration includes. -And if you need even more customizability, you can specify alternate -configuration paths on the command-line with borgmatic's `--config` option. -See `borgmatic --help` for more information. +Additionally, the `~/.config/borgmatic.d/` directory works the same way as +`/etc/borgmatic.d`. If you need even more customizability, you can specify +alternate configuration paths on the command-line with borgmatic's `--config` +flag. See `borgmatic --help` for more information. ## Configuration includes diff --git a/docs/how-to/set-up-backups.md b/docs/how-to/set-up-backups.md index 2d2883727..59d916207 100644 --- a/docs/how-to/set-up-backups.md +++ b/docs/how-to/set-up-backups.md @@ -68,10 +68,13 @@ sudo generate-borgmatic-config If that command is not found, then it may be installed in a location that's not in your system `PATH` (see above). Try looking in `~/.local/bin/`. -This generates a sample configuration file at /etc/borgmatic/config.yaml (by -default). You should edit the file to suit your needs, as the values are -representative. All options are optional except where indicated, so feel free -to ignore anything you don't need. +This generates a sample configuration file at `/etc/borgmatic/config.yaml` by +default. If you'd like to use another path, use the `--destination` flag, for +instance: `--destination ~/.config/borgmatic/config.yaml`. + +You should edit the configuration file to suit your needs, as the generated +values are only representative. All options are optional except where +indicated, so feel free to ignore anything you don't need. Note that the configuration file is organized into distinct sections, each with a section name like `location:` or `storage:`. So take care that if you @@ -79,12 +82,11 @@ uncomment a particular option, also uncomment its containing section name, or else borgmatic won't recognize the option. Also be sure to use spaces rather than tabs for indentation; YAML does not allow tabs. -You can also get the same sample configuration file from the [configuration +You can get the same sample configuration file from the [configuration reference](https://torsion.org/borgmatic/docs/reference/configuration/), the authoritative set of all configuration options. This is handy if borgmatic has -added new options -since you originally created your configuration file. Also check out how to -[upgrade your +added new options since you originally created your configuration file. Also +check out how to [upgrade your configuration](https://torsion.org/borgmatic/docs/how-to/upgrade/#upgrading-your-configuration). @@ -173,6 +175,9 @@ The verbosity flag makes borgmatic list the files that it's archiving, which are those that are new or changed since the last backup. Eyeball the list and see if it matches your expectations based on the configuration. +If you'd like to specify an alternate configuration file path, use the +`--config` flag. See `borgmatic --help` for more information. + ## Autopilot diff --git a/sample/systemd/borgmatic.service b/sample/systemd/borgmatic.service index 11725e6ea..cd3f51b0c 100644 --- a/sample/systemd/borgmatic.service +++ b/sample/systemd/borgmatic.service @@ -20,5 +20,5 @@ Restart=no LogRateLimitIntervalSec=0 # Delay start to prevent backups running during boot. -ExecStartPre=/usr/bin/sleep 1m -ExecStart=/usr/bin/systemd-inhibit --who="borgmatic" --why="Prevent interrupting scheduled backup" /root/.local/bin/borgmatic --syslog-verbosity 1 +ExecStartPre=sleep 1m +ExecStart=systemd-inhibit --who="borgmatic" --why="Prevent interrupting scheduled backup" /root/.local/bin/borgmatic --syslog-verbosity 1 diff --git a/setup.py b/setup.py index 293849d20..c73c9ea77 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,6 @@ from setuptools import find_packages, setup -VERSION = '1.4.22.dev0-files' +VERSION = '1.4.23.dev0' setup( diff --git a/tests/unit/hooks/test_dump.py b/tests/unit/hooks/test_dump.py index d36f80982..dc6e8dd3b 100644 --- a/tests/unit/hooks/test_dump.py +++ b/tests/unit/hooks/test_dump.py @@ -66,6 +66,7 @@ def test_remove_database_dumps_removes_dump_for_each_database(): 'databases', 'bar', None ).and_return('databases/localhost/bar') + flexmock(module.os.path).should_receive('isdir').and_return(False) flexmock(module.os).should_receive('remove').with_args('databases/localhost/foo').once() flexmock(module.os).should_receive('remove').with_args('databases/localhost/bar').once() flexmock(module.os).should_receive('listdir').with_args('databases/localhost').and_return( @@ -77,6 +78,21 @@ def test_remove_database_dumps_removes_dump_for_each_database(): module.remove_database_dumps('databases', databases, 'SuperDB', 'test.yaml', dry_run=False) +def test_remove_database_dumps_removes_dump_in_directory_format(): + databases = [{'name': 'foo'}] + flexmock(module).should_receive('make_database_dump_filename').with_args( + 'databases', 'foo', None + ).and_return('databases/localhost/foo') + + flexmock(module.os.path).should_receive('isdir').and_return(True) + flexmock(module.os).should_receive('remove').never() + flexmock(module.shutil).should_receive('rmtree').with_args('databases/localhost/foo').once() + flexmock(module.os).should_receive('listdir').with_args('databases/localhost').and_return([]) + flexmock(module.os).should_receive('rmdir').with_args('databases/localhost').once() + + module.remove_database_dumps('databases', databases, 'SuperDB', 'test.yaml', dry_run=False) + + def test_remove_database_dumps_with_dry_run_skips_removal(): databases = [{'name': 'foo'}, {'name': 'bar'}] flexmock(module.os).should_receive('rmdir').never()