Compare commits

...

831 commits

Author SHA1 Message Date
bc02c123e6 Monitor backups with PagerDuty hook integration (#245).
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2020-01-27 15:32:09 -08:00
e76d5ad988 Fix tests.
All checks were successful
continuous-integration/drone/push Build is passing
2020-01-27 12:56:12 -08:00
8ad8a9c422 Add per-action hooks: "before_prune", "after_prune", "before_check", and "after_check" (#255).
Some checks failed
continuous-integration/drone/push Build is failing
2020-01-27 11:07:07 -08:00
b15c9b7dab Add missing "how to" text.
All checks were successful
continuous-integration/drone/push Build is passing
2020-01-24 21:02:56 -08:00
2405e97c38 Backup to a removable drive or intermittent server via "soft failure" feature (#284).
All checks were successful
continuous-integration/drone/push Build is passing
2020-01-24 20:52:48 -08:00
fdbb2ee905 View consistency check progress via "--progress" flag for "check" action (#287).
All checks were successful
continuous-integration/drone/push Build is passing
2020-01-24 11:27:16 -08:00
94b9ef56be Change "exclude_if_present" option to support multiple filenames, rather than just a single filename (#280).
All checks were successful
continuous-integration/drone/push Build is passing
2020-01-23 13:41:37 -08:00
952168ce25 Fix unwanted console log messages with "list --json" and "info --json". 2020-01-23 13:40:54 -08:00
5273037a94 For "list" and "info" actions, show repository names even at verbosity 0.
Some checks failed
continuous-integration/drone/push Build is failing
2020-01-23 11:17:39 -08:00
53e6ff9524 No longer list files or show stats by default at verbosity 2.
All checks were successful
continuous-integration/drone/push Build is passing
2020-01-22 15:23:49 -08:00
f66fd1caaa Customize Healthchecks log level via borgmatic "--monitoring-verbosity" flag (#277).
All checks were successful
continuous-integration/drone/push Build is passing
2020-01-22 15:10:47 -08:00
d93fdbc5ad Support "--files" and "--stats" flags at verbosity level 0.
All checks were successful
continuous-integration/drone/push Build is passing
2020-01-22 13:28:24 -08:00
58e0439daf Disable per-file logging by default at verbosity 1; opt-in via new --files option.
All checks were successful
continuous-integration/drone/push Build is passing
2020-01-22 20:36:59 +00:00
palto42
75b5e7254e changes as per comments in PR #283 2020-01-22 19:03:26 +01:00
39550a7fe9 Add ~/.config/borgmatic.d as another configuration directory default (#274).
All checks were successful
continuous-integration/drone/push Build is passing
2020-01-22 09:26:58 -08:00
palto42
5f0c084bee Merge 'upstream/master' into list-files 2020-01-22 18:12:26 +01:00
88f06f7921 Revert "Use absolute paths in systemd commands."
All checks were successful
continuous-integration/drone/push Build is passing
This reverts commit 24e1516ec5.
2020-01-21 16:03:24 -08:00
8d12079386 Bump version.
All checks were successful
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is passing
2020-01-21 10:47:29 -08:00
7824a034ca Add test for database dump directory removal.
All checks were successful
continuous-integration/drone/push Build is passing
2020-01-21 10:34:46 -08:00
8ef0ba2fae
After a backup of a database dump in directory format, properly remove the dump directory. 2020-01-21 10:29:40 -08:00
cc384f4324 Second ticket for --json color bug.
All checks were successful
continuous-integration/drone/push Build is passing
2020-01-21 08:33:41 -08:00
8a91c79fb0 Support directory format dump cleanup.
Previously, only deleting a dump in a single-file format was supported.
This led to errors when performing a PostgreSQL directory format backup.
2020-01-19 15:15:47 +01:00
ac1d63bb0d Use more realistic repository examples in README.
All checks were successful
continuous-integration/drone/push Build is passing
2020-01-18 20:00:18 -08:00
palto42
83632448be updated NEWS for mod. --stats & new --files opt. 2020-01-18 14:57:50 +01:00
palto42
e108526bab disable --stats by default 2020-01-18 14:38:59 +01:00
palto42
e27ba0d08a less detail at v1 + option "--files" for details 2020-01-11 16:38:07 +01:00
5afe0e3d63 Disable colored output when "--json" flag is used, so as to produce valid JSON ouput (#276).
All checks were successful
continuous-integration/drone/push Build is passing
2020-01-04 15:50:41 -08:00
c52f82f9ce Documentation: Enable and start borgmatic with a single systemctl command.
All checks were successful
continuous-integration/drone/push Build is passing
2020-01-04 13:37:56 -08:00
d0c533555e In "borgmatic --help", don't expand $HOME in listing of default "--config" paths.
All checks were successful
continuous-integration/drone/push Build is passing
2020-01-02 10:37:31 -08:00
1995c80e60 Add comment about old versions of systemd and option compatibility (#275).
All checks were successful
continuous-integration/drone/push Build is passing
2020-01-02 10:05:32 -08:00
24e1516ec5 Use absolute paths in systemd commands.
All checks were successful
continuous-integration/drone/push Build is passing
2020-01-01 17:14:55 -08:00
5b1beda82b Add logrotate documentation suggestion.
All checks were successful
continuous-integration/drone/push Build is passing
2019-12-31 15:06:53 -08:00
e4f1094569 Bump version for release.
All checks were successful
continuous-integration/drone/tag Build is passing
2019-12-20 14:04:49 -08:00
911668f0c8 Only trigger "on_error" hooks and monitoring failures for "prune", "create", and "check" actions, and not for other actions (#270).
All checks were successful
continuous-integration/drone/push Build is passing
2019-12-20 13:58:02 -08:00
6bfa0783b9 Clarify that the documentation suggestion form is only for documentation.
All checks were successful
continuous-integration/drone/push Build is passing
2019-12-17 20:16:13 -08:00
d64bcd5e83 When pruning with verbosity level 1, list pruned and kept archives.
All checks were successful
continuous-integration/drone/push Build is passing
2019-12-17 20:12:41 -08:00
ed2ca9f476 Sign release files.
All checks were successful
continuous-integration/drone/push Build is passing
2019-12-17 20:06:25 -08:00
f787dfe809 Override particular configuration options from the command-line via "--override" flag (#268).
All checks were successful
continuous-integration/drone/push Build is passing
2019-12-17 11:46:27 -08:00
afaabd14a8 Clarify documentation on how /etc/borgmatic.d/ configuration files are interpreted.
All checks were successful
continuous-integration/drone/push Build is passing
2019-12-13 11:42:17 -08:00
e009bfeaa2 Update Healthchecks/Cronitor/Cronhub monitoring integrations to fire for "check" and "prune" actions, not just "create" (#249).
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-12-12 22:54:45 -08:00
f1358d52aa Add "borgmatic init" repository probing fix to NEWS. 2019-12-12 21:50:24 -08:00
b04b333466
Use --remote-path, --debug and --info when checking for repo existence. 2019-12-13 05:47:47 +00:00
Matthew Daley
dd16504329 Use --remote-path, --debug and --info when checking for repo existence
These are currently not being used in the call to `borg info` performed
as part of the borgmatic init command to check whether or not the repo
already exists.
2019-12-13 15:45:12 +13:00
c6cb21a748 Switch to read-only container filesystem to avoid *.pyc getting created with busted permissions.
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-12-11 21:24:37 -08:00
78aa4626fa Remove user switch in container due to CI permission issue.
All checks were successful
continuous-integration/drone/push Build is passing
2019-12-11 16:58:08 -08:00
d2df224da8 Use busybox short option to su.
Some checks failed
continuous-integration/drone/push Build is failing
2019-12-11 16:46:24 -08:00
464ff2fe96 Run end-to-end tests on developer machines with Docker Compose for approximate parity with continuous integration tests.
Some checks reported errors
continuous-integration/drone/push Build was killed
2019-12-11 16:43:01 -08:00
0cc711173a Merge branch 'master' into end-to-end-database-tests
All checks were successful
continuous-integration/drone/push Build is passing
2019-12-11 12:27:14 -08:00
14e5cfc8f8 Support piping "borgmatic list" output to grep. Retain colored output when piping/redirecting (#271).
All checks were successful
continuous-integration/drone/push Build is passing
2019-12-11 12:12:25 -08:00
b8b888090d Select Postgres service to work with particular client version.
All checks were successful
continuous-integration/drone/push Build is passing
2019-12-10 21:41:15 -08:00
68281339b7 Black.
Some checks failed
continuous-integration/drone/push Build is failing
2019-12-10 16:57:12 -08:00
2e5be3d3f1 Add missing psql.
Some checks reported errors
continuous-integration/drone/push Build was killed
2019-12-10 16:52:59 -08:00
abd31a94fb Ports fix?
Some checks reported errors
continuous-integration/drone/push Build was killed
2019-12-10 16:47:09 -08:00
01e2cf08d1 Fix Drone CI services syntax. 2019-12-10 16:43:43 -08:00
9f821862b7 End-to-end tests for database dump and restore. 2019-12-10 16:41:01 -08:00
8660af745e Optionally change the internal database dump path via "borgmatic_source_directory" option in location configuration section (#259).
All checks were successful
continuous-integration/drone/push Build is passing
2019-12-10 16:04:34 -08:00
826e4352d1 Filter listed paths via "borgmatic list --path" flag (#269).
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-12-08 14:07:02 -08:00
b94999bba4 Fix "borgmatic umount" so it only runs Borg once instead of once per repository / configuration file.
All checks were successful
continuous-integration/drone/push Build is passing
2019-12-07 21:36:51 -08:00
65cc4c9429 Fix "--repository" flag to accept relative paths.
All checks were successful
continuous-integration/drone/push Build is passing
2019-12-06 16:29:41 -08:00
df2be9620b Mount whole repositories via "borgmatic mount" without any "--archive" flag (#253).
All checks were successful
continuous-integration/drone/push Build is passing
2019-12-06 15:58:54 -08:00
2ab9daaa0f Attempt to repair any inconsistencies found during a consistency check via "borgmatic check --repair" flag (#266).
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-12-04 16:07:00 -08:00
0c6c61a272 Pass extra options directly to particular Borg commands, handy for Borg options that borgmatic does not yet support natively (#235).
All checks were successful
continuous-integration/drone/push Build is passing
2019-12-04 15:48:10 -08:00
00f62ca023 Fix for "before_backup" hook not triggering an error when the command contains "borg" and has an exit code of 1 (#256).
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-11-30 16:55:05 -08:00
9b2ca15de6 Fix for garbled Borg file listing when using "borgmatic create --progress" with verbosity level 1 or 2 (#257).
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-30 15:31:36 -08:00
c4aa34bf5c Fix for missing Healthchecks monitoring payload or HTTP 500 due to incorrect unicode encoding (#260).
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-30 14:51:32 -08:00
4385f2a36a Merge branch 'master' of github.com:witten/borgmatic
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-11-25 15:28:21 -08:00
ed6a9dadf8
Fix for database dump removal incorrectly skipping some database dumps. 2019-11-25 23:28:15 +00:00
d978a2d190 Fix for database dump removal incorrectly skipping some database dumps. 2019-11-25 15:27:59 -08:00
375036e409 Support for mounting an archive as a FUSE filesystem via "borgmatic mount" action, and unmounting via "borgmatic umount" (#123).
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-25 14:56:20 -08:00
Raphael Heinrich
99168c1035 Fix error on cleanup multiple database dumps 2019-11-25 22:07:42 +01:00
f4a231420f Show summary log errors regardless of verbosity. Log the "summary:" header with level based on the contained logs.
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-11-25 10:31:09 -08:00
55ebfdda39 Show full error logs at "--verbosity 0" so you can see command output without upping the verbosity level.
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-11-19 10:09:25 -08:00
e63e2e0852 Rephrasing verbosity levels.
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-17 22:52:26 -08:00
edc4b9e60e Update the command-line help description.
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-17 22:49:16 -08:00
78ff734e6c Add note about error logs only flowing to Healthchecks for the "create" action.
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-11-17 19:10:11 -08:00
2cc743cf47 With "borgmatic check", consider Borg warnings as errors (#247). 2019-11-17 19:06:28 -08:00
d99e6d1994 Remove obnoxious log message when Healthchecks hook sends failure for check action. 2019-11-17 18:55:40 -08:00
50f62d73b7 When using the Healthchecks monitoring hook, include borgmatic logs in the payloads for completion and failure pings (#241).
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-11-17 16:54:27 -08:00
26a89de790 Higher resolution BorgBase logo.
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-14 12:39:33 -08:00
c2276b18c5 Add troubleshooting documentation for MySQL lock table errors (#244).
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-14 10:33:47 -08:00
693434f8aa Icon spacing hack that'll show up on GitHub.
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-14 09:45:38 -08:00
1e8edc05e9 Marketing.
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-14 09:34:53 -08:00
1f166a47e9 Fix failing test due to dictionary order (or the lack thereof..) in Python 3.5.
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-13 16:42:58 -08:00
9ee6151999 Add link to unofficial Fedora package of borgmatic that's more up-to-date.
Some checks failed
continuous-integration/drone/push Build is failing
2019-11-13 14:59:49 -08:00
6cdc92bd0c Fix for "borgmatic restore" showing success and incorrectly extracting archive files, even when no databases are configured to restore (#246).
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-11-13 10:41:57 -08:00
612e1fea67 Add database version to issue template.
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-13 08:38:58 -08:00
0a9f4e8708 Reopen the file given by "--log-file" flag if an external program rotates the log file while borgmatic is running.
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-12 16:13:25 -08:00
781fac3266 Refactor ping monitors (Healthchecks, Cronitor, Cronhub) to share a common invocation and function signature.
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-12 15:31:07 -08:00
4c38810a32 Add note about rsyslog rate limiting.
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-12 12:32:32 -08:00
bf0d38ff2a Update docs about MySQL/MariaDB database dumps and restores (#228).
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-11-12 11:59:01 -08:00
04e5b42606 Fix repository does not exist error with "borgmatic extract" when repository is remote (#243).
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-12 11:47:24 -08:00
30525c43bf Another edge case: Don't error on non-matching restore path globs (#228).
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-12 11:24:31 -08:00
ebeb5efe05 More accurately detecting restore of unconfigured database (#228).
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-12 11:10:47 -08:00
a3e939f34b Factor out filtering of database configuration to function with tests (#228).
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-12 10:39:36 -08:00
2a771161e7 Finish test coverage for MySQL restore (#228).
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-12 09:50:26 -08:00
ded042d8cc First crack at MySQL/MariaDB database restore (#228).
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-11 21:59:30 -08:00
4ed43ae4dc Indicate in AUTHORS that it's not an exhaustive list.
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-10 14:50:28 -08:00
9d29ecf304 Remove MySQL/MariaDB database dumps after backing them up (#228).
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-08 11:53:27 -08:00
427b57e2a9 Database dump hooks for MySQL/MariaDB (#228).
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-08 11:17:52 -08:00
e4f0a336c2 Fix installation path in docs.
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-07 11:09:27 -08:00
68459c6795 Add note about setting PATH environment variable when installing borgmatic.
Some checks reported errors
continuous-integration/drone/push Build was killed
2019-11-07 11:05:41 -08:00
17fda7281a Monitor backups with Cronhub hook integration. Fix Healthchecks/Cronitor hooks to respect dry run.
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-11-07 10:08:44 -08:00
ac777965d0 Fix regression of generate-borgmatic-config working without --source flag (#239).
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-11-06 09:52:21 -08:00
31d3bc9bd8 In documentation, clarify when Healthchecks/Cronitor hooks fire in relation to other hooks (#238).
Some checks reported errors
continuous-integration/drone/push Build was killed
2019-11-06 09:44:46 -08:00
2115eeb6a2 Upgrade your borgmatic configuration to get new options and comments via "generate-borgmatic-config --source" (#239).
Some checks failed
continuous-integration/drone/push Build is failing
2019-11-06 09:31:00 -08:00
08f017bc3e Remove broken Tox Python version filter when running Black (code formatter) environment directly.
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-05 09:36:30 -08:00
7bc9482970 Add verbosity level -1 to NEWS.
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-11-03 17:03:19 -08:00
57ffad4e04 Verbosity level "-1" for even quieter output: Errors only (#236).
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-04 01:02:13 +00:00
5422d14f93 Add Python 3.8.
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-03 14:12:46 -08:00
e6d8c736d0 Documentation feedback: Don't hard-code Python 3.7 for Black.
Some checks reported errors
continuous-integration/drone/push Build was killed
2019-11-03 14:08:19 -08:00
palto42
18d3542fbc new verbosity level "-1" for errors 2019-11-03 09:55:19 +01:00
93f453cecf Add Python 3.8 to build matrix.
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-02 16:38:50 -07:00
505bb778fa Fix logging docs typo.
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-02 12:54:03 -07:00
b09d464162 Add missing PR link.
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-02 11:27:05 -07:00
a9104ed090 Handle log file error more consistently with other error. Add --log-file-verbosity flag. Add docs.
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-11-02 11:23:18 -07:00
06f134cc71 Log to file instead of syslog via command-line "--log-file" flag (#233).
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-02 17:43:39 +00:00
palto42
584359b6c0 .gitignore 2019-11-02 14:39:16 +01:00
palto42
26a1a3d1e0 test cases for logfile option 2019-11-02 14:34:16 +01:00
palto42
6da05cbe2d Exception handling for logfile option 2019-11-02 14:33:57 +01:00
f48f52079d Support for Borg --keep-exclude-tags and --exclude-nodump options (#234).
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-11-01 15:50:59 -07:00
76c569cf84 Update test requirements.
All checks were successful
continuous-integration/drone/push Build is passing
2019-11-01 12:18:35 -07:00
palto42
b121290c0f Merge remote-tracking branch 'upstream/master' into logging 2019-11-01 19:44:04 +01:00
8fd46b8c70 Monitor backups with Cronitor hook integration.
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-11-01 11:33:15 -07:00
603f525352 Clarify --archive help. 2019-11-01 10:50:20 -07:00
palto42
8c8640d0ab file-logger replaces syslog 2019-11-01 18:42:24 +01:00
e3dd545345 Extract files to a particular directory via "borgmatic extract --destination" flag. Also rename "--restore-path" to "--path" to reduce confusion.
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-11-01 10:00:26 -07:00
589fc30fc8 To orient the reader, add "borgmatic" to the top of each documentation page.
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-10-31 22:04:38 -07:00
bd3c51fc5a Documentation for database restores (#229). 2019-10-31 21:45:47 -07:00
2c46f53ef6 Attempt to upgrade version of pip used in CI.
All checks were successful
continuous-integration/drone/push Build is passing
2019-10-31 20:37:01 -07:00
939f4d4e3d Add additional tests for database restores.
All checks were successful
continuous-integration/drone/push Build is passing
2019-10-31 14:11:19 -07:00
3006db0cae Restore backed up PostgreSQL databases via "borgmatic restore" sub-command (#229).
All checks were successful
continuous-integration/drone/push Build is passing
2019-10-31 12:57:36 -07:00
palto42
22640a9ca0 new option for log-file 2019-10-31 10:44:22 +01:00
ca23c3b8b3 Remove unnecessary word from documentation.
All checks were successful
continuous-integration/drone/push Build is passing
2019-10-30 10:55:40 -07:00
74607fdd43 Documentation on how to develop borgmatic's documentation.
Some checks reported errors
continuous-integration/drone/push Build was killed
2019-10-30 10:54:42 -07:00
b53684a8f0 Fix incorrect link to hooks documentation.
All checks were successful
continuous-integration/drone/push Build is passing
2019-10-29 09:53:45 -07:00
f055f5dea8 Clarify borgmatic restore example with no leading slash.
All checks were successful
continuous-integration/drone/push Build is passing
2019-10-28 12:00:54 -07:00
4dc4fe0b8d Reordering hooks a bit so that pre-backup ordering mirrors post-backup ordering.
All checks were successful
continuous-integration/drone/push Build is passing
2019-10-27 14:47:55 -07:00
5e3c2da79c Database dump hooks documentation (#225).
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-10-23 15:35:37 -07:00
37dc94bc79 Add test for removal of database dumps.
All checks were successful
continuous-integration/drone/push Build is passing
2019-10-23 13:36:03 -07:00
fc274b43f0 Rename "borgmatic list --pattern-from" flag to "--patterns-from" to match Borg (#230).
All checks were successful
continuous-integration/drone/push Build is passing
2019-10-22 22:42:36 -07:00
9ab12e4312 Tests for database dumping (#225).
All checks were successful
continuous-integration/drone/push Build is passing
2019-10-22 21:39:30 -07:00
a5ff35c198 Update NEWS with PostgreSQL database dump hook.
All checks were successful
continuous-integration/drone/push Build is passing
2019-10-22 16:31:26 -07:00
458e7776c5 Database dump hooks for PostgreSQL, so you can easily dump your databases before backups run (#225).
All checks were successful
continuous-integration/drone/push Build is passing
2019-10-22 16:28:42 -07:00
fa5fa1c11b Move hooks into directory, so there can be one source file per type of hook (#225).
All checks were successful
continuous-integration/drone/push Build is passing
2019-10-21 15:52:14 -07:00
f8bc67be8d Config generation support for sequences of maps, needed for database dump hooks (#225).
All checks were successful
continuous-integration/drone/push Build is passing
2019-10-21 15:17:47 -07:00
17586d49ac Bump version of tox in CI.
All checks were successful
continuous-integration/drone/push Build is passing
2019-10-21 11:05:37 -07:00
2f75c9aa9e Bump Tox minimum version.
Some checks failed
continuous-integration/drone/push Build is failing
2019-10-20 21:47:57 +00:00
60650ccfc7
Follow latest Tox developments 2019-10-20 12:49:14 +02:00
c12c47cace Fix "borgmatic list --successful" with a slightly better heuristic for listing successful (non-checkpoint) archives.
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-10-16 10:24:58 -07:00
d6aaab8a09 Remove parentheses from docs sentence. 2019-10-15 13:02:54 -07:00
128ebf04ce Dead man's switch via healthchecks.io integration (#223) + new monitoring documentation.
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-10-15 10:49:14 -07:00
b1941bcce9 Automatically rewrite links to localhost when developing on docs locally. 2019-10-14 13:13:41 -07:00
7b3b28616d Add "borgmatic list --successful" flag to only list successful (non-checkpoint) archives (#86).
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-10-13 15:58:11 -07:00
f3910f49ca Fix incorrect help on borg list --last flag. 2019-10-13 14:46:28 -07:00
59e1cac92c Correct Arch Linux borgmatic package link.
All checks were successful
continuous-integration/drone/push Build is passing
2019-10-11 14:35:07 -07:00
b1f0287fdb Add documentation link to community AUR (Arch Linux) borgmatic package.
All checks were successful
continuous-integration/drone/push Build is passing
2019-10-11 13:35:57 -07:00
99c35d4077 "flags" -> "actions" a few places in the docs.
All checks were successful
continuous-integration/drone/push Build is passing
2019-10-11 10:46:30 -07:00
07b9ff61f2 Remove documentation link to the AUR (Arch Linux) borgmatic package, which apparently has been deleted. 2019-10-11 10:42:19 -07:00
f573c1810a Add a suggestion form to all documentation pages, so users can submit ideas for improving the documentation.
All checks were successful
continuous-integration/drone/push Build is passing
2019-10-10 14:27:48 -07:00
1d37b14356 More detailed error alerting via runtime context available in "on_error" hook (#174).
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-10-01 12:23:16 -07:00
6c617eddd5 When backups to one of several repositories fails, keep backing up to the other repositories (#144).
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-09-30 22:19:31 -07:00
e14ebee4e0 User-defined hooks for global setup or cleanup that run before/after all actions. (#192).
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-09-28 16:18:10 -07:00
a897ffd514 Fix "borgmatic create --progress" output so that it updates on the console in real-time (#221).
All checks were successful
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is passing
2019-09-25 12:03:10 -07:00
a472735616 Merge sample cron files.
All checks were successful
continuous-integration/drone/push Build is passing
2019-09-24 10:49:46 -07:00
b3fec03cf4 Up the syslog verbosity in sample cron files.
All checks were successful
continuous-integration/drone/push Build is passing
2019-09-24 10:47:39 -07:00
89dccc25c3 Add AC power condition for systemd service (#205).
All checks were successful
continuous-integration/drone/push Build is passing
2019-09-24 10:43:30 -07:00
3846155d62 More robust sample systemd service: boot delay, network dependency, lowered CPU/IO priority, etc (#205).
All checks were successful
continuous-integration/drone/push Build is passing
2019-09-24 10:16:30 -07:00
386979ebb4 Mention --stats option in documentation.
All checks were successful
continuous-integration/drone/push Build is passing
2019-09-23 13:13:34 -07:00
07222cd984 Fix visibility of "borgmatic prune --stats" output (#219).
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-09-23 13:07:51 -07:00
cf4c6c274d Upgrade build to Alpine 3.10.
All checks were successful
continuous-integration/drone/push Build is passing
2019-09-23 09:07:17 -07:00
340bd72176 Fix regression of argument parsing for default actions (#220).
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-09-22 11:30:58 -07:00
1a1bb71af1 Fix error with "borgmatic check --only" command-line flag with "extract" consistency check (#217).
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-09-20 11:43:27 -07:00
ae45dfe63a Clarify command-like help for check --only.
All checks were successful
continuous-integration/drone/push Build is passing
2019-09-19 15:20:05 -07:00
d6ac7a9192 Upgrade various dependencies.
All checks were successful
continuous-integration/drone/push Build is passing
2019-09-19 13:04:59 -07:00
d959fdbf8d Document new "check --only" command-line flag.
All checks were successful
continuous-integration/drone/push Build is passing
2019-09-19 11:50:29 -07:00
81739791e0 Override configured consistency checks via "borgmatic check --only" command-line flag (#210).
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-09-19 11:43:53 -07:00
4cdff74e9b Support for Borg check --verify-data flag via borgmatic "data" consistency check (#210).
All checks were successful
continuous-integration/drone/push Build is passing
2019-09-18 16:52:27 -07:00
11e830bb1d Fix flake8 warning.
All checks were successful
continuous-integration/drone/push Build is passing
2019-09-18 14:11:56 -07:00
cba00a9c4e Add NEWS entry for generate-borgmatic-config comment change.
Some checks reported errors
continuous-integration/drone/push Build was killed
2019-09-18 14:06:03 -07:00
f2198de151 Merge branch 'comments-white-space' of polyzen/borgmatic into master
Some checks reported errors
continuous-integration/drone/push Build was killed
2019-09-18 21:03:56 +00:00
0c439c0c02
Add space to separate comments from tokens
https://yaml.org/spec/1.2/spec.html#id2780069
2019-09-17 20:00:58 -04:00
f11a9bb4aa Revert "Fix for spurious Borg traceback when initializing a repository in an empty directory (#201)."
All checks were successful
continuous-integration/drone/push Build is passing
This reverts commit 9585c8f908.
2019-09-14 16:14:20 -07:00
ee6f390910 Merge branch 'point-to-stable-docs' of polyzen/borgmatic into master
Some checks failed
continuous-integration/drone/push Build is failing
2019-09-14 21:53:34 +00:00
9a5117db14
Consistently point to stable Borg docs 2019-09-14 17:30:28 -04:00
9585c8f908 Fix for spurious Borg traceback when initializing a repository in an empty directory (#201).
Some checks failed
continuous-integration/drone/push Build is failing
2019-09-13 13:08:23 -07:00
3495484ddd Bump version for release.
All checks were successful
continuous-integration/drone/tag Build is passing
2019-09-12 21:35:00 -07:00
67ab2acb82 Fix for hook erroring with exit code 1 not being interpreted as an error (#214).
All checks were successful
continuous-integration/drone/push Build is passing
2019-09-12 16:37:43 -07:00
c085bacccf Reorder arguments passed to Borg to fix duplicate directories when using Borg patterns (#213).
All checks were successful
continuous-integration/drone/push Build is passing
2019-09-12 15:27:04 -07:00
896401088e Fix for traceback when the "checks" option has an empty value (#208).
All checks were successful
continuous-integration/drone/push Build is passing
2019-08-26 09:52:32 -07:00
ef3dda9213 Bypass Borg error about a moved repository (#209).
All checks were successful
continuous-integration/drone/push Build is passing
2019-08-26 09:39:41 -07:00
c9f5d9b048 In issue template, use python3 instead of python.
All checks were successful
continuous-integration/drone/push Build is passing
2019-08-24 13:08:18 -07:00
ccbd0b608b Do not treat Borg warnings (exit code 1) as failures (#204).
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-08-03 15:13:54 -07:00
a7cc2ea803 When validating configuration files, require strings instead of allowing any scalar type. 2019-08-03 14:52:12 -07:00
9ec75ccf3f Fit inadvertent conversion of ordered dict to dict.
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-07-27 14:15:24 -07:00
7c890be76d Black formatting. 2019-07-27 14:08:47 -07:00
39e5aac479 If a "prefix" option in borgmatic's configuration has an empty value (blank or ""), then disable default prefix.
Some checks failed
continuous-integration/drone/push Build is failing
2019-07-27 14:04:13 -07:00
e25f2c4e6c Clarify documentation/schema about on_error hook running if there's an error in another hook (#202).
All checks were successful
continuous-integration/drone/push Build is passing
2019-07-19 09:25:01 -07:00
7ad8f9ac6f Link to borgmatic-binary installation method.
All checks were successful
continuous-integration/drone/push Build is passing
2019-07-13 15:40:26 -07:00
2add3ff7ad Fix redirect.
All checks were successful
continuous-integration/drone/push Build is passing
2019-07-05 09:19:51 -07:00
0602ca1862 Add how-to redirect. Fix capitalization.
All checks were successful
continuous-integration/drone/push Build is passing
2019-07-05 09:03:08 -07:00
e973802fc1 Iterate on how-to document name wording.
All checks were successful
continuous-integration/drone/push Build is passing
2019-07-05 08:57:25 -07:00
2bdf6dfd70 Merge branch 'master' of ssh://projects.torsion.org:3022/witten/borgmatic 2019-07-05 08:52:06 -07:00
f894c49540 Merge branch 'rename_howto_guide' of duncanbetts/borgmatic into master
All checks were successful
continuous-integration/drone/push Build is passing
2019-07-05 15:52:21 +00:00
7900e5ea53 Update 'README.md' 2019-07-05 14:40:41 +00:00
5587f48bda Update 'docs/how-to/run-preparation-steps-before-backups.md' 2019-07-05 14:39:21 +00:00
de3ee07566 Update 'README.md'
Improved description of what the resource provides.
2019-07-05 14:37:42 +00:00
fe39453598 Change example filename to be more descriptive. 2019-06-30 17:23:09 -07:00
9c75063c05 Unbreak console snippet in docs.
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-30 17:09:34 -07:00
5cf2ef1732 Add note to documentation about using spaces instead of tabs for indentation, as YAML does not allow tabs (#199).
Some checks failed
continuous-integration/drone/push Build is failing
2019-06-30 16:58:01 -07:00
f35e6ea7ad Upgrade base layers.
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-27 15:38:00 -07:00
90595e9c18 Only log to syslog when run from a non-interactive console (e.g. a cron job). Related to #197.
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-06-27 14:41:21 -07:00
032d4adee3 Remove unicode byte order mark from syslog output. (Related to #197.)
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-27 10:03:49 -07:00
4444219e17 Support for Borg --noatime, --noctime, and --nobirthtime flags (mentioned in #193).
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-06-25 11:30:55 -07:00
56fd78089d Sort generated flags before passing them to Borg.
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-25 11:04:10 -07:00
86dbc00cbe Support for several more borgmatic/borg info command-line flags (#193). 2019-06-25 10:46:55 -07:00
c644270599 Pass through several "borg list" flags (#193).
Some checks failed
continuous-integration/drone/push Build is failing
2019-06-25 10:18:30 -07:00
1676a98c51 Fix for Borg create error output not showing up at borgmatic verbosity level zero (#198).
Some checks reported errors
continuous-integration/drone/tag Build was killed
continuous-integration/drone/push Build is passing
2019-06-24 09:55:41 -07:00
358ed53da0 Only show build status badge for master branch.
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-23 16:53:33 -07:00
90925c9428 Provide tips about old-style flags for those on older versions.
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-23 16:42:23 -07:00
cd192a6909 Bump version for release.
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/tag Build is failing
2019-06-23 16:30:16 -07:00
7185146481 A bunch of tests for parse_subparser_arguments().
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-23 16:06:39 -07:00
c15e6c5fe5 More actions help.
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-23 09:46:22 -07:00
79c2b9df06 Don't make major version bump after all. 2019-06-23 09:23:51 -07:00
acd6772148 Update documentation to refer to dashless action sub-commands.
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-22 22:09:50 -07:00
cd91dbd4f7 Include sub-command help in documentation. 2019-06-22 22:04:56 -07:00
8fc4efff88 Add subcommand note to NEWS. 2019-06-22 21:35:40 -07:00
4bf3e906a1 Break out main borgmatic arguments-parsing code into a separate file. 2019-06-22 21:32:27 -07:00
0ca43ef67a Get tests passing.
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-22 21:23:48 -07:00
603e055a39 Fix borgmatic command unit tests for new parsed arguments. 2019-06-22 16:29:25 -07:00
75c04611dc Refactor to support subparsed-based parsed arguments. 2019-06-22 16:10:07 -07:00
881dc9b01e Make each subparser get a crack all all arguments. 2019-06-21 23:12:37 -07:00
8c72e909a7 Initial stab at subparsers for argument parsing. Not yet fully working. 2019-06-21 22:27:16 -07:00
74ac148747 Disable console color via "color" option in borgmatic configuration output section (#191).
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-06-19 20:48:54 -07:00
be7887c071 Demote log level of unhelpful info log (#194).
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-19 12:01:03 -07:00
da459d95b8 Bump version for release.
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-06-17 12:16:23 -07:00
b3aa6af859 Don't color syslog output (#197).
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-17 11:53:08 -07:00
b816af1b13 Undo purge.
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-16 22:10:25 -07:00
276aeb9875 Fix tests that assert on default syslog verbosity.
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-16 21:58:41 -07:00
de94001508 Change default syslog verbosity to show errors only.
Some checks reported errors
continuous-integration/drone/push Build was killed
2019-06-16 21:57:14 -07:00
7cfab3620b Don't prune docs image after push, so watchtower can pick it up.
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-16 21:52:09 -07:00
6c136ebbf1 Fix for unclear error message for invalid YAML merge include (#196).
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-16 21:33:40 -07:00
eaa5eb4174 Note about including config file.
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-15 14:28:32 -07:00
acc2a39454 Include note about debug output.
Some checks reported errors
continuous-integration/drone/push Build was killed
2019-06-15 14:27:53 -07:00
a10c7a8496 Trying out a Gitea issue template for somewhat more structured bug reports.
Some checks reported errors
continuous-integration/drone/push Build was killed
2019-06-15 14:23:45 -07:00
de82919e39 Skip coverage on a particular annoying-to-trigger branch in execution code.
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2019-06-13 21:38:06 -07:00
1ba56d5262 Fix tests in Python 3.6.
Some checks reported errors
continuous-integration/drone/push Build was killed
2019-06-13 21:34:04 -07:00
1c825b5d84 Bump version for release.
Some checks reported errors
continuous-integration/drone/push Build was killed
2019-06-13 20:50:06 -07:00
d6d66de251 Set umask used when executing hooks via "umask" option in borgmatic hooks section (#189).
Some checks failed
continuous-integration/drone/push Build is failing
2019-06-13 17:05:26 -07:00
76d79f0331 Suppress part of an obnoxious warning about disabling coverage (for end-to-end tests). 2019-06-13 14:15:08 -07:00
dc43c38e29 Complete test coverage for logging branch.
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-13 11:11:42 -07:00
7d7308a80d Integration tests for execute.py. 2019-06-13 10:48:21 -07:00
b43ef9d76d Move test file to correspond to its code under test. 2019-06-13 10:27:00 -07:00
28cdd67743 Error hook test.
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-13 10:14:16 -07:00
7f126ce127 Move hook.py file up a level. 2019-06-13 10:09:16 -07:00
a6c4debf78 Additional test coverage, and upgrade test requirements. 2019-06-13 10:01:55 -07:00
a74ad5475e Run all Borg commands such that they log to syslog as well as console.
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-12 20:56:20 -07:00
fa293828df Run hooks such that their output goes to syslog as well as console.
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-12 13:09:04 -07:00
f5582b1754 Move borgmatic.borg.execute module up a level for broader use. 2019-06-12 12:13:59 -07:00
1af95714c2 Collapse two execute_command() parameters into one output log level parameter. 2019-06-12 12:11:36 -07:00
0406d18cfd Log Borg --stats output as warning so it shows up at any verbosity level. 2019-06-12 11:49:35 -07:00
66e9ec9c3c A few tests for JSON flag suppressing Borg output. 2019-06-12 11:31:46 -07:00
899a7c8318 Add some wheel metadata do .gitignore.
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-11 21:40:28 -07:00
7c01b69498 Details on where to view logs. 2019-06-11 21:35:43 -07:00
4f0d3bf4ed Add docs/default about systemd journald rate limiting.
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-11 17:03:40 -07:00
9a5e7a3abb Successfully convert Borg output to Python logging entries.
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-11 16:42:04 -07:00
02eb6c7e09 Merge branch 'master' into logging
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-10 10:27:22 -07:00
418c09398c Fix incorrect compression default in schema comment.
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-09 21:21:46 -07:00
cdbd4c55e8 Fix 404 links harder.
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-01 13:23:48 -07:00
2374410891 Fix 404 documentation links by switching to absolute links.
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-01 13:02:39 -07:00
d2c46e91fe Add rsync.net to hosting providers; includ random link rotation.
All checks were successful
continuous-integration/drone/push Build is passing
2019-05-29 15:35:04 -07:00
12441331e6 Fix formatting / import ordering.
All checks were successful
continuous-integration/drone/push Build is passing
2019-05-27 15:46:38 -07:00
9ceeae2de0 Add separate syslog verbosity flag.
Some checks reported errors
continuous-integration/drone/push Build was killed
2019-05-27 15:44:48 -07:00
e0e493c2f1 Factor out configuring of logging into a common function.
Some checks failed
continuous-integration/drone/push Build is failing
2019-05-27 15:05:26 -07:00
0f05f7ad93 Log to syslog in addition to existing standard out logging (#53).
All checks were successful
continuous-integration/drone/push Build is passing
2019-05-26 16:34:46 -07:00
9bc1b71017 Clarify description in setup.py.
All checks were successful
continuous-integration/drone/push Build is passing
2019-05-26 13:36:53 -07:00
b3776871b5 Rewrite the borgmatic overview a bit to clarify its place in the world.
Some checks reported errors
continuous-integration/drone/push Build was killed
2019-05-26 13:35:51 -07:00
308cb31bf9 Remove some of the link rewriting to hopefully fix broken docs links.
All checks were successful
continuous-integration/drone/push Build is passing
2019-05-25 21:55:28 -07:00
e1f4643215 In README, use absolute links to properly rendered documentation (to cut down on confusion).
Some checks reported errors
continuous-integration/drone/push Build was killed
2019-05-25 21:48:05 -07:00
bc4fb322b5 Move documenation build step last in CI. Refactor docs build scripts.
All checks were successful
continuous-integration/drone/push Build is passing
2019-05-21 21:33:25 -07:00
2c4f192e43 Attempt to build documentation image in CI.
All checks were successful
continuous-integration/drone/push Build is passing
2019-05-21 21:13:35 -07:00
fb7a6dccaa Link to docs on skipping pruning entirely.
All checks were successful
continuous-integration/drone/push Build is passing
2019-05-21 12:32:19 -07:00
2826b7bd7c Add files for building documentation into a Docker image for web serving.
All checks were successful
continuous-integration/drone/push Build is passing
2019-05-21 03:16:32 +00:00
932848f6c1 Merge branch 'master' into docs-image.
All checks were successful
continuous-integration/drone/push Build is passing
2019-05-20 19:23:12 -07:00
9255940c6b Upgrade Drone build file format from 0.8 to 1.x.
All checks were successful
continuous-integration/drone/push Build is passing
2019-05-21 02:21:46 +00:00
3eadd16856 Add build server upgrade to NEWS.
Some checks reported errors
continuous-integration/drone/push Build was killed
2019-05-20 19:20:05 -07:00
61f46c5ad5 Try without explicit "sh".
All checks were successful
continuous-integration/drone/push Build is passing
2019-05-20 19:06:13 -07:00
aad47d1741 bash -> sh.
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2019-05-20 18:19:42 -07:00
079dd3fe4c Another try.
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2019-05-20 18:18:30 -07:00
d47f1bff4d Try to run script.
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2019-05-20 18:17:25 -07:00
53967f6324 Trigger build.
Some checks reported errors
continuous-integration/drone/pr Build was killed
continuous-integration/drone/push Build was killed
2019-05-20 17:48:39 -07:00
f5a70dc2a5 Drone + jsonnet apparently requires an extension, so switching back to plain YAML.
Some checks reported errors
continuous-integration/drone/push Build was killed
continuous-integration/drone/pr Build was killed
2019-05-20 17:30:07 -07:00
31ae1013d7 Add missing close curly. 2019-05-20 17:18:30 -07:00
071945e558 Re-order. 2019-05-20 17:15:01 -07:00
5c4d6a6e83 Upgrade Drone build file format from 0.8 to 1.x. 2019-05-20 17:05:29 -07:00
9c9be65b2b Add files for building documentation into a Docker image for web serving.
All checks were successful
the build was successful
2019-05-20 11:41:39 -07:00
c164684703 Allow to only run unit tests with Tox.
Some checks reported errors
the build was successful
continuous-integration/drone/push Build was killed
2019-05-19 22:07:15 +00:00
842c9001ba Auto-join #borgmatic from IRC web chat.
All checks were successful
the build was successful
2019-05-19 15:04:01 -07:00
481e47076e Add #borgmatic Freenode IRC channel to documentation.
All checks were successful
the build was successful
2019-05-19 15:01:03 -07:00
917a0dd0a0
Pass posargs to pytest in main testenv
All checks were successful
the build was successful
2019-05-19 23:53:43 +02:00
358aed7c31
Allow to only run unit tests with Tox 2019-05-19 23:53:42 +02:00
9893834e85 Pass positional arguments to Tox environments commands.
All checks were successful
the build was successful
2019-05-19 21:28:38 +00:00
32cf3225c5 Update NEWS.
All checks were successful
the build was successful
2019-05-19 14:17:00 -07:00
2bfd7518c5 Look for .yml configuration file extension in addition to .yaml (#178).
All checks were successful
the build was successful
2019-05-19 21:16:25 +00:00
4ba56684d1 Update NEWS with remove Python cache files before each Tox run.
All checks were successful
the build was successful
2019-05-19 10:07:28 -07:00
0b1e38e5f6 Remove Python cache files before each Tox run.
All checks were successful
the build was successful
2019-05-19 17:07:11 +00:00
7974219389
Make sure to pass posargs for Tox testenvs
All checks were successful
the build was successful
2019-05-19 13:11:22 +02:00
8424e443a9
Also read .yml ending configuration files
All checks were successful
the build was successful
Closes witten/borgmatic#178.
2019-05-19 13:04:42 +02:00
85251cf5d4
Ensure to remove cache files for Tox runs
All checks were successful
the build was successful
2019-05-19 12:46:32 +02:00
8f882ea3ea Switch to more standard "utm_source" for hosting provider link.
All checks were successful
the build was successful
2019-05-18 21:33:39 -07:00
7a2bcc96bb Add Borg/borgmatic hosting providers to documentation.
All checks were successful
the build was successful
2019-05-18 20:59:50 -07:00
8b41e58e1f Mention isort import ordering in documentation.
All checks were successful
the build was successful
2019-05-16 12:06:55 -07:00
9417359da3 Fix for regression with missing verbose log entries (#177).
All checks were successful
the build was successful
2019-05-16 10:50:19 -07:00
1cf0e1bd84 Support for various Borg directory environment variables (#153).
All checks were successful
the build was successful
2019-05-16 10:34:52 -07:00
223f803e87 Fix formatting.
All checks were successful
the build was successful
2019-05-14 13:09:36 -07:00
6cb901d083 Bump version for release.
All checks were successful
the build was successful
2019-05-14 13:07:49 -07:00
096be14230 Run tests for all installed versions of Python (#166).
All checks were successful
the build was successful
2019-05-14 20:06:08 +00:00
bb8b1e58e8 PR feedback: Consistency.
All checks were successful
the build was successful
2019-05-14 12:19:56 -07:00
06261d8c86 Merge branch 'master' into tox-skip-missing-interpreters
All checks were successful
the build was successful
2019-05-14 12:18:30 -07:00
869cccf884 Upgrade pip to a particular version during local test and CI.
All checks were successful
the build was successful
2019-05-14 19:17:30 +00:00
0defaf9cb5 Run tests for all installed versions of Python (#166).
All checks were successful
the build was successful
2019-05-14 12:09:07 -07:00
60b1f9921d Don't use pip wrapper script in CI.
All checks were successful
the build was successful
2019-05-14 12:01:40 -07:00
f61bc91b0f Merge branch 'master' into upgrade-pip
Some checks failed
the build failed
2019-05-14 10:31:03 -07:00
ed2c6053de Upgrade pip to a particular version during local test and CI.
Some checks failed
the build failed
2019-05-14 10:28:04 -07:00
2cffa8deaa Add missing ticket number to NEWS item.
All checks were successful
the build was successful
2019-05-14 10:07:46 -07:00
f0581271f6 Automatically sort Python imports in code.
All checks were successful
the build was successful
2019-05-14 10:02:41 -07:00
99522234ea Automatically sort Python imports in code.
All checks were successful
the build was successful
2019-05-14 17:02:37 +00:00
67f2862fb1 Change paths to reflect new pip install --user documentation.
All checks were successful
the build was successful
2019-05-14 10:00:50 -07:00
1c0dc3f904
Run isort over the source
All checks were successful
the build was successful
2019-05-14 18:59:19 +02:00
b94dbff216
Add isort configuration
Closes witten/borgmatic#169.
2019-05-14 18:59:19 +02:00
7388c723cd Mention tox.ini refactoring in NEWS.
All checks were successful
the build was successful
2019-05-14 09:45:39 -07:00
128be3c17d Factor out build/test configuration from tox.ini file.
All checks were successful
the build was successful
2019-05-14 16:45:24 +00:00
4c30c94258
Add workaround for editable failure
All checks were successful
the build was successful
See witten/borgmatic#165 (comment).
2019-05-14 13:17:15 +02:00
20b8b45aeb
Remove all configuration from Tox file
This puts tool configuration in their familiar and standard
locations and simplifies the Tox configuration to just laying
out the environments and factors.

This also allows users who do not want to deal with overhead of Tox (for
whatever reasons ...) to run pytest/black/etc. and have the same
behaviour.
2019-05-14 13:17:15 +02:00
2dd899f287 Linkify build status badge.
All checks were successful
the build was successful
2019-05-13 22:33:28 -07:00
a13cc0ab17 More tests for colored logging.
All checks were successful
the build was successful
2019-05-13 21:10:26 -07:00
620f9e64d6 A few more tests for new colored logging.
All checks were successful
the build was successful
2019-05-13 20:49:20 -07:00
25c320b281 Pin pip version: cherrypick of witten/borgmatic#172
All checks were successful
the build was successful
2019-05-13 20:01:25 -07:00
f19eec56ac Add tox pin to NEWS.
All checks were successful
the build was successful
2019-05-13 17:07:20 -07:00
7cbcff2e9b Pin tox version.
All checks were successful
the build was successful
2019-05-14 00:06:07 +00:00
9f6407ada6 Mention continuous integration badge in NEWS.
All checks were successful
the build was successful
2019-05-13 14:54:24 -07:00
e933ecf046 Add drone CI note and badge.
All checks were successful
the build was successful
2019-05-13 21:51:00 +00:00
4010a2ed77
Add note about Drone CI to contributing docs
All checks were successful
the build was successful
2019-05-13 23:43:11 +02:00
2f36096e1a
Add Drone build badge 2019-05-13 23:42:11 +02:00
82ec45e375
Pin tox version
All checks were successful
the build was successful
Towards more reproducible results with Tox.
2019-05-13 23:12:18 +02:00
37362150fe Color records that are logged via logger.handle() as well.
All checks were successful
the build was successful
2019-05-13 13:50:32 -07:00
a7ba97803f Add colored output to NEWS.
All checks were successful
the build was successful
2019-05-13 19:52:54 +00:00
31dc903877 Integrate colorama for colored output.
All checks were successful
the build was successful
2019-05-13 19:50:36 +00:00
8943867433 Bump to dev version.
All checks were successful
the build was successful
2019-05-13 19:07:27 +00:00
d9cb110563 Document installing borgmatic with pip install --user instead of a system Python install.
Some checks failed
the build failed
2019-05-13 19:06:42 +00:00
32113cee67 Document installing borgmatic with pip install --user instead of a system Python install.
All checks were successful
the build was successful
2019-05-13 19:04:24 +00:00
a621ce199a
Add tests for borgmatic.logger.to_bool
All checks were successful
the build was successful
2019-05-13 13:40:23 +02:00
1f524d6c87
Add borgmatic custom logger 2019-05-13 13:40:18 +02:00
0320d449ec
Add documentation about colorama 2019-05-13 13:40:17 +02:00
30f007687a
Add colorama to testing dependencies 2019-05-13 13:40:17 +02:00
adf7856162
Add new colorama dependency 2019-05-13 13:40:17 +02:00
f9dce8b2d3
Recommend user installs when upgrading
All checks were successful
the build was successful
2019-05-13 13:18:59 +02:00
15cb6270ef
Recommend a tox user install for developing 2019-05-13 13:18:45 +02:00
ed14fdbac9
Recommend root user package install
This can do bad things to a system Python install. So, we try to
mitigate this by recommending a root user user site installation.
2019-05-13 13:18:37 +02:00
8650a15db1 Document validate-borgmatic-config and add a few tests.
All checks were successful
the build was successful
2019-05-11 14:05:16 -07:00
6a10022543 Add validate-borgmatic-config command.
Some checks failed
the build failed
2019-05-11 20:15:06 +00:00
52e4f48eb9
Add validate-borgmatic-config command
Some checks failed
the build failed
Useful when generating the borgmatic configuration file with
configuration management and before moving the generated file in place
checking if it is actually valid.
2019-05-10 00:10:28 +02:00
f5e1e8bec9 In continuous integration build matrix, use newer Alpine 3.9 instead of 3.8.
All checks were successful
the build was successful
2019-05-07 16:19:03 -07:00
a291477c19 Fix for hooks executing when using --dry-run (#160).
All checks were successful
the build was successful
2019-05-07 16:06:31 -07:00
1c88dda76a Fix for invalid JSON output when using multiple borgmatic configuration files (#155).
All checks were successful
the build was successful
2019-04-02 22:30:14 -07:00
0b59c22c23 Fix for seemingly random filename ordering when running through a directory of configuration files (#157).
All checks were successful
the build was successful
2019-03-30 16:41:21 -07:00
576377e2b2 Clarify differences between Docker images.
All checks were successful
the build was successful
2019-03-16 15:04:48 -07:00
6ff1867312 Configuration files includes and merging (#148).
All checks were successful
the build was successful
2019-03-06 12:06:27 -08:00
3cb52423d2 Support for Borg create/extract --numeric-owner flag (#147).
All checks were successful
the build was successful
2019-03-05 09:11:35 -08:00
5a5b6491ac Add note about uncommenting section names.
All checks were successful
the build was successful
2019-03-04 15:15:49 -08:00
4272c6b077 List the files within an archive via --list --archive option (#140).
All checks were successful
the build was successful
2019-02-23 23:02:17 -08:00
26071de2e7 Update extraction docs.
All checks were successful
the build was successful
2019-02-18 22:43:32 -08:00
fe92d9e838 Fix restore paths list to tuple conversion.
All checks were successful
the build was successful
2019-02-18 21:59:09 -08:00
5ea2d644a2 Fix error handling when --extract repository guard fails.
All checks were successful
the build was successful
2019-02-18 21:52:56 -08:00
c35f90154f Only guard repository when --extract is used.
All checks were successful
the build was successful
2019-02-18 21:43:30 -08:00
36305c50b1 Update push script to support branches.
All checks were successful
the build was successful
2019-02-18 13:51:33 -08:00
2b3b8eab71 Add archive extract to end-to-end test.
All checks were successful
the build was successful
2019-02-18 13:47:18 -08:00
aa7c7651e5 Fix config repositories consumption. 2019-02-18 13:27:35 -08:00
c41ffb5ceb If no extract repository is given, then error if there are multiple configured repositories. 2019-02-18 13:22:14 -08:00
766a03375a Guard that the given repository occurs in config exactly once.
All checks were successful
the build was successful
2019-02-18 12:58:39 -08:00
2a4d4247e3 Tests for extract_archive(). 2019-02-18 10:31:52 -08:00
9de5083a7e Additional test coverage for extract options in borgmatic command. 2019-02-18 09:52:56 -08:00
d0557b2bcd Initial work on #123: Support for Borg extract. 2019-02-18 09:30:34 -08:00
1a980d6321 Organize options within command-line help into logical groups.
All checks were successful
the build was successful
2019-02-12 22:27:04 -08:00
fb21d4e645 Remove dead code.
All checks were successful
the build was successful
2019-02-09 21:17:55 -08:00
5933a4d778 Note tests exclusion in changelog.
All checks were successful
the build was successful
2019-02-08 20:59:50 -08:00
8cf16c7831 Exclude tests from distribution packages.
All checks were successful
the build was successful
2019-02-09 05:02:19 +00:00
fcf4e03c2f
exclude tests from distribution packages
All checks were successful
the build was successful
2019-02-08 19:22:56 +01:00
d1b29e82da borgmatic command-line reference.
All checks were successful
the build was successful
2019-02-04 22:27:40 -08:00
290e969a22 Include a sample borgmatic configuration file in the documentation (#119).
All checks were successful
the build was successful
2019-02-04 22:12:33 -08:00
18ae91ea6e Strike some unnecessary words from docs.
All checks were successful
the build was successful
2019-02-04 20:58:27 -08:00
0bce77a2ac Distribute troubleshooting among relevant how-to guides.
All checks were successful
the build was successful
2019-02-04 20:53:47 -08:00
19155607af Include link to development how-to.
All checks were successful
the build was successful
2019-02-03 22:42:33 -08:00
f357c37e2c Fix/remove some documentation links.
All checks were successful
the build was successful
2019-02-03 22:35:38 -08:00
2980c14728 Fix README links on GitHub.
All checks were successful
the build was successful
2019-02-03 22:26:39 -08:00
7e0e00d45d Refactor documentation into multiple separate pages for clarity and findability.
All checks were successful
the build was successful
2019-02-03 22:20:59 -08:00
8b4ac0017b Fix ticket number in changelog.
All checks were successful
the build was successful
2019-01-27 14:00:24 -08:00
8ec1ec527e Bump version for release.
All checks were successful
the build was successful
2019-01-27 13:54:26 -08:00
6096a7181c Leave exclude_patterns glob expansion to Borg, since doing it in borgmatic leads to confusing behavior (#132).
All checks were successful
the build was successful
2019-01-27 13:47:26 -08:00
fa9dfb8ff7 Remove date echo from schema example, as it's not a substitute for real logging (#127).
All checks were successful
the build was successful
2019-01-27 12:22:22 -08:00
2dc006aab4 Allow use of --stats flag when --create or --prune flags are implied (#139).
All checks were successful
the build was successful
2019-01-27 12:15:47 -08:00
031b9d6faf Handle and format validation errors raised during argument parsing (#136).
All checks were successful
the build was successful
2019-01-27 11:58:04 -08:00
d9018a47f6
Add link to openSUSE packages from README.
All checks were successful
the build was successful
2019-01-21 09:57:05 -08:00
Antonio Larrosa
e893a20dfd
Add link to openSUSE packages
Add a link to the software.opensuse.org page were both official and community packages of borgmatic are available to be downloaded or installed using 1-click-install.
2019-01-21 13:13:40 +01:00
09d521661f Remove weasel words like "easily" and "simply".
All checks were successful
the build was successful
2018-12-25 22:03:34 -08:00
fd46efb193 Add borgmatic --version command-line flag to get the current installed version number.
All checks were successful
the build was successful
2018-12-25 21:01:08 -08:00
426f54c9cc When generating sample configuration, document the defaults for each option (#103).
All checks were successful
the build was successful
2018-12-25 17:05:22 -08:00
45a537b6b1 When running multiple configuration files, attempt all of them even if one errors (#116).
All checks were successful
the build was successful
2018-12-25 15:23:54 -08:00
d6feca169c Fix duplicate issue number.
All checks were successful
the build was successful
2018-12-24 22:35:16 -08:00
05e2900ab0 Rev version.
All checks were successful
the build was successful
2018-12-24 22:29:41 -08:00
30b52e5523 With --init command-line flag, if a repository already exists, proceed without erroring (#117). 2018-12-24 22:28:02 -08:00
14aeddc11f Black re-formatting.
All checks were successful
the build was successful
2018-12-24 14:38:57 -08:00
066399ecdb Mention --stats command-line flag in NEWS file.
Some checks failed
the build failed
2018-12-23 16:06:08 -08:00
d4bbac4467 Support for --stats command-line flag independent of --verbosity (#100).
All checks were successful
the build was successful
2018-12-24 00:04:23 +00:00
7516443a89 fix changes requested about stats
All checks were successful
the build was successful
2018-12-22 23:46:03 +01:00
73d67e29b4 Support for Borg create & prune --stats via borgmatic command-line flag (#100) 2018-12-22 23:27:24 +01:00
c3e7425f4c Some late-breaking README additions (new borgmatic packages).
All checks were successful
the build was successful
2018-12-10 22:30:10 -08:00
cc9dbb1def Support for Borg repository initialization via borgmatic --init command-line flag (#110).
All checks were successful
the build was successful
2018-12-10 22:20:57 -08:00
2045edc11b Fix warning about classifiers as tuple. 2018-12-09 15:49:58 -08:00
1dcac44d6c Fix broken test of deprecated --excludes option.
Some checks failed
the build failed
2018-12-09 15:49:05 -08:00
300ead65d3 Error when deprecated --excludes command-line option is used.
Some checks failed
the build failed
2018-12-09 14:57:14 -08:00
6a0219a7a4 Update README with link to a new/forked Docker image (#113).
All checks were successful
the build was successful
2018-12-02 15:16:52 -08:00
80c69aac05 Fix incomplete test coverage around --progress argument validation. 2018-12-02 15:08:42 -08:00
7417a3cd00 Update Borg create --filter values so a dry run lists files to back up. (#111).
All checks were successful
the build was successful
2018-12-02 15:03:07 -08:00
9ca80a54d8 Support for Borg create --progress via borgmatic command-line flag (#108).
All checks were successful
the build was successful
2018-11-21 22:03:39 -08:00
5c0b17ef39 Support for Borg --chunker-params create option via "chunker_params" in borgmatic's storage section (#105).
All checks were successful
the build was successful
2018-10-27 15:57:28 -07:00
1697d8aaef Silence curl when posting release description to Gitea.
All checks were successful
the build was successful
2018-10-15 22:32:13 -07:00
fef441a8ff More concessions for Python 3.5 compatibility.
All checks were successful
the build was successful
2018-10-15 09:37:26 -07:00
c1ddc4268b We can't have nice things.
Some checks failed
the build failed
2018-10-15 09:30:04 -07:00
e323290e61 Switch from bash to sh for black wrapper.
Some checks failed
the build failed
2018-10-15 09:25:57 -07:00
1ab44d4201 Wrap black with script that skips it if Python version < 3.6.
Some checks failed
the build failed
2018-10-15 09:20:35 -07:00
71b1c3dfb0 Make automated tests support running in Python 3.5.
Some checks failed
the build failed
2018-10-15 09:04:29 -07:00
695930a607 Fix for syntax error that occurred in Python 3.5 and below (#102).
Some checks failed
the build failed
2018-10-15 08:47:15 -07:00
eb2a4ff1f0 Add Python 3.5 to continuous integration.
Some checks failed
the build failed
2018-10-15 08:17:34 -07:00
531d5c80c0 Fix quoting and escaping in release script.
All checks were successful
the build was successful
2018-10-14 12:14:29 -07:00
067ed27689 Rev to 1.2.8.
All checks were successful
the build was successful
2018-10-14 11:45:34 -07:00
fa38de2de7 Enable consistency checks for only certain repositories via "check_repositories" (#73).
All checks were successful
the build was successful
2018-10-13 20:34:51 -07:00
e4d1b49c39 Switch some functions with many arguments to kwargs only. 2018-10-13 15:19:16 -07:00
af7caec509 Mention minimum Borg version to install in README.
All checks were successful
the build was successful
2018-10-13 13:35:42 -07:00
90c1f899fc Use newer Alpine (with newer version of Borg) in matrix builds. 2018-10-13 13:35:18 -07:00
a0691ae4cd Run continuous integration tests on a matrix of Python and Borg versions.
Some checks failed
the build failed
2018-10-13 13:09:12 -07:00
2f20e6f808 Include link to issue tracker within various command output.
All checks were successful
the build was successful
2018-10-07 22:29:56 -07:00
7a4636ae0f Remove curl --verbose in release script.
All checks were successful
the build was successful
2018-10-06 22:35:00 -07:00
53435dcc3e Post release changelogs to projects.evoworx.org.
All checks were successful
the build was successful
2018-10-06 22:24:46 -07:00
4d01278037 Update release file to post changelogs to GitHub release descriptions.
All checks were successful
the build was successful
2018-10-06 15:18:21 -07:00
2299e5d41e Additional dependency version pins in test requirements.
All checks were successful
the build was successful
2018-10-06 14:17:47 -07:00
d16f5d5df3 Add backticks to path literal in README.
All checks were successful
the build was successful
2018-10-06 13:23:54 -07:00
da8e9638f4 Support for Borg --keep-secondly prune option (#98).
All checks were successful
the build was successful
2018-10-04 21:54:23 -07:00
900ea80a42 Hack to uncomment all options in config file used for finding unsupported Borg options.
All checks were successful
the build was successful
2018-10-04 21:45:31 -07:00
4b92d0f685 Remove unneeded Dockerfile for end-to-end tests.
All checks were successful
the build was successful
2018-10-03 22:44:23 -07:00
3ce5533103 Make end-to-end test clean up after itself, and drop unnecessary use of Docker for it.
All checks were successful
the build was successful
2018-10-03 22:36:25 -07:00
4a1ee8c911 Pull new base Docker images during CI.
All checks were successful
the build was successful
2018-10-03 19:35:42 -07:00
3f22a99412 Rev pykwalify.
All checks were successful
the build was successful
2018-10-03 08:59:08 -07:00
caf95cc913 Rebuild.
All checks were successful
the build was successful
2018-09-30 22:58:23 -07:00
fd3130b4d9 Install tox before using it. 2018-09-30 22:47:07 -07:00
65bb5a49e2 CI? 2018-09-30 22:43:49 -07:00
4bcc517326 Attempted Drone CI configuration. 2018-09-30 22:09:53 -07:00
0b164973e0 Add an end-to-end automated test that actually integrates with Borg. 2018-09-30 17:30:04 -07:00
a125df991b Move tests to the root of the repository, in keeping with more common convention. 2018-09-30 13:57:20 -07:00
f9a9b42c58 A little introductory text for the screencast. 2018-09-30 11:11:07 -07:00
56ad1d164a Use Flake8 code checker as part of running automated tests. 2018-09-29 23:15:18 -07:00
3cce18919c Switch Black link to documentation. 2018-09-29 22:46:34 -07:00
76d6a69f5a Use Black code formatter as part of running automated tests. 2018-09-29 22:45:00 -07:00
3db17277b4 Replace broken screencast thumbnail with embedded player. 2018-09-29 21:38:38 -07:00
ece49eb500 Update screencast. 2018-09-29 18:56:39 -07:00
746428ed44 Fix generated configuration to also include a "keep_daily" value so pruning works out of the box. 2018-09-29 15:44:37 -07:00
984702b3b2 Fix various warnings. 2018-09-29 15:06:57 -07:00
1bc71e1c5d Upgrade test requirements. 2018-09-29 15:04:42 -07:00
47efa88c9d In generate-borgmatic-config, comment out all optional config (#57). 2018-09-29 15:03:11 -07:00
3821636b77 Bump version. 2018-09-27 08:13:23 -07:00
596f6f9dac Update help/README about --create --json. 2018-09-27 08:12:54 -07:00
7ecdaea83a
Fix check_archives does not take json parameter. 2018-09-27 08:09:23 -07:00
Nils Hesse
98cb2644db
check_archives does not take json parameter 2018-09-27 12:21:14 +02:00
31db6faa19 Set to release version. 2018-09-26 21:32:28 -07:00
872d8b695a Flesh out NEWS line item a bit. 2018-09-24 21:37:45 -07:00
6db3e1dda5 Merge branch 'master' of floli/borgmatic into master 2018-09-25 04:36:09 +00:00
Florian Lindner
9aaf78b9dd Add --json option for --create command line.
Closes #94.
2018-09-24 21:53:09 +02:00
5d8ac158ce Merge ssh://projects.torsion.org:3022/witten/borgmatic 2018-09-17 22:34:08 -07:00
d32a53d58f Mention log level fix in NEWS. 2018-09-17 22:33:34 -07:00
a836ec944f Limit argument range for --verbose, make default log level more explicit. (#93) 2018-09-18 05:31:27 +00:00
e7b128e735 --read-special is now supported. 2018-09-09 11:21:06 -07:00
ff3cb1d80f Attach #64 to logging rewrite in NEWS. 2018-09-09 11:18:26 -07:00
c5ff08ee25 Remove now-gone verbosity parameter from test. 2018-09-09 11:14:33 -07:00
856db29180 Mention --read-special in NEWS. 2018-09-09 10:42:06 -07:00
Steve Kerrison
20e09b4ea8 Support for Borg create --read-special via "read_special" option (#25). 2018-09-09 10:39:56 -07:00
1dd0682661 Merge branch 'master' of ssh://projects.torsion.org:3022/witten/borgmatic 2018-09-08 13:54:18 -07:00
7252b8d614 Rework logging/verbosity system (#90)
Looks great, merged! Thanks again for all your hard work here.
2018-09-08 20:53:37 +00:00
grerrg
e5870a169b Add example for cron in Alpine Linux (#24) 2018-09-05 21:58:30 -07:00
94795a3560 Link to Borg home page instead of docs. 2018-09-02 22:06:57 -07:00
Dan
7705debab0 Switching back to table-like 11ty front matter. It looks less bad than JSON. 2018-09-01 22:45:13 -07:00
Dan
f87df0527f Adding JSON front matter for 11ty. 2018-09-01 22:38:17 -07:00
e4512a40e0 Removing 11ty front matter out of README since it renders as a table on GitHub. 2018-09-01 22:11:38 -07:00
1d4a9510b8 Upgrade pytest. 2018-09-01 20:29:05 -07:00
2648f07e7a Add missing syntax highlighting. 2018-08-29 23:01:11 -07:00
459bf1fcf6 Document --list and --info flags. 2018-08-29 22:57:32 -07:00
Dan
3930e63320 Merge branch 'master' of ssh://projects.torsion.org:3022/witten/borgmatic 2018-08-29 22:44:45 -07:00
Dan
acecb1e397 README metadata changes to support 11ty static site generator. 2018-08-29 22:44:12 -07:00
9b48eb5a61 Clarify that --json can be used with --info command-line flag. 2018-08-19 12:57:52 -07:00
7d40a448cb Pass --show-rc option to Borg when at highest verbosity level (#89). 2018-08-19 12:44:40 -07:00
da7aed3814 Support for Borg create --checkpoint-interval (#87). 2018-08-19 11:41:49 -07:00
c7f4200417 Somewhat more robust mechanism to find unsupported Borg arguments. 2018-08-19 11:24:48 -07:00
5e2a5494af Fix declared pykwalify compatibility version range in setup.py (#88). 2018-08-18 14:07:18 -07:00
7b77fd2510 Fix compatibility issue between pykwalify and ruamel.yaml 0.15.52 (#85). 2018-08-11 13:59:27 -07:00
ece5608677 Rev for release. 2018-07-28 22:27:39 -07:00
4644f613b2 Fix typo in README. 2018-07-28 22:24:24 -07:00
3afa5ac76d Document hooks (#81). 2018-07-28 22:22:25 -07:00
27f8a1df04 Switch to non-raw link to sample cron job. 2018-07-28 20:29:55 -07:00
8e5b0bbf17 Remove errant ctrl-F character from docs. 2018-07-28 20:27:18 -07:00
282e9565c9 Mentioning new --info --json option in NEWS. 2018-07-28 20:24:19 -07:00
b714ffd48b add support for --info --json (#83) 2018-07-29 03:17:45 +00:00
9968a15ef8 Clarifying code style for multiline constructs. 2018-07-28 15:21:19 -07:00
d93da55ce9 Add code style guidelines to the documention, and reformat some code accordingly. 2018-07-28 15:02:17 -07:00
789bcd402a add support for --list --json (#74) 2018-07-28 21:21:38 +00:00
cf6ab60d2e Use XDG_CONFIG_HOME for user configuration directory, if set. (Thanks to floli.) (#71)
Thanks! This will go out in the next release.
2018-07-25 01:34:05 +00:00
64364b20ff Skip non-"*.yaml" config filenames in /etc/borgmatic.d/ so as not to parse backup files, editor swap files, etc. (#77) 2018-07-22 12:08:49 -07:00
d29c7956bc Upgrade ruamel.yaml compatibility version range and fix support for Python 3.7 (#38, #76). 2018-07-22 11:25:06 -07:00
e5ef485d6b Merge branch 'master' of ssh://projects.torsion.org:3022/witten/borgmatic 2018-07-01 14:54:15 -07:00
fc8046edc4 Adding NEWS item about skipping before/after backup hooks. 2018-07-01 14:51:57 -07:00
4538017206 Merge branch 'fix-72-hooks-are-executed-when-list-or-info' of thomasleveil/borgmatic into master
Thanks for fixing this!

I agree about more specific hooks if and when `--check` or `--prune`-specific hook use cases are needed. I think what you've done here is fine until then.
2018-07-01 21:47:39 +00:00
d664b6d253 only run hooks when creating an archive
fix #72
2018-07-01 21:09:45 +02:00
f42aa0a6f2 Revving version for development. 2018-06-17 15:26:53 -07:00
9d4ba66f6e Revving version for release. 2018-06-17 15:14:45 -07:00
cf846ab8ac Support for Borg prune --umask option (#69). 2018-06-17 15:12:43 -07:00
219e287c6c Document how to develop on and contribute to borgmatic. 2018-06-17 14:55:57 -07:00
dede8f9d4b News for: ~/.config/borgmatic/config.yaml. 2018-06-17 14:30:47 -07:00
7a1e3f5639 Merge branch 'add_user_config' of floli/borgmatic into master 2018-06-17 21:26:36 +00:00
Florian Lindner
9bd77292ff Add default path for user configuration 2018-06-10 15:03:23 +02:00
f1a143de5b Adding list and info Borg sub-commands to find-unsupported-borg-options script. 2018-05-26 20:53:03 -07:00
765e343c71 Support for Borg --info via borgmatic command-line (#61). 2018-05-26 16:19:05 -07:00
af4b91a048 Support for Borg --list option via borgmatic command-line to list all archives (#61). 2018-05-26 16:09:08 -07:00
cc9044487b Support for Borg --nobsdflags option to skip recording bsdflags (e.g. NODUMP, IMMUTABLE) in archive (#63). 2018-05-26 15:09:23 -07:00
11c30001c3 Add "Persistent" flag to systemd timer example. (#60) 2018-05-20 22:20:21 -07:00
ac9161035a Merge branch 'master' of floli/borgmatic into master
Thanks for taking the time to add this! Makes sense.
2018-05-21 05:18:13 +00:00
007ec0644c Ignore "check_last" and consistency "prefix" when "archives" not in consistency checks. (#59) 2018-05-20 22:11:40 -07:00
1db808fb3d Link to OpenBSD port of borgmatic. 2018-05-19 16:16:54 -07:00
76656275c3 Update README to mention other ways of installing borgmatic. (#62) 2018-05-19 16:06:54 -07:00
Florian Lindner
64bdbc4bf0 Add Persistent, so that the timer is triggered if missed last time. 2018-05-17 21:47:58 +02:00
61033bb4e5 Update tox.ini to only assume Python 3.x instead of Python 3.4 specifically. 2018-04-09 20:34:59 -07:00
e608b7924a Adding note about executable location. 2018-04-08 12:06:15 -07:00
f7f852a28b Fix tests broken by addition of check --prefix default. 2018-03-03 22:36:51 -08:00
9b9c4c4abb Clarifying note in schema about adding prefix to consistency section. 2018-03-03 22:33:34 -08:00
1b59f5b190 Changing version in warning to correspond with next release version. 2018-03-03 22:30:30 -08:00
65ab230961 Noting new Borg check --prefix feature in release notes. 2018-03-03 22:21:48 -08:00
Nick Whyte
c64d0100d5 Only check archives with matching prefix. 2018-03-03 22:17:39 -08:00
0112407250 Add introductory screencast link to documentation. 2018-02-19 17:44:20 -08:00
2d3f5fa05d Support for Borg --lock-wait option for the maximum wait for a repository/cache lock (#56). 2018-02-19 15:51:04 -08:00
a87036ee46 Support for using tilde in exclude_patterns to reference home directory (#58). 2018-02-18 15:34:19 -08:00
a72f5ff69a Tests for --dry-run + --verbosity fix. 2018-02-18 14:26:51 -08:00
newtonne
bb99009191 Fix issue when using both --dry-run and -v options. 2018-02-18 14:18:25 -08:00
4c45d60529 Mentioning ssh_command for additional SSH configuration.. 2018-02-18 13:39:05 -08:00
2211f959ae AUTHORS addition for recent encryption pass command changes. 2018-01-18 21:13:20 -08:00
cc1d6f53a0 55: Fix for missing tags/releases from Gitea and GitHub project hosting. 2018-01-17 20:27:09 -08:00
389778c716 Adding BORG_PASSCOMMAND update to NEWS. 2018-01-16 21:05:53 -08:00
newtonne
e55e9e8139 Add encryption_passcommand configuration option 2018-01-16 21:03:25 -08:00
ef76e87477 Bumping version for release. 2018-01-15 20:55:49 -08:00
62526038d6 47: Support for Borg --dry-run option via borgmatic command-line. 2018-01-15 20:55:27 -08:00
bf2f39623e 49: Rename incorrect --pattern-from option to correct --patterns-from. 2018-01-15 20:22:53 -08:00
28c890a52d Bumping version for release. 2018-01-14 16:37:02 -08:00
cd189c4fe4 48: Add "local_path" to configuration for specifying an alternative Borg executable path. 2018-01-14 16:35:24 -08:00
b8f6bab12d 49: Support for Borg experimental --patterns-from and --patterns options for specifying mixed includes/excludes. 2018-01-14 15:52:19 -08:00
50b3240c4f 54: Fix for incorrect consistency check flags passed to Borg when all three checks in borgmatic config. 2018-01-14 14:09:20 -08:00
18fbc75e16 Revising history to account for off-by-one error when importing issue numbers into Gitea. 2018-01-04 21:49:43 -08:00
0881da4a82 New issue tracker. 2018-01-04 21:37:43 -08:00
Dan
fa210766a2 Update for release. 2018-01-02 20:36:52 -08:00
Dan
d4f52e3137 Update AUTHORS with recent changes + sort. 2018-01-02 20:33:27 -08:00
Dan
8b2ebdc5f7 Simplifying example. 2018-01-02 20:31:06 -08:00
a00407256d Merge branch 'keep_minutely' of thomasleveil/borgmatic into master 2018-01-03 04:30:13 +00:00
24b5eccefc add support for Borg --keep-minutely prune option 2018-01-03 00:13:44 +01:00
Dan
815fb39a05 Declare dependency on pykwalify 1.6 or above, as older versions yield "Unknown key: version" rule errors. 2017-11-26 10:30:31 -08:00
Dan
24c196d2a4 Script to find unsupported Borg options in borgmatic, to assist with #13. 2017-11-11 16:07:54 -08:00
Dan
3e26e70d0c Fix for incorrect /etc/borgmatic.d/ configuration path probing on macOS. 2017-11-10 21:33:29 -08:00
Dan
5ce25e2790 Re-fixing logo image. 2017-11-04 11:55:48 -07:00
Dan
8243552c8c Fixing PNG path. 2017-11-04 11:54:29 -07:00
Dan
425e27dee5 Add "ssh_command" to configuration for specifying a custom SSH command or options. 2017-11-03 22:01:04 -07:00
Dan
9ec9269a18 Link to repository encryption section of Borg Quick Start. 2017-11-03 20:28:31 -07:00
Dan
bf5cbd1deb Mentioning use of BORG_PASSPHRASE environment variable. 2017-11-03 20:27:21 -07:00
Dan
4c09cbf1a4 Releasing. 2017-11-02 22:38:16 -07:00
Dan
fc077af4ce Mentioning borgmatic --config option in docs. 2017-11-02 22:28:53 -07:00
Dan
ca4312bb85 Support for Borg --remote-ratelimit for limiting upload rate. And log Borg commands. 2017-11-02 22:22:40 -07:00
Dan
fc3b1fccba Support for Borg --files-cache option for setting the files cache operation mode. 2017-11-02 22:03:11 -07:00
Dan
f83346b9b3 Support for using tilde in repository paths to reference home directory. 2017-11-02 21:34:04 -07:00
Dan
63c7241aec Typo in comment. 2017-10-31 22:21:49 -07:00
Dan
fd77dc579e Pass through several more Unix signals that Borg happens to consume. 2017-10-31 22:10:00 -07:00
Dan
f017ed648f Disabling code coverage on this one-line functions. 2017-10-31 22:01:18 -07:00
Dan
27a6745743 Passing the Unix SIGTERM signal through to child processes like Borg. 2017-10-31 21:58:35 -07:00
Dan
95be0c8e46 Removing broken download URL. 2017-10-29 21:42:01 -07:00
Dan
17a774ba7e Removing .hg* files. 2017-10-29 20:32:21 -07:00
Dan
a1d2bd173b Bumping version for release. 2017-10-29 20:29:53 -07:00
Dan
f495550ad7 Default "prefix" to "{hostname}-" if not specified. 2017-10-29 20:14:18 -07:00
Dan
43d0e597a2 Require "prefix" in retention section when "archive_name_format" is set. 2017-10-29 19:36:26 -07:00
Dan
f1c07b5cf5 Updated dead links to Borg documentation. 2017-10-29 17:05:49 -07:00
Dan
f2782426d5 Comment typo. 2017-10-29 16:46:30 -07:00
Dan
f13ed92b0e Breaking borgmatic command main() apart, since it was getting a little unwieldy. 2017-10-29 16:44:15 -07:00
Dan
6e9e7c45d7 Being explicit about markdown syntax highlighting in README. 2017-10-28 10:45:27 -07:00
Dan
c1ca4b9421 Using absolute path for logo. 2017-10-28 10:33:36 -07:00
Dan
469feadbc0 Adding missing PNG logo. 2017-10-28 10:31:30 -07:00
Dan
a5403a4373 Switched logo from SVG to PNG for compatibility reasons. 2017-10-28 10:29:18 -07:00
Dan
56c902258d Setting up download URL for new hosting location. 2017-10-27 22:40:34 -07:00
Dan
9c1660f467 Fix typo in README. 2017-10-27 22:27:28 -07:00
Dan
dd926b5762 Updating links. 2017-10-27 22:26:33 -07:00
Dan
9d03351b5d Converted main source repository from Mercurial to Git. 2017-10-27 21:55:08 -07:00
Dan
719d9a9835 Merge branch 'master' of github.com:witten/borgmatic 2017-10-27 21:51:34 -07:00
Dan
731c8c9ad9 Adding push and release scripts. 2017-10-27 21:51:10 -07:00
2ae8ac2947 Add tests for verbosity mapping. 2017-10-25 22:36:23 -07:00
cc94e5f52f Add tests for verbosity mapping. 2017-10-25 22:36:23 -07:00
a09c9f248e Adding logging to hook execution! 2017-10-25 22:32:06 -07:00
16f0a3976c Adding logging to hook execution! 2017-10-25 22:32:06 -07:00
cc78223164 Fixing inconsistent indentation. 2017-10-25 21:58:02 -07:00
30f56235c1 Fixing inconsistent indentation. 2017-10-25 21:58:02 -07:00
7458769cb3 Merge. 2017-10-25 21:54:50 -07:00
a5aa9355f5 Merge. 2017-10-25 21:54:50 -07:00
5c229639f0 Improve clarity of logging spew at high verbosity levels. 2017-10-25 21:47:33 -07:00
059322b7f8 Improve clarity of logging spew at high verbosity levels. 2017-10-25 21:47:33 -07:00
Johannes Feichtner
f1a98d82c6 #16, #38: Support for user-defined hooks before/after backup, or on error. 2017-10-25 21:38:27 -07:00
Johannes Feichtner
80e2c023dd #16, #38: Support for user-defined hooks before/after backup, or on error. 2017-10-26 06:38:27 +02:00
b3vis
86511deac4 Added section about docker (#18) 2017-10-25 21:24:24 -07:00
b3vis
bb3475b3f8 Added section about docker (#18) 2017-10-26 05:24:24 +01:00
bd196c1fb9 Removing "from __future__ import print_function". This isn't Python 2 anymore, Toto. 2017-09-09 17:38:14 -07:00
873fc22cfb Removing "from __future__ import print_function". This isn't Python 2 anymore, Toto. 2017-09-09 17:38:14 -07:00
f3d6d7c0a3 #29: Support for using tilde in source directory path to reference home directory. 2017-09-09 17:23:31 -07:00
86cc6ca869 #29: Support for using tilde in source directory path to reference home directory. 2017-09-09 17:23:31 -07:00
d30caa422e #39: Fix to make /etc/borgmatic/config.yaml optional rather than required when using the default config paths. 2017-09-08 21:25:42 -07:00
84c148fb3b #39: Fix to make /etc/borgmatic/config.yaml optional rather than required when using the default config paths. 2017-09-08 21:25:42 -07:00
6c4f641c1e Added tag 1.1.7 for changeset ec7949a14a20 2017-09-03 11:33:10 -07:00
b44bc57548 Added tag 1.1.7 for changeset ec7949a14a20 2017-09-03 11:33:10 -07:00
bb18a9a3f2 Update NEWS and AUTHORS for release. 2017-09-03 11:33:07 -07:00
f7dcbe40d4 Update NEWS and AUTHORS for release. 2017-09-03 11:33:07 -07:00
Michele Lazzeri
95533d2b31 Added storage.archive_name_format to config (#16)
* Added storage.archive_name_format to config
2017-09-03 11:13:14 -07:00
Michele Lazzeri
867d3fceb0 Added storage.archive_name_format to config (#16)
* Added storage.archive_name_format to config
2017-09-03 20:13:14 +02:00
3af92f8b92 Fix for traceback when "exclude_from" value is empty in configuration file. 2017-08-27 10:01:49 -07:00
7c048d1989 Fix for traceback when "exclude_from" value is empty in configuration file. 2017-08-27 10:01:49 -07:00
d127e73590 Clarification of Python 3 pip usage in documentation. 2017-08-26 16:18:53 -07:00
13ba5c84de Clarification of Python 3 pip usage in documentation. 2017-08-26 16:18:53 -07:00
50c4f6f2a1 Adding documentation note about pruning happening before archiving. 2017-08-26 16:13:41 -07:00
9588e111c4 Adding documentation note about pruning happening before archiving. 2017-08-26 16:13:41 -07:00
37ae34a432 When pruning, make highest verbosity level list archives kept and pruned. 2017-08-26 16:07:30 -07:00
e3a559e13b When pruning, make highest verbosity level list archives kept and pruned. 2017-08-26 16:07:30 -07:00
3664ac7418 Added tag 1.1.6 for changeset 4daa944c122c 2017-08-05 23:33:08 -07:00
3f83788858 Added tag 1.1.6 for changeset 4daa944c122c 2017-08-05 23:33:08 -07:00
10cac46f4c #12, #35: Support for Borg --exclude-from, --exclude-caches, and --exclude-if-present options. 2017-08-05 23:32:39 -07:00
b1f429f4b5 #12, #35: Support for Borg --exclude-from, --exclude-caches, and --exclude-if-present options. 2017-08-05 23:32:39 -07:00
51095cd419 Remove unused imports. 2017-08-05 22:26:38 -07:00
ddd56bf2a7 Remove unused imports. 2017-08-05 22:26:38 -07:00
674a6153f3 Fix imports of borg/*.py modules now that they've been split out. 2017-08-05 22:26:28 -07:00
793ffbd048 Fix imports of borg/*.py modules now that they've been split out. 2017-08-05 22:26:28 -07:00
aa04473521 Split out Borg integration code into multiple files, as it was getting kind of hairy all in one. 2017-08-05 16:21:39 -07:00
247d36a309 Split out Borg integration code into multiple files, as it was getting kind of hairy all in one. 2017-08-05 16:21:39 -07:00
77d3c66fb9 Added tag 1.1.5 for changeset 64ca13bfe050 2017-07-30 11:16:41 -07:00
9f5b808042 Added tag 1.1.5 for changeset 64ca13bfe050 2017-07-30 11:16:41 -07:00
9bea7ae5ed #34: New "extract" consistency check that performs a dry-run extraction of the most recent archive. 2017-07-30 11:16:26 -07:00
e85d487c3a #34: New "extract" consistency check that performs a dry-run extraction of the most recent archive. 2017-07-30 11:16:26 -07:00
23679a6edd Removing Pelican-specific title metadata out of README markdown. 2017-07-29 16:05:11 -07:00
525ffa6a28 Removing Pelican-specific title metadata out of README markdown. 2017-07-29 16:05:11 -07:00
0f44fbedf4 Getting logo to show up on GitHub. 2017-07-28 22:36:16 -07:00
ac47301a64 Getting logo to show up on GitHub. 2017-07-28 22:36:16 -07:00
ae15e0f404 Added tag 1.1.4 for changeset 3d605962d891 2017-07-28 22:02:43 -07:00
9347c02268 Added tag 1.1.4 for changeset 3d605962d891 2017-07-28 22:02:43 -07:00
a2e8abc537 #17: Added command-line flags for performing a borgmatic run with only pruning, creating, or checking enabled. 2017-07-28 22:02:18 -07:00
ceeaf25443 #17: Added command-line flags for performing a borgmatic run with only pruning, creating, or checking enabled. 2017-07-28 22:02:18 -07:00
10404143c6 Added tag 1.1.3 for changeset 3f838f661546 2017-07-25 21:21:50 -07:00
62d2b267da Added tag 1.1.3 for changeset 3f838f661546 2017-07-25 21:21:50 -07:00
94aaf4554f Releasing. 2017-07-25 21:21:47 -07:00
0c8816e6cc #14: Support for running multiple config files in /etc/borgmatic.d/ from a single borgmatic run. 2017-07-25 21:18:51 -07:00
e3e4aeff94 Fix for generate-borgmatic-config writing config with invalid one_file_system value. 2017-07-25 20:32:32 -07:00
89cd879529 Added tag 1.1.2 for changeset f052a77a8ad5 2017-07-24 19:29:28 -07:00
2c61c0bc08 #32: Fix for passing check_last as integer to subprocess when calling Borg. 2017-07-24 19:29:26 -07:00
bcd8b9982d Added tag 1.1.1 for changeset 7d3d11eff6c0 2017-07-24 08:41:05 -07:00
b36b923c5d #32: Fix for upgrade-borgmatic-config converting check_last option as a string instead of an integer. 2017-07-24 08:41:02 -07:00
f44a7884e6 No longer producing univeral (Python 2 + 3) wheel. 2017-07-23 17:34:17 -07:00
b61b09f55c Added tag 1.1.0 for changeset 5a003056a8ff 2017-07-22 23:27:26 -07:00
588955a467 Setting release version. 2017-07-22 23:27:21 -07:00
ee3edeaac2 Support for backing up to multiple repositories. 2017-07-22 22:56:46 -07:00
90a0d3b1e0 Renaming group to section for consistency. 2017-07-22 22:17:37 -07:00
cd8ceccfaf To free up space, now pruning backups prior to creating a new backup. 2017-07-22 21:50:29 -07:00
e5c12fc81c Mentioning test coverage addition in NEWS. 2017-07-22 21:23:01 -07:00
f5abe05ce9 Instructions to make cron file executable. 2017-07-22 21:20:48 -07:00
6af53d1163 Fixing gets on config group names. 2017-07-22 21:19:26 -07:00
3cccac8cb1 Mentioning libyaml compile errors in troubleshooting. 2017-07-22 21:07:09 -07:00
919d7573c3 Upgrading instructions to super clarify Python 3 upgrade. 2017-07-22 20:52:29 -07:00
8bfffd8cf7 Removing TODO that basically entails testing ruamel.yaml round-tripping, which in theory already has its own tests. 2017-07-22 20:31:26 -07:00
edb54b300b Fixing up borg module to deal with new parsed config file structures. 2017-07-22 20:11:49 -07:00
41d202c2e7 TODO about using the new exclude_patterns. 2017-07-10 16:26:32 -07:00
8ef6c6fcbe Bail if "--excludes" argument is provided, as it's now deprecated in favor of configuration file. 2017-07-10 16:25:13 -07:00
0691cda46f Mention generate-borgmatic-config in changelog. 2017-07-10 16:07:07 -07:00
8bf07e4766 Provide helpful message when borgmatic is run with only legacy config present. 2017-07-10 16:06:02 -07:00
b3d0fb0cee When writing config, make containing directory if necessary. Also default to tighter permissions. 2017-07-10 15:20:50 -07:00
ff28be7724 Documentation updates based on the new YAML configuration. 2017-07-10 11:06:28 -07:00
5ff016238e Don't overwrite config files. And retain file permissions when upgrading config. 2017-07-10 10:37:11 -07:00
618e56b2a5 Display result of config upgrade. 2017-07-10 10:13:57 -07:00
338b80903c Fixing tests broken by excludes merging. 2017-07-10 10:09:06 -07:00
fea97b5149 Merge excludes into config file format. 2017-07-10 09:43:25 -07:00
17c87f8758 Completed test coverage of commands (except for main()s). 2017-07-09 17:03:45 -07:00
d49be19544 Add a version to the schema, because inevitably I'll want to revise the schema. 2017-07-09 16:18:10 -07:00
d4ae7814a0 Adding TODO about a helpful notice about legacy config. 2017-07-09 11:49:51 -07:00
dc9b075d5a Rename convert-borgmatic-config to upgrade-borgmatic-config. 2017-07-09 11:48:24 -07:00
1bcb2a8be4 More test coverage, and simplification of config generation. 2017-07-09 11:41:55 -07:00
a16d90ff46 Adding a "does not raise" test for displaying errors. 2017-07-09 10:27:34 -07:00
e50fd04750 Adding test coverage report. Making tests a little less brittle. 2017-07-08 23:01:41 -07:00
745de200df Basic YAML generating / validating / converting to. 2017-07-08 22:33:51 -07:00
bff6980eee Tests for YAML config code. 2017-07-04 18:32:37 -07:00
1dc60d2856 Integrating YAML config into borgmatic and updating README. 2017-07-04 18:23:59 -07:00
6e85940d63 Basic YAML configuration file parsing. 2017-07-04 16:52:24 -07:00
e00f74ddf7 Dropped Python 2 support. Now Python 3 only. 2017-07-02 17:18:33 -07:00
1aaf27dfb2 Changed example umask config to be more realistic. 2017-06-25 10:36:36 -07:00
87c65fb723 Removing unnecessary curlies from bash command. 2016-07-04 09:35:51 -07:00
abb6bed459 Sample files for triggering borgmatic from a systemd timer. 2016-07-04 09:19:34 -07:00
5bd1cc5580 #18: Fix for README mention of sample files not included in package. Also, added logo. 2016-07-03 22:07:53 -07:00
f6d2e983d9 Added tag 1.0.3 for changeset 32c6341dda9f 2016-06-23 07:13:29 -07:00
6bfe524bac #21: Fix for verbosity flag not actually causing verbose output. 2016-06-23 07:13:25 -07:00
ead991dcd1 Added tag 1.0.2 for changeset 9603d13910b3 2016-06-13 12:02:37 -07:00
b22b552bf3 #20: Fix for traceback when remote_path option is missing. 2016-06-13 08:53:41 -07:00
938392b25b Restricting issues list to open issues. 2016-06-12 22:40:04 -07:00
481dbc14c3 Rename issues URL. 2016-06-12 22:37:42 -07:00
600c438951 Reverting to pre-rename issues link, because that link isn't yet renamed to borgmatic. 2016-06-10 17:11:28 -07:00
2e3e68d2cb Added tag 1.0.1 for changeset de2d7721cdec 2016-06-10 13:34:23 -07:00
331adca23e #19: Support for Borg's --remote-path option to use an alternate Borg executable. 2016-06-10 13:31:37 -07:00
e1e5db22f8 Making a univeral wheel that supports both Python 2 and 3. 2016-06-10 12:34:49 -07:00
377e3948ff Added tag 1.0.0 for changeset 0e1fbee9358d 2016-06-10 12:15:48 -07:00
4533fec167 Documenting how to upgrade from atticmatic to borgmatic. 2016-06-10 11:53:45 -07:00
633700c0af Dropping support for Attic. 2016-06-10 11:21:53 -07:00
007b3e6d4e Merge pull request #12 from dawez/master
fixed typos in readme
2016-04-17 21:21:44 -07:00
dawez
175761c757 fixed typos in readme 2016-04-17 22:26:07 +02:00
c7e23fe9ed Added tag 0.1.8 for changeset dbc96d3f83bd 2016-04-10 16:01:18 -07:00
9e45da75cb Cutting a release. 2016-04-10 16:01:05 -07:00
0ea5824427 Switching from the no-longer-maintained nose test runner to pytest. 2016-04-10 15:59:36 -07:00
5b66dc69a1 Refreshing flexmock version in test requirements. 2016-04-10 15:48:10 -07:00
8210172d7f Fixing "check" backend tests to support new use of stderr=STDOUT. 2016-04-10 15:46:43 -07:00
82e8dae948 At verbosity zero, suppressing Borg check spew to stderr about "Checking segments". 2016-04-10 15:29:42 -07:00
fa87aed263 Normalizing recent changes. No new content. 2016-04-10 15:27:21 -07:00
c3b4cb21ed Fixed links to Borg documentation. 2016-04-10 10:23:32 -07:00
030b321e39 Merge pull request #11 from jangondol/patch-1
Fix broken link to Borg quickstart
2016-04-10 10:21:23 -07:00
Jan Gondol
15bf273e6e Fix broken link to Borg quickstart 2016-04-06 14:54:06 +02:00
cf545ae93a Mocking out glob() in test so it doesn't hit the filesystem, and simplifying comprehension. 2016-02-13 16:41:17 -08:00
45a2b9cded Merge pull request #5 from ypid/support-file-globs
Added support for file globs in source_directories.
2016-02-13 16:32:05 -08:00
953d08ba63
Made globing for source_directories the default.
Don’t remove non existing files/directories from the list and let
attic/borg handle this.
2016-02-13 21:10:05 +01:00
88da0c3039
Added support for file globs in source_directories.
source_directories_glob can be used to enable glob support (defaults to
disabled).
2016-02-13 21:07:07 +01:00
0012e0cdea Support borg create --umask. (Merge PR from ypid.) 2016-02-13 10:59:43 -08:00
049f9c8853 Added support for --one-file-system for Borg. 2016-02-13 10:43:31 -08:00
31482ee559 Merge pull request #8 from ypid/fixed-source-split-bug
Use /\s+/ to split source_directories to handle 1+ spaces.
2016-02-13 10:29:31 -08:00
1ffff3255a Merge pull request #6 from ypid/added-gitignore
Added .gitignore file.
2016-02-13 10:27:55 -08:00
9e52be6ffd
Use /\s+/ to split source_directories to handle 1+ spaces.
This bug is can be quite annoying because when you accidentally used
something like:

```ini
[location]
source_directories: backup_one  backup_two
;                              A (Additional space here)
```

It would call Attic/Borg with ('backup_one', '', 'backup_two') which in
turn backups your whole $PWD.
2016-02-07 23:30:54 +01:00
978096b402
Added .gitignore file. 2016-02-07 22:14:57 +01:00
cc6aa7af05 Merge pull request #3 from ypid/README-ini-hightlighting
Also allow the INI example to be highlighted on GitHub.
2016-01-24 20:52:01 -08:00
32858fb0b4
Also allow the INI example to be highlighted on GitHub. 2016-01-20 13:11:15 +01:00
e59845d4e1 Added tag github/master for changeset 28434dd0440c 2015-11-08 17:06:48 -08:00
9437e95849 Merge. 2015-11-08 17:04:49 -08:00
3a3851d2a5 Removed tag github/yaml_config_files 2015-11-08 17:04:14 -08:00
80318e6e30 Removed tag github/yaml_config_files 2015-11-08 17:03:40 -08:00
6756ca8311 Merge pull request #2 from ThomasWaldmann/patch-1
fixed typo in README
2015-10-20 18:33:16 -07:00
TW
fa7955b8cf fixed typo in README 2015-10-20 23:08:43 +02:00
944c0212c3 Added tag 0.1.7 for changeset 5a458ebef804 2015-09-06 16:40:46 -07:00
2456fc67f1 Revving version. 2015-09-06 16:40:39 -07:00
8a58b72934 Better error message when configuration file is missing. 2015-09-06 15:55:14 -07:00
6dc0173b74 #11: Fixed parsing of punctuation in configuration file. 2015-09-06 15:33:56 -07:00
5c58f85be1 Added tag 0.1.6 for changeset 4c63f3d90ec2 2015-09-02 22:48:14 -07:00
3a9e32a411 #9: New configuration option for the encryption passphrase. #10: Support for Borg's new archive compression feature. 2015-09-02 22:48:07 -07:00
30f6ec4f7d Adding documentation note about logging into the issue tracker in order to create issues. 2015-09-02 18:45:15 -07:00
c67ab09e4d Adding build to hgignore. 2015-08-09 11:04:57 -07:00
5299046b6b Added tag 0.1.5 for changeset 0afff209b902 2015-08-09 10:59:40 -07:00
204e515bf7 Changes to support release on PyPI. Now pip installable by name! 2015-08-09 10:59:27 -07:00
1334da99e2 Added tag 0.1.4 for changeset e58246fc92bb 2015-07-30 08:13:32 -07:00
996ca19dac Adding version test. 2015-07-30 08:13:27 -07:00
61969d17a2 Added tag 0.1.4 for changeset 6dda59c12de8 2015-07-30 08:12:36 -07:00
d041e23d35 Adding test that setup.py version matches release version. 2015-07-30 08:12:31 -07:00
Dan Helfman
e996e09657 Added tag 0.1.3 for changeset acc7fb61566f 2015-07-27 21:48:21 -07:00
Dan Helfman
9c06874073 #1: Add support for "borg check --last N" to Borg backend. 2015-07-27 21:47:52 -07:00
Dan Helfman
f5e0e10143 #6: Fixing example config file to use valid keep_within value. 2015-07-27 19:06:39 -07:00
Dan Helfman
952a691f60 Linking to both Attic and Borg check docs from sample config. 2015-07-26 22:02:43 -07:00
Dan Helfman
f94181480c Removing some annoying Pelican metadata from docs. 2015-07-26 21:29:14 -07:00
Dan Helfman
c27b4a3497 Added tag 0.1.2 for changeset 83067f995dd3 2015-07-26 21:06:06 -07:00
Dan Helfman
58d33503a1 As a convenience to new users, allow a missing default excludes file. 2015-07-26 21:06:03 -07:00
Dan Helfman
38322a3f6f Linking to both Attic and Borg prune docs from sample config. 2015-07-26 20:57:31 -07:00
52ab7cb881 New issue tracker, linked from documentation. 2015-07-21 21:29:40 -07:00
17ac63aae6 Added tag 0.1.1 for changeset 7b6c87dca7ea 2015-07-18 23:49:06 -07:00
1f1c8fdaba Bumping version. 2015-07-18 23:48:58 -07:00
Dan Helfman
ce6196a5c6 Added tag 0.1.1 for changeset ac5dfa01e9d1 2015-07-18 18:44:14 -07:00
Dan Helfman
6b0aa13856 Adding borgmatic cron example. 2015-07-18 18:44:11 -07:00
Dan Helfman
d25db4cd0d Added tag 0.1.0 for changeset 38d72677343f 2015-07-18 18:39:33 -07:00
Dan Helfman
7097ed67a6 New "borgmatic" command to support Borg backup software, a fork of Attic. 2015-07-18 18:35:29 -07:00
Dan Helfman
52d5240fa0 Added tag 0.0.7 for changeset cf4c7065f071 2015-07-17 21:58:58 -07:00
Dan Helfman
5bf3a4875c Flag for multiple levels of verbosity: some, and lots. 2015-07-17 21:58:50 -07:00
Dan Helfman
d9125451f5 Improved mocking of Python builtins in unit tests. 2015-06-14 11:00:46 -07:00
Dan Helfman
c3613e0637 Adding some explanitory text about consistency checks to README example. 2015-05-10 22:06:48 -07:00
Dan Helfman
c8f1af635f Added tag 0.0.6 for changeset 7ea93ca83f42 2015-05-10 22:00:34 -07:00
Dan Helfman
cfd61dc1d1 New configuration section for customizing which Attic consistency checks run, if any. 2015-05-10 22:00:31 -07:00
7750d2568c Passing through command-line options from tox to nosetests. 2015-03-15 11:15:40 -07:00
4e4f8c2670 Added tag 0.0.5 for changeset a03495a8e8b4 2015-03-15 10:47:58 -07:00
cb402d6846 Re-fixing version. 2015-03-15 10:47:49 -07:00
aa1178dc49 Added tag 0.0.5 for changeset 569aef47a9b2 2015-03-15 10:46:55 -07:00
3506819511 Added tag 0.0.5 for changeset aa8a807f4ba2 2015-03-15 10:44:25 -07:00
ac6c927a23 Backout out "helpful" error message that broke --verbose. 2015-03-15 10:44:18 -07:00
bda6451c1d Added tag 0.0.5 for changeset b31d51b63370 2015-03-15 10:39:08 -07:00
d9e396e264 Added tag 0.0.4 for changeset 4bb2e81fc770 2015-03-15 10:19:12 -07:00
66286f92df Releasing 0.0.4. 2015-03-15 10:15:03 -07:00
715b240589 Now using tox to run tests against multiple versions of Python in one go. 2015-03-15 10:14:30 -07:00
ee5697ac37 Fixing Python 3 test incompatibility with builtins. 2015-03-15 10:14:16 -07:00
aa48b95ee7 Bumping setup.py version. 2015-03-15 09:52:40 -07:00
2639b7105a Added nosetests config file (setup.cfg) with defaults. 2015-03-15 09:41:58 -07:00
02df59e964 Added a troubleshooting section with steps to deal with broken pipes. 2015-02-28 11:03:22 -08:00
f23810f19a Updating install instructions so you can upgrade from one release of atticmatic to the next. 2015-02-14 09:31:42 -08:00
9f5dd6c10d Added tag 0.0.3 for changeset 7730ae34665c 2015-02-14 09:24:15 -08:00
eaf2bd22c1 After pruning, run attic's consistency checks on all archives. 2015-02-14 09:23:40 -08:00
b1113d57ae Correcting doc string based on updated command-line arguments source. 2014-12-20 11:42:27 -08:00
dbd312981e Integration tests for argument parsing. 2014-12-20 11:37:25 -08:00
511314a54a Adding a note about repository encryption. 2014-12-20 10:56:03 -08:00
18267b9677 Added tag 0.0.2 for changeset 467d3a3ce918 2014-12-06 18:35:28 -08:00
056ed7184b Configuration support for additional attic prune flags: keep_within, keep_hourly, keep_yearly, and prefix. 2014-12-06 18:35:20 -08:00
b94c106a36 For convenience, adding some short-form arguments in addition to the long-form arguments. 2014-12-01 22:47:51 -08:00
965dd1aabe Adding sudo to installation of test dependencies, for consistency with installation of main dependencies. 2014-12-01 22:39:11 -08:00
626dd66254 Preventing ConfigParser from swallowing file read IOErrors, so that the user gets a more useful message. 2014-12-01 22:35:25 -08:00
d46e370950 Fixing configparser import for Python 3. 2014-12-01 22:14:35 -08:00
126bb279cd Expanding description. 2014-12-01 20:36:43 -08:00
d0eae19556 Adding authors/contributors file. 2014-12-01 20:30:07 -08:00
69971cd7e2 Python 3 ConfigParser compatibility. 2014-12-01 20:26:19 -08:00
45c6541266 Python 3 compatible exceptions. 2014-12-01 20:23:29 -08:00
65c837c828 Mentioning source code location explicitly. 2014-12-01 20:22:49 -08:00
8a4167b7a3 Saving README when rendered such that it can be served easily. 2014-12-01 20:15:21 -08:00
814770c2a9 Markdown metadata and link formatting updates. 2014-12-01 19:49:25 -08:00
f862eda7d6 Renaming README to indicate markdown. 2014-11-27 09:34:13 -08:00
5472424d5a Playing nicely with markdown. 2014-11-27 09:29:31 -08:00
10a449fe1a Adding note about making etc configuration directory before copying a file to it. 2014-11-26 20:15:21 -08:00
f557e2cbbd Merge pull request #1 from hajs/master
fixed README: copy cronjob to /etc/cron.d instead of /etc/init.d
2014-11-26 08:03:47 -08:00
Henning Schroder
704b97a636 fixed README: copy cronjob to /etc/cron.d instead of /etc/init.d (like comment in sample/atticmatic.cron correctly explains) 2014-11-26 13:04:14 +01:00
200a1bd63e Updating README with clarifications and examples. 2014-11-25 16:01:59 -08:00
cf4c262226 Note about hosting arrangement. 2014-11-18 18:32:16 -08:00
7b5363ce14 Merge with Github head! 2014-11-18 18:28:20 -08:00
42d9e2bfd8 Adding GPL v3 license. 2014-11-18 18:22:51 -08:00
d182509771 Unit tests for attic invocation code. 2014-11-17 22:19:34 -08:00
e567158246 Adding unit tests for config module. 2014-11-17 21:57:44 -08:00
db0f057b54 Adding contact info. 2014-11-17 18:35:47 -08:00
84922c7232 Adding PATH necessary to find the attic binary. 2014-11-01 17:46:04 -07:00
Dan Helfman
16bebe9832 Initial import. 2014-10-30 22:34:03 -07:00
175 changed files with 15371 additions and 1711 deletions

2
.dockerignore Normal file
View file

@ -0,0 +1,2 @@
.git
.tox

127
.drone.yml Normal file
View file

@ -0,0 +1,127 @@
---
kind: pipeline
name: python-3-5-alpine-3-10
services:
- name: postgresql
image: postgres:11.6-alpine
environment:
POSTGRES_PASSWORD: test
POSTGRES_DB: test
- name: mysql
image: mariadb:10.3
environment:
MYSQL_ROOT_PASSWORD: test
MYSQL_DATABASE: test
steps:
- name: build
image: python:3.5-alpine3.10
pull: always
commands:
- scripts/run-full-tests
---
kind: pipeline
name: python-3-6-alpine-3-10
services:
- name: postgresql
image: postgres:11.6-alpine
environment:
POSTGRES_PASSWORD: test
POSTGRES_DB: test
- name: mysql
image: mariadb:10.3
environment:
MYSQL_ROOT_PASSWORD: test
MYSQL_DATABASE: test
steps:
- name: build
image: python:3.6-alpine3.10
pull: always
commands:
- scripts/run-full-tests
---
kind: pipeline
name: python-3-7-alpine-3-10
services:
- name: postgresql
image: postgres:11.6-alpine
environment:
POSTGRES_PASSWORD: test
POSTGRES_DB: test
- name: mysql
image: mariadb:10.3
environment:
MYSQL_ROOT_PASSWORD: test
MYSQL_DATABASE: test
steps:
- name: build
image: python:3.7-alpine3.10
pull: always
commands:
- scripts/run-full-tests
---
kind: pipeline
name: python-3-7-alpine-3-7
services:
- name: postgresql
image: postgres:10.11-alpine
environment:
POSTGRES_PASSWORD: test
POSTGRES_DB: test
- name: mysql
image: mariadb:10.1
environment:
MYSQL_ROOT_PASSWORD: test
MYSQL_DATABASE: test
steps:
- name: build
image: python:3.7-alpine3.7
pull: always
commands:
- scripts/run-full-tests
---
kind: pipeline
name: python-3-8-alpine-3-10
services:
- name: postgresql
image: postgres:11.6-alpine
environment:
POSTGRES_PASSWORD: test
POSTGRES_DB: test
- name: mysql
image: mariadb:10.3
environment:
MYSQL_ROOT_PASSWORD: test
MYSQL_DATABASE: test
steps:
- name: build
image: python:3.8-alpine3.10
pull: always
commands:
- scripts/run-full-tests
---
kind: pipeline
name: documentation
steps:
- name: build
image: plugins/docker
settings:
username:
from_secret: docker_username
password:
from_secret: docker_password
repo: witten/borgmatic-docs
dockerfile: docs/Dockerfile
when:
branch:
- master

44
.eleventy.js Normal file
View file

@ -0,0 +1,44 @@
const pluginSyntaxHighlight = require("@11ty/eleventy-plugin-syntaxhighlight");
const inclusiveLangPlugin = require("@11ty/eleventy-plugin-inclusive-language");
module.exports = function(eleventyConfig) {
eleventyConfig.addPlugin(pluginSyntaxHighlight);
eleventyConfig.addPlugin(inclusiveLangPlugin);
let markdownIt = require("markdown-it");
let markdownItAnchor = require("markdown-it-anchor");
let markdownItReplaceLink = require("markdown-it-replace-link");
let markdownItOptions = {
html: true,
breaks: false,
linkify: true,
replaceLink: function (link, env) {
if (process.env.NODE_ENV == "production") {
return link;
}
return link.replace('https://torsion.org/borgmatic/', 'http://localhost:8080/');
}
};
let markdownItAnchorOptions = {
permalink: true,
permalinkClass: "direct-link"
};
eleventyConfig.setLibrary(
"md",
markdownIt(markdownItOptions)
.use(markdownItAnchor, markdownItAnchorOptions)
.use(markdownItReplaceLink)
);
eleventyConfig.addPassthroughCopy({"docs/static": "static"});
return {
templateFormats: [
"md",
"txt"
]
}
};

35
.gitea/issue_template.md Normal file
View file

@ -0,0 +1,35 @@
#### What I'm trying to do and why
#### Steps to reproduce (if a bug)
Include (sanitized) borgmatic configuration files if applicable.
#### Actual behavior (if a bug)
Include (sanitized) `--verbosity 2` output if applicable.
#### Expected behavior (if a bug)
#### Other notes / implementation ideas
#### Environment
**borgmatic version:** [version here]
Use `sudo borgmatic --version` or `sudo pip show borgmatic | grep ^Version`
**borgmatic installation method:** [e.g., Debian package, Docker container, etc.]
**Borg version:** [version here]
Use `sudo borg --version`
**Python version:** [version here]
Use `python3 --version`
**Database version (if applicable):** [version here]
Use `psql --version` or `mysql --version` on client and server.
**operating system and version:** [OS here]

9
.gitignore vendored
View file

@ -1,6 +1,11 @@
*.egg-info
*.pyc
*.swp
.cache
.coverage
.pytest_cache
.tox
build
dist
__pycache__
build/
dist/
pip-wheel-metadata/

View file

@ -1,9 +0,0 @@
syntax: glob
*.egg-info
*.pyc
*.swp
.cache
.coverage
.tox
build
dist

35
.hgtags
View file

@ -1,35 +0,0 @@
467d3a3ce9185e84ee51ca9156499162efd94f9a 0.0.2
7730ae34665c0dedf46deab90b32780abf6dbaff 0.0.3
4bb2e81fc77038be4499b7ea6797ab7d109460e0 0.0.4
b31d51b633701554e84f996cc0c73bad2990780b 0.0.5
b31d51b633701554e84f996cc0c73bad2990780b 0.0.5
aa8a807f4ba28f0652764ed14713ffea2fd6922d 0.0.5
aa8a807f4ba28f0652764ed14713ffea2fd6922d 0.0.5
569aef47a9b25c55b13753f94706f5d330219995 0.0.5
569aef47a9b25c55b13753f94706f5d330219995 0.0.5
a03495a8e8b471da63b5e2ae79d3ff9065839c2a 0.0.5
7ea93ca83f426ec0a608a68580c72c0775b81f86 0.0.6
cf4c7065f0711deda1cba878398bc05390e2c3f9 0.0.7
38d72677343f0a5d6845f4ac50d6778397083d45 0.1.0
ac5dfa01e9d14d09845f5e94c2c679e21c5eb2f9 0.1.1
ac5dfa01e9d14d09845f5e94c2c679e21c5eb2f9 0.1.1
7b6c87dca7ea312b2257ac1b46857b3f8c56b39c 0.1.1
83067f995dd391e38544a7722dc3b254b59c5521 0.1.2
acc7fb61566fe8028c179f43ecc735c851220b06 0.1.3
6dda59c12de88f060eb7244e6d330173985a9639 0.1.4
6dda59c12de88f060eb7244e6d330173985a9639 0.1.4
e58246fc92bb22c2b2fd8b86a1227de69d2d0315 0.1.4
0afff209b902698c2266986129d6dc9f5f913101 0.1.5
4c63f3d90ec2bf6af1714a3acec84654a7c9edf3 0.1.6
5a458ebef804be14e30d7375e3e9fbc26aedb80d 0.1.7
977f19c2f6a515be6c5ef69cf17b0e0989532209 github/yaml_config_files
0000000000000000000000000000000000000000 github/yaml_config_files
28434dd0440cc8da44c2f3e9bd7e9402a59c3b40 github/master
dbc96d3f83bd5570b6826537616d4160b3374836 0.1.8
0e1fbee9358de4f062fa9539e1355db83db70caa 1.0.0
de2d7721cdec93a52d20222a9ddd579ed93c1017 1.0.1
9603d13910b32d57a887765cab694ac5d0acc1f4 1.0.2
32c6341dda9fad77a3982641bce8a3a45821842e 1.0.3
5a003056a8ff4709c5bd4d6d33354199423f8a1d 1.1.0
7d3d11eff6c0773883c48f221431f157bc7995eb 1.1.1
f052a77a8ad5a0fea7fa86a902e0e401252f7d80 1.1.2

11
AUTHORS
View file

@ -1,5 +1,14 @@
Dan Helfman <witten@torsion.org>: Main developer
Alexander Görtz: Python 3 compatibility
Florian Lindner: Logging rewrite
Henning Schroeder: Copy editing
Robin `ypid` Schneider: Support additional options of Borg
Johannes Feichtner: Support for user hooks
Michele Lazzeri: Custom archive names
Nick Whyte: Support prefix filtering for archive consistency checks
newtonne: Read encryption password from external file
Robin `ypid` Schneider: Support additional options of Borg and add validate-borgmatic-config command
Scott Squires: Custom archive names
Thomas LÉVEIL: Support for a keep_minutely prune option. Support for the --json option
And many others! See the output of "git log".

View file

@ -1 +1,2 @@
include borgmatic/config/schema.yaml
graft sample/systemd

507
NEWS
View file

@ -1,15 +1,498 @@
1.5.0
* #245: Monitor backups with PagerDuty hook integration. See the documentation for more
information: https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/#pagerduty-hook
* #255: Add per-action hooks: "before_prune", "after_prune", "before_check", and "after_check".
* #274: Add ~/.config/borgmatic.d as another configuration directory default.
* #277: Customize Healthchecks log level via borgmatic "--monitoring-verbosity" flag.
* #280: Change "exclude_if_present" option to support multiple filenames that indicate a directory
should be excluded from backups, rather than just a single filename.
* #284: Backup to a removable drive or intermittent server via "soft failure" feature. See the
documentation for more information:
https://torsion.org/borgmatic/docs/how-to/backup-to-a-removable-drive-or-an-intermittent-server/
* #287: View consistency check progress via "--progress" flag for "check" action.
* For "create" and "prune" actions, no longer list files or show detailed stats at any verbosities
by default. You can opt back in with "--files" or "--stats" flags.
* For "list" and "info" actions, show repository names even at verbosity 0.
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
* #268: Override particular configuration options from the command-line via "--override" flag. See
the documentation for more information:
https://torsion.org/borgmatic/docs/how-to/make-per-application-backups/#configuration-overrides
* #270: Only trigger "on_error" hooks and monitoring failures for "prune", "create", and "check"
actions, and not for other actions.
* When pruning with verbosity level 1, list pruned and kept archives. Previously, this information
was only shown at verbosity level 2.
1.4.20
* Fix repository probing during "borgmatic init" to respect verbosity flag and remote_path option.
* #249: Update Healthchecks/Cronitor/Cronhub monitoring integrations to fire for "check" and
"prune" actions, not just "create".
1.4.19
* #259: Optionally change the internal database dump path via "borgmatic_source_directory" option
in location configuration section.
* #271: Support piping "borgmatic list" output to grep by logging certain log levels to console
stdout and others to stderr.
* Retain colored output when piping or redirecting in an interactive terminal.
* Add end-to-end tests for database dump and restore. These are run on developer machines with
Docker Compose for approximate parity with continuous integration tests.
1.4.18
* Fix "--repository" flag to accept relative paths.
* Fix "borgmatic umount" so it only runs Borg once instead of once per repository / configuration
file.
* #253: Mount whole repositories via "borgmatic mount" without any "--archive" flag.
* #269: Filter listed paths via "borgmatic list --path" flag.
1.4.17
* #235: Pass extra options directly to particular Borg commands, handy for Borg options that
borgmatic does not yet support natively. Use "extra_borg_options" in the storage configuration
section.
* #266: Attempt to repair any inconsistencies found during a consistency check via
"borgmatic check --repair" flag.
1.4.16
* #256: Fix for "before_backup" hook not triggering an error when the command contains "borg" and
has an exit code of 1.
* #257: Fix for garbled Borg file listing when using "borgmatic create --progress" with
verbosity level 1 or 2.
* #260: Fix for missing Healthchecks monitoring payload or HTTP 500 due to incorrect unicode
encoding.
1.4.15
* Fix for database dump removal incorrectly skipping some database dumps.
* #123: Support for mounting an archive as a FUSE filesystem via "borgmatic mount" action, and
unmounting via "borgmatic umount". See the documentation for more information:
https://torsion.org/borgmatic/docs/how-to/extract-a-backup/#mount-a-filesystem
1.4.14
* Show summary log errors regardless of verbosity level, and log the "summary:" header with a log
level based on the contained summary logs.
1.4.13
* Show full error logs at "--verbosity 0" so you can see command output without upping the
verbosity level.
1.4.12
* #247: With "borgmatic check", consider Borg warnings as errors.
* Dial back the display of inline error logs a bit, so failed command output doesn't appear
multiple times in the logs (well, except for the summary).
1.4.11
* #241: When using the Healthchecks monitoring hook, include borgmatic logs in the payloads for
completion and failure pings.
* With --verbosity level 1 or 2, show error logs both inline when they occur and in the summary
logs at the bottom. With lower verbosity levels, suppress the summary and show error logs when
they occur.
1.4.10
* #246: Fix for "borgmatic restore" showing success and incorrectly extracting archive files, even
when no databases are configured to restore. As this can overwrite files from the archive and
lead to data loss, please upgrade to get the fix before using "borgmatic restore".
* Reopen the file given by "--log-file" flag if an external program rotates the log file while
borgmatic is running.
1.4.9
* #228: Database dump hooks for MySQL/MariaDB, so you can easily dump your databases before backups
run.
* #243: Fix repository does not exist error with "borgmatic extract" when repository is remote.
1.4.8
* Monitor backups with Cronhub hook integration. See the documentation for more information:
https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/#cronhub-hook
* Fix Healthchecks/Cronitor hooks to skip actions when the borgmatic "--dry-run" flag is used.
1.4.7
* #238: In documentation, clarify when Healthchecks/Cronitor hooks fire in relation to other hooks.
* #239: Upgrade your borgmatic configuration to get new options and comments via
"generate-borgmatic-config --source". See the documentation for more information:
https://torsion.org/borgmatic/docs/how-to/upgrade/#upgrading-your-configuration
1.4.6
* Verbosity level "-1" for even quieter output: Errors only (#236).
1.4.5
* Log to file instead of syslog via command-line "--log-file" flag (#233).
1.4.4
* #234: Support for Borg --keep-exclude-tags and --exclude-nodump options.
1.4.3
* Monitor backups with Cronitor hook integration. See the documentation for more information:
https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/#cronitor-hook
1.4.2
* Extract files to a particular directory via "borgmatic extract --destination" flag.
* Rename "borgmatic extract --restore-path" flag to "--path" to reduce confusion with the separate
"borgmatic restore" action. Any uses of "--restore-path" will continue working.
1.4.1
* #229: Restore backed up PostgreSQL databases via "borgmatic restore" action. See the
documentation for more information:
https://torsion.org/borgmatic/docs/how-to/backup-your-databases/
* Documentation on how to develop borgmatic's documentation:
https://torsion.org/borgmatic/docs/how-to/develop-on-borgmatic/#documentation-development
1.4.0
* #225: Database dump hooks for PostgreSQL, so you can easily dump your databases before backups
run.
* #230: Rename "borgmatic list --pattern-from" flag to "--patterns-from" to match Borg.
1.3.26
* #224: Fix "borgmatic list --successful" with a slightly better heuristic for listing successful
(non-checkpoint) archives.
1.3.25
* #223: Dead man's switch to detect when backups start failing silently, implemented via
healthchecks.io hook integration. See the documentation for more information:
https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/#healthchecks-hook
* Documentation on monitoring and alerting options for borgmatic backups:
https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/
* Automatically rewrite links when developing on documentation locally.
1.3.24
* #86: Add "borgmatic list --successful" flag to only list successful (non-checkpoint) archives.
* Add a suggestion form to all documentation pages, so users can submit ideas for improving the
documentation.
* Update documentation link to community Arch Linux borgmatic package.
1.3.23
* #174: More detailed error alerting via runtime context available in "on_error" hook.
1.3.22
* #144: When backups to one of several repositories fails, keep backing up to the other
repositories and report errors afterwards.
1.3.21
* #192: User-defined hooks for global setup or cleanup that run before/after all actions. See the
documentation for more information:
https://torsion.org/borgmatic/docs/how-to/add-preparation-and-cleanup-steps-to-backups/
1.3.20
* #205: More robust sample systemd service: boot delay, network dependency, lowered CPU/IO
priority, etc.
* #221: Fix "borgmatic create --progress" output so that it updates on the console in real-time.
1.3.19
* #219: Fix visibility of "borgmatic prune --stats" output.
1.3.18
* #220: Fix regression of argument parsing for default actions.
1.3.17
* #217: Fix error with "borgmatic check --only" command-line flag with "extract" consistency check.
1.3.16
* #210: Support for Borg check --verify-data flag via borgmatic "data" consistency check.
* #210: Override configured consistency checks via "borgmatic check --only" command-line flag.
* When generating sample configuration with generate-borgmatic-config, add a space after each "#"
comment indicator.
1.3.15
* #208: Fix for traceback when the "checks" option has an empty value.
* #209: Bypass Borg error about a moved repository via "relocated_repo_access_is_ok" option in
borgmatic storage configuration section.
* #213: Reorder arguments passed to Borg to fix duplicate directories when using Borg patterns.
* #214: Fix for hook erroring with exit code 1 not being interpreted as an error.
1.3.14
* #204: Do not treat Borg warnings (exit code 1) as failures.
* When validating configuration files, require strings instead of allowing any scalar type.
1.3.13
* #199: Add note to documentation about using spaces instead of tabs for indentation, as YAML does
not allow tabs.
* #203: Fix compatibility with ruamel.yaml 0.16.x.
* If a "prefix" option in borgmatic's configuration has an empty value (blank or ""), then disable
default prefix.
1.3.12
* Only log to syslog when run from a non-interactive console (e.g. a cron job).
* Remove unicode byte order mark from syslog output so it doesn't show up as a literal in rsyslog
output. See discussion on #197.
1.3.11
* #193: Pass through several "borg list" and "borg info" flags like --short, --format, --sort-by,
--first, --last, etc. via borgmatic command-line flags.
* Add borgmatic info --repository and --archive command-line flags to display info for individual
repositories or archives.
* Support for Borg --noatime, --noctime, and --nobirthtime flags via corresponding options in
borgmatic configuration location section.
1.3.10
* #198: Fix for Borg create error output not showing up at borgmatic verbosity level zero.
1.3.9
* #195: Switch to command-line actions as more traditional sub-commands, e.g. "borgmatic create",
"borgmatic prune", etc. However, the classic dashed options like "--create" still work!
1.3.8
* #191: Disable console color via "color" option in borgmatic configuration output section.
1.3.7
* #196: Fix for unclear error message for invalid YAML merge include.
* #197: Don't color syslog output.
* Change default syslog verbosity to show errors only.
1.3.6
* #53: Log to syslog in addition to existing console logging. Add --syslog-verbosity flag to
customize the log level. See the documentation for more information:
https://torsion.org/borgmatic/docs/how-to/inspect-your-backups/
* #178: Look for .yml configuration file extension in addition to .yaml.
* #189: Set umask used when executing hooks via "umask" option in borgmatic hooks section.
* Remove Python cache files before each Tox run.
* Add #borgmatic Freenode IRC channel to documentation.
* Add Borg/borgmatic hosting providers section to documentation.
* Add files for building documentation into a Docker image for web serving.
* Upgrade project build server from Drone 0.8 to 1.1.
* Build borgmatic documentation during continuous integration.
* We're nearly at 500 ★s on GitHub. We can do this!
1.3.5
* #153: Support for various Borg directory environment variables (BORG_CONFIG_DIR, BORG_CACHE_DIR,
etc.) via options in borgmatic's storage configuration.
* #177: Fix for regression with missing verbose log entries.
1.3.4
* Part of #125: Color borgmatic (but not Borg) output when using an interactive terminal.
* #166: Run tests for all installed versions of Python.
* #168: Update README with continuous integration badge.
* #169: Automatically sort Python imports in code.
* Document installing borgmatic with pip install --user instead of a system Python install.
* Get more reproducible builds by pinning the versions of pip and tox used to run tests.
* Factor out build/test configuration from tox.ini file.
1.3.3
* Add validate-borgmatic-config command, useful for validating borgmatic config generated by
configuration management or even edited by hand.
1.3.2
* #160: Fix for hooks executing when using --dry-run. Now hooks are skipped during a dry run.
1.3.1
* #155: Fix for invalid JSON output when using multiple borgmatic configuration files.
* #157: Fix for seemingly random filename ordering when running through a directory of
configuration files.
* Fix for empty JSON output when using --create --json.
* Now capturing Borg output only when --json flag is used. Previously, borgmatic delayed Borg
output even without the --json flag.
1.3.0
* #148: Configuration file includes and merging via "!include" tag to support reuse of common
options across configuration files.
1.2.18
* #147: Support for Borg create/extract --numeric-owner flag via "numeric_owner" option in
borgmatic's location section.
1.2.17
* #140: List the files within an archive via --list --archive option.
1.2.16
* #119: Include a sample borgmatic configuration file in the documentation.
* #123: Support for Borg archive restoration via borgmatic --extract command-line flag.
* Refactor documentation into multiple separate pages for clarity and findability.
* Organize options within command-line help into logical groups.
* Exclude tests from distribution packages.
1.2.15
* #127: Remove date echo from schema example, as it's not a substitute for real logging.
* #132: Leave exclude_patterns glob expansion to Borg, since doing it in borgmatic leads to
confusing behavior.
* #136: Handle and format validation errors raised during argument parsing.
* #138: Allow use of --stats flag when --create or --prune flags are implied.
1.2.14
* #103: When generating sample configuration with generate-borgmatic-config, document the defaults
for each option.
* #116: When running multiple configuration files, attempt all configuration files even if one of
them errors. Log a summary of results at the end.
* Add borgmatic --version command-line flag to get the current installed version number.
1.2.13
* #100: Support for --stats command-line flag independent of --verbosity.
* #117: With borgmatic --init command-line flag, proceed without erroring if a repository already
exists.
1.2.12
* #110: Support for Borg repository initialization via borgmatic --init command-line flag.
* #111: Update Borg create --filter values so a dry run lists files to back up.
* #113: Update README with link to a new/forked Docker image.
* Prevent deprecated --excludes command-line option from being used.
* Refactor README a bit to flow better for first-time users.
* Update README with a few additional borgmatic packages (Debian and Ubuntu).
1.2.11
* #108: Support for Borg create --progress via borgmatic command-line flag.
1.2.10
* #105: Support for Borg --chunker-params create option via "chunker_params" option in borgmatic's
storage section.
1.2.9
* #102: Fix for syntax error that occurred in Python 3.5 and below.
* Make automated tests support running in Python 3.5.
1.2.8
* #73: Enable consistency checks for only certain repositories via "check_repositories" option in
borgmatic's consistency configuration. Handy for large repositories that take forever to check.
* Include link to issue tracker within various command output.
* Run continuous integration tests on a matrix of Python and Borg versions.
1.2.7
* #98: Support for Borg --keep-secondly prune option.
* Use Black code formatter and Flake8 code checker as part of running automated tests.
* Add an end-to-end automated test that actually integrates with Borg.
* Set up continuous integration for borgmatic automated tests on projects.evoworx.org.
1.2.6
* Fix generated configuration to also include a "keep_daily" value so pruning works out of the
box.
1.2.5
* #57: When generating sample configuration with generate-borgmatic-config, comment out all
optional configuration so as to streamline the initial configuration process.
1.2.4
* Fix for archive checking traceback due to parameter mismatch.
1.2.3
* #64, #90, #92: Rewrite of logging system. Now verbosity flags passed to Borg are derived from
borgmatic's log level. Note that the output of borgmatic might slightly change.
* Part of #80: Support for Borg create --read-special via "read_special" option in borgmatic's
location configuration.
* #87: Support for Borg create --checkpoint-interval via "checkpoint_interval" option in
borgmatic's storage configuration.
* #88: Fix declared pykwalify compatibility version range in setup.py to prevent use of ancient
versions of pykwalify with large version numbers.
* #89: Pass --show-rc option to Borg when at highest verbosity level.
* #94: Support for Borg --json option via borgmatic command-line to --create archives.
1.2.2
* #85: Fix compatibility issue between pykwalify and ruamel.yaml 0.15.52, which manifested in
borgmatic as a pykwalify RuleError.
1.2.1
* Skip before/after backup hooks when only doing --prune, --check, --list, and/or --info.
* #71: Support for XDG_CONFIG_HOME environment variable for specifying alternate user ~/.config/
path.
* #74, #83: Support for Borg --json option via borgmatic command-line to --list archives or show
archive --info in JSON format, ideal for programmatic consumption.
* #38, #76: Upgrade ruamel.yaml compatibility version range and fix support for Python 3.7.
* #77: Skip non-"*.yaml" config filenames in /etc/borgmatic.d/ so as not to parse backup files,
editor swap files, etc.
* #81: Document user-defined hooks run before/after backup, or on error.
* Add code style guidelines to the documention.
1.2.0
* #61: Support for Borg --list option via borgmatic command-line to list all archives.
* #61: Support for Borg --info option via borgmatic command-line to display summary information.
* #62: Update README to mention other ways of installing borgmatic.
* Support for Borg --prefix option for consistency checks via "prefix" option in borgmatic's
consistency configuration.
* Add introductory screencast link to documentation.
* #59: Ignore "check_last" and consistency "prefix" when "archives" not in consistency checks.
* #60: Add "Persistent" flag to systemd timer example.
* #63: Support for Borg --nobsdflags option to skip recording bsdflags (e.g. NODUMP, IMMUTABLE) in
archive.
* #69: Support for Borg prune --umask option using value of existing "umask" option in borgmatic's
storage configuration.
* Update tox.ini to only assume Python 3.x instead of Python 3.4 specifically.
* Add ~/.config/borgmatic/config.yaml to default configuration path probing.
* Document how to develop on and contribute to borgmatic.
1.1.15
* Support for Borg BORG_PASSCOMMAND environment variable to read a password from an external file.
* Fix for Borg create error when using borgmatic's --dry-run and --verbosity options together.
Work-around for behavior introduced in Borg 1.1.3: https://github.com/borgbackup/borg/issues/3298
* #55: Fix for missing tags/releases on Gitea and GitHub project hosting.
* #56: Support for Borg --lock-wait option for the maximum wait for a repository/cache lock.
* #58: Support for using tilde in exclude_patterns to reference home directory.
1.1.14
* #49: Fix for typo in --patterns-from option.
* #47: Support for Borg --dry-run option via borgmatic command-line.
1.1.13
* #54: Fix for incorrect consistency check flags passed to Borg when all three checks ("repository",
"archives", and "extract") are specified in borgmatic configuration.
* #48: Add "local_path" to configuration for specifying an alternative Borg executable path.
* #49: Support for Borg experimental --patterns-from and --patterns options for specifying mixed
includes/excludes.
* Moved issue tracker from Taiga to integrated Gitea tracker at
https://projects.torsion.org/witten/borgmatic/issues
1.1.12
* #46: Declare dependency on pykwalify 1.6 or above, as older versions yield "Unknown key: version"
rule errors.
* Support for Borg --keep-minutely prune option.
1.1.11
* #26: Add "ssh_command" to configuration for specifying a custom SSH command or options.
* Fix for incorrect /etc/borgmatic.d/ configuration path probing on macOS. This problem manifested
as an error on startup: "[Errno 2] No such file or directory: '/etc/borgmatic.d'".
1.1.10
* Pass several Unix signals through to child processes like Borg. This means that Borg now properly
shuts down if borgmatic is terminated (e.g. due to a system suspend).
* #30: Support for using tilde in repository paths to reference home directory.
* #43: Support for Borg --files-cache option for setting the files cache operation mode.
* #45: Support for Borg --remote-ratelimit option for limiting upload rate.
* Log invoked Borg commands when at highest verbosity level.
1.1.9
* #17, #39: Support for user-defined hooks before/after backup, or on error.
* #34: Improve clarity of logging spew at high verbosity levels.
* #30: Support for using tilde in source directory path to reference home directory.
* Require "prefix" in retention section when "archive_name_format" is set. This is to avoid
accidental pruning of archives with a different archive name format. For similar reasons, default
"prefix" to "{hostname}-" if not specified.
* Convert main source repository from Mercurial to Git.
* Update dead links to Borg documentation.
1.1.8
* #40: Fix to make /etc/borgmatic/config.yaml optional rather than required when using the default
config paths.
1.1.7
* #29: Add "archive_name_format" to configuration for customizing archive names.
* Fix for traceback when "exclude_from" value is empty in configuration file.
* When pruning, make highest verbosity level list archives kept and pruned.
* Clarification of Python 3 pip usage in documentation.
1.1.6
* #13, #36: Support for Borg --exclude-from, --exclude-caches, and --exclude-if-present options.
1.1.5
* #35: New "extract" consistency check that performs a dry-run extraction of the most recent
archive.
1.1.4
* #18: Added command-line flags for performing a borgmatic run with only pruning, creating, or
checking enabled. This supports use cases like running consistency checks from a different cron
job with a different frequency, or running pruning with a different verbosity level.
1.1.3
* #14: Support for running multiple config files in /etc/borgmatic.d/ from a single borgmatic run.
* #15: Support for running multiple config files in /etc/borgmatic.d/ from a single borgmatic run.
* Fix for generate-borgmatic-config writing config with invalid one_file_system value.
1.1.2
* #32: Fix for passing check_last as integer to subprocess when calling Borg.
* #33: Fix for passing check_last as integer to subprocess when calling Borg.
1.1.1
* Part of #32: Fix for upgrade-borgmatic-config converting check_last option as a string instead of
* Part of #33: Fix for upgrade-borgmatic-config converting check_last option as a string instead of
an integer.
* Fix for upgrade-borgmatic-config erroring when consistency checks option is not present.
@ -18,8 +501,8 @@
* Switched config file format to YAML. Run upgrade-borgmatic-config to upgrade.
* Added generate-borgmatic-config command for initial config creation.
* Dropped Python 2 support. Now Python 3 only.
* #18: Fix for README mention of sample files not included in package.
* #22: Sample files for triggering borgmatic from a systemd timer.
* #19: Fix for README mention of sample files not included in package.
* #23: Sample files for triggering borgmatic from a systemd timer.
* Support for backing up to multiple repositories.
* To free up space, now pruning backups prior to creating a new backup.
* Enabled test coverage output during tox runs.
@ -27,15 +510,15 @@
1.0.3
* #21: Fix for verbosity flag not actually causing verbose output.
* #22: Fix for verbosity flag not actually causing verbose output.
1.0.2
* #20: Fix for traceback when remote_path option is missing.
* #21: Fix for traceback when remote_path option is missing.
1.0.1
* #19: Support for Borg's --remote-path option to use an alternate Borg
* #20: Support for Borg's --remote-path option to use an alternate Borg
executable. See sample/config.
1.0.0
@ -57,13 +540,13 @@
0.1.7
* #11: Fixed parsing of punctuation in configuration file.
* #12: Fixed parsing of punctuation in configuration file.
* Better error message when configuration file is missing.
0.1.6
* #9: New configuration option for the encryption passphrase.
* #10: Support for Borg's new archive compression feature.
* #10: New configuration option for the encryption passphrase.
* #11: Support for Borg's new archive compression feature.
0.1.5
@ -75,7 +558,7 @@
0.1.3
* #1: Add support for "borg check --last N" to Borg backend.
* #2: Add support for "borg check --last N" to Borg backend.
0.1.2

328
README.md
View file

@ -1,276 +1,142 @@
---
title: borgmatic
permalink: index.html
---
<img src="static/borgmatic.svg" alt="borgmatic logo" style="width: 8em; float: right; padding-left: 1em;" />
## It's your data. Keep it that way.
## Overview
<img src="docs/static/borgmatic.png" alt="borgmatic logo" width="150px" style="float: right; padding-left: 1em;">
borgmatic (formerly atticmatic) is a simple Python wrapper script for the
[Borg](https://borgbackup.readthedocs.org/en/stable/) backup software that
initiates a backup, prunes any old backups according to a retention policy,
and validates backups for consistency. The script supports specifying your
settings in a declarative configuration file rather than having to put them
all on the command-line, and handles common errors.
borgmatic is simple, configuration-driven backup software for servers and
workstations. Protect your files with client-side encryption. Backup your
databases too. Monitor it all with integrated third-party services.
Here's an example config file:
Here's an example configuration file:
```yaml
location:
# List of source directories to backup. Globs are expanded.
# List of source directories to backup.
source_directories:
- /home
- /etc
- /var/log/syslog*
# Paths to local or remote repositories.
# Paths of local or remote repositories to backup to.
repositories:
- user@backupserver:sourcehostname.borg
# Any paths matching these patterns are excluded from backups.
exclude_patterns:
- /home/*/.cache
- 1234@usw-s001.rsync.net:backups.borg
- k8pDxu32@k8pDxu32.repo.borgbase.com:repo
- /var/lib/backups/local.borg
retention:
# Retention policy for how many backups to keep in each category.
# Retention policy for how many backups to keep.
keep_daily: 7
keep_weekly: 4
keep_monthly: 6
consistency:
# List of consistency checks to run: "repository", "archives", or both.
# List of checks to run to validate your backups.
checks:
- repository
- archives
hooks:
# Custom preparation scripts to run.
before_backup:
- prepare-for-backup.sh
# Databases to dump and include in backups.
postgresql_databases:
- name: users
# Third-party services to notify you if backups aren't happening.
healthchecks: https://hc-ping.com/be067061-cf96-4412-8eae-62b0c50d6a8c
```
borgmatic is hosted at <https://torsion.org/borgmatic> with [source code
available](https://torsion.org/hg/borgmatic). It's also mirrored on
[GitHub](https://github.com/witten/borgmatic) and
[BitBucket](https://bitbucket.org/dhelfman/borgmatic) for convenience.
Want to see borgmatic in action? Check out the <a
href="https://asciinema.org/a/203761" target="_blank">screencast</a>.
<script src="https://asciinema.org/a/203761.js" id="asciicast-203761" async></script>
## Installation
borgmatic is powered by [Borg Backup](https://www.borgbackup.org/).
To get up and running, follow the [Borg Quick
Start](https://borgbackup.readthedocs.org/en/latest/quickstart.html) to create
a repository on a local or remote host. Note that if you plan to run
borgmatic on a schedule with cron, and you encrypt your Borg repository with
a passphrase instead of a key file, you'll need to set the borgmatic
`encryption_passphrase` configuration variable. See the repository encryption
section of the Quick Start for more info.
## Integrations
If the repository is on a remote host, make sure that your local root user has
key-based ssh access to the desired user account on the remote host.
<a href="https://www.postgresql.org/"><img src="docs/static/postgresql.png" alt="PostgreSQL" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="https://www.mysql.com/"><img src="docs/static/mysql.png" alt="MySQL" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="https://mariadb.com/"><img src="docs/static/mariadb.png" alt="MariaDB" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="https://healthchecks.io/"><img src="docs/static/healthchecks.png" alt="Healthchecks" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="https://cronitor.io/"><img src="docs/static/cronitor.png" alt="Cronitor" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="https://cronhub.io/"><img src="docs/static/cronhub.png" alt="Cronhub" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="https://www.pagerduty.com/"><img src="docs/static/pagerduty.png" alt="PagerDuty" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="https://www.rsync.net/cgi-bin/borg.cgi?campaign=borg&adgroup=borgmatic"><img src="docs/static/rsyncnet.png" alt="rsync.net" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="https://www.borgbase.com/?utm_source=borgmatic"><img src="docs/static/borgbase.png" alt="BorgBase" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
To install borgmatic, run the following command to download and install it:
sudo pip install --upgrade borgmatic
## How-to guides
Make sure you're using Python 3, as borgmatic does not support Python 2. (You
may have to use "pip3" or similar instead of "pip".)
* [Set up backups with borgmatic](https://torsion.org/borgmatic/docs/how-to/set-up-backups/) ⬅ *Start here!*
* [Make per-application backups](https://torsion.org/borgmatic/docs/how-to/make-per-application-backups/)
* [Deal with very large backups](https://torsion.org/borgmatic/docs/how-to/deal-with-very-large-backups/)
* [Inspect your backups](https://torsion.org/borgmatic/docs/how-to/inspect-your-backups/)
* [Monitor your backups](https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/)
* [Extract a backup](https://torsion.org/borgmatic/docs/how-to/extract-a-backup/)
* [Backup your databases](https://torsion.org/borgmatic/docs/how-to/backup-your-databases/)
* [Add preparation and cleanup steps to backups](https://torsion.org/borgmatic/docs/how-to/add-preparation-and-cleanup-steps-to-backups/)
* [Backup to a removable drive or an intermittent server](https://torsion.org/borgmatic/docs/how-to/backup-to-a-removable-drive-or-an-intermittent-server/)
* [Upgrade borgmatic](https://torsion.org/borgmatic/docs/how-to/upgrade/)
* [Develop on borgmatic](https://torsion.org/borgmatic/docs/how-to/develop-on-borgmatic/)
## Configuration
After you install borgmatic, generate a sample configuration file:
## Reference guides
sudo generate-borgmatic-config
* [borgmatic configuration reference](https://torsion.org/borgmatic/docs/reference/configuration/)
* [borgmatic command-line reference](https://torsion.org/borgmatic/docs/reference/command-line/)
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 just
representative. All fields are optional except where indicated, so feel free
to remove anything you don't need.
## Hosting providers
### Multiple configuration files
Need somewhere to store your encrypted offsite backups? The following hosting
providers include specific support for Borg/borgmatic. Using these links and
services helps support borgmatic development and hosting. (These are referral
links, but without any tracking scripts or cookies.)
A more advanced usage is to create multiple separate configuration files and
place each one in a /etc/borgmatic.d directory. For instance:
<ul>
<li class="referral"><a href="https://www.rsync.net/cgi-bin/borg.cgi?campaign=borg&adgroup=borgmatic">rsync.net</a>: Cloud Storage provider with full support for borg and any other SSH/SFTP tool</li>
<li class="referral"><a href="https://www.borgbase.com/?utm_source=borgmatic">BorgBase</a>: Borg hosting service with support for monitoring, 2FA, and append-only repos</li>
</ul>
sudo mkdir /etc/borgmatic.d
sudo generate-borgmatic-config --destination /etc/borgmatic.d/app1.yaml
sudo generate-borgmatic-config --destination /etc/borgmatic.d/app2.yaml
## Support and contributing
With this approach, you can have entirely different backup policies for
different applications on your system. For instance, you may want one backup
configuration for your database data directory, and a different configuration
for your user home directories.
### Issues
When you set up multiple configuration files like this, borgmatic will run
each one in turn from a single borgmatic invocation. This includes, by
default, the traditional /etc/borgmatic/config.yaml as well.
You've got issues? Or an idea for a feature enhancement? We've got an [issue
tracker](https://projects.torsion.org/witten/borgmatic/issues). In order to
create a new issue or comment on an issue, you'll need to [login
first](https://projects.torsion.org/user/login). Note that you can login with
an existing GitHub account if you prefer.
## Upgrading
In general, all you should need to do to upgrade borgmatic is run the
following:
sudo pip install --upgrade borgmatic
(You may have to use "pip3" or similar instead of "pip", so Python 3 gets
used.)
However, see below about special cases.
### Upgrading from borgmatic 1.0.x
borgmatic changed its configuration file format in version 1.1.0 from
INI-style to YAML. This better supports validation, and has a more natural way
to express lists of values. To upgrade your existing configuration, first
upgrade to the new version of borgmatic:
As of version 1.1.0, borgmatic no longer supports Python 2. If you were
already running borgmatic with Python 3, then you can simply upgrade borgmatic
in-place:
sudo pip install --upgrade borgmatic
But if you were running borgmatic with Python 2, uninstall and reinstall instead:
sudo pip uninstall borgmatic
sudo pip3 install borgmatic
The pip binary names for different versions of Python can differ, so the above
commands may need some tweaking to work on your machine.
Once borgmatic is upgraded, run:
sudo upgrade-borgmatic-config
That will generate a new YAML configuration file at /etc/borgmatic/config.yaml
(by default) using the values from both your existing configuration and
excludes files. The new version of borgmatic will consume the YAML
configuration file instead of the old one.
### Upgrading from atticmatic
You can ignore this section if you're not an atticmatic user (the former name
of borgmatic).
borgmatic only supports Borg now and no longer supports Attic. So if you're
an Attic user, consider switching to Borg. See the [Borg upgrade
command](https://borgbackup.readthedocs.io/en/stable/usage.html#borg-upgrade)
for more information. Then, follow the instructions above about setting up
your borgmatic configuration files.
If you were already using Borg with atticmatic, then you can easily upgrade
from atticmatic to borgmatic. Simply run the following commands:
sudo pip uninstall atticmatic
sudo pip install borgmatic
That's it! borgmatic will continue using your /etc/borgmatic configuration
files.
## Usage
You can run borgmatic and start a backup simply by invoking it without
arguments:
borgmatic
This will also prune any old backups as per the configured retention policy,
and check backups for consistency problems due to things like file damage.
By default, the backup will proceed silently except in the case of errors. But
if you'd like to to get additional information about the progress of the
backup as it proceeds, use the verbosity option:
borgmatic --verbosity 1
Or, for even more progress spew:
borgmatic --verbosity 2
If you'd like to see the available command-line arguments, view the help:
borgmatic --help
## Autopilot
If you want to run borgmatic automatically, say once a day, the you can
configure a job runner to invoke it periodically.
### cron
If you're using cron, download the [sample cron
file](https://torsion.org/hg/borgmatic/raw-file/tip/sample/cron/borgmatic).
Then, from the directory where you downloaded it:
sudo mv borgmatic /etc/cron.d/borgmatic
sudo chmod +x /etc/cron.d/borgmatic
You can modify the cron file if you'd like to run borgmatic more or less frequently.
### systemd
If you're using systemd instead of cron to run jobs, download the [sample
systemd service
file](https://torsion.org/hg/borgmatic/raw-file/tip/sample/systemd/borgmatic.service)
and the [sample systemd timer
file](https://torsion.org/hg/borgmatic/raw-file/tip/sample/systemd/borgmatic.timer).
Then, from the directory where you downloaded them:
sudo mv borgmatic.service borgmatic.timer /etc/systemd/system/
sudo systemctl enable borgmatic.timer
sudo systemctl start borgmatic.timer
Feel free to modify the timer file based on how frequently you'd like
borgmatic to run.
## Running tests
First install tox, which is used for setting up testing environments:
pip install tox
Then, to actually run tests, run:
tox
## Troubleshooting
### Broken pipe with remote repository
When running borgmatic on a large remote repository, you may receive errors
like the following, particularly while "borg check" is validating backups for
consistency:
Write failed: Broken pipe
borg: Error: Connection closed by remote host
This error can be caused by an ssh timeout, which you can rectify by adding
the following to the ~/.ssh/config file on the client:
Host *
ServerAliveInterval 120
This should make the client keep the connection alive while validating
backups.
### libyaml compilation errors
borgmatic depends on a Python YAML library (ruamel.yaml) that will optionally
use a C YAML library (libyaml) if present. But if it's not installed, then
when installing or upgrading borgmatic, you may see errors about compiling the
YAML library. If so, not to worry. borgmatic should install and function
correctly even without the C YAML library. And borgmatic won't be any faster
with the C library present, so you don't need to go out of your way to install
it.
## Issues and feedback
Got an issue or an idea for a feature enhancement? Check out the [borgmatic
issue tracker](https://tree.taiga.io/project/witten-borgmatic/issues?page=1&status=399951,399952,399955). In
order to create a new issue or comment on an issue, you'll need to [login
first](https://tree.taiga.io/login).
If you'd like to chat with borgmatic developers or users, head on over to the
`#borgmatic` IRC channel on Freenode, either via <a
href="https://webchat.freenode.net/?channels=borgmatic">web chat</a> or a
native <a href="irc://chat.freenode.net:6697">IRC client</a>.
Other questions or comments? Contact <mailto:witten@torsion.org>.
### Contributing
borgmatic is hosted at <https://torsion.org/borgmatic> with [source code
available](https://projects.torsion.org/witten/borgmatic). It's also mirrored
on [GitHub](https://github.com/witten/borgmatic) for convenience.
If you'd like to contribute to borgmatic development, please feel free to
submit a [Pull Request](https://projects.torsion.org/witten/borgmatic/pulls)
or open an [issue](https://projects.torsion.org/witten/borgmatic/issues) first
to discuss your idea. We also accept Pull Requests on GitHub, if that's more
your thing. In general, contributions are very welcome. We don't bite!
Also, please check out the [borgmatic development
how-to](https://torsion.org/borgmatic/docs/how-to/develop-on-borgmatic/) for
info on cloning source code, running tests, etc.
<a href="https://build.torsion.org/witten/borgmatic" alt="build status">![Build Status](https://build.torsion.org/api/badges/witten/borgmatic/status.svg?ref=refs/heads/master)</a>

View file

@ -1,202 +0,0 @@
from datetime import datetime
import glob
import itertools
import os
import platform
import re
import subprocess
import tempfile
from borgmatic.verbosity import VERBOSITY_SOME, VERBOSITY_LOTS
# Integration with Borg for actually handling backups.
COMMAND = 'borg'
def initialize(storage_config, command=COMMAND):
passphrase = storage_config.get('encryption_passphrase')
if passphrase:
os.environ['{}_PASSPHRASE'.format(command.upper())] = passphrase
def _write_exclude_file(exclude_patterns=None):
'''
Given a sequence of exclude patterns, write them to a named temporary file and return it. Return
None if no patterns are provided.
'''
if not exclude_patterns:
return None
exclude_file = tempfile.NamedTemporaryFile('w')
exclude_file.write('\n'.join(exclude_patterns))
exclude_file.flush()
return exclude_file
def create_archive(
verbosity, repository, location_config, storage_config, command=COMMAND,
):
'''
Given a vebosity flag, a storage config dict, a list of source directories, a local or remote
repository path, a list of exclude patterns, and a command to run, create an attic archive.
'''
sources = tuple(
itertools.chain.from_iterable(
glob.glob(directory) or [directory]
for directory in location_config['source_directories']
)
)
exclude_file = _write_exclude_file(location_config.get('exclude_patterns'))
exclude_flags = ('--exclude-from', exclude_file.name) if exclude_file else ()
compression = storage_config.get('compression', None)
compression_flags = ('--compression', compression) if compression else ()
umask = storage_config.get('umask', None)
umask_flags = ('--umask', str(umask)) if umask else ()
one_file_system_flags = ('--one-file-system',) if location_config.get('one_file_system') else ()
remote_path = location_config.get('remote_path')
remote_path_flags = ('--remote-path', remote_path) if remote_path else ()
verbosity_flags = {
VERBOSITY_SOME: ('--info', '--stats',),
VERBOSITY_LOTS: ('--debug', '--list', '--stats'),
}.get(verbosity, ())
full_command = (
command, 'create',
'{repo}::{hostname}-{timestamp}'.format(
repo=repository,
hostname=platform.node(),
timestamp=datetime.now().isoformat(),
),
) + sources + exclude_flags + compression_flags + one_file_system_flags + \
remote_path_flags + umask_flags + verbosity_flags
subprocess.check_call(full_command)
def _make_prune_flags(retention_config):
'''
Given a retention config dict mapping from option name to value, tranform it into an iterable of
command-line name-value flag pairs.
For example, given a retention config of:
{'keep_weekly': 4, 'keep_monthly': 6}
This will be returned as an iterable of:
(
('--keep-weekly', '4'),
('--keep-monthly', '6'),
)
'''
return (
('--' + option_name.replace('_', '-'), str(retention_config[option_name]))
for option_name, value in retention_config.items()
)
def prune_archives(verbosity, repository, retention_config, command=COMMAND, remote_path=None):
'''
Given a verbosity flag, a local or remote repository path, a retention config dict, and a
command to run, prune attic archives according the the retention policy specified in that
configuration.
'''
remote_path_flags = ('--remote-path', remote_path) if remote_path else ()
verbosity_flags = {
VERBOSITY_SOME: ('--info', '--stats',),
VERBOSITY_LOTS: ('--debug', '--stats'),
}.get(verbosity, ())
full_command = (
command, 'prune',
repository,
) + tuple(
element
for pair in _make_prune_flags(retention_config)
for element in pair
) + remote_path_flags + verbosity_flags
subprocess.check_call(full_command)
DEFAULT_CHECKS = ('repository', 'archives')
def _parse_checks(consistency_config):
'''
Given a consistency config with a "checks" list, transform it to a tuple of named checks to run.
For example, given a retention config of:
{'checks': ['repository', 'archives']}
This will be returned as:
('repository', 'archives')
If no "checks" option is present, return the DEFAULT_CHECKS. If the checks value is the string
"disabled", return an empty tuple, meaning that no checks should be run.
'''
checks = consistency_config.get('checks', [])
if checks == ['disabled']:
return ()
return tuple(check for check in checks if check.lower() not in ('disabled', '')) or DEFAULT_CHECKS
def _make_check_flags(checks, check_last=None):
'''
Given a parsed sequence of checks, transform it into tuple of command-line flags.
For example, given parsed checks of:
('repository',)
This will be returned as:
('--repository-only',)
Additionally, if a check_last value is given, a "--last" flag will be added.
'''
last_flag = ('--last', str(check_last)) if check_last else ()
if checks == DEFAULT_CHECKS:
return last_flag
return tuple(
'--{}-only'.format(check) for check in checks
) + last_flag
def check_archives(verbosity, repository, consistency_config, command=COMMAND, remote_path=None):
'''
Given a verbosity flag, a local or remote repository path, a consistency config dict, and a
command to run, check the contained attic archives for consistency.
If there are no consistency checks to run, skip running them.
'''
checks = _parse_checks(consistency_config)
check_last = consistency_config.get('check_last', None)
if not checks:
return
remote_path_flags = ('--remote-path', remote_path) if remote_path else ()
verbosity_flags = {
VERBOSITY_SOME: ('--info',),
VERBOSITY_LOTS: ('--debug',),
}.get(verbosity, ())
full_command = (
command, 'check',
repository,
) + _make_check_flags(checks, check_last) + remote_path_flags + verbosity_flags
# The check command spews to stdout/stderr even without the verbose flag. Suppress it.
stdout = None if verbosity_flags else open(os.devnull, 'w')
subprocess.check_call(full_command, stdout=stdout, stderr=subprocess.STDOUT)

142
borgmatic/borg/check.py Normal file
View file

@ -0,0 +1,142 @@
import logging
from borgmatic.borg import extract
from borgmatic.execute import execute_command, execute_command_without_capture
DEFAULT_CHECKS = ('repository', 'archives')
DEFAULT_PREFIX = '{hostname}-'
logger = logging.getLogger(__name__)
def _parse_checks(consistency_config, only_checks=None):
'''
Given a consistency config with a "checks" list, and an optional list of override checks,
transform them a tuple of named checks to run.
For example, given a retention config of:
{'checks': ['repository', 'archives']}
This will be returned as:
('repository', 'archives')
If no "checks" option is present in the config, return the DEFAULT_CHECKS. If the checks value
is the string "disabled", return an empty tuple, meaning that no checks should be run.
If the "data" option is present, then make sure the "archives" option is included as well.
'''
checks = [
check.lower() for check in (only_checks or consistency_config.get('checks', []) or [])
]
if checks == ['disabled']:
return ()
if 'data' in checks and 'archives' not in checks:
checks.append('archives')
return tuple(check for check in checks if check not in ('disabled', '')) or DEFAULT_CHECKS
def _make_check_flags(checks, check_last=None, prefix=None):
'''
Given a parsed sequence of checks, transform it into tuple of command-line flags.
For example, given parsed checks of:
('repository',)
This will be returned as:
('--repository-only',)
However, if both "repository" and "archives" are in checks, then omit them from the returned
flags because Borg does both checks by default.
Additionally, if a check_last value is given and "archives" is in checks, then include a
"--last" flag. And if a prefix value is given and "archives" is in checks, then include a
"--prefix" flag.
'''
if 'archives' in checks:
last_flags = ('--last', str(check_last)) if check_last else ()
prefix_flags = ('--prefix', prefix) if prefix else ()
else:
last_flags = ()
prefix_flags = ()
if check_last:
logger.warning(
'Ignoring check_last option, as "archives" is not in consistency checks.'
)
if prefix:
logger.warning(
'Ignoring consistency prefix option, as "archives" is not in consistency checks.'
)
common_flags = last_flags + prefix_flags + (('--verify-data',) if 'data' in checks else ())
if set(DEFAULT_CHECKS).issubset(set(checks)):
return common_flags
return (
tuple('--{}-only'.format(check) for check in checks if check in DEFAULT_CHECKS)
+ common_flags
)
def check_archives(
repository,
storage_config,
consistency_config,
local_path='borg',
remote_path=None,
progress=None,
repair=None,
only_checks=None,
):
'''
Given a local or remote repository path, a storage config dict, a consistency config dict,
local/remote commands to run, whether to include progress information, whether to attempt a
repair, and an optional list of checks to use instead of configured checks, check the contained
Borg archives for consistency.
If there are no consistency checks to run, skip running them.
'''
checks = _parse_checks(consistency_config, only_checks)
check_last = consistency_config.get('check_last', None)
lock_wait = None
extra_borg_options = storage_config.get('extra_borg_options', {}).get('check', '')
if set(checks).intersection(set(DEFAULT_CHECKS + ('data',))):
lock_wait = storage_config.get('lock_wait', None)
verbosity_flags = ()
if logger.isEnabledFor(logging.INFO):
verbosity_flags = ('--info',)
if logger.isEnabledFor(logging.DEBUG):
verbosity_flags = ('--debug', '--show-rc')
prefix = consistency_config.get('prefix', DEFAULT_PREFIX)
full_command = (
(local_path, 'check')
+ (('--repair',) if repair else ())
+ _make_check_flags(checks, check_last, prefix)
+ (('--remote-path', remote_path) if remote_path else ())
+ (('--lock-wait', str(lock_wait)) if lock_wait else ())
+ verbosity_flags
+ (('--progress',) if progress else ())
+ (tuple(extra_borg_options.split(' ')) if extra_borg_options else ())
+ (repository,)
)
# The Borg repair option trigger an interactive prompt, which won't work when output is
# captured. And progress messes with the terminal directly.
if repair or progress:
execute_command_without_capture(full_command, error_on_warnings=True)
else:
execute_command(full_command, error_on_warnings=True)
if 'extract' in checks:
extract.extract_last_archive_dry_run(repository, lock_wait, local_path, remote_path)

212
borgmatic/borg/create.py Normal file
View file

@ -0,0 +1,212 @@
import glob
import itertools
import logging
import os
import tempfile
from borgmatic.execute import execute_command, execute_command_without_capture
logger = logging.getLogger(__name__)
def _expand_directory(directory):
'''
Given a directory path, expand any tilde (representing a user's home directory) and any globs
therein. Return a list of one or more resulting paths.
'''
expanded_directory = os.path.expanduser(directory)
return glob.glob(expanded_directory) or [expanded_directory]
def _expand_directories(directories):
'''
Given a sequence of directory paths, expand tildes and globs in each one. Return all the
resulting directories as a single flattened tuple.
'''
if directories is None:
return ()
return tuple(
itertools.chain.from_iterable(_expand_directory(directory) for directory in directories)
)
def _expand_home_directories(directories):
'''
Given a sequence of directory paths, expand tildes in each one. Do not perform any globbing.
Return the results as a tuple.
'''
if directories is None:
return ()
return tuple(os.path.expanduser(directory) for directory in directories)
def _write_pattern_file(patterns=None):
'''
Given a sequence of patterns, write them to a named temporary file and return it. Return None
if no patterns are provided.
'''
if not patterns:
return None
pattern_file = tempfile.NamedTemporaryFile('w')
pattern_file.write('\n'.join(patterns))
pattern_file.flush()
return pattern_file
def _make_pattern_flags(location_config, pattern_filename=None):
'''
Given a location config dict with a potential patterns_from option, and a filename containing
any additional patterns, return the corresponding Borg flags for those files as a tuple.
'''
pattern_filenames = tuple(location_config.get('patterns_from') or ()) + (
(pattern_filename,) if pattern_filename else ()
)
return tuple(
itertools.chain.from_iterable(
('--patterns-from', pattern_filename) for pattern_filename in pattern_filenames
)
)
def _make_exclude_flags(location_config, exclude_filename=None):
'''
Given a location config dict with various exclude options, and a filename containing any exclude
patterns, return the corresponding Borg flags as a tuple.
'''
exclude_filenames = tuple(location_config.get('exclude_from') or ()) + (
(exclude_filename,) if exclude_filename else ()
)
exclude_from_flags = tuple(
itertools.chain.from_iterable(
('--exclude-from', exclude_filename) for exclude_filename in exclude_filenames
)
)
caches_flag = ('--exclude-caches',) if location_config.get('exclude_caches') else ()
if_present_flags = tuple(
itertools.chain.from_iterable(
('--exclude-if-present', if_present)
for if_present in location_config.get('exclude_if_present', ())
)
)
keep_exclude_tags_flags = (
('--keep-exclude-tags',) if location_config.get('keep_exclude_tags') else ()
)
exclude_nodump_flags = ('--exclude-nodump',) if location_config.get('exclude_nodump') else ()
return (
exclude_from_flags
+ caches_flag
+ if_present_flags
+ keep_exclude_tags_flags
+ exclude_nodump_flags
)
DEFAULT_BORGMATIC_SOURCE_DIRECTORY = '~/.borgmatic'
def borgmatic_source_directories(borgmatic_source_directory):
'''
Return a list of borgmatic-specific source directories used for state like database backups.
'''
if not borgmatic_source_directory:
borgmatic_source_directory = DEFAULT_BORGMATIC_SOURCE_DIRECTORY
return (
[borgmatic_source_directory]
if os.path.exists(os.path.expanduser(borgmatic_source_directory))
else []
)
def create_archive(
dry_run,
repository,
location_config,
storage_config,
local_path='borg',
remote_path=None,
progress=False,
stats=False,
json=False,
files=False,
):
'''
Given vebosity/dry-run flags, a local or remote repository path, a location config dict, and a
storage config dict, create a Borg archive and return Borg's JSON output (if any).
'''
sources = _expand_directories(
location_config['source_directories']
+ borgmatic_source_directories(location_config.get('borgmatic_source_directory'))
)
pattern_file = _write_pattern_file(location_config.get('patterns'))
exclude_file = _write_pattern_file(
_expand_home_directories(location_config.get('exclude_patterns'))
)
checkpoint_interval = storage_config.get('checkpoint_interval', None)
chunker_params = storage_config.get('chunker_params', None)
compression = storage_config.get('compression', None)
remote_rate_limit = storage_config.get('remote_rate_limit', None)
umask = storage_config.get('umask', None)
lock_wait = storage_config.get('lock_wait', None)
files_cache = location_config.get('files_cache')
default_archive_name_format = '{hostname}-{now:%Y-%m-%dT%H:%M:%S.%f}'
archive_name_format = storage_config.get('archive_name_format', default_archive_name_format)
extra_borg_options = storage_config.get('extra_borg_options', {}).get('create', '')
full_command = (
(local_path, 'create')
+ _make_pattern_flags(location_config, pattern_file.name if pattern_file else None)
+ _make_exclude_flags(location_config, exclude_file.name if exclude_file else None)
+ (('--checkpoint-interval', str(checkpoint_interval)) if checkpoint_interval else ())
+ (('--chunker-params', chunker_params) if chunker_params else ())
+ (('--compression', compression) if compression else ())
+ (('--remote-ratelimit', str(remote_rate_limit)) if remote_rate_limit else ())
+ (('--one-file-system',) if location_config.get('one_file_system') else ())
+ (('--numeric-owner',) if location_config.get('numeric_owner') else ())
+ (('--noatime',) if location_config.get('atime') is False else ())
+ (('--noctime',) if location_config.get('ctime') is False else ())
+ (('--nobirthtime',) if location_config.get('birthtime') is False else ())
+ (('--read-special',) if location_config.get('read_special') else ())
+ (('--nobsdflags',) if location_config.get('bsd_flags') is False else ())
+ (('--files-cache', files_cache) if files_cache else ())
+ (('--remote-path', remote_path) if remote_path else ())
+ (('--umask', str(umask)) if umask else ())
+ (('--lock-wait', str(lock_wait)) if lock_wait else ())
+ (('--list', '--filter', 'AME-') if files and not json and not progress else ())
+ (('--info',) if logger.getEffectiveLevel() == logging.INFO and not json else ())
+ (('--stats',) if stats and not json and not dry_run else ())
+ (('--debug', '--show-rc') if logger.isEnabledFor(logging.DEBUG) and not json else ())
+ (('--dry-run',) if dry_run else ())
+ (('--progress',) if progress else ())
+ (('--json',) if json else ())
+ (tuple(extra_borg_options.split(' ')) if extra_borg_options else ())
+ (
'{repository}::{archive_name_format}'.format(
repository=repository, archive_name_format=archive_name_format
),
)
+ sources
)
# The progress output isn't compatible with captured and logged output, as progress messes with
# the terminal directly.
if progress:
execute_command_without_capture(full_command, error_on_warnings=False)
return
if json:
output_log_level = None
elif (stats or files) and logger.getEffectiveLevel() == logging.WARNING:
output_log_level = logging.WARNING
else:
output_log_level = logging.INFO
return execute_command(full_command, output_log_level, error_on_warnings=False)

View file

@ -0,0 +1,31 @@
import os
OPTION_TO_ENVIRONMENT_VARIABLE = {
'borg_base_directory': 'BORG_BASE_DIR',
'borg_config_directory': 'BORG_CONFIG_DIR',
'borg_cache_directory': 'BORG_CACHE_DIR',
'borg_security_directory': 'BORG_SECURITY_DIR',
'borg_keys_directory': 'BORG_KEYS_DIR',
'encryption_passcommand': 'BORG_PASSCOMMAND',
'encryption_passphrase': 'BORG_PASSPHRASE',
'ssh_command': 'BORG_RSH',
}
DEFAULT_BOOL_OPTION_TO_ENVIRONMENT_VARIABLE = {
'relocated_repo_access_is_ok': 'BORG_RELOCATED_REPO_ACCESS_IS_OK',
'unknown_unencrypted_repo_access_is_ok': 'BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK',
}
def initialize(storage_config):
for option_name, environment_variable_name in OPTION_TO_ENVIRONMENT_VARIABLE.items():
value = storage_config.get(option_name)
if value:
os.environ[environment_variable_name] = value
for (
option_name,
environment_variable_name,
) in DEFAULT_BOOL_OPTION_TO_ENVIRONMENT_VARIABLE.items():
value = storage_config.get(option_name, False)
os.environ[environment_variable_name] = 'yes' if value else 'no'

102
borgmatic/borg/extract.py Normal file
View file

@ -0,0 +1,102 @@
import logging
import os
from borgmatic.execute import execute_command, execute_command_without_capture
logger = logging.getLogger(__name__)
def extract_last_archive_dry_run(repository, lock_wait=None, local_path='borg', remote_path=None):
'''
Perform an extraction dry-run of the most recent archive. If there are no archives, skip the
dry-run.
'''
remote_path_flags = ('--remote-path', remote_path) if remote_path else ()
lock_wait_flags = ('--lock-wait', str(lock_wait)) if lock_wait else ()
verbosity_flags = ()
if logger.isEnabledFor(logging.DEBUG):
verbosity_flags = ('--debug', '--show-rc')
elif logger.isEnabledFor(logging.INFO):
verbosity_flags = ('--info',)
full_list_command = (
(local_path, 'list', '--short')
+ remote_path_flags
+ lock_wait_flags
+ verbosity_flags
+ (repository,)
)
list_output = execute_command(full_list_command, output_log_level=None, error_on_warnings=False)
try:
last_archive_name = list_output.strip().splitlines()[-1]
except IndexError:
return
list_flag = ('--list',) if logger.isEnabledFor(logging.DEBUG) else ()
full_extract_command = (
(local_path, 'extract', '--dry-run')
+ remote_path_flags
+ lock_wait_flags
+ verbosity_flags
+ list_flag
+ (
'{repository}::{last_archive_name}'.format(
repository=repository, last_archive_name=last_archive_name
),
)
)
execute_command(full_extract_command, working_directory=None, error_on_warnings=True)
def extract_archive(
dry_run,
repository,
archive,
paths,
location_config,
storage_config,
local_path='borg',
remote_path=None,
destination_path=None,
progress=False,
error_on_warnings=True,
):
'''
Given a dry-run flag, a local or remote repository path, an archive name, zero or more paths to
restore from the archive, location/storage configuration dicts, optional local and remote Borg
paths, and an optional destination path to extract to, extract the archive into the current
directory.
'''
umask = storage_config.get('umask', None)
lock_wait = storage_config.get('lock_wait', None)
full_command = (
(local_path, 'extract')
+ (('--remote-path', remote_path) if remote_path else ())
+ (('--numeric-owner',) if location_config.get('numeric_owner') else ())
+ (('--umask', str(umask)) if umask else ())
+ (('--lock-wait', str(lock_wait)) if lock_wait else ())
+ (('--info',) if logger.getEffectiveLevel() == logging.INFO else ())
+ (('--debug', '--list', '--show-rc') if logger.isEnabledFor(logging.DEBUG) else ())
+ (('--dry-run',) if dry_run else ())
+ (('--progress',) if progress else ())
+ ('::'.join((repository if ':' in repository else os.path.abspath(repository), archive)),)
+ (tuple(paths) if paths else ())
)
# The progress output isn't compatible with captured and logged output, as progress messes with
# the terminal directly.
if progress:
execute_command_without_capture(
full_command, working_directory=destination_path, error_on_warnings=error_on_warnings
)
return
# Error on warnings by default, as Borg only gives a warning if the restore paths don't exist in
# the archive!
execute_command(
full_command, working_directory=destination_path, error_on_warnings=error_on_warnings
)

31
borgmatic/borg/flags.py Normal file
View file

@ -0,0 +1,31 @@
import itertools
def make_flags(name, value):
'''
Given a flag name and its value, return it formatted as Borg-compatible flags.
'''
if not value:
return ()
flag = '--{}'.format(name.replace('_', '-'))
if value is True:
return (flag,)
return (flag, str(value))
def make_flags_from_arguments(arguments, excludes=()):
'''
Given borgmatic command-line arguments as an instance of argparse.Namespace, and optionally a
list of named arguments to exclude, generate and return the corresponding Borg command-line
flags as a tuple.
'''
return tuple(
itertools.chain.from_iterable(
make_flags(name, value=getattr(arguments, name))
for name in sorted(vars(arguments))
if name not in excludes and not name.startswith('_')
)
)

45
borgmatic/borg/info.py Normal file
View file

@ -0,0 +1,45 @@
import logging
from borgmatic.borg.flags import make_flags, make_flags_from_arguments
from borgmatic.execute import execute_command
logger = logging.getLogger(__name__)
def display_archives_info(
repository, storage_config, info_arguments, local_path='borg', remote_path=None
):
'''
Given a local or remote repository path, a storage config dict, and the arguments to the info
action, display summary information for Borg archives in the repository or return JSON summary
information.
'''
lock_wait = storage_config.get('lock_wait', None)
full_command = (
(local_path, 'info')
+ (
('--info',)
if logger.getEffectiveLevel() == logging.INFO and not info_arguments.json
else ()
)
+ (
('--debug', '--show-rc')
if logger.isEnabledFor(logging.DEBUG) and not info_arguments.json
else ()
)
+ make_flags('remote-path', remote_path)
+ make_flags('lock-wait', lock_wait)
+ make_flags_from_arguments(info_arguments, excludes=('repository', 'archive'))
+ (
'::'.join((repository, info_arguments.archive))
if info_arguments.archive
else repository,
)
)
return execute_command(
full_command,
output_log_level=None if info_arguments.json else logging.WARNING,
error_on_warnings=False,
)

58
borgmatic/borg/init.py Normal file
View file

@ -0,0 +1,58 @@
import logging
import subprocess
from borgmatic.execute import execute_command, execute_command_without_capture
logger = logging.getLogger(__name__)
INFO_REPOSITORY_NOT_FOUND_EXIT_CODE = 2
def initialize_repository(
repository,
storage_config,
encryption_mode,
append_only=None,
storage_quota=None,
local_path='borg',
remote_path=None,
):
'''
Given a local or remote repository path, a storage configuration dict, a Borg encryption mode,
whether the repository should be append-only, and the storage quota to use, initialize the
repository. If the repository already exists, then log and skip initialization.
'''
info_command = (
(local_path, 'info')
+ (('--info',) if logger.getEffectiveLevel() == logging.INFO else ())
+ (('--debug',) if logger.isEnabledFor(logging.DEBUG) else ())
+ (('--remote-path', remote_path) if remote_path else ())
+ (repository,)
)
logger.debug(' '.join(info_command))
try:
execute_command(info_command, output_log_level=None)
logger.info('Repository already exists. Skipping initialization.')
return
except subprocess.CalledProcessError as error:
if error.returncode != INFO_REPOSITORY_NOT_FOUND_EXIT_CODE:
raise
extra_borg_options = storage_config.get('extra_borg_options', {}).get('init', '')
init_command = (
(local_path, 'init')
+ (('--encryption', encryption_mode) if encryption_mode else ())
+ (('--append-only',) if append_only else ())
+ (('--storage-quota', storage_quota) if storage_quota else ())
+ (('--info',) if logger.getEffectiveLevel() == logging.INFO else ())
+ (('--debug',) if logger.isEnabledFor(logging.DEBUG) else ())
+ (('--remote-path', remote_path) if remote_path else ())
+ (tuple(extra_borg_options.split(' ')) if extra_borg_options else ())
+ (repository,)
)
# Don't use execute_command() here because it doesn't support interactive prompts.
execute_command_without_capture(init_command, error_on_warnings=False)

53
borgmatic/borg/list.py Normal file
View file

@ -0,0 +1,53 @@
import logging
from borgmatic.borg.flags import make_flags, make_flags_from_arguments
from borgmatic.execute import execute_command
logger = logging.getLogger(__name__)
# A hack to convince Borg to exclude archives ending in ".checkpoint". This assumes that a
# non-checkpoint archive name ends in a digit (e.g. from a timestamp).
BORG_EXCLUDE_CHECKPOINTS_GLOB = '*[0123456789]'
def list_archives(repository, storage_config, list_arguments, local_path='borg', remote_path=None):
'''
Given a local or remote repository path, a storage config dict, and the arguments to the list
action, display the output of listing Borg archives in the repository or return JSON output. Or,
if an archive name is given, listing the files in that archive.
'''
lock_wait = storage_config.get('lock_wait', None)
if list_arguments.successful:
list_arguments.glob_archives = BORG_EXCLUDE_CHECKPOINTS_GLOB
full_command = (
(local_path, 'list')
+ (
('--info',)
if logger.getEffectiveLevel() == logging.INFO and not list_arguments.json
else ()
)
+ (
('--debug', '--show-rc')
if logger.isEnabledFor(logging.DEBUG) and not list_arguments.json
else ()
)
+ make_flags('remote-path', remote_path)
+ make_flags('lock-wait', lock_wait)
+ make_flags_from_arguments(
list_arguments, excludes=('repository', 'archive', 'paths', 'successful')
)
+ (
'::'.join((repository, list_arguments.archive))
if list_arguments.archive
else repository,
)
+ (tuple(list_arguments.paths) if list_arguments.paths else ())
)
return execute_command(
full_command,
output_log_level=None if list_arguments.json else logging.WARNING,
error_on_warnings=False,
)

46
borgmatic/borg/mount.py Normal file
View file

@ -0,0 +1,46 @@
import logging
from borgmatic.execute import execute_command, execute_command_without_capture
logger = logging.getLogger(__name__)
def mount_archive(
repository,
archive,
mount_point,
paths,
foreground,
options,
storage_config,
local_path='borg',
remote_path=None,
):
'''
Given a local or remote repository path, an optional archive name, a filesystem mount point,
zero or more paths to mount from the archive, extra Borg mount options, a storage configuration
dict, and optional local and remote Borg paths, mount the archive onto the mount point.
'''
umask = storage_config.get('umask', None)
lock_wait = storage_config.get('lock_wait', None)
full_command = (
(local_path, 'mount')
+ (('--remote-path', remote_path) if remote_path else ())
+ (('--umask', str(umask)) if umask else ())
+ (('--lock-wait', str(lock_wait)) if lock_wait else ())
+ (('--info',) if logger.getEffectiveLevel() == logging.INFO else ())
+ (('--debug', '--show-rc') if logger.isEnabledFor(logging.DEBUG) else ())
+ (('--foreground',) if foreground else ())
+ (('-o', options) if options else ())
+ (('::'.join((repository, archive)),) if archive else (repository,))
+ (mount_point,)
+ (tuple(paths) if paths else ())
)
# Don't capture the output when foreground mode is used so that ctrl-C can work properly.
if foreground:
execute_command_without_capture(full_command, error_on_warnings=False)
return
execute_command(full_command, error_on_warnings=False)

75
borgmatic/borg/prune.py Normal file
View file

@ -0,0 +1,75 @@
import logging
from borgmatic.execute import execute_command
logger = logging.getLogger(__name__)
def _make_prune_flags(retention_config):
'''
Given a retention config dict mapping from option name to value, tranform it into an iterable of
command-line name-value flag pairs.
For example, given a retention config of:
{'keep_weekly': 4, 'keep_monthly': 6}
This will be returned as an iterable of:
(
('--keep-weekly', '4'),
('--keep-monthly', '6'),
)
'''
config = retention_config.copy()
if 'prefix' not in config:
config['prefix'] = '{hostname}-'
elif not config['prefix']:
config.pop('prefix')
return (
('--' + option_name.replace('_', '-'), str(value)) for option_name, value in config.items()
)
def prune_archives(
dry_run,
repository,
storage_config,
retention_config,
local_path='borg',
remote_path=None,
stats=False,
files=False,
):
'''
Given dry-run flag, a local or remote repository path, a storage config dict, and a
retention config dict, prune Borg archives according to the retention policy specified in that
configuration.
'''
umask = storage_config.get('umask', None)
lock_wait = storage_config.get('lock_wait', None)
extra_borg_options = storage_config.get('extra_borg_options', {}).get('prune', '')
full_command = (
(local_path, 'prune')
+ tuple(element for pair in _make_prune_flags(retention_config) for element in pair)
+ (('--remote-path', remote_path) if remote_path else ())
+ (('--umask', str(umask)) if umask else ())
+ (('--lock-wait', str(lock_wait)) if lock_wait else ())
+ (('--stats',) if stats and not dry_run else ())
+ (('--info',) if logger.getEffectiveLevel() == logging.INFO else ())
+ (('--list',) if files else ())
+ (('--debug', '--show-rc') if logger.isEnabledFor(logging.DEBUG) else ())
+ (('--dry-run',) if dry_run else ())
+ (tuple(extra_borg_options.split(' ')) if extra_borg_options else ())
+ (repository,)
)
if (stats or files) and logger.getEffectiveLevel() == logging.WARNING:
output_log_level = logging.WARNING
else:
output_log_level = logging.INFO
execute_command(full_command, output_log_level=output_log_level, error_on_warnings=False)

20
borgmatic/borg/umount.py Normal file
View file

@ -0,0 +1,20 @@
import logging
from borgmatic.execute import execute_command
logger = logging.getLogger(__name__)
def unmount_archive(mount_point, local_path='borg'):
'''
Given a mounted filesystem mount point, and an optional local Borg paths, umount the filesystem
from the mount point.
'''
full_command = (
(local_path, 'umount')
+ (('--info',) if logger.getEffectiveLevel() == logging.INFO else ())
+ (('--debug', '--show-rc') if logger.isEnabledFor(logging.DEBUG) else ())
+ (mount_point,)
)
execute_command(full_command, error_on_warnings=True)

View file

@ -0,0 +1,559 @@
import collections
from argparse import ArgumentParser
from borgmatic.config import collect
SUBPARSER_ALIASES = {
'init': ['--init', '-I'],
'prune': ['--prune', '-p'],
'create': ['--create', '-C'],
'check': ['--check', '-k'],
'extract': ['--extract', '-x'],
'mount': ['--mount', '-m'],
'umount': ['--umount', '-u'],
'restore': ['--restore', '-r'],
'list': ['--list', '-l'],
'info': ['--info', '-i'],
}
def parse_subparser_arguments(unparsed_arguments, subparsers):
'''
Given a sequence of arguments, and a subparsers object as returned by
argparse.ArgumentParser().add_subparsers(), give each requested action's subparser a shot at
parsing all arguments. This allows common arguments like "--repository" to be shared across
multiple subparsers.
Return the result as a dict mapping from subparser name to a parsed namespace of arguments.
'''
arguments = collections.OrderedDict()
remaining_arguments = list(unparsed_arguments)
alias_to_subparser_name = {
alias: subparser_name
for subparser_name, aliases in SUBPARSER_ALIASES.items()
for alias in aliases
}
for subparser_name, subparser in subparsers.choices.items():
if subparser_name not in remaining_arguments:
continue
canonical_name = alias_to_subparser_name.get(subparser_name, subparser_name)
# If a parsed value happens to be the same as the name of a subparser, remove it from the
# remaining arguments. This prevents, for instance, "check --only extract" from triggering
# the "extract" subparser.
parsed, unused_remaining = subparser.parse_known_args(unparsed_arguments)
for value in vars(parsed).values():
if isinstance(value, str):
if value in subparsers.choices:
remaining_arguments.remove(value)
elif isinstance(value, list):
for item in value:
if item in subparsers.choices:
remaining_arguments.remove(item)
arguments[canonical_name] = parsed
# If no actions are explicitly requested, assume defaults: prune, create, and check.
if not arguments and '--help' not in unparsed_arguments and '-h' not in unparsed_arguments:
for subparser_name in ('prune', 'create', 'check'):
subparser = subparsers.choices[subparser_name]
parsed, unused_remaining = subparser.parse_known_args(unparsed_arguments)
arguments[subparser_name] = parsed
return arguments
def parse_global_arguments(unparsed_arguments, top_level_parser, subparsers):
'''
Given a sequence of arguments, a top-level parser (containing subparsers), and a subparsers
object as returned by argparse.ArgumentParser().add_subparsers(), parse and return any global
arguments as a parsed argparse.Namespace instance.
'''
# Ask each subparser, one by one, to greedily consume arguments. Any arguments that remain
# are global arguments.
remaining_arguments = list(unparsed_arguments)
present_subparser_names = set()
for subparser_name, subparser in subparsers.choices.items():
if subparser_name not in remaining_arguments:
continue
present_subparser_names.add(subparser_name)
unused_parsed, remaining_arguments = subparser.parse_known_args(remaining_arguments)
# If no actions are explicitly requested, assume defaults: prune, create, and check.
if (
not present_subparser_names
and '--help' not in unparsed_arguments
and '-h' not in unparsed_arguments
):
for subparser_name in ('prune', 'create', 'check'):
subparser = subparsers.choices[subparser_name]
unused_parsed, remaining_arguments = subparser.parse_known_args(remaining_arguments)
# Remove the subparser names themselves.
for subparser_name in present_subparser_names:
if subparser_name in remaining_arguments:
remaining_arguments.remove(subparser_name)
return top_level_parser.parse_args(remaining_arguments)
def parse_arguments(*unparsed_arguments):
'''
Given command-line arguments with which this script was invoked, parse the arguments and return
them as a dict mapping from subparser name (or "global") to an argparse.Namespace instance.
'''
config_paths = collect.get_default_config_paths(expand_home=True)
unexpanded_config_paths = collect.get_default_config_paths(expand_home=False)
global_parser = ArgumentParser(add_help=False)
global_group = global_parser.add_argument_group('global arguments')
global_group.add_argument(
'-c',
'--config',
nargs='*',
dest='config_paths',
default=config_paths,
help='Configuration filenames or directories, defaults to: {}'.format(
' '.join(unexpanded_config_paths)
),
)
global_group.add_argument(
'--excludes',
dest='excludes_filename',
help='Deprecated in favor of exclude_patterns within configuration',
)
global_group.add_argument(
'-n',
'--dry-run',
dest='dry_run',
action='store_true',
help='Go through the motions, but do not actually write to any repositories',
)
global_group.add_argument(
'-nc', '--no-color', dest='no_color', action='store_true', help='Disable colored output'
)
global_group.add_argument(
'-v',
'--verbosity',
type=int,
choices=range(-1, 3),
default=0,
help='Display verbose progress to the console (from only errors to very verbose: -1, 0, 1, or 2)',
)
global_group.add_argument(
'--syslog-verbosity',
type=int,
choices=range(-1, 3),
default=0,
help='Log verbose progress to syslog (from only errors to very verbose: -1, 0, 1, or 2). Ignored when console is interactive or --log-file is given',
)
global_group.add_argument(
'--log-file-verbosity',
type=int,
choices=range(-1, 3),
default=0,
help='Log verbose progress to log file (from only errors to very verbose: -1, 0, 1, or 2). Only used when --log-file is given',
)
global_group.add_argument(
'--monitoring-verbosity',
type=int,
choices=range(-1, 3),
default=1,
help='Log verbose progress to monitoring integrations that support logging (from only errors to very verbose: -1, 0, 1, or 2)',
)
global_group.add_argument(
'--log-file',
type=str,
default=None,
help='Write log messages to this file instead of syslog',
)
global_group.add_argument(
'--override',
metavar='SECTION.OPTION=VALUE',
nargs='+',
dest='overrides',
help='One or more configuration file options to override with specified values',
)
global_group.add_argument(
'--version',
dest='version',
default=False,
action='store_true',
help='Display installed version number of borgmatic and exit',
)
top_level_parser = ArgumentParser(
description='''
Simple, configuration-driven backup software for servers and workstations. If none of
the action options are given, then borgmatic defaults to: prune, create, and check
archives.
''',
parents=[global_parser],
)
subparsers = top_level_parser.add_subparsers(
title='actions',
metavar='',
help='Specify zero or more actions. Defaults to prune, create, and check. Use --help with action for details:',
)
init_parser = subparsers.add_parser(
'init',
aliases=SUBPARSER_ALIASES['init'],
help='Initialize an empty Borg repository',
description='Initialize an empty Borg repository',
add_help=False,
)
init_group = init_parser.add_argument_group('init arguments')
init_group.add_argument(
'-e',
'--encryption',
dest='encryption_mode',
help='Borg repository encryption mode',
required=True,
)
init_group.add_argument(
'--append-only',
dest='append_only',
action='store_true',
help='Create an append-only repository',
)
init_group.add_argument(
'--storage-quota',
dest='storage_quota',
help='Create a repository with a fixed storage quota',
)
init_group.add_argument('-h', '--help', action='help', help='Show this help message and exit')
prune_parser = subparsers.add_parser(
'prune',
aliases=SUBPARSER_ALIASES['prune'],
help='Prune archives according to the retention policy',
description='Prune archives according to the retention policy',
add_help=False,
)
prune_group = prune_parser.add_argument_group('prune arguments')
prune_group.add_argument(
'--stats',
dest='stats',
default=False,
action='store_true',
help='Display statistics of archive',
)
prune_group.add_argument(
'--files', dest='files', default=False, action='store_true', help='Show per-file details'
)
prune_group.add_argument('-h', '--help', action='help', help='Show this help message and exit')
create_parser = subparsers.add_parser(
'create',
aliases=SUBPARSER_ALIASES['create'],
help='Create archives (actually perform backups)',
description='Create archives (actually perform backups)',
add_help=False,
)
create_group = create_parser.add_argument_group('create arguments')
create_group.add_argument(
'--progress',
dest='progress',
default=False,
action='store_true',
help='Display progress for each file as it is backed up',
)
create_group.add_argument(
'--stats',
dest='stats',
default=False,
action='store_true',
help='Display statistics of archive',
)
create_group.add_argument(
'--files', dest='files', default=False, action='store_true', help='Show per-file details'
)
create_group.add_argument(
'--json', dest='json', default=False, action='store_true', help='Output results as JSON'
)
create_group.add_argument('-h', '--help', action='help', help='Show this help message and exit')
check_parser = subparsers.add_parser(
'check',
aliases=SUBPARSER_ALIASES['check'],
help='Check archives for consistency',
description='Check archives for consistency',
add_help=False,
)
check_group = check_parser.add_argument_group('check arguments')
check_group.add_argument(
'--progress',
dest='progress',
default=False,
action='store_true',
help='Display progress for each file as it is checked',
)
check_group.add_argument(
'--repair',
dest='repair',
default=False,
action='store_true',
help='Attempt to repair any inconsistencies found (experimental and only for interactive use)',
)
check_group.add_argument(
'--only',
metavar='CHECK',
choices=('repository', 'archives', 'data', 'extract'),
dest='only',
action='append',
help='Run a particular consistency check (repository, archives, data, or extract) instead of configured checks; can specify flag multiple times',
)
check_group.add_argument('-h', '--help', action='help', help='Show this help message and exit')
extract_parser = subparsers.add_parser(
'extract',
aliases=SUBPARSER_ALIASES['extract'],
help='Extract files from a named archive to the current directory',
description='Extract a named archive to the current directory',
add_help=False,
)
extract_group = extract_parser.add_argument_group('extract arguments')
extract_group.add_argument(
'--repository',
help='Path of repository to extract, defaults to the configured repository if there is only one',
)
extract_group.add_argument('--archive', help='Name of archive to extract', required=True)
extract_group.add_argument(
'--path',
'--restore-path',
metavar='PATH',
nargs='+',
dest='paths',
help='Paths to extract from archive, defaults to the entire archive',
)
extract_group.add_argument(
'--destination',
metavar='PATH',
dest='destination',
help='Directory to extract files into, defaults to the current directory',
)
extract_group.add_argument(
'--progress',
dest='progress',
default=False,
action='store_true',
help='Display progress for each file as it is extracted',
)
extract_group.add_argument(
'-h', '--help', action='help', help='Show this help message and exit'
)
mount_parser = subparsers.add_parser(
'mount',
aliases=SUBPARSER_ALIASES['mount'],
help='Mount files from a named archive as a FUSE filesystem',
description='Mount a named archive as a FUSE filesystem',
add_help=False,
)
mount_group = mount_parser.add_argument_group('mount arguments')
mount_group.add_argument(
'--repository',
help='Path of repository to use, defaults to the configured repository if there is only one',
)
mount_group.add_argument('--archive', help='Name of archive to mount')
mount_group.add_argument(
'--mount-point',
metavar='PATH',
dest='mount_point',
help='Path where filesystem is to be mounted',
required=True,
)
mount_group.add_argument(
'--path',
metavar='PATH',
nargs='+',
dest='paths',
help='Paths to mount from archive, defaults to the entire archive',
)
mount_group.add_argument(
'--foreground',
dest='foreground',
default=False,
action='store_true',
help='Stay in foreground until ctrl-C is pressed',
)
mount_group.add_argument('--options', dest='options', help='Extra Borg mount options')
mount_group.add_argument('-h', '--help', action='help', help='Show this help message and exit')
umount_parser = subparsers.add_parser(
'umount',
aliases=SUBPARSER_ALIASES['umount'],
help='Unmount a FUSE filesystem that was mounted with "borgmatic mount"',
description='Unmount a mounted FUSE filesystem',
add_help=False,
)
umount_group = umount_parser.add_argument_group('umount arguments')
umount_group.add_argument(
'--mount-point',
metavar='PATH',
dest='mount_point',
help='Path of filesystem to unmount',
required=True,
)
umount_group.add_argument('-h', '--help', action='help', help='Show this help message and exit')
restore_parser = subparsers.add_parser(
'restore',
aliases=SUBPARSER_ALIASES['restore'],
help='Restore database dumps from a named archive',
description='Restore database dumps from a named archive. (To extract files instead, use "borgmatic extract".)',
add_help=False,
)
restore_group = restore_parser.add_argument_group('restore arguments')
restore_group.add_argument(
'--repository',
help='Path of repository to restore from, defaults to the configured repository if there is only one',
)
restore_group.add_argument('--archive', help='Name of archive to restore from', required=True)
restore_group.add_argument(
'--database',
metavar='NAME',
nargs='+',
dest='databases',
help='Names of databases to restore from archive, defaults to all databases. Note that any databases to restore must be defined in borgmatic\'s configuration',
)
restore_group.add_argument(
'--progress',
dest='progress',
default=False,
action='store_true',
help='Display progress for each database dump file as it is extracted from archive',
)
restore_group.add_argument(
'-h', '--help', action='help', help='Show this help message and exit'
)
list_parser = subparsers.add_parser(
'list',
aliases=SUBPARSER_ALIASES['list'],
help='List archives',
description='List archives or the contents of an archive',
add_help=False,
)
list_group = list_parser.add_argument_group('list arguments')
list_group.add_argument(
'--repository',
help='Path of repository to list, defaults to the configured repository if there is only one',
)
list_group.add_argument('--archive', help='Name of archive to list')
list_group.add_argument(
'--path',
metavar='PATH',
nargs='+',
dest='paths',
help='Paths to list from archive, defaults to the entire archive',
)
list_group.add_argument(
'--short', default=False, action='store_true', help='Output only archive or path names'
)
list_group.add_argument('--format', help='Format for file listing')
list_group.add_argument(
'--json', default=False, action='store_true', help='Output results as JSON'
)
list_group.add_argument(
'-P', '--prefix', help='Only list archive names starting with this prefix'
)
list_group.add_argument(
'-a', '--glob-archives', metavar='GLOB', help='Only list archive names matching this glob'
)
list_group.add_argument(
'--successful',
default=False,
action='store_true',
help='Only list archive names of successful (non-checkpoint) backups',
)
list_group.add_argument(
'--sort-by', metavar='KEYS', help='Comma-separated list of sorting keys'
)
list_group.add_argument(
'--first', metavar='N', help='List first N archives after other filters are applied'
)
list_group.add_argument(
'--last', metavar='N', help='List last N archives after other filters are applied'
)
list_group.add_argument(
'-e', '--exclude', metavar='PATTERN', help='Exclude paths matching the pattern'
)
list_group.add_argument(
'--exclude-from', metavar='FILENAME', help='Exclude paths from exclude file, one per line'
)
list_group.add_argument('--pattern', help='Include or exclude paths matching a pattern')
list_group.add_argument(
'--patterns-from',
metavar='FILENAME',
help='Include or exclude paths matching patterns from pattern file, one per line',
)
list_group.add_argument('-h', '--help', action='help', help='Show this help message and exit')
info_parser = subparsers.add_parser(
'info',
aliases=SUBPARSER_ALIASES['info'],
help='Display summary information on archives',
description='Display summary information on archives',
add_help=False,
)
info_group = info_parser.add_argument_group('info arguments')
info_group.add_argument(
'--repository',
help='Path of repository to show info for, defaults to the configured repository if there is only one',
)
info_group.add_argument('--archive', help='Name of archive to show info for')
info_group.add_argument(
'--json', dest='json', default=False, action='store_true', help='Output results as JSON'
)
info_group.add_argument(
'-P', '--prefix', help='Only show info for archive names starting with this prefix'
)
info_group.add_argument(
'-a',
'--glob-archives',
metavar='GLOB',
help='Only show info for archive names matching this glob',
)
info_group.add_argument(
'--sort-by', metavar='KEYS', help='Comma-separated list of sorting keys'
)
info_group.add_argument(
'--first',
metavar='N',
help='Show info for first N archives after other filters are applied',
)
info_group.add_argument(
'--last', metavar='N', help='Show info for first N archives after other filters are applied'
)
info_group.add_argument('-h', '--help', action='help', help='Show this help message and exit')
arguments = parse_subparser_arguments(unparsed_arguments, subparsers)
arguments['global'] = parse_global_arguments(unparsed_arguments, top_level_parser, subparsers)
if arguments['global'].excludes_filename:
raise ValueError(
'The --excludes option has been replaced with exclude_patterns in configuration'
)
if 'init' in arguments and arguments['global'].dry_run:
raise ValueError('The init action cannot be used with the --dry-run option')
if 'list' in arguments and arguments['list'].glob_archives and arguments['list'].successful:
raise ValueError('The --glob-archives and --successful options cannot be used together')
if (
'list' in arguments
and 'info' in arguments
and arguments['list'].json
and arguments['info'].json
):
raise ValueError('With the --json option, list and info actions cannot be used together')
return arguments

View file

@ -1,73 +1,677 @@
from __future__ import print_function
from argparse import ArgumentParser
import collections
import json
import logging
import os
from subprocess import CalledProcessError
import sys
from subprocess import CalledProcessError
from borgmatic import borg
from borgmatic.config import collect, convert, validate
import colorama
import pkg_resources
from borgmatic.borg import check as borg_check
from borgmatic.borg import create as borg_create
from borgmatic.borg import environment as borg_environment
from borgmatic.borg import extract as borg_extract
from borgmatic.borg import info as borg_info
from borgmatic.borg import init as borg_init
from borgmatic.borg import list as borg_list
from borgmatic.borg import mount as borg_mount
from borgmatic.borg import prune as borg_prune
from borgmatic.borg import umount as borg_umount
from borgmatic.commands.arguments import parse_arguments
from borgmatic.config import checks, collect, convert, validate
from borgmatic.hooks import command, dispatch, dump, monitor
from borgmatic.logger import configure_logging, should_do_markup
from borgmatic.signals import configure_signals
from borgmatic.verbosity import verbosity_to_log_level
logger = logging.getLogger(__name__)
LEGACY_CONFIG_PATH = '/etc/borgmatic/config'
DEFAULT_CONFIG_PATHS = ['/etc/borgmatic/config.yaml', '/etc/borgmatic.d']
DEFAULT_EXCLUDES_PATH = '/etc/borgmatic/excludes'
def parse_arguments(*arguments):
def run_configuration(config_filename, config, arguments):
'''
Given command-line arguments with which this script was invoked, parse the arguments and return
them as an ArgumentParser instance.
'''
parser = ArgumentParser()
parser.add_argument(
'-c', '--config',
nargs='+',
dest='config_paths',
default=DEFAULT_CONFIG_PATHS,
help='Configuration filenames or directories, defaults to: {}'.format(' '.join(DEFAULT_CONFIG_PATHS)),
)
parser.add_argument(
'--excludes',
dest='excludes_filename',
help='Excludes filename, deprecated in favor of exclude_patterns within configuration',
)
parser.add_argument(
'-v', '--verbosity',
type=int,
help='Display verbose progress (1 for some, 2 for lots)',
)
Given a config filename, the corresponding parsed config dict, and command-line arguments as a
dict from subparser name to a namespace of parsed arguments, execute its defined pruning,
backups, consistency checks, and/or other actions.
return parser.parse_args(arguments)
Yield a combination of:
* JSON output strings from successfully executing any actions that produce JSON
* logging.LogRecord instances containing errors from any actions or backup hooks that fail
'''
(location, storage, retention, consistency, hooks) = (