Compare commits

...

854 Commits
1.9.1 ... main

Author SHA1 Message Date
772c4c1b83 In the documentation for the MariaDB/MySQL database hooks, clarify how to set custom command-line flags for database commands (#1193).
All checks were successful
build / test (push) Successful in 16m21s
build / docs (push) Successful in 2m36s
2025-12-03 13:52:30 -08:00
a77de447d4 Document potential interactions between systemd security settings and the ZFS, LVM, and Btrfs hooks (#1192, #1163).
All checks were successful
build / test (push) Successful in 9m26s
build / docs (push) Successful in 2m2s
2025-12-02 17:25:36 -08:00
50a062611e Fix a regression in the ZFS, LVM, and Btrfs hooks in which snapshotted paths ignored global excludes (#1195).
All checks were successful
build / test (push) Successful in 12m21s
build / docs (push) Successful in 2m30s
2025-12-02 15:40:42 -08:00
42bf6c6f8e Fix typo in database restore documentation example (#1197).
Some checks failed
build / test (push) Failing after 11m30s
build / docs (push) Has been cancelled
2025-12-02 12:13:06 -08:00
e95d652abb Reword NEWS entry for clarity (#1192). 2025-12-02 10:58:29 -08:00
2a97ac0174 Fix for over-aggressive deduplication of source directories that contain the borgmatic runtime directory (#1192).
Some checks failed
build / test (push) Failing after 10m38s
build / docs (push) Has been cancelled
2025-12-01 17:14:31 -08:00
5029ab1ffd Update the sample systemd timer with a shorter random delay when catching up on a missed run.
Some checks failed
build / test (push) Failing after 14m44s
build / docs (push) Has been cancelled
2025-11-29 22:25:43 -08:00
7dc902f5db Fix for an incorrect diff command shown when running the "generate config" action with a source configuration file (#1194).
All checks were successful
build / test (push) Successful in 10m4s
build / docs (push) Successful in 2m29s
2025-11-28 19:53:46 -08:00
8134bdec7f Fix release script brokenness.
All checks were successful
build / test (push) Successful in 8m47s
build / docs (push) Successful in 2m4s
2025-11-26 15:40:16 -08:00
5e7d14e419 Bump version for release. 2025-11-26 15:31:04 -08:00
8f2ae5e9a1 Fix a regression in the Btrfs hook in which subvolume snapshots didn't get cleaned up until the start of the next borgmatic run (#1186).
All checks were successful
build / test (push) Successful in 8m58s
build / docs (push) Successful in 1m51s
2025-11-26 13:59:23 -08:00
928bb3fb8c Fix an unreleased regression in the KeePassXC hook in which it raised when it was used without explicit "keepassxc:" configuration (#1181).
All checks were successful
build / test (push) Successful in 8m57s
build / docs (push) Successful in 2m25s
2025-11-25 22:48:05 -08:00
31623f9c91 Add borgmatic release artifacts to each release on the releases page. 2025-11-25 20:41:25 -08:00
47ce12e4b6 Explicitly note Borg v1 caching doesn't work with Btrfs (#1187).
All checks were successful
build / test (push) Successful in 16m30s
build / docs (push) Successful in 2m19s
Reviewed-on: #1187
2025-11-21 06:55:39 +00:00
e72ace5294 remove lingering )
Some checks failed
build / test (pull_request) Has been cancelled
build / docs (pull_request) Has been cancelled
2025-11-21 05:17:44 +01:00
72c3e524be docs: btrfs: note that btrfs hook doesn't cache even with runtime dir 2025-11-21 05:17:44 +01:00
399576e7c9 Add data hooks working directory fix to NEWS (#1127).
All checks were successful
build / test (push) Successful in 8m47s
build / docs (push) Successful in 2m1s
2025-11-19 10:42:11 -08:00
a7356f2360 Fix for the database dumps hooks not respecting the "working_directory" option (#1127).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
Reviewed-on: #1129
2025-11-19 18:40:50 +00:00
1f8c39fb17 Add fish shell completion fix to NEWS (#1184).
All checks were successful
build / test (push) Successful in 8m41s
build / docs (push) Successful in 2m9s
2025-11-18 22:29:19 -08:00
66e567f78c Hard-code default configuration paths in command-line flag help (#1184).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
Reviewed-on: #1184
2025-11-19 06:25:56 +00:00
ea45a37db8 Omit "-c" when describing default value for -c
All checks were successful
build / test (pull_request) Successful in 8m46s
build / docs (pull_request) Has been skipped
2025-11-18 09:55:54 +01:00
a229fc7f92 Give the borgmatic logo a white circle background so it actually shows up properly in dark mode.
All checks were successful
build / test (push) Successful in 13m36s
build / docs (push) Successful in 2m12s
2025-11-17 22:20:27 -08:00
573405bb88 Hard-code default config paths in help strings
All checks were successful
build / test (pull_request) Successful in 14m8s
build / docs (pull_request) Has been skipped
This fixes a bug with fish completions. Before this commit,
`borgmatic --fish-completion` would generate a fish completion script
with an expanded XDG_CONFIG_HOME (if this variable is set).

This is problematic for package maintainers if the variable is set
during the creation of a package.

Moreover, it is problematic if the user has set this variable because
the fish completion scripts checks its own consistency with `borg
--fish-completion` during startup to detect version mismatches. If the
user has a packaged fish completion file with "~/.config/$HOME" in it,
this won't match the output of `borg --fish-completion` because the
latter contains the expansion of $XDG_CONFIG_HOME. As a result, the
script will incorrectly conclude that it is outdated.
2025-11-17 15:42:30 +01:00
94dc4c497a Note in the KeePassXC documentation which features are in which versions of borgmatic (#1181).
All checks were successful
build / test (push) Successful in 8m47s
build / docs (push) Successful in 2m14s
2025-11-14 21:27:07 -08:00
0e9193c46b Add an "ask_for_password" option to the KeePassXC credential hook for disabling KeePassXC's password prompt (#1181).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-11-14 21:20:21 -08:00
151becbaea Move shell autocompletion documentation out to reference docs.
All checks were successful
build / test (push) Successful in 8m51s
build / docs (push) Successful in 2m16s
2025-11-11 10:21:01 -08:00
ce7f0226be Mock get_working_directory() calls in data source hook tests
All checks were successful
build / test (pull_request) Successful in 9m26s
build / docs (pull_request) Has been skipped
2025-11-11 15:36:51 +01:00
51ef9c7708 Fix database dumps hooks not respecting working_directory
All checks were successful
build / test (pull_request) Successful in 9m8s
build / docs (pull_request) Has been skipped
2025-11-11 14:22:34 +01:00
14a8055e71 In the SQLite database hook, run SQLite such that it exits upon encountering an error instead of, you know, not doing that.
All checks were successful
build / test (push) Successful in 8m54s
build / docs (push) Successful in 2m20s
2025-11-07 23:22:44 -08:00
fcfc7ee726 Emojis everywhere!
All checks were successful
build / test (push) Successful in 13m55s
build / docs (push) Successful in 2m14s
2025-11-04 23:04:16 -08:00
859c338d06 Improve documentation search results for individual configuration options. 2025-11-04 22:34:15 -08:00
d1f2d8a061 Add documentation on repositories, including SSH, Rclone, S3, and B2.
All checks were successful
build / test (push) Successful in 8m45s
build / docs (push) Successful in 2m7s
2025-11-03 13:56:15 -08:00
bddc82951e Bump version for release. 2025-11-02 19:41:38 -08:00
3d15c51039 Fix the "--repository" flag not applying to command hooks (#1176).
All checks were successful
build / test (push) Successful in 13m50s
build / docs (push) Successful in 2m12s
2025-11-02 19:32:08 -08:00
f9206c15e7 Fix documentation typos.
All checks were successful
build / test (push) Successful in 9m3s
build / docs (push) Successful in 2m3s
2025-11-02 09:36:08 -08:00
0da4b64838 Drop support for Python 3.9, which has been end-of-lifed. (Also hopefully fix the build.)
All checks were successful
build / test (push) Successful in 9m14s
build / docs (push) Successful in 2m15s
2025-11-01 23:16:13 -07:00
85f06a900a Revert "Attempt to fix broken build (rpds module not found error)."
This reverts commit bae8f983e0.
2025-11-01 21:48:59 -07:00
bae8f983e0 Attempt to fix broken build (rpds module not found error).
Some checks failed
build / test (push) Failing after 3m4s
build / docs (push) Has been skipped
2025-11-01 21:39:10 -07:00
89c0cd0af6 Add documentation on patterns and excludes.
Some checks failed
build / test (push) Failing after 3m14s
build / docs (push) Has been skipped
2025-11-01 21:18:22 -07:00
292d9cb2c7 Add documentation on patterns and excludes. 2025-11-01 21:17:35 -07:00
181030c5d1 Add an "environment" option to the Sentry monitoring hook (#1172).
Some checks failed
build / test (push) Failing after 7m20s
build / docs (push) Has been skipped
2025-10-30 15:39:49 -07:00
2600598359 Add environment option to Sentry monitoring hook (#1172).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
Reviewed-on: #1172
Reviewed-by: Dan Helfman <witten@torsion.org>
2025-10-30 22:37:53 +00:00
Tom Janssen
9e649af2a3 fix typo
All checks were successful
build / test (pull_request) Successful in 8m39s
build / docs (pull_request) Has been skipped
2025-10-29 10:13:45 +01:00
Tom Janssen
370bc7e7f0 fix schema length
Some checks failed
build / test (pull_request) Failing after 3m13s
build / docs (pull_request) Has been skipped
2025-10-29 09:55:03 +01:00
Tom Janssen
7cca1358fb incorporate feedback
Some checks failed
build / test (pull_request) Failing after 3m2s
build / docs (pull_request) Has been skipped
2025-10-29 09:50:55 +01:00
67406b60b3 Cleanup "other ways to install" section and boost "Docker" there so it shows up in search.
All checks were successful
build / test (push) Successful in 8m50s
build / docs (push) Successful in 2m14s
2025-10-28 23:01:51 -07:00
72fde728a4 Fix typo (#1173).
All checks were successful
build / test (push) Successful in 15m28s
build / docs (push) Successful in 2m9s
Reviewed-on: #1173
2025-10-28 18:16:36 +00:00
d4433eeec1 Fix typo
Some checks failed
build / test (pull_request) Has been cancelled
build / docs (pull_request) Has been cancelled
2025-10-28 16:43:40 +00:00
Tom Janssen
d0b5244888 add environment option
Some checks failed
build / test (pull_request) Failing after 2m51s
build / docs (pull_request) Has been skipped
2025-10-28 16:52:50 +01:00
1ed207c6b1 Document borgmatic's limitations around parallelism—both its own and Borg's (#957).
All checks were successful
build / test (push) Successful in 7m41s
build / docs (push) Successful in 1m40s
2025-10-27 15:58:12 -07:00
5ef257ebb6 Attempt to clarify recursion root patterns in the schema comments.
All checks were successful
build / test (push) Successful in 8m22s
build / docs (push) Successful in 2m5s
2025-10-27 14:34:20 -07:00
eb2b0b35c1 Fix for an inconsistent log level for Borg's last output line before exiting (#1170).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-10-27 14:20:27 -07:00
0f7ebcb4b7 Fix for a regression in the ZFS, LVM, and Btrfs hooks in which partial excludes of snapshot paths were ignored (#1169).
All checks were successful
build / test (push) Successful in 15m17s
build / docs (push) Successful in 2m9s
2025-10-26 14:12:52 -07:00
51d2ce7963 Add a "rename" option to "extra_borg_options" to support passing arbitrary flags to "borg rename".
All checks were successful
build / test (push) Successful in 12m17s
build / docs (push) Successful in 2m15s
2025-10-24 23:02:46 -07:00
0c4222037d Fix for the "list", "info", and "delete" options in "extra_borg_options" being ignored when "--archive" is omitted with Borg 1.x (#1168).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-10-24 22:57:23 -07:00
25e8aad517 Add systemd multiple service directories fix to NEWS (#1165).
All checks were successful
build / test (push) Successful in 8m21s
build / docs (push) Successful in 2m3s
2025-10-24 09:36:52 -07:00
11ffd76cc6 Support multiple configured systemd service directories (RuntimeDirectory, StateDirectory) (#1165).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-10-24 16:31:59 +00:00
Simon Pilkington
68864395b5 Support multiple configured systemd service directories (RuntimeDirectory, StateDirectory)
All checks were successful
build / test (pull_request) Successful in 8m27s
build / docs (pull_request) Has been skipped
2025-10-24 08:20:59 +02:00
0777d40218 Bump version for release.
All checks were successful
build / test (push) Successful in 8m18s
build / docs (push) Successful in 1m52s
2025-10-23 21:47:56 -07:00
f680869d31 Expand the "borg_extra_options" option to support every Borg sub-command that borgmatic uses (#427).
All checks were successful
build / test (push) Successful in 15m12s
build / docs (push) Successful in 2m14s
2025-10-23 21:13:16 -07:00
9b66004819 Fix images in README.md to use absolute URLs (#1167).
All checks were successful
build / test (push) Successful in 7m41s
build / docs (push) Successful in 2m37s
Reviewed-on: #1167
2025-10-23 23:08:25 +00:00
aa43906b28 icons fix
All checks were successful
build / test (pull_request) Successful in 8m7s
build / docs (pull_request) Has been skipped
2025-10-23 21:49:37 +00:00
134bf1ebdd Add a "borg_key_file" option for setting the Borg repository key file path (#1166).
All checks were successful
build / test (push) Successful in 8m9s
build / docs (push) Successful in 2m2s
2025-10-23 10:36:00 -07:00
dcd567f4f0 Fix for a runtime directory error when the configured patterns contain a global exclude (#1150).
All checks were successful
build / test (push) Successful in 15m25s
build / docs (push) Successful in 2m10s
2025-10-22 11:10:42 -07:00
44d63cac07 Mention that repo-create is also known as init in command-line help. 2025-10-22 10:28:20 -07:00
4017897b1a For the MariaDB and MySQL database hooks, add a "skip_names" option to ignore particular databases when dumping "all" (#973).
All checks were successful
build / test (push) Successful in 14m49s
build / docs (push) Successful in 1m59s
2025-10-16 14:48:42 -07:00
d808d7424f Document the fact that missing "source_directories" are warnings, not errors (#1076).
All checks were successful
build / test (push) Successful in 8m17s
build / docs (push) Successful in 1m56s
2025-10-15 16:15:36 -07:00
a327496c99 Document that the "exclude_nodump" option is Borg 1.x only (#1111).
All checks were successful
build / test (push) Successful in 8m1s
build / docs (push) Successful in 1m57s
2025-10-15 16:00:55 -07:00
46bb49f40b Add "Related documentation" on action reference documentation.
All checks were successful
build / test (push) Successful in 8m9s
build / docs (push) Successful in 1m53s
2025-10-15 15:48:00 -07:00
9cd607af9d Clarify schema documentation about borg_security_directory and borg_keys_directory defaults (#1162).
All checks were successful
build / test (push) Successful in 8m6s
build / docs (push) Successful in 2m9s
2025-10-15 10:42:18 -07:00
b80d126424 Fix for a runtime directory error when the "create" action is used with the "--log-json" flag (#1150).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-10-15 10:35:16 -07:00
dea1c0179b Clarify what command hooks are in the reference documentation.
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-10-15 10:22:02 -07:00
2deb27c985 Fix page <title> on documentation home.
All checks were successful
build / test (push) Successful in 7m46s
build / docs (push) Successful in 2m6s
2025-10-14 16:20:34 -07:00
6f9bf687d9 Combining a few sections (#942).
All checks were successful
build / test (push) Successful in 14m37s
build / docs (push) Successful in 1m56s
2025-10-14 15:57:04 -07:00
7e7b6e012c Remove incorrect bash code styling (#942). 2025-10-14 15:41:52 -07:00
3ee1203435 Tweaks to search indexing and results. 2025-10-14 13:05:50 -07:00
2db5525f72 Link to action reference documentation instead of "--help". 2025-10-14 12:42:35 -07:00
e3c369a579 Individual actions command-line reference documentation (#942). 2025-10-14 12:29:39 -07:00
9787c9fda0 Replace various how-to links with replacement reference links (#942). 2025-10-13 18:38:25 -07:00
c7053f8202 Additional documentation reference refactoring (#942). 2025-10-13 18:14:39 -07:00
044b1722e3 Factor out command hook reference documentation. 2025-10-13 16:21:42 -07:00
b5f0dc7f1f Factor out snapshot-related reference documentation. 2025-10-13 13:51:09 -07:00
efc4316a45 Split out example configuration into different pages of reference documentation (#942). 2025-10-12 21:28:52 -07:00
5e6ceea7e2 Merge branch 'main' into reference-docs 2025-10-12 15:59:09 -07:00
a1acf1e0dd Add documentation search.
All checks were successful
build / test (push) Successful in 7m44s
build / docs (push) Successful in 1m28s
2025-10-12 15:37:28 -07:00
8ea9a7cb55 Change the URL of the local documentation development server to be more like the production URL.
All checks were successful
build / test (push) Successful in 7m41s
build / docs (push) Successful in 1m19s
2025-10-12 15:16:25 -07:00
f45258b6b7 Revert "Add documentation search."
All checks were successful
build / test (push) Successful in 8m4s
build / docs (push) Successful in 1m25s
This reverts commit 6d7dc378a9.
2025-10-12 11:18:41 -07:00
85177b78a6 Merge branch 'main' into reference-docs 2025-10-12 10:59:19 -07:00
6d7dc378a9 Add documentation search.
All checks were successful
build / test (push) Successful in 8m12s
build / docs (push) Successful in 1m58s
2025-10-12 10:55:48 -07:00
2a69598e02 Partial work on factoring out references docs from how-to guides (#942). 2025-10-10 22:21:15 -07:00
4c7435378c Add to NEWS: Fix a traceback (TypeError) in the "check" action with Python 3.14 (#1161).
All checks were successful
build / test (push) Successful in 7m49s
build / docs (push) Successful in 1m27s
2025-10-09 14:34:57 -07:00
d15bed5d4f Fix Python 3.14 incompatibility (#1161).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
Reviewed-on: #1161
2025-10-09 21:33:25 +00:00
2b34c62e6f Remove non-existent argument to Path
All checks were successful
build / test (pull_request) Successful in 12m39s
build / docs (pull_request) Has been skipped
'mode' is not a valid argument to (Pure)Path. Passing keyword arguments is
deprecated since Python 3.12. I don't suspect it ever did anything. It is
removed in Python 3.14.

Without this patch, borgmatic crashes on Python 3.14.

This code was first introduced in e76bfa555f.
2025-10-09 22:09:40 +02:00
2a5e202daf Bump version for release.
All checks were successful
build / test (push) Successful in 8m9s
build / docs (push) Successful in 1m57s
2025-10-07 09:55:41 -07:00
7f2e3e0054 Fix to snapshot both parent and child volumes/filesystems instead of just the parent (#1156).
All checks were successful
build / test (push) Successful in 13m32s
build / docs (push) Successful in 2m15s
Reviewed-on: #1158
2025-10-07 16:14:31 +00:00
173ba00caa Fix to snapshot both parent and child volumes/filesystems instead of just the parent (#1156).
All checks were successful
build / test (pull_request) Successful in 13m14s
build / docs (pull_request) Has been skipped
2025-10-04 14:35:42 -07:00
498d662b3d More accurately collect Btrfs subvolumes to snapshot. As part of this, the Btrfs hook no longer uses "findmnt" (#1105).
All checks were successful
build / test (push) Successful in 8m18s
build / docs (push) Successful in 2m44s
Reviewed-on: #1154
2025-10-03 03:27:37 +00:00
75405bed89 Cache Btrfs get property commands (#1105).
All checks were successful
build / test (pull_request) Successful in 7m38s
build / docs (pull_request) Has been skipped
2025-10-01 22:50:33 -07:00
c989b73103 Various cleanup (#1105).
All checks were successful
build / test (pull_request) Successful in 13m3s
build / docs (pull_request) Has been skipped
2025-10-01 22:28:54 -07:00
35feeb4615 Fix restore and get end-to-end tests passing (#1105).
All checks were successful
build / test (pull_request) Successful in 8m0s
build / docs (pull_request) Has been skipped
2025-09-30 21:56:04 -07:00
5dca281439 Simplify logic around checking for read-only Btrfs subvolumes (#1105).
Some checks failed
build / test (pull_request) Failing after 7m0s
build / docs (pull_request) Has been skipped
2025-09-30 12:19:57 -07:00
13fbee858a Fix a traceback (TypeError) regression in the "spot" check when the "local_path" option isn't set.
All checks were successful
build / test (push) Successful in 7m50s
build / docs (push) Successful in 1m27s
2025-09-30 09:51:47 -07:00
e2cdcba4e7 Get tests passing (#1105).
Some checks failed
build / test (pull_request) Failing after 7m24s
build / docs (pull_request) Has been skipped
2025-09-29 23:06:49 -07:00
595c639d25 Merge branch 'main' into btrfs-remove-findmnt
Some checks failed
build / test (pull_request) Failing after 3m0s
build / docs (pull_request) Has been skipped
2025-09-28 17:55:40 -07:00
b89f057be0 Fix a regression in the Loki monitoring hook in which log messages weren't sending (#1152).
All checks were successful
build / test (push) Successful in 8m26s
build / docs (push) Successful in 25s
2025-09-28 16:44:59 -07:00
98ddb3e535 Fix several existing tests (#1105). 2025-09-28 15:45:21 -07:00
339186b579 More accurately collect Btrfs subvolumes to snapshot by using the "btrfs" command rather than "findmnt" (#1105).
Some checks failed
build / test (pull_request) Failing after 2m30s
build / docs (pull_request) Has been skipped
2025-09-27 19:43:43 -07:00
1192451718 Fix snapshotting in the ZFS, Btrfs, and LVM hooks to play nicely with the Borg 1.4+ "slashdot" hack within source directory paths (#1151).
All checks were successful
build / test (push) Successful in 7m39s
build / docs (push) Successful in 1m14s
2025-09-25 10:24:12 -07:00
06e24dfbc1 Fix incomplete documentation description.
All checks were successful
build / test (push) Successful in 12m35s
build / docs (push) Successful in 1m34s
2025-09-24 23:14:24 -07:00
4f0162d5f2 Add loading of systemd credentials even when running borgmatic outside of a systemd service (#1123).
All checks were successful
build / test (push) Successful in 12m34s
build / docs (push) Successful in 1m28s
2025-09-24 10:34:20 -07:00
ed58bc2943 Attempt to fix CI build broken due to missing schema file (#1149).
All checks were successful
build / test (push) Successful in 7m23s
build / docs (push) Successful in 1m18s
2025-09-22 21:16:03 -07:00
cab6c3ee9b Include automated tests in the source dist tarball uploaded to PyPI (#1149).
Some checks failed
build / test (push) Failing after 1m48s
build / docs (push) Has been skipped
2025-09-22 14:26:00 -07:00
65c17c91b3 Add support for Python 3.14 (#1149).
All checks were successful
build / test (push) Successful in 7m12s
build / docs (push) Successful in 1m0s
2025-09-22 10:34:46 -07:00
546c0bf83b Add documentation note about borgmatic source packages (#1149).
All checks were successful
build / test (push) Successful in 12m24s
build / docs (push) Successful in 1m21s
2025-09-22 09:56:22 -07:00
6d48ff95d2 Bump version for release.
All checks were successful
build / test (push) Successful in 7m15s
build / docs (push) Successful in 1m0s
2025-09-19 17:32:13 -07:00
22b77a4262 Merge branch 'fix-borg-2-latest-archive'
All checks were successful
build / test (push) Successful in 7m14s
build / docs (push) Successful in 1m1s
2025-09-19 14:32:44 -07:00
f15e8282ab Fix a broken "create" action and "--archive latest" flag when multiple archives share the same name with Borg 2 (#1146). 2025-09-19 14:30:33 -07:00
a0e2a98735 Treat configuration file permissions issues as errors instead of warnings.
All checks were successful
build / test (push) Successful in 12m27s
build / docs (push) Successful in 1m21s
2025-09-19 10:31:31 -07:00
4ced5150f4 Merge branch 'main' into fix-borg-2-latest-archive 2025-09-18 19:25:49 -07:00
a388b17271 No longer defaulting Dump(hostname=...) to "localhost" (#1116).
All checks were successful
build / test (push) Successful in 7m24s
build / docs (push) Successful in 1m0s
2025-09-18 19:22:45 -07:00
4feec081a8 Clarify "container:" documentation about borgmatic running inside a container (#1116).
All checks were successful
build / test (push) Successful in 7m16s
build / docs (push) Successful in 1m7s
2025-09-18 16:13:24 -07:00
f3d42d081e Merge branch 'main' into fix-borg-2-latest-archive 2025-09-17 23:00:27 -07:00
da65063216 Make test code style more consistent with the rest of the codebase (#1116).
All checks were successful
build / test (push) Successful in 14m42s
build / docs (push) Successful in 1m34s
2025-09-17 21:55:36 -07:00
8eea005cbc Spelling out the new container database features in NEWS a little more and making the documentation on it more verbose as well (#1116).
All checks were successful
build / test (push) Successful in 7m44s
build / docs (push) Successful in 1m11s
2025-09-17 16:24:45 -07:00
a276aaa31f Add dumping of database containers via their container name and for labels in database configuration (#1116).
All checks were successful
build / test (push) Successful in 7m48s
build / docs (push) Successful in 1m30s
Reviewed-on: #1121
Reviewed-by: Dan Helfman <witten@torsion.org>
2025-09-17 23:02:57 +00:00
abad73d605 final round of fixes.
All checks were successful
build / test (pull_request) Successful in 7m43s
build / docs (pull_request) Has been skipped
2025-09-17 20:17:31 +02:00
4de879d86e address some review comments
All checks were successful
build / test (pull_request) Successful in 13m19s
build / docs (pull_request) Has been skipped
2025-09-17 08:46:02 +02:00
0e90087dc4 Finalize container support
All checks were successful
build / test (pull_request) Successful in 7m12s
build / docs (pull_request) Has been skipped
2025-09-15 22:16:49 +02:00
56a3f6d854 address more review comments 2025-09-15 20:02:31 +02:00
16c8098b06 address some review comments 2025-09-15 20:02:31 +02:00
d44fb24670 get --container arg working 2025-09-15 20:02:31 +02:00
8639b73f80 fix label handling and improve unittests 2025-09-15 20:02:31 +02:00
eef264dcc5 test improvements 2025-09-15 20:02:31 +02:00
b306cac5c1 raise ValueError if json decode fails when getting the container ip 2025-09-15 20:02:31 +02:00
0d190016d3 rename utils.py to config.py 2025-09-15 20:02:31 +02:00
97815bb498 fix dump matching logic with labels. 2025-09-15 20:02:31 +02:00
3811a9f57b more test fixes and first stab at end-to-end tests 2025-09-15 20:02:31 +02:00
a2c9bb12e5 test fixes 2025-09-15 20:02:31 +02:00
04cc58a5c7 fixes and more tests. 2025-09-15 20:02:31 +02:00
db1c6f548f add support for original-label and fix the tests from the previous changes. 2025-09-15 20:02:31 +02:00
bcacbc0d69 restore_container schema 2025-09-15 20:02:31 +02:00
e058df6b7e cleanup database option resolving. 2025-09-15 20:02:31 +02:00
133a11c647 add support for container names/id when dumping databases. 2025-09-15 20:02:31 +02:00
c084f10fe2 Add support for a database backup label instead of host:port (#1116) 2025-09-15 20:02:31 +02:00
97cd3f20df Fix "--consider-checkpoints" being passed to Borg 2, which doesn't have that flag (#1146).
revert revert 0d198c7072

revert Fix "--consider-checkpoints" being passed to Borg 2, which doesn't have that flag (#1046).
2025-09-15 05:05:58 +00:00
fd028d42d5 revert 0d198c7072
revert Fix "--consider-checkpoints" being passed to Borg 2, which doesn't have that flag (#1046).
2025-09-15 05:05:07 +00:00
0d198c7072 Fix "--consider-checkpoints" being passed to Borg 2, which doesn't have that flag (#1046). 2025-09-14 22:02:17 -07:00
000d633590 Read and write data source dump metadata files within an archive (#1136).
All checks were successful
build / test (push) Successful in 11m38s
build / docs (push) Successful in 1m20s
Reviewed-on: #1136
2025-09-14 22:38:19 +00:00
084fbd2f16 PR "feedback": Adding a key to the dumps metadata JSON for clarity and expandability (#1136).
All checks were successful
build / test (pull_request) Successful in 11m48s
build / docs (pull_request) Has been skipped
2025-09-14 15:30:07 -07:00
3310d7c036 Adding missing template metadata.
All checks were successful
build / test (push) Successful in 6m43s
build / docs (push) Successful in 1m8s
2025-09-13 10:23:27 -07:00
fbfb7fc1f5 Use separate pull requests templates for each of GitHub and Gitea.
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-09-13 10:16:39 -07:00
30b8aeb764 Merge branch 'main' into data-source-dump-metadata
All checks were successful
build / test (pull_request) Successful in 7m2s
build / docs (pull_request) Has been skipped
2025-09-12 22:41:40 -07:00
2cae42a163 Always error and exit when the borgmatic runtime directory overlaps with the configured excludes (#1122).
All checks were successful
build / test (push) Successful in 6m47s
build / docs (push) Successful in 1m19s
Reviewed-on: #1144
2025-09-13 05:40:04 +00:00
c4c40af812 Account for the case where "store_config_files: false" and the runtime directory never gets added to patterns to begin with (#1122).
All checks were successful
build / test (pull_request) Successful in 6m51s
build / docs (pull_request) Has been skipped
2025-09-12 22:17:44 -07:00
5028fe9ff4 Bring doc string up to date and rename function for clarity. (#1122).
Some checks failed
build / test (pull_request) Failing after 6m25s
build / docs (pull_request) Has been skipped
2025-09-12 14:03:52 -07:00
f60007545b Update automated tests (#1122).
Some checks failed
build / test (pull_request) Failing after 6m27s
build / docs (pull_request) Has been skipped
2025-09-12 12:54:38 -07:00
947dc77a50 Always error and exit when the borgmatic runtime directory overlaps with the configured excludes (#1122).
Some checks failed
build / test (pull_request) Failing after 7m31s
build / docs (pull_request) Has been skipped
2025-09-12 11:21:11 -07:00
21ab371e9f Clarify documentation about ZFS, Btrfs, and LVM snapshotting when a separate filesystem is mounted in the source directory.
All checks were successful
build / test (push) Successful in 6m33s
build / docs (push) Successful in 1m4s
2025-09-09 16:05:34 -07:00
b340ede9ac Merge branch 'main' into data-source-dump-metadata
All checks were successful
build / test (pull_request) Successful in 6m44s
build / docs (pull_request) Has been skipped
2025-09-09 09:22:54 -07:00
82e962eae2 Include bootstrapped configuration files in spot check (#1143).
All checks were successful
build / test (push) Successful in 6m32s
build / docs (push) Successful in 1m20s
Reviewed-on: #1143
2025-09-09 16:19:20 +00:00
85b198feb2 Get automated tests passing (#1143).
All checks were successful
build / test (pull_request) Successful in 6m29s
build / docs (pull_request) Has been skipped
2025-09-08 23:16:27 -07:00
e3f4b79e76 Fix the "spot" check to include borgmatic configuration files that were backed up to support the "bootstrap" action (#1133).
Some checks failed
build / test (pull_request) Failing after 1m54s
build / docs (pull_request) Has been skipped
2025-09-08 12:16:59 -07:00
627898cc23 Add tests for new code.
All checks were successful
build / test (pull_request) Successful in 6m45s
build / docs (pull_request) Has been skipped
2025-09-05 16:02:23 -07:00
46381175ef Code formatting. 2025-09-05 14:33:40 -07:00
d7205694db Get existing restore tests passing (and add one test for the dumps metadata present case).
Some checks failed
build / test (pull_request) Failing after 1m54s
build / docs (pull_request) Has been skipped
2025-09-05 14:21:53 -07:00
9bbce71673 Fix tests for database hooks.
Some checks failed
build / test (pull_request) Failing after 1m49s
build / docs (pull_request) Has been skipped
2025-09-04 10:36:00 -07:00
6a1f2a4c86 Add SQLite dump metadata.
Some checks failed
build / test (pull_request) Failing after 1m53s
build / docs (pull_request) Has been skipped
2025-09-03 20:20:11 -07:00
5a45a0cbc0 Add NEWS entry for dumps metadata.
Some checks failed
build / test (pull_request) Failing after 1m53s
build / docs (pull_request) Has been skipped
2025-09-03 19:35:13 -07:00
03e3e0f5dd Add MongoDB dumps metadata.
Some checks failed
build / test (pull_request) Failing after 1m52s
build / docs (pull_request) Has been skipped
2025-09-03 19:31:54 -07:00
d40f728410 Add MySQL dump metadata.
Some checks failed
build / test (pull_request) Failing after 1m53s
build / docs (pull_request) Has been skipped
2025-09-03 19:21:47 -07:00
049132377c Add MariaDB dumps metadata.
Some checks failed
build / test (pull_request) Failing after 1m52s
build / docs (pull_request) Has been skipped
2025-09-03 18:54:49 -07:00
fca647b3ae Fix broken fallback to dump path introspection when dumps.json is missing. Also add additional logging.
Some checks failed
build / test (pull_request) Failing after 1m49s
build / docs (pull_request) Has been skipped
2025-09-03 16:52:26 -07:00
e02c4be493 Add error handling docstrings.
Some checks failed
build / test (pull_request) Failing after 1m50s
build / docs (pull_request) Has been skipped
2025-09-03 14:52:53 -07:00
b45c9628e7 Error handling.
Some checks failed
build / test (pull_request) Failing after 1m50s
build / docs (pull_request) Has been skipped
2025-09-03 14:49:09 -07:00
09d702ee88 Merge branch 'main' into data-source-dump-metadata
Some checks failed
build / test (pull_request) Failing after 1m51s
build / docs (pull_request) Has been skipped
2025-09-03 10:21:18 -07:00
eb971694bb PR feedback.
Some checks failed
build / test (pull_request) Failing after 7m2s
build / docs (pull_request) Has been skipped
2025-09-03 10:20:53 -07:00
f1a008ee18 Rephrase NEWS entry for clarity (#1139). 2025-09-02 09:47:53 -07:00
563cb8441e When making HTTP requests in monitoring hooks, set "borgmatic" as the user agent (#1139).
All checks were successful
build / test (push) Successful in 6m42s
build / docs (push) Successful in 1m19s
2025-09-01 16:51:33 -07:00
030abfa13c Read and write data source dump metadata files within an archive.
Some checks failed
build / test (pull_request) Failing after 6m50s
build / docs (pull_request) Has been skipped
2025-08-27 15:53:42 -07:00
36d6619099 Create LVM snapshots as read-write to avoid an error when snapshotting ext4 filesystems with orphaned files that need recovery (#1126).
All checks were successful
build / test (push) Successful in 11m53s
build / docs (push) Successful in 1m40s
2025-08-11 10:01:13 -07:00
5f468c4261 Use borg compact --dry-run in Borg 1.2.9+.
All checks were successful
build / test (push) Successful in 7m1s
build / docs (push) Successful in 1m21s
2025-08-04 21:41:19 -07:00
88ecb96b98 Document systemd configuration changes for the ZFS filesystem hook (#1114).
All checks were successful
build / test (push) Successful in 12m44s
build / docs (push) Successful in 1m47s
2025-07-18 21:32:49 -07:00
099d30f044 Only run Python 3.9 and 3.13 in end-to-end tests since 3.11 has issues in Alpine.
All checks were successful
build / test (push) Successful in 8m16s
build / docs (push) Successful in 1m42s
2025-07-18 17:25:31 -07:00
5439e616f8 Hopefully fix end-to-end tests broken due to uv changes.
Some checks failed
build / test (push) Failing after 5m29s
build / docs (push) Has been skipped
2025-07-18 17:09:48 -07:00
2d8b455e44 Switched from pipx to uv for installing development tools, and added tox-uv for speeding up test environment creation.
Some checks failed
build / test (push) Failing after 1m12s
build / docs (push) Has been skipped
2025-07-18 15:16:45 -07:00
9a80fec91b When running tests, use Ruff for faster and more comprehensive code linting and formatting.
All checks were successful
build / test (push) Successful in 12m35s
build / docs (push) Successful in 1m55s
2025-07-17 23:24:58 -07:00
ea72f1c367 Fix a bug in which Borg hangs during database backup when different filesystems are in use (#1118).
All checks were successful
build / test (push) Successful in 8m11s
build / docs (push) Successful in 1m46s
2025-07-15 13:05:03 -07:00
34f677dba1 Add a flake8 plugin that enforces a blank line after if/for/while/with/try blocks.
All checks were successful
build / test (push) Successful in 8m1s
build / docs (push) Successful in 1m56s
2025-06-30 22:04:05 -07:00
3eed3191e8 Add a flake8 extension to tests to detect commented out code.
All checks were successful
build / test (push) Successful in 12m37s
build / docs (push) Successful in 1m51s
2025-06-30 21:42:38 -07:00
1a33e5fa1e Bump version for release.
All checks were successful
build / test (push) Successful in 8m28s
build / docs (push) Successful in 1m31s
2025-06-30 18:04:06 -07:00
c2d2ce18a2 Clarify documentation about interacion between "--repository" flag and command hooks (#1112).
Some checks failed
build / test (push) Successful in 8m10s
build / docs (push) Has been cancelled
2025-06-30 18:02:02 -07:00
1b62be0949 Fix a bug in which quoted "extra_borg_options" values containing spaces are passed to Borg incorrectly. Add a "--comment" flag to the "create" action for creating an archive with a comment (#1108).
All checks were successful
build / test (push) Successful in 8m21s
build / docs (push) Successful in 1m45s
2025-06-30 16:16:53 -07:00
392fbcd19f Add missing Bandit configuration file.
All checks were successful
build / test (push) Successful in 7m47s
build / docs (push) Successful in 1m42s
2025-06-27 23:00:35 -07:00
0d54fda27a Use the Bandit security analysis tool when running tests.
Some checks failed
build / test (push) Failing after 7m34s
build / docs (push) Has been skipped
SECURITY: Add timeouts to all monitoring hooks to prevent hangs on network requests.
SECURITY: For the "spot" check, use a more secure source of randomness when selecting paths to check.
2025-06-27 22:30:00 -07:00
1e6fba6e99 Ignore Btrfs subvolumes whose read-only status can't be determined (#1048).
All checks were successful
build / test (push) Successful in 7m31s
build / docs (push) Successful in 1m22s
2025-06-27 19:41:14 -07:00
a1b14d58af Support Btrfs subvolume paths in "source_directories" even when the subvolume is mounted elsewhere (#1043).
All checks were successful
build / test (push) Successful in 7m44s
build / docs (push) Successful in 1m39s
Reviewed-on: #1113
2025-06-28 02:23:19 +00:00
6058efbaac Clarify NEWS entry (#1043).
All checks were successful
build / test (pull_request) Successful in 7m22s
build / docs (pull_request) Has been skipped
2025-06-27 19:21:10 -07:00
05b34d4b56 Fix unit/integration tests and add coverage (#1043).
All checks were successful
build / test (pull_request) Successful in 8m4s
build / docs (pull_request) Has been skipped
2025-06-27 12:37:03 -07:00
5f6173ab24 Clarify Btrfs subvolume path vs. mount point documentation (#1043).
Some checks failed
build / test (pull_request) Failing after 2m11s
build / docs (pull_request) Has been skipped
2025-06-25 22:43:14 -07:00
6f92ae2462 Add documentation for "raw" Btrfs subvolume paths (#1043).
Some checks failed
build / test (pull_request) Failing after 3m12s
build / docs (pull_request) Has been skipped
2025-06-25 22:34:14 -07:00
df383be8a2 Merge branch 'main' into btrfs-raw-subvolumes
Some checks failed
build / test (pull_request) Failing after 2m9s
build / docs (pull_request) Has been skipped
2025-06-25 15:37:56 -07:00
11da378304 Update GitHub pull request template, because it also shows up on Gitea apparently.
All checks were successful
build / test (push) Successful in 7m33s
build / docs (push) Successful in 1m20s
2025-06-25 15:37:20 -07:00
65ce7309f1 Initial WIP-level work on supporting snapshots of "raw" Btrfs subvolumes. 2025-06-25 15:29:03 -07:00
0cae581014 Add fix for failing database hook creating archive to NEWS (#1032).
All checks were successful
build / test (push) Successful in 7m46s
build / docs (push) Successful in 1m44s
2025-06-25 09:27:38 -07:00
123f8958f6 Create a checkpoint archive first with streaming processes (#1032).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
This ensures that if a streaming process fails, we do not create a
real (i.e. non-checkpoint archive), (fixes #1032).

Without this, there is a race condition where borg already creates an
archive before borgmatic can kill it.

Tested locally (with `pipx install --editable .`):

```sh
borgmatic --config config.yaml create
borgmatic --config config.yaml create --json
```

## Hold up!

Thanks for your contribution. Unfortunately, we don't use GitHub pull requests to manage code contributions to this repository (and GitHub doesn't have any way to disable pull requests entirely). Instead, please see:

https://torsion.org/borgmatic/#contributing

... which provides full instructions on how to submit pull requests. You can even use your GitHub account to login.

Reviewed-on: #1102
Reviewed-by: Dan Helfman <witten@torsion.org>
Co-authored-by: Tobias Schlatter <schlatter.tobias@gmail.com>
Co-committed-by: Tobias Schlatter <schlatter.tobias@gmail.com>
2025-06-25 16:24:07 +00:00
5ac086fa73 Revert "Temporarily remove recent contributors due to broken Gitea API: https://github.com/go-gitea/gitea/issues/34682"
All checks were successful
build / test (push) Successful in 12m17s
build / docs (push) Successful in 2m2s
This reverts commit 3902dd873d.
2025-06-19 17:05:06 -07:00
3902dd873d Temporarily remove recent contributors due to broken Gitea API: https://github.com/go-gitea/gitea/issues/34682
All checks were successful
build / test (push) Successful in 7m59s
build / docs (push) Successful in 1m53s
2025-06-10 12:34:41 -07:00
652a63223a Rename constant (#1083).
Some checks failed
build / test (push) Successful in 10m5s
build / docs (push) Failing after 1m6s
2025-06-10 11:29:12 -07:00
01dc7e7841 Upgrade requests in test requirements to "fix" theoretical security vulnerability.
Some checks failed
build / test (push) Failing after 2m34s
build / docs (push) Has been skipped
2025-06-10 11:21:34 -07:00
249183250b Merge branch 'main' of ssh://projects.torsion.org:3022/borgmatic-collective/borgmatic
Some checks failed
build / test (push) Failing after 2m36s
build / docs (push) Has been skipped
2025-06-10 11:18:59 -07:00
080c8dfd93 Add NEWS entry (#1083). 2025-06-10 11:18:49 -07:00
9ec287cd2e Add Borg 2.0.0b15 features (#1083).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
Reviewed-on: #1088
Reviewed-by: Dan Helfman <witten@torsion.org>
2025-06-10 18:15:02 +00:00
Nish_
df64794115 test yes/YES for env vars
All checks were successful
build / test (pull_request) Successful in 7m45s
build / docs (pull_request) Has been skipped
Signed-off-by: Nish_ <120EE0980@nitrkl.ac.in>
2025-06-08 15:07:03 +05:30
Nish_
fede523dae enhance passphrase handling
All checks were successful
build / test (pull_request) Successful in 12m48s
build / docs (pull_request) Has been skipped
Signed-off-by: Nish_ <120EE0980@nitrkl.ac.in>
2025-06-08 09:31:13 +00:00
Nish_
35bfb393c7 remove make-parent-dirs option
Signed-off-by: Nish_ <120EE0980@nitrkl.ac.in>
2025-06-08 09:31:13 +00:00
782f534636 Clarify documentation on command hooks order of execution (#1099).
All checks were successful
build / test (push) Successful in 12m28s
build / docs (push) Successful in 1m56s
2025-06-02 12:01:33 -07:00
8e8d9e6267 Fix a bug in which "borg --version" failing isn't considered a "fail" state in a command hook (#1100).
All checks were successful
build / test (push) Successful in 11m58s
build / docs (push) Successful in 1m47s
2025-05-27 11:52:36 -07:00
b208c5352a Bump version for release.
All checks were successful
build / test (push) Successful in 7m5s
build / docs (push) Successful in 1m17s
2025-05-14 21:16:33 -07:00
79cf3495ee Fix for the "spot" check erroring when a checksum command errors (#1089).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-05-14 21:13:48 -07:00
15607d2ccd During the "spot" check, truncate log messages containing many file paths.
All checks were successful
build / test (push) Successful in 7m18s
build / docs (push) Successful in 1m44s
2025-05-14 20:24:28 -07:00
ae1fbf7940 Fix incorrect option names in config normalize warning message (#1096).
All checks were successful
build / test (push) Successful in 7m25s
build / docs (push) Successful in 1m25s
Reviewed-on: #1096
2025-05-15 02:32:23 +00:00
a1eb612a08 Fix incorrect option names in config normalize warning message.
All checks were successful
build / test (pull_request) Successful in 7m24s
build / docs (pull_request) Has been skipped
2025-05-15 08:02:37 +08:00
7f3e9c5347 Fix for the "spot" check's "xxh64sum_command" option erroring on commands containing spaces (#1095).
All checks were successful
build / test (push) Successful in 7m17s
build / docs (push) Successful in 1m42s
2025-05-14 14:09:19 -07:00
d83c444d9e More documentation fixes/clarifications for customizing warnings and errors (#1094).
All checks were successful
build / test (push) Successful in 12m7s
build / docs (push) Successful in 1m41s
2025-05-13 12:34:21 -07:00
2221be4549 Update Borg 2.0.0 documentation URLs. 2025-05-13 11:21:09 -07:00
9973c5fb7d Fix indentation in exit code documentation (#1094).
All checks were successful
build / test (push) Successful in 7m42s
build / docs (push) Successful in 1m22s
2025-05-12 14:17:32 -07:00
ec7101ccf3 Fix incorrect documentation about customizing Borg exit codes (#1094).
All checks were successful
build / test (push) Successful in 7m39s
build / docs (push) Successful in 1m31s
2025-05-12 12:17:38 -07:00
5966022b67 Fix for the LVM hook erroring when the "--dry-run" flag is used (#1093).
All checks were successful
build / test (push) Successful in 12m24s
build / docs (push) Successful in 1m36s
2025-05-12 11:50:55 -07:00
b68211cc0c Fix for the "config generate" action generating invalid configuration when upgrading deprecated command hooks (#1091).
All checks were successful
build / test (push) Successful in 12m7s
build / docs (push) Successful in 1m38s
2025-05-08 12:59:53 -07:00
1f773124f6 Add support for Borg 2's "s3:" and "b2:" repository URLs, so you can backup to S3 or B2 cloud storage services even without using Rclone.
All checks were successful
build / test (push) Successful in 11m42s
build / docs (push) Successful in 1m39s
2025-05-04 09:59:07 -07:00
3ff9a33468 Fix for the "spot" check breaking when the "--progress" flag is used (#1086).
All checks were successful
build / test (push) Successful in 16m8s
build / docs (push) Successful in 2m4s
2025-05-01 18:46:34 -07:00
02644c3bb6 Add LVM file descriptor warning fix to NEWS (#1068).
All checks were successful
build / test (push) Successful in 11m7s
build / docs (push) Successful in 2m23s
2025-04-30 08:29:55 -07:00
0e42ba21ba Explicitly close file descriptors when invoking LVM commands (#1068).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
Reviewed-on: #1074
2025-04-30 15:23:42 +00:00
d876e8636a Close fds for btrfs.
All checks were successful
build / test (pull_request) Successful in 15m38s
build / docs (pull_request) Has been skipped
2025-04-30 07:42:55 +00:00
3127da54b5 Close fds for zfs. 2025-04-30 07:42:55 +00:00
3d44e95c1a Explicitly close filedescriptors when invoking lvm commands. Closes #1068 2025-04-30 07:42:55 +00:00
cdbfe1c1e9 Bump version for release.
All checks were successful
build / test (push) Successful in 7m17s
build / docs (push) Successful in 1m29s
2025-04-29 15:20:50 -07:00
4c8ba5c5ab Fix some outdated config (section headers) in documentation (#1033).
All checks were successful
build / test (push) Successful in 11m25s
build / docs (push) Successful in 1m37s
2025-04-29 14:21:47 -07:00
091e9fa9ee Add a "password_transport" option to the MariaDB and MySQL database hooks for customizing how borgmatic transmits passwords to the database client (#1033).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-04-29 14:19:15 -07:00
0f4e93c9c8 GitHub Mistake Pull Closer was a mistake to use, because it doesn't work...
All checks were successful
build / test (push) Successful in 7m21s
build / docs (push) Successful in 1m45s
2025-04-26 17:39:36 -07:00
43bd42fb31 Tweak GitHub pull request template.
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-04-26 17:36:01 -07:00
bb54068152 Back out accidentally added partial feature.
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-04-26 17:32:31 -07:00
6c5eecac20 Add a GitHub pull request template to discourage PRs there.
Some checks failed
build / test (push) Failing after 2m16s
build / docs (push) Has been skipped
2025-04-26 17:27:22 -07:00
3f92b0b6ed The borgmatic project no longer accepts pull requests on GitHub. Use https://torsion.org/borgmatic/#contributing instead.
Some checks failed
build / test (push) Failing after 2m4s
build / docs (push) Has been skipped
2025-04-26 17:19:13 -07:00
30d2108399 Move from Fosstodon to FLOSS.social.
Some checks failed
build / test (push) Failing after 7m22s
build / docs (push) Has been skipped
2025-04-26 16:49:41 -07:00
d36e5f24ce Add Borg 1.4.1 features to NEWS (#1078).
All checks were successful
build / test (push) Successful in 7m22s
build / docs (push) Successful in 1m42s
2025-04-25 12:06:49 -07:00
76c50555d3 Add Borg 1.4.1 features (#1078).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
Reviewed-on: #1081
2025-04-25 19:02:27 +00:00
Vandal
1cde65b4eb fix dry run not working borg 1.4.1+
All checks were successful
build / test (pull_request) Successful in 7m16s
build / docs (pull_request) Has been skipped
2025-04-26 00:21:48 +05:30
Vandal
4e05539825 add review changes
All checks were successful
build / test (pull_request) Successful in 7m17s
build / docs (pull_request) Has been skipped
2025-04-25 22:56:07 +05:30
Vandal
d17aa3e7cc review changes
All checks were successful
build / test (pull_request) Successful in 7m5s
build / docs (pull_request) Has been skipped
2025-04-25 22:28:43 +05:30
3eff794f44 Fix a regression in which the default monitoring verbosity is 0 instead of 1 (#1085).
All checks were successful
build / test (push) Successful in 7m20s
build / docs (push) Successful in 1m33s
2025-04-24 23:27:09 -07:00
Vandal
1ac51e34bc pass dry run flag
All checks were successful
build / test (pull_request) Successful in 11m46s
build / docs (pull_request) Has been skipped
2025-04-25 11:40:25 +05:30
345b4cfb09 Add support for new Borg placeholder "{unixtime}".
All checks were successful
build / test (push) Successful in 11m36s
build / docs (push) Successful in 1m21s
2025-04-23 10:07:33 -07:00
Vandal
27a2bbc231 add --dry-run feature check
All checks were successful
build / test (pull_request) Successful in 6m35s
build / docs (pull_request) Has been skipped
2025-04-23 08:11:43 +05:30
Vandal
dbf1d0946a make review changes 2025-04-23 07:38:52 +05:30
5465b60d37 Bump version for release.
All checks were successful
build / test (push) Successful in 6m41s
build / docs (push) Successful in 1m3s
2025-04-22 14:11:36 -07:00
e2b5972c09 Fix end-to-end tests (#1072).
All checks were successful
build / test (push) Successful in 6m43s
build / docs (push) Successful in 1m30s
2025-04-21 23:11:38 -07:00
9bf316e28f If the exact same "everything" command hook is present in multiple configuration files, borgmatic only runs it once (#1080).
Some checks failed
build / test (push) Failing after 6m40s
build / docs (push) Has been skipped
2025-04-21 19:19:36 -07:00
3847f31939 Fix path rewriting for non-root patterns in the ZFS, Btrfs, and LVM hooks (#1072).
Some checks failed
build / test (push) Failing after 11m12s
build / docs (push) Has been skipped
2025-04-21 10:07:46 -07:00
a815d2dfdb Clarify the documentation about when an "after: error" command hook runs and how it differs from other hooks (#1073).
All checks were successful
build / test (push) Successful in 6m44s
build / docs (push) Successful in 1m2s
2025-04-20 16:00:14 -07:00
6ebfd60e21 Fix an incorrect warning about Borg placeholders being unsupported in a command hook (#1075).
All checks were successful
build / test (push) Successful in 10m53s
build / docs (push) Successful in 1m20s
2025-04-20 15:06:21 -07:00
Vandal
2078527539 add BORG_USE_CHUNKS_ARCHIVE
All checks were successful
build / test (pull_request) Successful in 6m37s
build / docs (pull_request) Has been skipped
2025-04-20 09:58:09 +05:30
Vandal
620bf52e01 add prune test 2025-04-20 09:31:51 +05:30
Vandal
fdb08b6c56 add 13weekly and 3monthly quarterly
Some checks failed
build / test (pull_request) Has been cancelled
build / docs (pull_request) Has been cancelled
2025-04-19 10:14:41 +05:30
c3c37dee13 Only build and deploy docs on pushes to main, not for pull requests.
All checks were successful
build / test (push) Successful in 8m8s
build / docs (push) Successful in 1m22s
2025-04-17 20:51:40 -07:00
13d49fda9b Bump version for release.
All checks were successful
build / test (push) Successful in 6m45s
build / docs (push) Successful in 1m19s
2025-04-14 22:53:23 -07:00
b01b8498aa Fix an error in the LVM hook when removing a snapshot directory (#1071).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-04-14 22:48:36 -07:00
a573e606a5 Add a "states" option to command hooks, so you can optionally skip an "after" hook if borgmatic encounters an error (#1066).
All checks were successful
build / test (push) Successful in 11m14s
build / docs (push) Successful in 1m25s
2025-04-12 15:02:47 -07:00
81db67c759 Fix a regression in monitoring hooks in which an error pinged the finish state instead of the fail state (#1065).
All checks were successful
build / test (push) Successful in 11m14s
build / docs (push) Successful in 1m19s
2025-04-09 11:32:59 -07:00
0b4aff9277 Bump version for release.
All checks were successful
build / test (push) Successful in 6m46s
build / docs (push) Successful in 59s
2025-04-08 12:07:16 -07:00
7de1c2121c List the configured "when" action names in the log entries for command hooks (#1063).
All checks were successful
build / test (push) Successful in 6m36s
build / docs (push) Successful in 1m8s
2025-04-08 12:04:10 -07:00
2c8dc5858f Fix a regression that broke environment variable interpolation (#1062).
Some checks failed
build / test (push) Failing after 2m1s
build / docs (push) Has been skipped
2025-04-08 11:55:26 -07:00
f27a96e22d Display a nicer error message when the "recreate" action encounters an archive that already exists (#1053).
All checks were successful
build / test (push) Successful in 6m34s
build / docs (push) Successful in 1m0s
2025-04-08 10:58:53 -07:00
a892a308bd Display a nicer error message when running the "recreate" action on a leftover temporary archive from a prior recreate run (#1053).
All checks were successful
build / test (push) Successful in 6m33s
build / docs (push) Successful in 1m13s
2025-04-08 10:13:04 -07:00
2db023f785 Don't run action command hooks for actions listed in the "skip_actions" option (#1060).
All checks were successful
build / test (push) Successful in 6m33s
build / docs (push) Successful in 1m19s
2025-04-07 23:10:59 -07:00
edaca2b3cd Fix command hooks getting run too many times when multiple borgmatic actions are executed (#1060).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-04-07 23:00:29 -07:00
bc79eafb0b Document potential performance issues and workarounds with the ZFS, Btrfs, and LVM hooks (#1035).
All checks were successful
build / test (push) Successful in 6m30s
build / docs (push) Successful in 1m2s
2025-04-07 13:51:20 -07:00
68fafffe99 Fix a regression in which soft failure exit codes in command hooks were not respected (#1059).
All checks were successful
build / test (push) Successful in 6m30s
build / docs (push) Successful in 1m5s
2025-04-07 10:29:51 -07:00
6c068a297a Update README to use new command hooks in the example.
All checks were successful
build / test (push) Successful in 6m36s
build / docs (push) Successful in 1m7s
2025-04-06 23:29:12 -07:00
06a6444c86 Expand test that checks whether schema actions correspond to supported actions.
All checks were successful
build / test (push) Successful in 6m34s
build / docs (push) Successful in 1m0s
2025-04-06 21:25:06 -07:00
f6de79060e Omit "pattern" from missing actions test (#1056).
All checks were successful
build / test (push) Successful in 13m36s
build / docs (push) Successful in 1m22s
2025-04-06 20:57:15 -07:00
0d94a6587a Move pattern and flag functions from create.py into their own module (#1056).
Some checks failed
build / test (push) Failing after 3s
build / docs (push) Has been skipped
Reviewed-on: #1056
Reviewed-by: Dan Helfman <witten@torsion.org>
2025-04-07 03:51:36 +00:00
2f535056ee Removing asterisk escaping from release script, which apparently breaks Gitea changelog posting.
All checks were successful
build / test (push) Successful in 6m34s
build / docs (push) Successful in 1m10s
2025-04-06 15:27:58 -07:00
074db68a1b Bump version for release.
Some checks failed
build / test (push) Successful in 6m37s
build / docs (push) Has been cancelled
2025-04-06 15:21:03 -07:00
3cd5c1290d Fix argument parsing to avoid using Python 3.12+ string features (#1057). 2025-04-06 15:20:29 -07:00
66a636e994 Add more escaping to release script changelog output.
All checks were successful
build / test (push) Successful in 6m37s
build / docs (push) Successful in 59s
2025-04-06 09:04:54 -07:00
Vandal
360156e3b1 refactor codebase 2025-04-06 21:34:04 +05:30
b25bfbe913 Bump version for release.
All checks were successful
build / test (push) Successful in 10m51s
build / docs (push) Successful in 1m18s
2025-04-06 08:22:28 -07:00
acb9aace1d Include pull requests in build action, so they're covered by CI.
All checks were successful
build / test (push) Successful in 6m31s
build / docs (push) Successful in 1m0s
2025-04-05 20:20:45 -07:00
e6ae0b73d4 Rephrase NEWS entry. 2025-04-05 16:59:40 -07:00
7ee0d3563b Add configuration options for all verbosity and logging flags (#793).
All checks were successful
build / test (push) Successful in 10m48s
build / docs (push) Successful in 1m18s
Reviewed-on: #1055
2025-04-05 23:13:17 +00:00
edee3c3788 Fix broken monitoring verbosity (#793). 2025-04-05 16:11:42 -07:00
445f700b09 Fix log file format example. 2025-04-05 14:42:16 -07:00
732634f7ba Add an additional test (#793). 2025-04-04 18:49:20 -07:00
ad9f037ec5 Add documentation for verbosity/logging configuration options (#793). 2025-04-04 18:29:51 -07:00
c0adc4f9df Add test coverage for new code (#793). 2025-04-04 17:19:14 -07:00
49839e884a Add configuration options for logging and verbosity (#793). 2025-04-04 10:11:00 -07:00
828ada085b Add a deprecated, top-level "color" option back in for backwards compatibility. 2025-04-03 19:52:00 -07:00
93b1172266 Remove merge conflict artifacts. 2025-04-03 17:31:06 -07:00
c6ce9c70ab Merge branch 'main' into logging-verbosity-config. 2025-04-03 17:29:59 -07:00
929d343214 Add CLI flags for every config option and add config options for many action flags (#303).
All checks were successful
build / test (push) Successful in 6m25s
build / docs (push) Successful in 1m12s
Reviewed-on: #1040
2025-04-03 23:48:49 +00:00
9ea55d9aa3 Add a documentation note about a limitation: You can't pass flags as values to flags (#303). 2025-04-03 16:38:17 -07:00
3eabda45f2 If a boolean option name already starts with "no_", don't add a "--no-no-..." CLI flag (#303). 2025-04-03 16:21:22 -07:00
09212961a4 Add action "--help" note about running compact after recreate (#1053).
All checks were successful
build / test (push) Successful in 5m49s
build / docs (push) Successful in 1m4s
2025-04-03 12:55:26 -07:00
3f25f3f0ff Merge branch 'main' into config-command-line. 2025-04-03 11:47:29 -07:00
e8542f3613 Fix KeePassXC error when "keepassxc:" option is not present, add new options to NEWS (#1047).
All checks were successful
build / test (push) Successful in 5m51s
build / docs (push) Successful in 1m13s
2025-04-03 11:41:58 -07:00
9407f24674 Fix setting of "--checks" on the command-line (#303). 2025-04-03 11:28:32 -07:00
1c9d25b892 Add "key-file" and "yubikey" options to KeePassXC credential hook (#1047).
Some checks failed
build / test (push) Failing after 5m52s
build / docs (push) Has been skipped
Reviewed-on: #1049
2025-04-03 18:28:08 +00:00
248999c23e Final 2025-04-03 17:10:52 +00:00
d0a5aa63be Add a TL;DR to NEWS since 2.0.0 is such a huge release and ain't nobody got time for reading a huge changelog. 2025-04-03 09:24:47 -07:00
d2c3ed26a9 Make a CLI flag for any config option that's a list of scalars (#303). 2025-04-02 23:15:21 -07:00
bbf6f27715 For boolean configuration options, add separate "--foo" and "--no-foo" CLI flags (#303). 2025-04-02 17:08:04 -07:00
9301ab13cc Merge branch 'main' into config-command-line. 2025-04-02 09:55:33 -07:00
d5d04b89dc Add configuration filename to "Successfully ran configuration file" log message (#1051).
All checks were successful
build / test (push) Successful in 10m4s
build / docs (push) Successful in 1m14s
2025-04-02 09:50:31 -07:00
364200c65a Fix incorrect matching of non-zero array index flags with dashed names (#303). 2025-04-02 09:37:52 -07:00
4e55547235 Command Restructuring 2025-04-02 15:35:12 +00:00
96ec66de79 Applied changes 2025-04-02 10:50:25 +00:00
7a0c56878b Applied changes 2025-04-02 10:47:35 +00:00
4065c5d0f7 Fix use of dashed command-line flags like "--repositories[2].append-only" generated from configuration (#303). 2025-04-01 23:04:53 -07:00
affe7cdc1b Expose propertyless YAML objects from configuration (e.g. "constants") as command-line flags (#303). 2025-04-01 21:05:44 -07:00
017cbae4f9 Fix for the example not showing up in generated config for empty YAML objects (#303). 2025-04-01 19:44:47 -07:00
e96db2e100 Fix "progress" option with the "transfer" action (#303). 2025-04-01 19:43:56 -07:00
af97b95e2b Merge branch 'main' into config-command-line. 2025-04-01 12:09:54 -07:00
6a61259f1a Fix a failure in the "spot" check when the archive contains a symlink (#1050).
All checks were successful
build / test (push) Successful in 10m19s
build / docs (push) Successful in 1m14s
2025-04-01 11:49:47 -07:00
5490a83d77 Merge branch 'main' into config-command-line. 2025-03-31 17:13:20 -07:00
8c907bb5a3 Fix broken "recreate" action with Borg 1.4 (#610).
All checks were successful
build / test (push) Successful in 9m49s
build / docs (push) Successful in 1m14s
2025-03-31 17:11:37 -07:00
f166111b9b Fix new "repositories:" sub-options ("append_only", "make_parent_directories", etc.) (#303). 2025-03-31 15:26:24 -07:00
10fb02c40a Fix bootstrap --progress flag (#303). 2025-03-31 13:33:39 -07:00
cf477bdc1c Fix broken list_details, progress, and statistics options (#303). 2025-03-31 11:33:56 -07:00
6f07402407 Fix end-to-end tests and don't stat() directories that don't exist (#1048).
All checks were successful
build / test (push) Successful in 5m52s
build / docs (push) Successful in 55s
2025-03-30 19:04:36 -07:00
ab01e97a5e Fix a "no such file or directory" error in ZFS, Btrfs, and LVM hooks with nested directories that reside on separate devices/filesystems (#1048).
Some checks failed
build / test (push) Failing after 5m40s
build / docs (push) Has been skipped
2025-03-30 14:55:54 -07:00
92ebc77597 2nd Draft 2025-03-30 16:19:56 +00:00
863c954144 added schema.yaml 2025-03-30 15:57:42 +00:00
f7e4d38762 First Draft 2025-03-30 14:02:56 +00:00
de4d7af507 Merge branch 'main' into config-command-line. 2025-03-29 22:52:40 -07:00
5cea1e1b72 Fix flake error (#262).
All checks were successful
build / test (push) Successful in 5m52s
build / docs (push) Successful in 1m15s
2025-03-29 22:52:17 -07:00
fd8c11eb0a Add documentation for "native" command-line overrides without --override (#303). 2025-03-29 21:59:47 -07:00
92de539bf9 Merge branch 'main' into config-command-line. 2025-03-29 19:55:03 -07:00
5716e61f8f Code formatting (#262).
Some checks failed
build / test (push) Failing after 1m49s
build / docs (push) Has been skipped
2025-03-29 19:54:40 -07:00
3e05eeb4de Merge branch 'main' into config-command-line. 2025-03-29 19:03:29 -07:00
65d1b9235d Add "default_actions" to NEWS (#262).
Some checks failed
build / test (push) Failing after 1m43s
build / docs (push) Has been skipped
2025-03-29 19:02:11 -07:00
cffb8e88da Merge branch 'main' of ssh://projects.torsion.org:3022/borgmatic-collective/borgmatic into config-command-line 2025-03-29 18:58:12 -07:00
a8362f2618 borgmatic without arguments/parameters should show usage help instead of starting a backup (#262).
Some checks failed
build / test (push) Failing after 1m42s
build / docs (push) Has been skipped
Reviewed-on: #1046
2025-03-30 01:57:11 +00:00
36265eea7d Docs update 2025-03-30 01:34:30 +00:00
8101e5c56f Add "list_details" config option support to new "recreate" action (#303). 2025-03-29 15:24:37 -07:00
c7feb16ab5 Merge branch 'main' into config-command-line. 2025-03-29 15:16:29 -07:00
da324ebeb7 Add "recreate" action to NEWS and docs (#610).
All checks were successful
build / test (push) Successful in 5m48s
build / docs (push) Successful in 1m15s
2025-03-29 15:15:36 -07:00
59f9d56aae Add a recreate action (#1030).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
Reviewed-on: #1030
2025-03-29 22:07:52 +00:00
Vandal
dbf2e78f62 help changes 2025-03-30 03:05:46 +05:30
f6929f8891 Add last couple of missing tests after audit (#303). 2025-03-29 14:26:54 -07:00
Vandal
2716d9d0b0 add to schema 2025-03-29 23:25:50 +05:30
668f767bfc Adding some missing tests and fixing related flag vs. config logic (#303). 2025-03-28 23:11:15 -07:00
0182dbd914 Added 2 new unit tests and updated docs 2025-03-29 03:43:58 +00:00
1c27e0dadc Add an end-to-end test for command-line flags of configuration options (#303). 2025-03-28 13:46:58 -07:00
Vandal
8b3a682edf add tests and minor fixes 2025-03-29 01:26:20 +05:30
975a6e4540 Add additional tests for complete coverage (#303). 2025-03-28 11:37:48 -07:00
Vandal
7020f0530a update existing tests 2025-03-28 22:22:19 +05:30
5bf2f546b9 More automated tests (#303). 2025-03-27 21:01:56 -07:00
b4c558d013 Add tests for CLI arguments from schema logic (#303). 2025-03-27 16:49:14 -07:00
79bf641668 Set the action type when cloning an argument for a list index flag (#303). 2025-03-27 12:42:49 -07:00
50beb334dc Add tests for adding array element arguments and fix the code under test (#303). 2025-03-27 11:07:25 -07:00
Vandal
26fd41da92 add rest of flags 2025-03-27 22:18:34 +05:30
088da19012 Added Unit Tests 2025-03-27 11:26:56 +00:00
4c6674e0ad Merge branch 'main' into config-command-line. 2025-03-26 22:14:36 -07:00
486bec698d Add "key import" to reference documentation (#345).
All checks were successful
build / test (push) Successful in 9m59s
build / docs (push) Successful in 1m14s
2025-03-26 22:13:30 -07:00
7a766c717e 2nd Draft 2025-03-27 02:55:16 +00:00
520fb78a00 Clarify Btrfs documentation: borgmatic expects subvolume mount points in "source_directories" (#1043).
All checks were successful
build / test (push) Successful in 5m49s
build / docs (push) Successful in 59s
2025-03-26 11:39:16 -07:00
Vandal
acc2814f11 add archive timestamp filter 2025-03-26 23:39:06 +05:30
996b037946 1st 2025-03-26 17:39:10 +00:00
Vandal
9356924418 add archive options 2025-03-26 22:30:11 +05:30
79e4e089ee Fix typo in NEWS (#1044).
All checks were successful
build / test (push) Successful in 5m50s
build / docs (push) Successful in 1m0s
2025-03-26 09:57:53 -07:00
d2714cb706 Fix an error in the systemd credential hook when the credential name contains a "." chararcter (#1044).
Some checks failed
build / test (push) Failing after 1m48s
build / docs (push) Has been skipped
2025-03-26 09:53:52 -07:00
5a0430b9c8 Merge branch 'main' into config-command-line. 2025-03-25 22:39:51 -07:00
23efbb8df3 Fix line wrapping / code style (#837).
All checks were successful
build / test (push) Successful in 8m7s
build / docs (push) Successful in 1m12s
2025-03-25 22:31:50 -07:00
9e694e4df9 Add MongoDB custom command options to NEWS (#837).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-03-25 22:28:14 -07:00
76f7c53a1c Add custom command options for MongoDB hook (#837).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
Reviewed-on: #1041
2025-03-26 05:27:03 +00:00
Vandal
203e84b91f hotfix 2025-03-25 21:57:06 +05:30
Vandal
ea5a2d8a46 add tests for the flags 2025-03-25 20:39:02 +05:30
Vandal
a8726c408a add tests 2025-03-25 19:35:15 +05:30
Vandal
3542673446 add test recreate with skip action 2025-03-25 11:36:06 +05:30
532a97623c Added test_build_restore_command_prevents_shell_injection() 2025-03-25 04:50:45 +00:00
e1fdfe4c2f Add credential hook directory expansion to NEWS (#422).
All checks were successful
build / test (push) Successful in 8m40s
build / docs (push) Successful in 1m15s
2025-03-24 13:00:38 -07:00
83a56a3fef Add directory expansion for file-based and KeyPassXC credential hooks (#1042).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
Reviewed-on: #1042
2025-03-24 19:57:18 +00:00
Vandal
b60cf2449a add recreate to schema 2025-03-25 00:48:27 +05:30
Vandal
e7f14bca87 add tests and requested changes 2025-03-25 00:16:20 +05:30
Nish_
4bca7bb198 add directory expansion for file-based and KeyPassXC credentials
Signed-off-by: Nish_ <120EE0980@nitrkl.ac.in>
2025-03-24 21:04:55 +05:30
Vandal
fa3b140590 add patterns 2025-03-24 12:09:08 +05:30
Vandal
a1d2f7f221 add path 2025-03-24 11:51:33 +05:30
6a470be924 Made some changes in test file 2025-03-24 03:53:42 +00:00
d651813601 Custom command options for MongoDB hook #837 2025-03-24 03:39:26 +00:00
65b1d8e8b2 Clarify NEWS items (#303). 2025-03-23 19:13:07 -07:00
16a1121649 Get existing end-to-end tests passing (#303). 2025-03-23 18:45:49 -07:00
423627e67b Get existing unit/integration tests passing (#303). 2025-03-23 17:00:04 -07:00
9f7c71265e Add Bash completion for completing flags like "--foo[3].bar". 2025-03-23 16:32:31 -07:00
ba75958a2f Fix missing argument descriptions (#303). 2025-03-23 11:26:49 -07:00
57721937a3 Factor out schema type comparion in config generation and get several tests passing (#303). 2025-03-23 11:24:36 -07:00
f222bf2c1a Organizational refactoring (#303). 2025-03-22 22:52:23 -07:00
dc9da3832d Bold "not yet released" in docs to prevent confusion (#303). 2025-03-22 14:03:44 -07:00
f8eda92379 Code formatting (#303). 2025-03-22 14:01:39 -07:00
cc14421460 Fix list examples in generated configuration. 2025-03-22 13:58:42 -07:00
Vandal
a750d58a2d add recreate action 2025-03-22 21:18:28 +05:30
2045706faa merge upstream 2025-03-22 13:00:07 +00:00
976fb8f343 Add "compact_threshold" option, overridden by "compact --threshold" flag (#303). 2025-03-21 22:44:49 -07:00
5246a10b99 Merge branch 'main' into config-command-line. 2025-03-21 15:44:12 -07:00
524ec6b3cb Add "extract" action fix to NEWS (#1037).
All checks were successful
build / test (push) Successful in 8m11s
build / docs (push) Successful in 1m22s
2025-03-21 15:43:05 -07:00
6f1c77bc7d Merge branch 'main' of ssh://projects.torsion.org:3022/borgmatic-collective/borgmatic into config-command-line 2025-03-21 15:40:27 -07:00
7904ffb641 Fix extracting from remote repositories with working_directory defined (#1037).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
Reviewed-on: #1038
Reviewed-by: Dan Helfman <witten@torsion.org>
2025-03-21 22:40:18 +00:00
cd5ba81748 Fix docs: Crontabs aren't executable (#1039).
All checks were successful
build / test (push) Successful in 5m59s
build / docs (push) Successful in 59s
Reviewed-on: #1039
2025-03-21 21:32:38 +00:00
5c11052b8c Merge branch 'main' into config-command-line 2025-03-21 14:30:39 -07:00
514ade6609 Fix inconsistent quotes in one documentation file (#790).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
2025-03-21 14:27:40 -07:00
201469e2c2 Add "key import" action to NEWS (#345).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
2025-03-21 14:26:01 -07:00
9ac2a2e286 Add key import action to import a copy of repository key from backup (#345).
Some checks failed
build / test (push) Failing after 1m41s
build / docs (push) Has been skipped
Reviewed-on: #1036
Reviewed-by: Dan Helfman <witten@torsion.org>
2025-03-21 21:22:50 +00:00
Benjamin Bock
a16d138afc Crontabs aren't executable 2025-03-21 21:58:02 +01:00
Benjamin Bock
81a3a99578 Fix extracting from remote repositories with working_directory defined 2025-03-21 21:34:46 +01:00
f3cc3b1b65 Merge branch 'main' into config-command-line 2025-03-21 11:10:19 -07:00
587d31de7c Run all command hooks respecting the "working_directory" option if configured (#790).
All checks were successful
build / test (push) Successful in 10m15s
build / docs (push) Successful in 1m14s
2025-03-21 10:53:06 -07:00
cbfc0bead1 Exclude --match-archives from global flags since it already exists on several actions (#303). 2025-03-21 09:56:42 -07:00
Nish_
8aaa5ba8a6 minor changes
Signed-off-by: Nish_ <120EE0980@nitrkl.ac.in>
2025-03-21 19:26:12 +05:30
7d989f727d Don't auto-add CLI flags for configuration options that already have per-action CLI flags (#303). 2025-03-20 12:23:00 -07:00
Nish_
5525b467ef add key import command
Signed-off-by: Nish_ <120EE0980@nitrkl.ac.in>
2025-03-21 00:47:45 +05:30
89c98de122 Merge branch 'main' into config-command-line. 2025-03-20 11:37:04 -07:00
c2409d9968 Remove the "dump_data_sources" command hook, as it doesn't really solve the use case and works differently than all the other command hooks (#790).
All checks were successful
build / test (push) Successful in 5m47s
build / docs (push) Successful in 1m6s
2025-03-20 11:13:37 -07:00
624a7de622 Document "after" command hooks running in case of error and make sure that happens in case of "before" hook error (#790).
All checks were successful
build / test (push) Successful in 10m16s
build / docs (push) Successful in 1m22s
2025-03-20 10:57:39 -07:00
3119c924b4 In configuration option descriptions, remove mention of corresponding CLI flags because it looks dumb on the command-line help (#303). 2025-03-19 23:08:26 -07:00
ed6022d4a9 Add "list" option to configuration, corresponding to "--list" (#303). 2025-03-19 23:05:38 -07:00
3e21cdb579 Add "stats" option to configuration (#303). 2025-03-19 19:43:04 -07:00
d02d31f445 Use schema defaults instead of a flag name whitelist to make valueless boolean flags (#303). 2025-03-19 11:37:17 -07:00
1097a6576f Add "progress" option to configuration (#303). 2025-03-19 11:06:36 -07:00
63b0c69794 Add additional options under "repositories:" for parity with repo-create #303. 2025-03-18 20:54:14 -07:00
Vandal
4e2805918d update borg/recreate.py 2025-03-18 23:19:33 +05:30
711f5fa6cb UX nicety to make default-false boolean options into valueless CLI flags (#303). 2025-03-17 22:58:25 -07:00
93e7da823c Add an encryption option to repositories (#303). 2025-03-17 22:24:01 -07:00
903308864c Factor out schema type parsing (#303). 2025-03-17 10:46:02 -07:00
d75c8609c5 Merge branch 'main' into config-command-line 2025-03-17 10:34:20 -07:00
c926f0bd5d Clarify documentation for dump_data_sources command hook (#790).
All checks were successful
build / test (push) Successful in 10m21s
build / docs (push) Successful in 1m14s
2025-03-17 10:31:34 -07:00
7b14e8c7f2 Add feature to NEWS (#303). 2025-03-17 10:17:04 -07:00
87b9ad5aea Code formatting (#303). 2025-03-17 10:02:25 -07:00
eca78fbc2c Support setting whole lists and dicts from the command-line (#303). 2025-03-17 09:57:25 -07:00
Vandal
6adb0fd44c add borg recreate 2025-03-17 22:24:53 +05:30
05900c188f Expand docstrings (#303). 2025-03-15 22:58:39 -07:00
1d5713c4c5 Updated outdated schema comment referencing ~/.borgmatic path (#836).
All checks were successful
build / test (push) Successful in 6m7s
build / docs (push) Successful in 1m13s
2025-03-15 21:42:45 -07:00
f9612cc685 Add SQLite custom command option to NEWS (#836). 2025-03-15 21:37:23 -07:00
5742a1a2d9 Add custom command option for SQLite hook (#836).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
Reviewed-on: #1027
2025-03-16 04:34:15 +00:00
Nish_
c84815bfb0 add custom dump and restore commands for sqlite hook
Signed-off-by: Nish_ <120EE0980@nitrkl.ac.in>
2025-03-16 09:07:49 +05:30
e1ff51ff1e Merge branch 'main' into config-command-line. 2025-03-15 10:03:59 -07:00
1c92d84e09 Add Borg 2 "prune --stats" flag change to NEWS (#1010).
All checks were successful
build / test (push) Successful in 9m59s
build / docs (push) Successful in 1m33s
2025-03-15 10:02:47 -07:00
1d94fb501f Conditionally pass --stats to prune based on Borg version (#1010).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
Reviewed-on: #1026
2025-03-15 16:59:50 +00:00
92279d3c71 Initial work on command-line flags for all configuration (#303). 2025-03-14 22:59:43 -07:00
Nish_
1b4c94ad1e Add feature toggle to pass --stats to prune on Borg 1, but not Borg 2
Signed-off-by: Nish_ <120EE0980@nitrkl.ac.in>
2025-03-15 09:56:14 +05:30
901e668c76 Document a database use case involving a temporary database client container (#1020).
All checks were successful
build / test (push) Successful in 7m37s
build / docs (push) Successful in 1m30s
2025-03-12 17:10:35 -07:00
bcb224a243 Claim another implemented ticket in NEWS (#821).
All checks were successful
build / test (push) Successful in 7m35s
build / docs (push) Successful in 1m25s
2025-03-12 14:31:13 -07:00
6b6e1e0336 Make the "configuration" command hook support "error" hooks and also pinging monitoring on failure (#790).
All checks were successful
build / test (push) Successful in 12m18s
build / docs (push) Successful in 1m53s
2025-03-12 14:13:29 -07:00
f5c9bc4fa9 Add a "not yet released" note on 2.0.0 in docs (#790).
All checks were successful
build / test (push) Successful in 7m15s
build / docs (push) Successful in 1m35s
2025-03-11 16:46:07 -07:00
cdd0e6f052 Fix incorrect kwarg in LVM hook (#790).
All checks were successful
build / test (push) Successful in 7m3s
build / docs (push) Successful in 1m36s
2025-03-11 14:42:25 -07:00
7bdbadbac2 Deprecate all "before_*", "after_*" and "on_error" command hooks in favor of more flexible "commands:" (#790).
Some checks failed
build / test (push) Failing after 15m7s
build / docs (push) Has been skipped
Reviewed-on: #1019
2025-03-11 21:22:33 +00:00
d3413e0907 Documentation clarification (#1019). 2025-03-11 14:20:42 -07:00
8a20ee7304 Fix typo in documentation (#1019). 2025-03-11 14:08:53 -07:00
325f53c286 Context tweaks + mention configuration upgrade in command hook documentation (#1019). 2025-03-11 14:07:06 -07:00
b4d24798bf More command hook documentation updates (#1019). 2025-03-11 13:03:58 -07:00
7965eb9de3 Correctly handle errors in command hooks (#1019). 2025-03-11 11:36:28 -07:00
8817364e6d Documentation on command hooks (#1019). 2025-03-10 22:38:48 -07:00
965740c778 Update version of command hooks since they didn't get released in 1.9.14 (#1019). 2025-03-10 10:37:09 -07:00
2a0319f02f Merge branch 'main' into unified-command-hooks. 2025-03-10 10:35:36 -07:00
fbdb09b87d Bump version for release.
All checks were successful
build / test (push) Successful in 6m42s
build / docs (push) Successful in 1m19s
2025-03-10 10:17:36 -07:00
bec5a0c0ca Fix end-to-end tests for Btrfs (#1023).
All checks were successful
build / test (push) Successful in 6m50s
build / docs (push) Successful in 1m38s
2025-03-10 10:15:23 -07:00
4ee7f72696 Fix an error in the Btrfs hook when attempting to snapshot a read-only subvolume (#1023).
Some checks failed
build / test (push) Failing after 6m54s
build / docs (push) Has been skipped
2025-03-09 23:04:55 -07:00
9941d7dc57 More docs and command hook context tweaks (#1019). 2025-03-09 17:01:46 -07:00
ec88bb2e9c Merge branch 'main' into unified-command-hooks. 2025-03-09 13:37:17 -07:00
68b6d01071 Fix a regression in which the "exclude_patterns" option didn't expand "~" (#1021).
All checks were successful
build / test (push) Successful in 7m11s
build / docs (push) Successful in 1m31s
2025-03-09 13:35:22 -07:00
b52339652f Initial command hooks documentation work (#1019). 2025-03-09 09:57:13 -07:00
4fd22b2df0 Merge branch 'main' into unified-command-hooks. 2025-03-08 21:02:04 -08:00
86b138e73b Clarify command hook documentation.
All checks were successful
build / test (push) Successful in 11m29s
build / docs (push) Successful in 1m44s
2025-03-08 21:00:58 -08:00
5ab766b51c Add a few more missing tests (#1019). 2025-03-08 20:55:13 -08:00
45c114973c Add missing test coverage for new/changed code (#1019). 2025-03-08 18:31:16 -08:00
6a96a78cf1 Fix existing tests (#1019). 2025-03-07 22:58:25 -08:00
e06c6740f2 Switch to context manager for running "dump_data_sources" before/after hooks (#790). 2025-03-07 10:33:39 -08:00
10bd1c7b41 Remove restore_data_source_dump as a command hook for now (#790). 2025-03-06 22:53:19 -08:00
d4f48a3a9e Initial work on unified command hooks (#790). 2025-03-06 11:23:24 -08:00
c76a108422 Link to Zabbix documentation from NEWS. 2025-03-06 10:37:00 -08:00
eb5dc128bf Fix incorrect test name (#1017).
All checks were successful
build / test (push) Successful in 7m10s
build / docs (push) Successful in 1m32s
2025-03-06 10:34:28 -08:00
1d486d024b Fix a regression in which some MariaDB/MySQL passwords were not escaped correctly (#1017).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
2025-03-06 10:32:38 -08:00
5a8f27d75c Add single quotes around the MariaDB password (#1017).
All checks were successful
build / test (push) Successful in 11m51s
build / docs (push) Successful in 1m41s
Reviewed-on: #1017
2025-03-06 18:01:43 +00:00
a926b413bc Updating automated test, and fixing linting errors. 2025-03-06 09:00:33 -03:30
18ffd96d62 Add single quotes around the password.
When the DB password uses some special characters, the
defaults-extra-file can be incorrect. In the case of a password with
the # symbol, anything after that is considered a comment. The single
quotes around the password rectify this.
2025-03-05 22:51:41 -03:30
c0135864c2 With the PagerDuty monitoring hook, send borgmatic logs to PagerDuty so they show up in the incident UI (#409).
All checks were successful
build / test (push) Successful in 10m48s
build / docs (push) Successful in 2m50s
2025-03-04 08:55:09 -08:00
ddfd3c6ca1 Clarify Zabbix monitoring hook documentation about creating items (#936).
All checks were successful
build / test (push) Successful in 7m54s
build / docs (push) Successful in 1m40s
2025-03-03 16:02:22 -08:00
dbe82ff11e Bump version for release.
All checks were successful
build / test (push) Successful in 6m46s
build / docs (push) Successful in 1m14s
2025-03-03 10:21:15 -08:00
55c0ab1610 Add "tls" options to the MariaDB and MySQL database hooks.
All checks were successful
build / test (push) Successful in 10m58s
build / docs (push) Successful in 1m43s
2025-03-03 10:07:03 -08:00
1f86100f26 NEWS wording tweaks. 2025-03-02 20:10:20 -08:00
2a16ffab1b When ctrl-C is pressed, ensure Borg actually exits (#1015).
All checks were successful
build / test (push) Successful in 7m0s
build / docs (push) Successful in 1m38s
2025-03-02 10:32:57 -08:00
4b2f7e03af Fix broken "config generate" (#975).
All checks were successful
build / test (push) Successful in 6m52s
build / docs (push) Successful in 1m42s
2025-03-01 21:02:32 -08:00
024006f4c0 Title case Borg.
Some checks failed
build / test (push) Failing after 4m35s
build / docs (push) Has been skipped
2025-03-01 20:56:40 -08:00
4c71e600ca Expand a little on the specifics of backups of an LVM volume (#1014).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
Reviewed-on: #1014
2025-03-02 04:55:13 +00:00
114f5702b2 Expand a little on the specifics of backups of an LVM volume. 2025-03-02 14:22:57 +11:00
54afe87a9f Add a "compression" option to the PostgreSQL database hook (#975).
Some checks failed
build / test (push) Failing after 4m32s
build / docs (push) Has been skipped
2025-03-01 17:29:16 -08:00
25b6a49df7 Send database passwords to MongoDB via anonymous pipe (#1013).
All checks were successful
build / test (push) Successful in 6m27s
build / docs (push) Successful in 1m26s
2025-03-01 10:04:04 -08:00
b97372adf2 Add MariaDB and MySQL anonymous pipe to NEWS (#1009).
All checks were successful
build / test (push) Successful in 6m42s
build / docs (push) Successful in 1m25s
2025-03-01 08:49:42 -08:00
6bc9a592d9 Send MariaDB and MySQL passwords via anonymous pipe instead of environment variable (#1009).
All checks were successful
build / test (push) Successful in 11m27s
build / docs (push) Successful in 1m49s
Reviewed-on: #1011
2025-03-01 03:33:08 +00:00
839862cff0 Update documentation link text about providing database passwords from external sources (#1009). 2025-02-28 19:31:22 -08:00
06b065cb09 Add missing test coverage (#1009). 2025-02-28 18:28:09 -08:00
1e5c256d54 Get tests passing again (#1009). 2025-02-28 14:40:00 -08:00
baf5fec78d If the user supplies their own --defaults-extra-file, include it from the one we generate (#1009). 2025-02-28 10:53:17 -08:00
48a4fbaa89 Add missing test coverage for defaults file function (#1009). 2025-02-28 09:21:01 -08:00
1e274d7153 Add some missing test mocking (#1009). 2025-02-28 08:59:38 -08:00
c41b743819 Get existing unit tests passing (#1009). 2025-02-28 08:37:03 -08:00
36d0073375 Send MySQL passwords via anonymous pipe instead of environment variable (#1009). 2025-02-27 10:42:47 -08:00
0bd418836e Send MariaDB passwords via anonymous pipe instead of environment variable (#1009) 2025-02-27 10:15:45 -08:00
923fa7d82f Include contributors of closed tickets in "recent contributors" documentation.
All checks were successful
build / test (push) Successful in 7m15s
build / docs (push) Successful in 1m32s
2025-02-27 09:23:08 -08:00
dce0528057 In the Zabbix monitoring hook, support Zabbix 7.2's authentication changes (#1003).
All checks were successful
build / test (push) Successful in 11m21s
build / docs (push) Successful in 1m35s
2025-02-26 22:33:01 -08:00
8a6c6c84d2 Add Uptime Kuma "verify_tls" option to NEWS.
All checks were successful
build / test (push) Successful in 6m32s
build / docs (push) Successful in 24s
2025-02-24 11:30:16 -08:00
1e21c8f97b Add "verify_tls" option to Uptime Kuma hook.
Merge pull request #90 from columbarius/uptimekuma-verify-tls
2025-02-24 11:28:18 -08:00
columbarius
2eab74a521 Add "verify_tls" option to Uptime Kuma hook. 2025-02-24 20:12:47 +01:00
3bca686707 Fix a ZFS error during snapshot cleanup (#1001).
All checks were successful
build / test (push) Successful in 6m38s
build / docs (push) Successful in 1m13s
2025-02-23 17:01:35 -08:00
8854b9ad20 Backing out a ZFS change that hasn't been confirmed working quite yet.
Some checks failed
build / test (push) Failing after 1s
build / docs (push) Has been skipped
2025-02-23 15:49:12 -08:00
bcc463688a When getting all ZFS dataset mount points, deduplicate and filter out "none".
Some checks failed
build / test (push) Failing after 23s
build / docs (push) Has been skipped
2025-02-23 15:46:39 -08:00
596305e3de Bump version for release.
All checks were successful
build / test (push) Successful in 6m34s
build / docs (push) Successful in 1m11s
2025-02-23 09:59:53 -08:00
c462f0c84c Fix Python < 3.12 compatibility issue (#1005).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
2025-02-23 09:59:19 -08:00
4f0142c3c5 Fix Python < 3.12 compatibility issue (#1005).
All checks were successful
build / test (push) Successful in 8m48s
build / docs (push) Successful in 1m29s
2025-02-23 09:09:47 -08:00
4f88018558 Bump version for release.
All checks were successful
build / test (push) Successful in 6m17s
build / docs (push) Successful in 1m21s
2025-02-22 14:39:45 -08:00
3642687ab5 Fix broken tests (#999).
All checks were successful
build / test (push) Successful in 6m20s
build / docs (push) Successful in 1m17s
2025-02-22 14:32:32 -08:00
5d9c111910 Fix a runtime directory error from a conflict between "extra_borg_options" and special file detection (#999).
Some checks failed
build / test (push) Failing after 2m0s
build / docs (push) Has been skipped
2025-02-22 14:26:21 -08:00
3cf19dd1b0 Send the "encryption_passphrase" option to Borg via an anonymous pipe (#998).
All checks were successful
build / test (push) Successful in 6m50s
build / docs (push) Successful in 1m30s
Reviewed-on: #998
2025-02-22 17:57:37 +00:00
ad3392ca15 Ignore the BORG_PASSCOMMAND environment variable when the "encryption_passphase" option is set. 2025-02-22 09:55:07 -08:00
087b7f5c7b Merge branch 'main' into passphrase-via-file-descriptor 2025-02-22 09:27:39 -08:00
34bb09e9be Document Zabbix server version compatibility (#1003).
All checks were successful
build / test (push) Successful in 6m33s
build / docs (push) Successful in 1m30s
2025-02-22 09:26:08 -08:00
a61eba8c79 Add PR number to NEWS item. 2025-02-21 22:30:31 -08:00
2280bb26b6 Fix a few tests to mock more accurately. 2025-02-21 22:08:08 -08:00
4ee2603fef Merge branch 'main' into passphrase-via-file-descriptor 2025-02-21 20:26:48 -08:00
cc2ede70ac Fix ZFS mount errors (#1001).
All checks were successful
build / test (push) Successful in 8m26s
build / docs (push) Successful in 1m29s
Reviewed-on: #1002
2025-02-22 04:13:35 +00:00
02d8ecd66e Document the root pattern requirement for snapshotting (#1001). 2025-02-21 18:08:34 -08:00
9ba78fa33b Don't try to unmount empty directories (#1001). 2025-02-21 17:59:45 -08:00
a3e34d63e9 Remove debugging prints (#1001). 2025-02-21 16:36:12 -08:00
bc25ac4eea Fix Btrfs end-to-end-test (#1001). 2025-02-21 16:32:07 -08:00
e69c686abf Get all unit/integration tests passing (#1001). 2025-02-21 11:32:57 -08:00
0210bf76bc Fix ZFS and Btrfs tests (#1001). 2025-02-20 22:58:05 -08:00
e69cce7e51 Document ZFS snapshotting exclusion of "canmount=off" datasets (#1001). 2025-02-20 14:04:23 -08:00
3655e8784a Add NEWS items for filesystem hook fixes/changes (#1001). 2025-02-20 13:25:09 -08:00
58aed0892c Initial work on fixing ZFS mount errors (#1001). 2025-02-19 22:49:14 -08:00
0e65169503 Improve clarity of comments and variable names of runtime directory exclude detection logic (#999).
All checks were successful
build / test (push) Successful in 9m1s
build / docs (push) Successful in 1m48s
2025-02-17 14:12:55 -08:00
07ecc0ffd6 Send the "encryption_passphrase" option to Borg via an anonymous pipe. 2025-02-17 11:03:36 -08:00
37ad398aff Add a ticket number to NEWS for (some of) the credential hook work.
All checks were successful
build / test (push) Successful in 8m51s
build / docs (push) Successful in 1m40s
2025-02-16 09:12:52 -08:00
056dfc6d33 Add Btrfs "/" subvolume fix to NEWS.
All checks were successful
build / test (push) Successful in 6m33s
build / docs (push) Successful in 1m34s
2025-02-15 09:56:46 -08:00
bf850b9d38 Fix path handling error when handling btrfs '/' subvolume.
Merge pull request #89 from dmitry-t7ko/btrfs-root-submodule-fix
2025-02-15 09:49:13 -08:00
7f22612bf1 Add credential loading from file, KeePassXC, and Docker/Podman secrets.
All checks were successful
build / test (push) Successful in 8m40s
build / docs (push) Successful in 1m31s
Reviewed-on: #994
2025-02-15 04:20:11 +00:00
e02a0e6322 Support working directory for container and file credential hooks. 2025-02-14 19:35:12 -08:00
2ca23b629c Add end-to-end tests for new credential hooks, along with some related configuration options. 2025-02-14 15:33:30 -08:00
b283e379d0 Actually pass the current configuration to credential hooks. 2025-02-14 10:15:52 -08:00
5dda9c8ee5 Add unit tests for new credential hooks. 2025-02-13 16:38:50 -08:00
Dmitrii Tishchenko
653d8c0946 Remove unneeded 'continue' 2025-02-13 21:44:45 +00:00
Dmitrii Tishchenko
92e87d839d Fix path handling error when handling btrfs '/' submodule 2025-02-13 17:12:23 +00:00
d6cf48544a Get existing tests passing. 2025-02-12 22:49:16 -08:00
8745b9939d Add documentation for new credential hooks. 2025-02-12 21:44:17 -08:00
5661b67cde Merge branch 'main' into keepassxc-docker-podman-file-credentials 2025-02-12 09:14:49 -08:00
aa4a9de3b2 Fix the "create" action to omit the repository label prefix from Borg's output when databases are enabled (#996).
All checks were successful
build / test (push) Successful in 8m19s
build / docs (push) Successful in 1m38s
2025-02-12 09:12:59 -08:00
f9ea45493d Add missing dev0 tag to version. 2025-02-11 23:00:26 -08:00
a0ba5b673b Add credential loading from file, KeePassXC, and Docker/Podman secrets. 2025-02-11 22:54:07 -08:00
50096296da Revamp systemd credential syntax to be more consistent with constants (#966).
All checks were successful
build / test (push) Successful in 8m19s
build / docs (push) Successful in 1m39s
2025-02-10 22:01:23 -08:00
3bc14ba364 Bump version for release. 2025-02-10 14:21:33 -08:00
c9c6913547 Add a "!credential" tag for loading systemd credentials into borgmatic configuration (#966).
All checks were successful
build / test (push) Successful in 6m1s
build / docs (push) Successful in 1m28s
Reviewed-on: #993
2025-02-10 22:18:43 +00:00
779f51f40a Fix favicon on non-home pages.
All checks were successful
build / test (push) Successful in 7m41s
build / docs (push) Successful in 1m34s
2025-02-10 13:24:27 -08:00
24b846e9ca Additional test coverage (#966). 2025-02-10 10:05:51 -08:00
73fe29b055 Add additional test coverage for credential tag (#966). 2025-02-10 09:52:07 -08:00
775385e688 Get unit tests passing again (#966). 2025-02-09 22:44:38 -08:00
efdbee934a Update documentation to describe delayed !credential tag approach (#966). 2025-02-09 15:27:58 -08:00
49719dc309 Load credentials from database hooks (#966). 2025-02-09 11:35:26 -08:00
b7e3ee8277 Revamped the credentials to load them much closer to where they're used (#966). 2025-02-09 11:12:40 -08:00
97fe1a2c50 Flake fixes (#966). 2025-02-08 19:28:03 -08:00
66abf38b39 Add end-to-end tests for the systemd credential hook (#966). 2025-02-08 17:50:59 -08:00
5baf091853 Add automated tests for the systemd credential hook (#966). 2025-02-08 10:42:11 -08:00
c5abcc1fdf Add documentation for the "!credential" tag (#966). 2025-02-07 16:04:10 -08:00
9a9a8fd1c6 Add a "!credential" tag for loading systemd credentials into borgmatic configuration (#966). 2025-02-07 14:09:26 -08:00
ab9e8d06ee Add a delayed logging handler that delays anything logged before logging is actually configured.
All checks were successful
build / test (push) Successful in 8m26s
build / docs (push) Successful in 1m47s
2025-02-07 09:50:05 -08:00
21cef267c1 Merge branch 'main' into logging-verbosity-config 2025-02-07 09:33:12 -08:00
5a2cd1b261 Add support for Python 3.13.
All checks were successful
build / test (push) Successful in 5m14s
build / docs (push) Successful in 1m24s
2025-02-06 14:21:36 -08:00
ffaa99ba15 With the "max_duration" option or the "--max-duration" flag, run the archives and repository checks separately so they don't interfere with one another (#988).
All checks were successful
build / test (push) Successful in 7m14s
build / docs (push) Successful in 1m18s
2025-02-06 11:52:16 -08:00
5dc0b08f22 Fix the log message code to avoid using Python 3.10+ logging features (#989).
All checks were successful
build / test (push) Successful in 5m55s
build / docs (push) Successful in 2m26s
2025-02-04 11:51:39 -08:00
23009e22aa When both "encryption_passcommand" and "encryption_passphrase" are configured, prefer "encryption_passphrase" even if it's an empty value (#987).
All checks were successful
build / test (push) Successful in 6m27s
build / docs (push) Successful in 1m43s
2025-02-03 23:20:31 -08:00
6cfa10fb7e Fix a "list" action error when the "encryption_passcommand" option is set (#987).
Some checks failed
build / test (push) Successful in 8m21s
build / docs (push) Has been cancelled
2025-02-03 23:11:59 -08:00
d29d0bc1c6 NEWS wording tweaks for clarity.
All checks were successful
build / test (push) Successful in 6m37s
build / docs (push) Successful in 1m30s
2025-02-03 11:22:54 -08:00
c3f4f94190 Bump version for release. 2025-02-03 11:20:13 -08:00
b2d61ade4e Change the default value for the "--original-hostname" flag from "localhost" to no host specified (#985).
Some checks failed
build / test (push) Successful in 7m49s
build / docs (push) Has been cancelled
2025-02-03 11:17:21 -08:00
cfad4200a9 Initial work on putting logging and verbosity options into configuration. 2025-02-02 11:04:37 -08:00
cca9039863 Move the passcommand logic out of a hook to prevent future security issues (e.g., passphrase exfiltration attacks) if a user invokes a credential hook from an arbitrary configuration value (#961).
All checks were successful
build / test (push) Successful in 8m55s
build / docs (push) Successful in 2m8s
2025-01-31 22:15:53 -08:00
afcf253318 Fix flake errors (#961).
All checks were successful
build / test (push) Successful in 5m56s
build / docs (push) Successful in 1m58s
2025-01-31 10:27:20 -08:00
76533c7db5 Add a clarifying comment to the NEWS entry (#961).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
2025-01-31 10:26:05 -08:00
0073366dfc Add a passcommand hook so borgmatic can collect the encryption passphrase once and pass it to Borg multiple times (#961).
Some checks failed
build / test (push) Failing after 4m12s
build / docs (push) Has been skipped
Reviewed-on: #984
2025-01-31 18:13:38 +00:00
13acaa47e4 Add an end-to-end test for the passcommand hook (#961). 2025-01-30 22:50:13 -08:00
cf326a98a5 Add test coverage for new code (#961). 2025-01-30 21:29:52 -08:00
355eef186e Get existing tests passing again (#961). 2025-01-30 20:18:03 -08:00
c392e4914c Add documentation (#961). 2025-01-30 10:20:24 -08:00
8fed8e0695 Add a passcommand hook to NEWS (#961). 2025-01-30 09:55:32 -08:00
52189490a2 Docstring typo (#961). 2025-01-30 09:48:55 -08:00
26b44699ba Add a passphrase hook so borgmatic can collect the encryption passphrase once and pass it to Borg multiple times (#961). 2025-01-30 09:35:20 -08:00
09933c3dc7 Log the repository path or label on every relevant log message, not just some logs (#635).
All checks were successful
build / test (push) Successful in 5m18s
build / docs (push) Successful in 1m11s
Reviewed-on: #980
2025-01-29 18:39:49 +00:00
c702dca8da Merge branch 'main' into log-repository-everywhere 2025-01-29 10:31:30 -08:00
62003c58ea Fix the Btrfs hook to support subvolumes with names like "@home", different from their mount points (#983).
All checks were successful
build / test (push) Successful in 6m44s
build / docs (push) Successful in 1m55s
2025-01-29 09:46:39 -08:00
67c22e464a Code formatting (#635). 2025-01-29 08:00:42 -08:00
5a9066940f Add monitoring end-to-end tests (#635). 2025-01-28 23:06:22 -08:00
61f0987051 Merge branch 'main' into log-repository-everywhere 2025-01-27 22:03:35 -08:00
63c39be55f Fix flaking issues (#635). 2025-01-27 12:28:36 -08:00
7e344e6e0a Complete test coverage for new code (#635). 2025-01-27 12:25:28 -08:00
b02ff8b6e5 Fix "spot" check file count delta error (#981).
All checks were successful
build / test (push) Successful in 4m38s
build / docs (push) Successful in 1m14s
2025-01-27 10:51:06 -08:00
b6ff242d3a Fix for borgmatic "exclude_patterns" and "exclude_from" recursing into excluded subdirectories (#982).
All checks were successful
build / test (push) Successful in 6m37s
build / docs (push) Successful in 2m2s
2025-01-27 10:07:19 -08:00
71f1819f05 Some additional test coverage (#635). 2025-01-27 09:27:12 -08:00
31b6e21139 Fix end-to-end tests and update more log messages (#635). 2025-01-26 19:03:40 -08:00
7d56641f56 Get existing unit tests passing (#635). 2025-01-26 12:13:29 -08:00
1ad6be2077 Add missing test coverage and fix incorrect test expectations (#855).
All checks were successful
build / test (push) Successful in 6m18s
build / docs (push) Successful in 1m58s
2025-01-26 09:29:54 -08:00
803361b850 Some text fixes (#635). 2025-01-26 09:12:18 -08:00
e0059de711 Add log prefix context manager to make prefix cleanup/restoration easier (#635). 2025-01-25 21:56:41 -08:00
b9ec9bb873 Don't prefix command output (like Borg output) with the global log prefix (#635). 2025-01-25 14:49:39 -08:00
8c5db19490 Code formatting (#635). 2025-01-25 14:14:48 -08:00
cc7e01be68 Log the repository path or label on every relevant log message, not just some logs (#635). 2025-01-25 14:01:25 -08:00
1232ba8045 Revert "Log the repository path or label on every relevant log message, not just some logs (#635)."
All checks were successful
build / test (push) Successful in 4m4s
build / docs (push) Successful in 7s
This reverts commit 90c1161a8c.
2025-01-25 13:57:56 -08:00
90c1161a8c Log the repository path or label on every relevant log message, not just some logs (#635).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
2025-01-25 13:55:58 -08:00
02451a8b30 Further database container dump documentation clarifications (#978).
All checks were successful
build / test (push) Successful in 3m55s
build / docs (push) Successful in 59s
2025-01-25 09:17:13 -08:00
730350b31a Fix incorrect option name within schema description.
All checks were successful
build / test (push) Successful in 3m56s
build / docs (push) Successful in 1m6s
2025-01-25 08:04:13 -08:00
203e1f4e99 Bump version for release. 2025-01-25 08:01:34 -08:00
4c35a564ef Fix root patterns so they don't have an invalid "sh:" prefix before getting passed to Borg (#979).
All checks were successful
build / test (push) Successful in 5m44s
build / docs (push) Successful in 1m38s
2025-01-25 07:59:53 -08:00
7551810ea6 Clarify/correct documentation about dumping databases when using containers (#978).
All checks were successful
build / test (push) Successful in 6m26s
build / docs (push) Successful in 1m39s
2025-01-24 14:31:38 -08:00
ce523eeed6 Add a blurb about recent contributors.
All checks were successful
build / test (push) Successful in 11m15s
build / docs (push) Successful in 1m15s
2025-01-23 15:11:54 -08:00
3c0def6d6d Expand the recent contributors documentation section to ticket submitters.
All checks were successful
build / test (push) Successful in 4m12s
build / docs (push) Successful in 1m1s
2025-01-23 14:41:26 -08:00
f08014e3be Code formatting.
All checks were successful
build / test (push) Successful in 4m23s
build / docs (push) Successful in 1m36s
2025-01-23 12:11:27 -08:00
86ad93676d Bump version for release. 2025-01-23 12:09:20 -08:00
e1825d2bcb Add #977 to NEWS. 2025-01-23 12:08:34 -08:00
92b8c0230e Fix exclude patterns parsing to support pattern styles (#977).
Some checks failed
build / test (push) Failing after 3m37s
build / docs (push) Has been skipped
Reviewed-on: #976
2025-01-23 20:06:11 +00:00
Pavel Andreev
73c196aa70 Fix according to review comments 2025-01-23 19:49:10 +00:00
Pavel Andreev
5d390d7953 Fix patterns parsing 2025-01-23 15:58:43 +00:00
ffb342780b Link to Sentry's DSN documentation (#855).
All checks were successful
build / test (push) Successful in 4m24s
build / docs (push) Successful in 1m42s
2025-01-21 17:28:32 -08:00
9871267f97 Add a Sentry monitoring hook (#855).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
2025-01-21 17:23:56 -08:00
914c2b17e9 Add a Sentry monitoring hook (#855). 2025-01-21 17:23:18 -08:00
804455ac9f Fix for "exclude_from" files being completely ignored (#971).
All checks were successful
build / test (push) Successful in 5m44s
build / docs (push) Successful in 1m34s
2025-01-19 10:27:13 -08:00
4fe0fd1576 Fix version number in NEWS.
All checks were successful
build / test (push) Successful in 4m3s
build / docs (push) Successful in 1m34s
2025-01-18 09:55:03 -08:00
e3d40125cb Fix for a "spot" check error when a filename in the most recent archive contains a newline (#968).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
2025-01-18 09:54:30 -08:00
e66df22a6e Fix for an error when a blank line occurs in the configured patterns or excludes (#970).
Some checks failed
build / test (push) Failing after 3m15s
build / docs (push) Has been skipped
2025-01-18 09:25:29 -08:00
e789de0851 Bump version for release.
All checks were successful
build / test (push) Successful in 3m52s
build / docs (push) Successful in 54s
2025-01-17 13:50:22 -08:00
f1cac95b9c Fix the "restore" action to work on database dumps without a port when a default port is configured (#969). 2025-01-17 13:46:18 -08:00
f183800009 For the LVM hook, add support for nested logical volumes (#962).
All checks were successful
build / test (push) Successful in 5m46s
build / docs (push) Successful in 57s
2025-01-17 09:38:49 -08:00
b7362bfbac Apply snapshot path rewriting to excludes and patterns, not just source directories (#962).
All checks were successful
build / test (push) Successful in 5m48s
build / docs (push) Successful in 1m35s
Reviewed-on: #964
2025-01-17 03:23:41 +00:00
2467518d4e Add even more missing test coverage (#962). 2025-01-16 15:11:59 -08:00
3bda843139 Fix the "spot" check to have a nicer error when there are no source paths to compare. 2025-01-15 19:48:08 -08:00
44efca2be9 Update patterns schema comment (#962). 2025-01-15 12:37:44 -08:00
cfeeb87bbe Fix pattern expansion/normalization bug with working directory (#962). 2025-01-15 11:26:26 -08:00
bb2e986c9d Fix end-to-end tests (#962). 2025-01-15 10:52:09 -08:00
67ac70354b Merge branch 'main' into snapshot-excludes-and-patterns 2025-01-15 10:37:36 -08:00
8c1d5dbfe1 Revert end-to-end script change.
All checks were successful
build / test (push) Successful in 4m4s
build / docs (push) Successful in 1m36s
2025-01-15 10:37:04 -08:00
a3aeb36159 Merge branch 'main' into snapshot-excludes-and-patterns 2025-01-15 10:35:45 -08:00
c702a988bd Add a basic end-to-end test for patterns (#962).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
2025-01-15 10:33:38 -08:00
bbf1c3d55e Add test coverage for new code. 2025-01-14 23:01:39 -08:00
0b17fb2d3f Get all existing tests passing (#962). 2025-01-14 13:48:20 -08:00
ca54da1067 Getting additional tests passing (#962). 2025-01-13 20:51:27 -08:00
661041da04 Fix check tests (#962). 2025-01-13 10:22:32 -08:00
ad14ff3ee5 Fix tests for remaining hooks (#962). 2025-01-13 10:07:25 -08:00
b72b9aaf13 Fix several tests (#962). 2025-01-12 22:42:58 -08:00
a70fd30cb1 Merge branch 'main' into snapshot-excludes-and-patterns 2025-01-12 11:38:50 -08:00
5560f30aa6 Fix a borgmatic runtime directory error when running the "spot" check with a database hook enabled (#965).
All checks were successful
build / test (push) Successful in 5m56s
build / docs (push) Successful in 1m55s
2025-01-12 09:36:24 -08:00
256ed4170b Minor comment clarifications (#962). 2025-01-10 22:20:49 -08:00
071d8d945a Strip comments from patterns (#962). 2025-01-10 12:33:25 -08:00
926c26315a Add documentation for patterns and snapshot hooks (#962). 2025-01-10 12:22:37 -08:00
120a29ab4d Initial work on applying snapshot path rewriting to excludes and patterns (#962). 2025-01-10 10:38:27 -08:00
8573660ff0 Clarify error message to mention patterns, not just excludes (#947).
All checks were successful
build / test (push) Successful in 5m59s
build / docs (push) Successful in 1m54s
2025-01-10 08:41:56 -08:00
0b9f3ae8a1 Fix comment typo. 2025-01-04 20:18:18 -08:00
2c70ad81ec Fix the "spot" check to support relative source directory paths (#960). Fix the "spot" check to no longer consider pipe files within an archive for file comparisons. Fix auto-excluding of special files (when databases are configured) to support relative source directory paths.
All checks were successful
build / test (push) Successful in 6m4s
build / docs (push) Successful in 1m58s
2025-01-01 15:00:36 -08:00
d6c3ec05aa Reduce duplication (#960).
All checks were successful
build / test (push) Successful in 4m5s
build / docs (push) Successful in 1m6s
2024-12-29 22:00:25 -08:00
a4954cc7a3 Fix for archives storing relative source directory paths such that they contain the working directory (#960).
All checks were successful
build / test (push) Successful in 5m53s
build / docs (push) Successful in 2m1s
2024-12-29 20:09:13 -08:00
a6b6dd32c1 Upgrade dependencies and containers for end-to-end tests.
All checks were successful
build / test (push) Successful in 5m48s
build / docs (push) Successful in 1m57s
2024-12-29 09:33:25 -08:00
d3409df84c Fix an error in the Btrfs hook when a "/" subvolume is configured in borgmatic's source directories (#959).
All checks were successful
build / test (push) Successful in 6m59s
build / docs (push) Successful in 2m7s
2024-12-28 09:57:33 -08:00
87e77ff2b7 Bump version for release.
All checks were successful
build / test (push) Successful in 7m31s
build / docs (push) Successful in 2m1s
2024-12-27 08:54:53 -08:00
3517d9d4f3 Indentation tweak. 2024-12-26 19:11:45 -08:00
d3c7279dad Backup and restore databases that have the same name but with different ports, hostnames, or hooks (#418).
All checks were successful
build / test (push) Successful in 5m30s
build / docs (push) Successful in 1m12s
Reviewed-on: #952
2024-12-26 23:17:58 +00:00
a99c48c115 Documentation / CLI help clarifications around "--original-port" (#418). 2024-12-26 15:16:29 -08:00
94cedd4cf8 Merge branch 'main' into same-named-databases 2024-12-25 23:04:45 -08:00
a4baf4623b Drop colorama as a library dependency (#958).
All checks were successful
build / test (push) Successful in 7m15s
build / docs (push) Successful in 1m58s
2024-12-25 23:02:38 -08:00
77df425bd1 Minor edits and clarifying comments (#418). 2024-12-25 21:59:10 -08:00
69476a4fab Documentation clarifications (#418). 2024-12-24 23:25:26 -08:00
be6b865a81 Add even more missing test coverage (#418). 2024-12-24 23:09:44 -08:00
b58a52e03f Merge branch 'main' into same-named-databases 2024-12-24 15:25:57 -08:00
9b85c5bc61 Add missing restore test coverage (#418). 2024-12-24 15:24:09 -08:00
b8041f5c39 Fix end-to-end tests broken by new database config checks during restore (#418). 2024-12-24 09:13:42 -08:00
d9d6d3f7f2 Simplify logic to get configured data sources during restoration (#418). 2024-12-23 22:12:47 -08:00
0844cd0d4f Fix the printing of a color reset code at exit even when color is disabled (#956).
All checks were successful
build / test (push) Successful in 8m17s
build / docs (push) Successful in 2m42s
2024-12-23 19:53:57 -08:00
d4705602fa Handle more edge cases by erroring (#418). 2024-12-22 22:02:53 -08:00
5174a78109 Get existing tests passing (#418). 2024-12-21 13:35:00 -08:00
3db79b4352 Simplified dump metadata comparison logic and got a few tests passing (#418). 2024-12-20 22:40:20 -08:00
d6732d9abb Merge branch 'main' into same-named-databases 2024-12-19 21:07:44 -08:00
267af5b372 To avoid a hang in the database hooks, error and exit when the borgmatic runtime directory overlaps with the configured excludes (#947).
All checks were successful
build / test (push) Successful in 7m11s
build / docs (push) Successful in 2m6s
2024-12-19 20:59:57 -08:00
d53ea09adb In tests, account for some function renames (#418). 2024-12-17 16:28:59 -08:00
8696cbfa22 Clarify some comments (#418). 2024-12-17 12:02:31 -08:00
48dca28c74 When the ZFS, Btrfs, or LVM hooks aren't configured, don't try to cleanup snapshots for them.
All checks were successful
build / test (push) Successful in 6m47s
build / docs (push) Successful in 1m49s
2024-12-17 11:00:19 -08:00
36bcbd0592 Documentation about restoring datebases with the same name (#418). 2024-12-17 08:51:04 -08:00
ebb3bca4b3 Fix findmnt command error in the Btrfs hook by switching to parsing JSON output (#954).
All checks were successful
build / test (push) Successful in 9m15s
build / docs (push) Successful in 2m17s
2024-12-12 11:58:18 -08:00
b1e343f15c Initial work on supporting same-named database with different ports, hosts, or hooks (#418). 2024-12-09 08:48:34 -08:00
cb7f98192c Updates to out-of-date documentation on database dumps.
All checks were successful
build / test (push) Successful in 4m37s
build / docs (push) Successful in 1m1s
2024-12-07 12:25:39 -08:00
3ceb4f554f Fix out-of-date schema comments about databases and one_file_system.
All checks were successful
build / test (push) Successful in 4m34s
build / docs (push) Successful in 1m9s
2024-12-07 11:42:41 -08:00
4b18c0bc81 Make LVM snapshots read-only.
All checks were successful
build / test (push) Successful in 4m33s
build / docs (push) Successful in 55s
2024-12-07 09:41:50 -08:00
2ce09dbf82 Snapshot documentation clarifications.
All checks were successful
build / test (push) Successful in 4m35s
build / docs (push) Successful in 57s
2024-12-07 09:10:52 -08:00
8a4f3b8f1a Add word missing from docs (#80).
All checks were successful
build / test (push) Successful in 4m34s
build / docs (push) Successful in 1m5s
2024-12-06 20:39:50 -08:00
81cd03cbbf Bump version for release. 2024-12-06 20:29:16 -08:00
f2455527fc Fix spelling in comment (#80).
All checks were successful
build / test (push) Successful in 4m37s
build / docs (push) Successful in 1m41s
2024-12-06 20:22:45 -08:00
62d67cde0a LVM snapshots + ZFS and Btrfs improvements (#80).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
Reviewed-on: #949
2024-12-07 04:21:22 +00:00
ae8a9db27d Fix flake issues (#80). 2024-12-06 16:12:01 -08:00
8979f8918d Organize imports (#80). 2024-12-06 16:05:46 -08:00
eb97708092 Completed tests for LVM (#80). 2024-12-06 16:02:33 -08:00
f2d93b85b4 Lots of LVM unit tests + code formatting (#80). 2024-12-06 13:59:38 -08:00
b999d2dc4d Add some missing test coverage (#80). 2024-12-06 10:27:47 -08:00
7f2e38d061 Fix file permissions (#80). 2024-12-06 09:40:32 -08:00
140fc248b6 Fix LVM end-to-end tests (#80). 2024-12-06 09:39:24 -08:00
ec9e1a8223 LVM hook end-to-end tests, not quite working yet (#80). 2024-12-05 22:46:50 -08:00
03bbe77dd9 Add an end-to-end test for the Btrfs hook using a fake Btrfs binary (#80). 2024-12-05 17:35:44 -08:00
f1c5f11422 Add an end-to-end test for the ZFS hook using a fake ZFS binary (#80). 2024-12-05 11:18:53 -08:00
f8df06fb92 Remove divison by zero (#80). 2024-12-04 20:33:59 -08:00
d95707ff9b Get existing tests passing (#80). 2024-12-04 20:22:59 -08:00
51a7f50e3a Add ZFS snapshot unmount error fix to NEWS (#950). 2024-12-04 15:43:05 -08:00
49b8b693af Don't try to unmount a ZFS snapshot if it's already deleted (#80). 2024-12-04 15:39:04 -08:00
d0e92493f6 Fix broken ZFS tests (#80). 2024-12-04 14:48:13 -08:00
9afdaca985 Before unmounting, remove the snapshot mount path instead of the parent snapshot directory (#80). 2024-12-03 19:19:22 -08:00
cc11ed78e0 Put LVM snapshots into a data structure for convenience (#80). 2024-12-03 19:12:41 -08:00
87f3746881 Fix a ZFS edge case in which the hook tries to unmounted a non-mounted directory (#80). 2024-12-03 15:56:03 -08:00
347a4c3dd5 Fix breakage of ZFS user property auto-backup (#80). 2024-12-03 15:43:50 -08:00
399bb6ef68 Add recent LVM and ZFS work to NEWS (#80). 2024-12-03 12:22:43 -08:00
9b9ecad299 Port the parent directory discovery logic from LVM to Btrfs (#80). 2024-12-03 12:15:34 -08:00
8c4b899a13 Use a namedtuple for logical volume metadata (#80). 2024-12-03 11:12:27 -08:00
9b77de3d66 Port the parent directory discovery logic from LVM to ZFS (#80). 2024-12-03 11:05:45 -08:00
bfeea5d394 Code formatting (#80). 2024-12-03 08:52:05 -08:00
8a6225b7c2 Factor out logic for finding contained source directories in a parent directory (#80). 2024-12-03 08:51:10 -08:00
9aaa3c925f Code formatting (#80). 2024-12-02 21:01:34 -08:00
88fd1ae454 Discover parent/grandparent/etc. logical volumes of source directories (#80). 2024-12-02 20:58:50 -08:00
27305ec2bf Clarify the path rewriting for LVM (but also ZFS + Btrfs) (#80). 2024-12-02 12:01:04 -08:00
4453c2d49c Add LVM logo to integrations docs. 2024-12-02 11:28:57 -08:00
6367a00013 Add snapshot_size option (#80). 2024-12-02 11:09:07 -08:00
cd654cbb57 Fix a few docstring typos (#80). 2024-12-01 21:00:11 -08:00
1e8f73779f Fix typo in schema comment (#80). 2024-12-01 20:25:16 -08:00
27d167b071 LVM snapshots WIP (#80). 2024-12-01 20:13:02 -08:00
cfff6c6855 Btrfs snapshotting (#251).
All checks were successful
build / test (push) Successful in 5m46s
build / docs (push) Successful in 1m38s
Reviewed-on: #946
2024-11-30 19:19:09 +00:00
37efaeae88 Warn if Btrfs is configured but there are no Btrfs subvolumes detected (#251). 2024-11-30 10:55:30 -08:00
0978c669ad A little more Btrfs error handling (#251). 2024-11-30 10:25:01 -08:00
1366269586 Add a couple of missing tests (#251). 2024-11-30 09:44:55 -08:00
a9a0910817 Add Btrfs logo to integrations docs (#251). 2024-11-30 09:36:52 -08:00
5bcc7b60c8 Tests for Btrfs (#251). 2024-11-30 09:32:50 -08:00
84a0552277 Improve Btrfs hook factoring/organization (#251). 2024-11-29 09:36:46 -08:00
d4a02f73b5 Create Btrfs snapshots as read-only (#251). 2024-11-28 22:18:44 -08:00
3f901c0a52 Btrfs hook documentation (#251). 2024-11-28 20:32:12 -08:00
b5b5c1fafa Initial work on a Btrfs hook (#251). 2024-11-28 18:47:15 -08:00
86e5085acc Fix incorrect documentation links to source.
All checks were successful
build / test (push) Successful in 4m5s
build / docs (push) Successful in 1m38s
2024-11-27 08:54:19 -08:00
08a5e8717b Merge branch 'main' of ssh://projects.torsion.org:3022/borgmatic-collective/borgmatic
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
2024-11-27 08:51:00 -08:00
6b2f2b2ac4 Reorganize data source and monitoring hooks to make developing new hooks easier. 2024-11-27 08:50:34 -08:00
a07cf9e699 Revert temporary reversion of 1.9.4.dev0.
All checks were successful
build / test (push) Successful in 4m9s
build / docs (push) Successful in 6s
revert Temporary revert of 1.9.4.dev0 changeset so we can re-build 1.9.3 (which never actually got built).

revert Fix library error when running within a PyInstaller bundle (#926).
2024-11-26 16:20:06 +00:00
bf40b01077 Temporary revert of 1.9.4.dev0 changeset so we can re-build 1.9.3 (which never actually got built).
All checks were successful
build / test (push) Successful in 4m8s
build / docs (push) Successful in 55s
revert Fix library error when running within a PyInstaller bundle (#926).
2024-11-26 16:13:39 +00:00
a5c6a2fe1c Fix library error when running within a PyInstaller bundle (#926).
All checks were successful
build / test (push) Successful in 5m47s
build / docs (push) Successful in 1m39s
2024-11-25 20:14:18 -08:00
82141fe981 Bump version for release. 2024-11-25 07:49:11 -08:00
228a83978d Check docs clarifications.
All checks were successful
build / test (push) Successful in 4m19s
build / docs (push) Successful in 1m38s
2024-11-24 19:40:00 -08:00
638db3770b Clarify how frequent default checks run.
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
2024-11-24 19:38:20 -08:00
98df5c3af2 Fix docs about the relative speeds of different checks (#945).
All checks were successful
build / test (push) Successful in 4m9s
build / docs (push) Successful in 1m2s
Reviewed-on: #945
2024-11-25 03:23:39 +00:00
b0e906c0e7 NEWS clarifications.
All checks were successful
build / test (push) Successful in 4m9s
build / docs (push) Successful in 59s
2024-11-24 19:05:11 -08:00
e8dccbf1c1 Promote the "spot" check from a beta feature to stable.
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
2024-11-24 19:03:05 -08:00
4a997bc234 Add rclone to the integrations.
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
2024-11-24 18:59:21 -08:00
3197178b3d Fix flake errors.
All checks were successful
build / test (push) Successful in 4m10s
build / docs (push) Successful in 1m9s
2024-11-24 16:32:48 -08:00
5e618154d0 Clarify error message.
Some checks failed
build / test (push) Failing after 1m50s
build / docs (push) Has been skipped
2024-11-24 16:18:29 -08:00
84f611ae4f Require the runtime directory to be an absolute path.
Some checks failed
build / test (push) Failing after 1m51s
build / docs (push) Has been skipped
2024-11-24 16:15:19 -08:00
5dc8450c8e Adding missing bootstrap files. 2024-11-24 16:15:12 -08:00
689643e5fa Move bootstrap manifest file creation into a hook so it can actually clean up after itself.
Some checks failed
build / test (push) Failing after 1m9s
build / docs (push) Has been skipped
2024-11-24 16:00:33 -08:00
0a3d87eaea docs: repository check means full CRC check -> slow
Ref: https://borgbackup.readthedocs.io/en/stable/usage/check.html#description
2024-11-24 18:04:58 +01:00
b45b62cd38 Don't recursively snapshot ZFS datasets, since we're not mounting them recursively (#261).
All checks were successful
build / test (push) Successful in 4m9s
build / docs (push) Successful in 56s
2024-11-23 22:37:46 -08:00
8de7094691 ZFS snapshots (#261).
All checks were successful
build / test (push) Successful in 6m1s
build / docs (push) Successful in 1m40s
Reviewed-on: #944
2024-11-24 04:42:19 +00:00
8c7e68305e A few clarifications to the ZFS docs (#261). 2024-11-23 20:41:43 -08:00
65a323433c Add comment (#261). 2024-11-23 20:12:40 -08:00
b5a3589471 A little more error handling (#261). 2024-11-23 18:09:59 -08:00
f4a736bdfe Deduplicate directories again after hooks have their way with them (#261). 2024-11-23 14:33:41 -08:00
eab0ec15ef Expand ZFS NEWS entry (#261). 2024-11-23 11:46:39 -08:00
c65aa24001 Add test coverage for ZFS hook (#261). 2024-11-23 10:50:58 -08:00
5a24bf2037 Get tests passing (#261). 2024-11-22 20:16:18 -08:00
324dbc3a79 Swallow temporary directory removal errors (#261). 2024-11-22 10:56:07 -08:00
9fe7db320a Consider ZFS hook as a beta feature (#261). 2024-11-22 09:53:46 -08:00
4d19596616 Add ZFS documentation (#261). 2024-11-22 08:33:24 -08:00
5cec2bf3d9 Don't unmount directories that don't exist. 2024-11-21 22:16:05 -08:00
06e0f98fd8 More refactoring for better organization of ZFS hook (#261). 2024-11-21 22:09:18 -08:00
87f36caf8d Factoring out some utility functions (#261). 2024-11-21 20:17:57 -08:00
ab7acceff6 Unmount and remove mounted snapshot directories, not just for the current process but for previous borgmatic runs as well (#261). 2024-11-21 19:09:30 -08:00
1b2b0c3020 Update out-of-date ZFS hook comments (#261). 2024-11-21 16:49:25 -08:00
289d178581 Also support discovery of ZFS datasets tagged with a borgmatic-specific user property (#261). 2024-11-21 16:45:44 -08:00
1e7f6d9f41 ZFS hook support for borgmatic's --dry-run (#261). 2024-11-21 11:55:45 -08:00
d0c90389fb Remove ZFS "enabled" option and fix override command options. 2024-11-21 10:52:00 -08:00
f9e920dce9 Prevent ZFS snapshots from ending up in the Borg archive twice (#261). 2024-11-21 10:23:27 -08:00
0ed52bbc4a Proceed gracefully in ZFS data source removal if ZFS isn't installed (#261). 2024-11-21 08:59:59 -08:00
da8278b566 Use os.path.normpath() instead of custom list comprehension (#261). 2024-11-21 08:36:15 -08:00
2af3522902 Fix broken check action (#261). 2024-11-21 08:32:02 -08:00
5e4784991a Comment tweaks and additional TODOs (#261). 2024-11-20 22:33:23 -08:00
ab43ef00ce ZFS snapshots WIP (#261). 2024-11-20 22:21:27 -08:00
47a8a95b29 Test path fix for finding schema file.
All checks were successful
build / test (push) Successful in 4m7s
build / docs (push) Successful in 58s
2024-11-20 08:18:06 -08:00
7c90c04ce0 Add a "--deleted" flag to the "repo-list" action (Borg 2 only).
All checks were successful
build / test (push) Successful in 5m49s
build / docs (push) Successful in 1m39s
2024-11-19 22:33:15 -08:00
97305cc3ce Fix broken tests when NO_COLOR=1 is set (#943).
All checks were successful
build / test (push) Successful in 4m7s
build / docs (push) Successful in 56s
2024-11-19 08:48:21 -08:00
4985b805b4 Bump version for release. 2024-11-18 20:40:51 -08:00
d09b4c72a9 Fix a few remaining Pushover issues from the PR.
All checks were successful
build / test (push) Successful in 5m45s
build / docs (push) Successful in 1m39s
2024-11-18 20:32:17 -08:00
9807549f88 Add a Pushover monitoring hook.
Merge pull request #86 from tony1661/pushover-branch.
2024-11-18 20:17:28 -08:00
30c821120e Fix borgmatic ignoring the "BORG_RELOCATED_REPO_ACCESS_IS_OK" and "BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK" environment variables (#939).
All checks were successful
build / test (push) Successful in 4m5s
build / docs (push) Successful in 55s
2024-11-18 09:46:52 -08:00
13884bd448 Apply the "umask" option to all relevant actions, not just some of them (#441).
All checks were successful
build / test (push) Successful in 4m5s
build / docs (push) Successful in 56s
2024-11-18 09:07:29 -08:00
6bce4c4a0d changed version release to 1.9.2 2024-11-18 07:56:00 -05:00
25572c98d7 better fuction name 2024-11-18 07:52:19 -05:00
dab0dfcb32 added test for value error 2024-11-18 07:49:53 -05:00
851c454ef0 Remove the restriction that the "extract" and "mount" actions must match a single repository (#722).
All checks were successful
build / test (push) Successful in 5m47s
build / docs (push) Successful in 1m40s
2024-11-17 21:39:59 -08:00
c7a0cebaf7 Add a documentation link to NEWS (#934).
All checks were successful
build / test (push) Successful in 4m5s
build / docs (push) Successful in 56s
2024-11-17 12:46:58 -08:00
76cfeda290 Update the logic that probes for the borgmatic runtime directory to support more platforms and use cases (#934).
All checks were successful
build / test (push) Successful in 5m45s
build / docs (push) Successful in 1m40s
Reviewed-on: #937
2024-11-17 19:57:09 +00:00
afdf831c59 Fix broken restore/bootstrap when using Borg 1.2 and a randomly named temporary directory (#934). 2024-11-17 11:55:10 -08:00
9ac3087304 Before creating a temp file in a directory, make sure the directory exists (#934). 2024-11-17 10:30:17 -08:00
7cca83b698 Log the path of the borgmatic runtime directory used (#934). 2024-11-17 10:15:58 -08:00
4b5df7117a Fix documentation type (#934). 2024-11-17 09:01:58 -08:00
57decfa4db Document the fact that the config bootstrap feature writes to the runtime directory (#934). 2024-11-16 16:45:49 -08:00
b80f60a731 Create the borgmatic runtime directory if it doesn't exist (#934). 2024-11-16 16:03:18 -08:00
8f5ea95348 Fix use of borgmatic runtime directory in the restore action (#934). 2024-11-16 12:19:20 -08:00
b0cad58d6c Add a dash to the prefix of the randomly named temporary directory to improve readability (#937). 2024-11-16 11:26:24 -08:00
073d6bddf6 Fix outdated comment (#934). 2024-11-16 07:26:23 -08:00
810b65589f Documentation for runtime/state directory changes (#934). 2024-11-15 22:23:49 -08:00
295bfb0c57 Update the logic that probes for the borgmatic streaming database dump, bootstrap metadata, and check state directories to support more platforms and use cases (#934). 2024-11-15 18:15:32 -08:00
5f3d4f9b03 final fix for true/false and 1/0 2024-11-13 15:27:25 -05:00
5321301708 fix for true/false to 1/0 2024-11-13 15:23:47 -05:00
a939a66fb4 raise ValueError on priprity 2 with retry or expire 2024-11-13 15:20:52 -05:00
c0721a8cad Fix misleading example for user_runtime_directory.
All checks were successful
build / test (push) Successful in 5m45s
build / docs (push) Successful in 1m40s
2024-11-13 11:17:40 -08:00
ea47704d86 added missing tests to get 100% test coverage 2024-11-13 12:09:25 -05:00
61e4eeff6c converted html to a boolean and updated documentation and schema 2024-11-13 11:52:08 -05:00
3ab4b45041 added test for early exit when state is not in config 2024-11-13 09:07:47 -05:00
4e1f256b48 added dryrun test case with minimum config 2024-11-12 10:15:19 -05:00
96bb402837 fix test 2 2024-11-12 10:10:13 -05:00
97949266b3 fix test 2024-11-12 10:09:23 -05:00
e69d2385fc better name for test 2024-11-12 10:08:13 -05:00
6d9340ebb2 better comment blocks 2024-11-12 10:05:57 -05:00
0441e79b41 "fail" -> "fails" 2024-11-12 10:00:34 -05:00
b1af304125 better data dict creation 2024-11-12 09:59:02 -05:00
eb8f7e0329 better description for expire and retry 2024-11-12 09:55:07 -05:00
bf978f2db4 Fix missing build backend setting in pyproject.toml to allow Fedora builds (#932).
All checks were successful
build / test (push) Successful in 4m3s
build / docs (push) Successful in 56s
2024-11-10 17:09:10 -08:00
ef66349674 small fixed for some failing tests 2024-11-08 20:02:29 -05:00
51b885e7db added global constant for priority 2024-11-08 19:49:23 -05:00
1781787305 better schema description for retry and expire 2024-11-08 19:43:40 -05:00
46ebb0cebb removed redundant code 2024-11-08 18:45:46 -05:00
3e0fa57860 removed tests that are not needed 2024-11-08 17:44:27 -05:00
59f8722e05 better spacing for comments 2024-11-08 17:42:46 -05:00
4ba42e8905 better wording. Added 'by default' 2024-11-08 17:41:18 -05:00
3b79482b24 better wording 2024-11-08 17:38:58 -05:00
7eb19cb0a7 added period 2024-11-08 17:38:20 -05:00
a4fabb8521 fix version 2024-11-08 17:37:26 -05:00
85ea8f4f45 fix 10min in seconds 2024-11-08 15:03:38 -05:00
290559116d better logic for priority 2024-11-08 15:01:28 -05:00
72b27b0858 better message description in schema 2024-11-08 14:57:44 -05:00
0fdee067c7 double space fix 2024-11-08 14:45:36 -05:00
0dca5eeafc fix title wordwrap 2024-11-08 14:09:03 -05:00
02ce3ba190 fix url_title word wrap 2024-11-08 14:07:49 -05:00
dc78bf4d6b fix TTL wordwrap 2024-11-08 14:06:39 -05:00
4b7fbce291 fix sound word wrap 2024-11-08 14:05:27 -05:00
1817b9a9ea fix wordwrap for html 2024-11-08 13:50:22 -05:00
009055c61a device description rewrap 2024-11-08 13:48:21 -05:00
54884da8fa priority word wrap 2024-11-08 13:46:19 -05:00
1177385e08 fix expire description 2024-11-08 13:44:12 -05:00
a45ba8553c removed duplicate type:object 2024-11-08 13:42:19 -05:00
d7d6e30178 moved checks from hook to schema 2024-11-08 13:40:23 -05:00
94db527500 finalized support for Pushover 2024-10-30 15:43:06 -04:00
2849f54932 initial pushover commit 2024-10-30 11:25:26 -04:00
422 changed files with 45468 additions and 14485 deletions

3
.bandit Normal file
View File

@@ -0,0 +1,3 @@
[bandit]
exclude=tests
skips=S105,S404

View File

@@ -21,7 +21,7 @@ module.exports = function(eleventyConfig) {
if (process.env.NODE_ENV == "production") {
return link;
}
return link.replace('https://torsion.org/borgmatic/', 'http://localhost:8080/');
return link.replace('https://torsion.org/', 'http://localhost:8080/');
}
};
let markdownItAnchorOptions = {
@@ -44,7 +44,7 @@ module.exports = function(eleventyConfig) {
templateFormats: [
"md",
"txt"
]
],
}
};

View File

@@ -0,0 +1,4 @@
---
name: "Pull Request"
about: "Pull Request"
---

View File

@@ -3,6 +3,8 @@ run-name: ${{ gitea.actor }} is building
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
@@ -15,6 +17,7 @@ jobs:
docs:
needs: [test]
runs-on: host
if: gitea.event_name == 'push'
env:
IMAGE_NAME: projects.torsion.org/borgmatic-collective/borgmatic:docs
@@ -26,5 +29,3 @@ jobs:
PASSWORD: "${{ secrets.REGISTRY_PASSWORD }}"
- run: podman build --tag "$IMAGE_NAME" --file docs/Dockerfile --storage-opt "overlay.mount_program=/usr/bin/fuse-overlayfs" .
- run: podman push "$IMAGE_NAME"
- run: scripts/export-docs-from-image
- run: curl --user "${{ secrets.REGISTRY_USERNAME }}:${{ secrets.REGISTRY_PASSWORD }}" --upload-file borgmatic-docs.tar.gz https://projects.torsion.org/api/packages/borgmatic-collective/generic/borgmatic-docs/$(head --lines=1 NEWS)/borgmatic-docs.tar.gz

10
.github/pull_request_template.md vendored Normal file
View File

@@ -0,0 +1,10 @@
## Hold up, GitHub users
Thanks for your contribution!
Unfortunately, we don't use GitHub pull requests to manage code contributions to this repository (and GitHub doesn't have any way to disable pull requests entirely). Instead, please see:
https://torsion.org/borgmatic/#contributing
... which provides full instructions on how to submit pull requests. You can even use your GitHub account to login.

View File

@@ -1,2 +1,7 @@
# This file only applies to the source dist tarball, not the built wheel.
include borgmatic/config/schema.yaml
graft sample/systemd
graft docs
graft sample
graft scripts
graft tests
global-exclude *.py[co]

406
NEWS
View File

@@ -1,3 +1,403 @@
2.0.13.dev0
* #1192: Fix for over-aggressive deduplication of source directories that contain the borgmatic
runtime directory, potentially resulting in data loss (data not getting backed up) when
snapshotting these source directories.
* #1192, #1163: Document potential interactions between security settings in borgmatic's sample
systemd service file and the ZFS, LVM, and Btrfs hooks.
* #1193: In the documentation for the MariaDB/MySQL database hooks, clarify how to set custom
command-line flags for database commands.
* #1194: Fix for an incorrect diff command shown when running the "generate config" action with a
source configuration file.
* #1195: Fix a regression in the ZFS, LVM, and Btrfs hooks in which snapshotted paths ignored
global excludes.
* Update the sample systemd timer with a shorter random delay when catching up on a missed run.
2.0.12
* #1127: Fix for the database hooks not respecting the "working_directory" option.
* #1181: Add an "ask_for_password" option to the KeePassXC credential hook for disabling
KeePassXC's password prompt, e.g. if you're only using a key file to decrypt your database.
* #1184: Fix the fish shell completion's detection of version mismatches.
* #1186: Fix a regression in the Btrfs hook in which subvolume snapshots didn't get cleaned up
until the start of the next borgmatic run.
* In the SQLite database hook, run SQLite such that it exits upon encountering an error instead of,
you know, not doing that.
* Add documentation on repositories, including SSH, Rclone, S3, and B2:
https://torsion.org/borgmatic/reference/configuration/repositories/
* Improve documentation search results for individual configuration options.
* Add borgmatic release artifacts (wheel and tarball) to each release on the releases page:
https://projects.torsion.org/borgmatic-collective/borgmatic/releases
* Move the tarball of borgmatic's HTML documentation from the packages page to the releases page.
2.0.11
* #957: Document borgmatic's limitations around parallelism—both its own and Borg's. See the
documentation for more information:
https://torsion.org/borgmatic/how-to/make-per-application-backups/#limitations
* #1165: Fix for when the systemd service directories (RuntimeDirectory and StateDirectory) each
contain multiple paths.
* #1168: Fix for the "list", "info", and "delete" options in "extra_borg_options" being ignored
when "--archive" is omitted with Borg 1.x.
* #1169: Fix for a regression in the ZFS, LVM, and Btrfs hooks in which partial excludes of
snapshot paths were ignored.
* #1170: Fix for an inconsistent log level for Borg's last output line before exiting.
* #1172: Add an "environment" option to the Sentry monitoring hook.
* #1176: Fix the "--repository" flag not applying to command hooks.
* Add a "rename" option to "extra_borg_options" to support passing arbitrary flags to "borg
rename".
* Add documentation on patterns and excludes:
https://torsion.org/borgmatic/reference/configuration/patterns-and-excludes/
* Drop support for Python 3.9, which has been end-of-lifed.
2.0.10
* #427: Expand the "extra_borg_options" option to support passing arbitrary Borg flags to every
Borg sub-command that borgmatic uses. As part of this, deprecate the "init" option under
"borg_extra_options" in favor of "repo_create".
* #942: Factor reference material out of the documentation how-to guides. This means there's now a
whole reference section in the docs! Check it out: https://torsion.org/borgmatic/
* #973: For the MariaDB and MySQL database hooks, add a "skip_names" option to ignore particular
databases when dumping "all".
* #1150: Fix for a runtime directory error when the "create" action is used with the "--log-json"
flag.
* #1150: Fix for a runtime directory error when the configured patterns contain a global exclude.
* #1161: Fix a traceback (TypeError) in the "check" action with Python 3.14.
* #1166: Add a "borg_key_file" option for setting the Borg repository key file path.
* Add documentation search.
* Change the URL of the local documentation development server to be more like the production URL.
2.0.9
* #1105: More accurately collect Btrfs subvolumes to snapshot. As part of this, the Btrfs hook no
longer uses "findmnt" and the "findmnt_command" option is deprecated.
* #1123: Add loading of systemd credentials even when running borgmatic outside of a systemd
service.
* #1149: Add support for Python 3.14.
* #1149: Include automated tests in the source dist tarball uploaded to PyPI.
* #1151: Fix snapshotting in the ZFS, Btrfs, and LVM hooks to play nicely with the Borg 1.4+
"slashdot" hack within source directory paths.
* #1152: Fix a regression in the Loki monitoring hook in which log messages weren't sending.
* #1156: Fix snapshotting in the ZFS, Btrfs, and LVM hooks to snapshot both parent and child
volumes/filesystems instead of just the parent. As part of this fix, borgmatic no longer
deduplicates patterns except for those containing the borgmatic runtime directory.
* Fix a traceback (TypeError) regression in the "spot" check when the "local_path" option isn't
set.
2.0.8
* #1114: Document systemd configuration changes for the ZFS filesystem hook.
* #1116: Add dumping of database containers via their container names, handy for backing up
database containers from the host. See the documentation for more information:
https://torsion.org/borgmatic/docs/how-to/backup-your-databases/#database-client-on-the-host
* #1116: Add optional database labels to make it easier to find your dumps within a Borg archive.
* #1118: Fix a bug in which Borg hangs during database backup when different filesystems are in
use.
* #1122: To prevent the user from inadvertently excluding the "bootstrap" action's manifest, always
error and exit when the borgmatic runtime directory overlaps with the configured excludes.
* #1125: Clarify documentation about ZFS, Btrfs, and LVM snapshotting when a separate
filesystem is mounted in the source directory. (Spoiler: The separate filesystem doesn't get
included in the snapshot.)
* #1126: Create LVM snapshots as read-write to avoid an error when snapshotting ext4 filesystems
with orphaned files that need recovery.
* #1133: Fix the "spot" check to include borgmatic configuration files that were backed up to
support the "bootstrap" action.
* #1136: For all database hooks, record metadata about the dumps contained within an archive.
* #1139: Set "borgmatic" as the user agent when connecting to monitoring services.
* #1146: Fix a broken "create" action and "--archive latest" flag when multiple archives share the
same name with Borg 2.
* Treat configuration file permissions issues as errors instead of warnings.
* When running tests, use Ruff for faster and more comprehensive code linting and formatting,
replacing Flake8, Black, isort, etc.
* Switch from pipx to uv for installing development tools, and added tox-uv for speeding up test
environment creation. See the developer documentation for more information:
https://torsion.org/borgmatic/docs/how-to/develop-on-borgmatic/
2.0.7
* #1032: Fix a bug in which a Borg archive gets created even when a database hook fails.
* #1043: Support Btrfs subvolume paths in "source_directories" even when the subvolume is mounted
elsewhere.
* #1048: Ignore Btrfs subvolumes whose read-only status can't be determined.
* #1083: Add "debug_passphrase"/"display_passphrase" options and a "{unixtime}" placeholder in
support of Borg 2 features.
* #1099: Clarify documentation on command hooks order of execution.
* #1100: Fix a bug in which "borg --version" failing isn't considered a "fail" state in a command
hook.
* #1108: Fix a bug in which quoted "extra_borg_options" values containing spaces are passed to Borg
incorrectly.
* #1108: Add a "--comment" flag to the "create" action for creating an archive with a comment.
* Use the Bandit security analysis tool when running tests.
* SECURITY: Add timeouts to all monitoring hooks to prevent hangs on network requests, e.g. due to
a compromised monitoring server holding requests open.
* SECURITY: For the "spot" check, use a more secure source of randomness when selecting paths to
check.
2.0.6
* #1068: Fix a warning from LVM about leaked file descriptors.
* #1086: Fix for the "spot" check breaking when the "--progress" flag is used.
* #1089: Fix for the "spot" check erroring when a checksum command errors.
* #1091: Fix for the "config generate" action generating invalid configuration when upgrading
deprecated command hooks.
* #1093: Fix for the LVM hook erroring when the "--dry-run" flag is used.
* #1094: Fix incorrect documentation about customizing Borg exit codes:
https://torsion.org/borgmatic/docs/how-to/customize-warnings-and-errors/
* #1095: Fix for the "spot" check's "xxh64sum_command" option erroring on commands containing
spaces.
* Add support for Borg 2's "s3:" and "b2:" repository URLs, so you can backup to S3 or B2 cloud
storage services even without using Rclone.
* During the "spot" check, truncate log messages containing many file paths.
2.0.5
* #1033: Add a "password_transport" option to the MariaDB and MySQL database hooks for customizing
how borgmatic transmits passwords to the database client.
* #1078: Add "keep_3monthly" and "keep_13weekly" options for customizing "prune" action archive
retention.
* #1078: Add a "use_chunks_archive" option for controlling whether Borg uses its chunks cache
directory.
* #1078: For the "compact" action, pass "--dry-run" through to Borg.
* #1085: Fix a regression in which the default monitoring verbosity is 0 (warnings only) instead of
1 (info about steps borgmatic is taking). This prevented logs from showing up in monitoring
services like Healthchecks unless you had an explicit monitoring verbosity set.
* Move Mastodon social hosting from Fosstodon to FLOSS.social: https://floss.social/@borgmatic
* The borgmatic project no longer accepts pull requests on GitHub. But see
https://torsion.org/borgmatic/#contributing for how you can still submit pull requests. You can
even use your GitHub account to login.
2.0.4
* #1072: Fix path rewriting for non-root patterns in the ZFS, Btrfs, and LVM hooks.
* #1073: Clarify the documentation about when an "after: error" command hook runs and how it
differs from other hooks:
https://torsion.org/borgmatic/docs/how-to/add-preparation-and-cleanup-steps-to-backups/
* #1075: Fix an incorrect warning about Borg placeholders being unsupported in a command hook.
* #1080: If the exact same "everything" command hook is present in multiple configuration files,
only run it once.
2.0.3
* #1065: Fix a regression in monitoring hooks in which an error pinged the finish state instead of
the fail state.
* #1066: Add a "states" option to command hooks, so you can optionally skip an "after" hook if
borgmatic encounters an error.
* #1071: Fix an error in the LVM hook when removing a snapshot directory.
2.0.2
* #1035: Document potential performance issues and workarounds with the ZFS, Btrfs, and LVM hooks:
https://torsion.org/borgmatic/docs/how-to/snapshot-your-filesystems/
* #1053: Display a nicer error message when the "recreate" action encounters an archive that
already exists.
* #1059: Fix a regression in which soft failure exit codes in command hooks were not respected.
* #1060: Fix action command hooks getting run too many times when multiple borgmatic actions are
executed (implicitly or explicitly).
* #1060: Don't run action command hooks for actions listed in the "skip_actions" option.
* #1062: Fix a regression that broke environment variable interpolation.
* #1063: List the configured "when" action names in the log entries for command hooks.
2.0.1
* #1057: Fix argument parsing to avoid using Python 3.12+ string features. Now borgmatic will
work with Python 3.9, 3.10, and 3.11 again.
2.0.0
* TL;DR: More flexible, completely revamped command hooks. All configuration options settable on
the command-line. New configuration options for many command-line flags (including verbosity!).
New "key import" and "recreate" actions. Almost everything is backwards compatible—but mind those
deprecation warnings!
* #262: Add a "default_actions" option that supports disabling default actions when borgmatic is
run without any command-line arguments.
* #303: Deprecate the "--override" flag in favor of direct command-line flags for every borgmatic
configuration option. See the documentation for more information:
https://torsion.org/borgmatic/docs/how-to/make-per-application-backups/#configuration-overrides
* #303: Add configuration options that serve as defaults for some (but not all) command-line
action flags. For example, each entry in "repositories:" now has an "encryption" option that
applies to the "repo-create" action, serving as a default for the "--encryption" flag. See the
documentation for more information: https://torsion.org/borgmatic/docs/reference/configuration/
* #345: Add a "key import" action to import a repository key from backup.
* #422: Add home directory expansion to file-based and KeePassXC credential hooks.
* #610: Add a "recreate" action for recreating archives, for instance for retroactively excluding
particular files from existing archives.
* #790, #821: Deprecate all "before_*", "after_*" and "on_error" command hooks in favor of more
flexible "commands:". See the documentation for more information:
https://torsion.org/borgmatic/docs/how-to/add-preparation-and-cleanup-steps-to-backups/
* #790: BREAKING: For both new and deprecated command hooks, run a configured "after" hook even if
an error occurs first. This allows you to perform cleanup steps that correspond to "before"
preparation commands—even when something goes wrong.
* #790: BREAKING: Run all command hooks (both new and deprecated) respecting the
"working_directory" option if configured, meaning that hook commands are run in that directory.
* #793: Add configuration options for all verbosity and logging flags, so you don't have to set
them on the command-line.
* #836: Add a custom command option for the SQLite hook.
* #837: Add custom command options for the MongoDB hook.
* #1010: When using Borg 2, don't pass the "--stats" flag to "borg prune".
* #1020: Document a database use case involving a temporary database client container:
https://torsion.org/borgmatic/docs/how-to/backup-your-databases/#database-containers
* #1037: Fix an error with the "extract" action when both a remote repository and a
"working_directory" are used.
* #1044: Fix an error in the systemd credential hook when the credential name contains a "."
character.
* #1047: Add "key-file" and "yubikey" options to the KeePassXC credential hook.
* #1048: Fix a "no such file or directory" error in ZFS, Btrfs, and LVM hooks with nested
directories that reside on separate devices/filesystems.
* #1050: Fix a failure in the "spot" check when the archive contains a symlink.
* #1051: Add configuration filename to the "Successfully ran configuration file" log message.
1.9.14
* #409: With the PagerDuty monitoring hook, send borgmatic logs to PagerDuty so they show up in the
incident UI. See the documentation for more information:
https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/#pagerduty-hook
* #936: Clarify Zabbix monitoring hook documentation about creating items:
https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/#zabbix-hook
* #1017: Fix a regression in which some MariaDB/MySQL passwords were not escaped correctly.
* #1021: Fix a regression in which the "exclude_patterns" option didn't expand "~" (the user's
home directory). This fix means that all "patterns" and "patterns_from" also now expand "~".
* #1023: Fix an error in the Btrfs hook when attempting to snapshot a read-only subvolume. Now,
read-only subvolumes are ignored since Btrfs can't actually snapshot them.
1.9.13
* #975: Add a "compression" option to the PostgreSQL database hook.
* #1001: Fix a ZFS error during snapshot cleanup.
* #1003: In the Zabbix monitoring hook, support Zabbix 7.2's authentication changes.
* #1009: Send database passwords to MariaDB and MySQL via anonymous pipe, which is more secure than
using an environment variable.
* #1013: Send database passwords to MongoDB via anonymous pipe, which is more secure than using
"--password" on the command-line!
* #1015: When ctrl-C is pressed, more strongly encourage Borg to actually exit.
* Add a "verify_tls" option to the Uptime Kuma monitoring hook for disabling TLS verification.
* Add "tls" options to the MariaDB and MySQL database hooks to enable or disable TLS encryption
between client and server.
1.9.12
* #1005: Fix the credential hooks to avoid using Python 3.12+ string features. Now borgmatic will
work with Python 3.9, 3.10, and 3.11 again.
1.9.11
* #795: Add credential loading from file, KeePassXC, and Docker/Podman secrets. See the
documentation for more information:
https://torsion.org/borgmatic/docs/how-to/provide-your-passwords/
* #996: Fix the "create" action to omit the repository label prefix from Borg's output when
databases are enabled.
* #998: Send the "encryption_passphrase" option to Borg via an anonymous pipe, which is more secure
than using an environment variable.
* #999: Fix a runtime directory error from a conflict between "extra_borg_options" and special file
detection.
* #1001: For the ZFS, Btrfs, and LVM hooks, only make snapshots for root patterns that come from
a borgmatic configuration option (e.g. "source_directories")—not from other hooks within
borgmatic.
* #1001: Fix a ZFS/LVM error due to colliding snapshot mount points for nested datasets or logical
volumes.
* #1001: Don't try to snapshot ZFS datasets that have the "canmount=off" property.
* Fix another error in the Btrfs hook when a subvolume mounted at "/" is configured in borgmatic's
source directories.
1.9.10
* #966: Add a "{credential ...}" syntax for loading systemd credentials into borgmatic
configuration files. See the documentation for more information:
https://torsion.org/borgmatic/docs/how-to/provide-your-passwords/
* #987: Fix a "list" action error when the "encryption_passcommand" option is set.
* #987: When both "encryption_passcommand" and "encryption_passphrase" are configured, prefer
"encryption_passphrase" even if it's an empty value.
* #988: With the "max_duration" option or the "--max-duration" flag, run the archives and
repository checks separately so they don't interfere with one another. Previously, borgmatic
refused to run checks in this situation.
* #989: Fix the log message code to avoid using Python 3.10+ logging features. Now borgmatic will
work with Python 3.9 again.
* Capture and delay any log records produced before logging is fully configured, so early log
records don't get lost.
* Add support for Python 3.13.
1.9.9
* #635: Log the repository path or label on every relevant log message, not just some logs.
* #961: When the "encryption_passcommand" option is set, call the command once from borgmatic to
collect the encryption passphrase and then pass it to Borg multiple times. See the documentation
for more information: https://torsion.org/borgmatic/docs/how-to/provide-your-passwords/
* #981: Fix a "spot" check file count delta error.
* #982: Fix for borgmatic "exclude_patterns" and "exclude_from" recursing into excluded
subdirectories.
* #983: Fix the Btrfs hook to support subvolumes with names like "@home" different from their
mount points.
* #985: Change the default value for the "--original-hostname" flag from "localhost" to no host
specified. This way, the "restore" action works without a hostname if there's a single matching
database dump.
1.9.8
* #979: Fix root patterns so they don't have an invalid "sh:" prefix before getting passed to Borg.
* Expand the recent contributors documentation section to include ticket submitters—not just code
contributors—because there are multiple ways to contribute to the project! See:
https://torsion.org/borgmatic/#recent-contributors
1.9.7
* #855: Add a Sentry monitoring hook. See the documentation for more information:
https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/#sentry-hook
* #968: Fix for a "spot" check error when a filename in the most recent archive contains a newline.
* #970: Fix for an error when there's a blank line in the configured patterns or excludes.
* #971: Fix for "exclude_from" files being completely ignored.
* #977: Fix for "exclude_patterns" and "exclude_from" not supporting explicit pattern styles (e.g.,
"sh:" or "re:").
1.9.6
* #959: Fix an error in the Btrfs hook when a subvolume mounted at "/" is configured in borgmatic's
source directories.
* #960: Fix for archives storing relative source directory paths such that they contain the working
directory.
* #960: Fix the "spot" check to support relative source directory paths.
* #962: For the ZFS, Btrfs, and LVM hooks, perform path rewriting for excludes and patterns in
addition to the existing source directories rewriting.
* #962: Under the hood, merge all configured source directories, excludes, and patterns into a
unified temporary patterns file for passing to Borg. The borgmatic configuration options remain
unchanged.
* #962: For the LVM hook, add support for nested logical volumes.
* #965: Fix a borgmatic runtime directory error when running the "spot" check with a database hook
enabled.
* #969: Fix the "restore" action to work on database dumps without a port when a default port is
present in configuration.
* Fix the "spot" check to no longer consider pipe files within an archive for file comparisons.
* Fix the "spot" check to have a nicer error when there are no source paths to compare.
* Fix auto-excluding of special files (when databases are configured) to support relative source
directory paths.
* Drop support for Python 3.8, which has been end-of-lifed.
1.9.5
* #418: Backup and restore databases that have the same name but with different ports, hostnames,
or hooks.
* #947: To avoid a hang in the database hooks, error and exit when the borgmatic runtime
directory overlaps with the configured excludes.
* #954: Fix a findmnt command error in the Btrfs hook by switching to parsing JSON output.
* #956: Fix the printing of a color reset code even when color is disabled.
* #958: Drop colorama as a library dependency.
* When the ZFS, Btrfs, or LVM hooks aren't configured, don't try to cleanup snapshots for them.
1.9.4
* #80 (beta): Add an LVM hook for snapshotting and backing up LVM logical volumes. See the
documentation for more information:
https://torsion.org/borgmatic/docs/how-to/snapshot-your-filesystems/
* #251 (beta): Add a Btrfs hook for snapshotting and backing up Btrfs subvolumes. See the
documentation for more information:
https://torsion.org/borgmatic/docs/how-to/snapshot-your-filesystems/
* #926: Fix a library error when running within a PyInstaller bundle.
* #950: Fix a snapshot unmount error in the ZFS hook when using nested datasets.
* Update the ZFS hook to discover and snapshot ZFS datasets even if they are parent/grandparent
directories of your source directories.
* Reorganize data source and monitoring hooks to make developing new hooks easier.
1.9.3
* #261 (beta): Add a ZFS hook for snapshotting and backing up ZFS datasets. See the documentation
for more information: https://torsion.org/borgmatic/docs/how-to/snapshot-your-filesystems/
* Remove any temporary copies of the manifest file created in support of the "bootstrap" action.
* Deprecate the "store_config_files" option at the global scope and move it under the "bootstrap"
hook. See the documentation for more information:
https://torsion.org/borgmatic/docs/how-to/extract-a-backup/#extract-the-configuration-files-used-to-create-an-archive
* Require the runtime directory to be an absolute path.
* Add a "--deleted" flag to the "repo-list" action for listing deleted archives that haven't
yet been compacted (Borg 2 only).
* Promote the "spot" check from a beta feature to stable.
1.9.2
* #441: Apply the "umask" option to all relevant actions, not just some of them.
* #722: Remove the restriction that the "extract" and "mount" actions must match a single
repository. Now they work more like other actions, where each repository is applied in turn.
* #932: Fix the missing build backend setting in pyproject.toml to allow Fedora builds.
* #934: Update the logic that probes for the borgmatic streaming database dump, bootstrap
metadata, and check state directories to support more platforms and use cases. See the
documentation for more information:
https://torsion.org/borgmatic/docs/how-to/backup-your-databases/#runtime-directory
* #934: Add the "RuntimeDirectory" and "StateDirectory" options to the sample systemd service
file to support the new runtime and state directory logic.
* #939: Fix borgmatic ignoring the "BORG_RELOCATED_REPO_ACCESS_IS_OK" and
"BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK" environment variables.
* Add a Pushover monitoring hook. See the documentation for more information:
https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/#pushover-hook
1.9.1
* #928: Fix the user runtime directory location on macOS (and possibly Cygwin).
* #930: Fix an error with the sample systemd service when no credentials are configured.
@@ -71,7 +471,7 @@
paths when a "working_directory" is set.
* #906: Add documentation details for how to run custom database dump commands using binaries from
running containers:
https://torsion.org/borgmatic/docs/how-to/backup-your-databases/#containers
https://torsion.org/borgmatic/docs/how-to/backup-your-databases/#database-containers
* Fix a regression in which the "color" option had no effect.
* Add a recent contributors section to the documentation, because credit where credit's due! See:
https://torsion.org/borgmatic/#recent-contributors
@@ -127,7 +527,7 @@
* Fix handling of the NO_COLOR environment variable to ignore an empty value.
* Add documentation about backing up containerized databases by configuring borgmatic to exec into
a container to run a dump command:
https://torsion.org/borgmatic/docs/how-to/backup-your-databases/#containers
https://torsion.org/borgmatic/docs/how-to/backup-your-databases/#database-containers
1.8.9
* #311: Add custom dump/restore command options for MySQL and MariaDB.
@@ -397,7 +797,7 @@
at the command-line. See the configuration reference for more information:
https://torsion.org/borgmatic/docs/reference/configuration/
* #649: Add documentation on backing up a database running in a container:
https://torsion.org/borgmatic/docs/how-to/backup-your-databases/#containers
https://torsion.org/borgmatic/docs/how-to/backup-your-databases/#database-containers
* #655: Fix error when databases are configured and a source directory doesn't exist.
* Add code style plugins to enforce use of Python f-strings and prevent single-letter variables.
To join in the pedantry, refresh your test environment with "tox --recreate".

View File

@@ -2,10 +2,7 @@
title: borgmatic
permalink: index.html
---
## It's your data. Keep it that way.
<img src="docs/static/borgmatic.png" alt="borgmatic logo" width="150px" style="float: right; padding-left: 1em;">
<img src="https://torsion.org/borgmatic/static/borgmatic.png" alt="borgmatic logo" width="150px" style="float: right; padding-left: 1em;">
borgmatic is simple, configuration-driven backup software for servers and
workstations. Protect your files with client-side encryption. Backup your
@@ -40,8 +37,10 @@ checks:
frequency: 2 weeks
# Custom preparation scripts to run.
before_backup:
- prepare-for-backup.sh
commands:
- before: action
when: [create]
run: [prepare-for-backup.sh]
# Databases to dump and include in backups.
postgresql_databases:
@@ -56,27 +55,47 @@ borgmatic is powered by [Borg Backup](https://www.borgbackup.org/).
## Integrations
<a href="https://www.postgresql.org/"><img src="docs/static/postgresql.png" alt="PostgreSQL" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://www.mysql.com/"><img src="docs/static/mysql.png" alt="MySQL" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://mariadb.com/"><img src="docs/static/mariadb.png" alt="MariaDB" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://www.mongodb.com/"><img src="docs/static/mongodb.png" alt="MongoDB" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://sqlite.org/"><img src="docs/static/sqlite.png" alt="SQLite" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://healthchecks.io/"><img src="docs/static/healthchecks.png" alt="Healthchecks" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://uptime.kuma.pet/"><img src="docs/static/uptimekuma.png" alt="Uptime Kuma" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://cronitor.io/"><img src="docs/static/cronitor.png" alt="Cronitor" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://cronhub.io/"><img src="docs/static/cronhub.png" alt="Cronhub" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://www.pagerduty.com/"><img src="docs/static/pagerduty.png" alt="PagerDuty" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://ntfy.sh/"><img src="docs/static/ntfy.png" alt="ntfy" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://grafana.com/oss/loki/"><img src="docs/static/loki.png" alt="Loki" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://github.com/caronc/apprise/wiki"><img src="docs/static/apprise.png" alt="Apprise" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://www.zabbix.com/"><img src="docs/static/zabbix.png" alt="Zabbix" height="40px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://www.borgbase.com/?utm_source=borgmatic"><img src="docs/static/borgbase.png" alt="BorgBase" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
### Data
<a href="https://www.postgresql.org/"><img src="https://torsion.org/borgmatic/static/postgresql.png" alt="PostgreSQL" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://www.mysql.com/"><img src="https://torsion.org/borgmatic/static/mysql.png" alt="MySQL" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://mariadb.com/"><img src="https://torsion.org/borgmatic/static/mariadb.png" alt="MariaDB" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://www.mongodb.com/"><img src="https://torsion.org/borgmatic/static/mongodb.png" alt="MongoDB" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://sqlite.org/"><img src="https://torsion.org/borgmatic/static/sqlite.png" alt="SQLite" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://openzfs.org/"><img src="https://torsion.org/borgmatic/static/openzfs.png" alt="OpenZFS" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://btrfs.readthedocs.io/"><img src="https://torsion.org/borgmatic/static/btrfs.png" alt="Btrfs" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://sourceware.org/lvm2/"><img src="https://torsion.org/borgmatic/static/lvm.png" alt="LVM" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://rclone.org"><img src="https://torsion.org/borgmatic/static/rclone.png" alt="rclone" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://www.borgbase.com/?utm_source=borgmatic"><img src="https://torsion.org/borgmatic/static/borgbase.png" alt="BorgBase" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
### Monitoring
<a href="https://healthchecks.io/"><img src="https://torsion.org/borgmatic/static/healthchecks.png" alt="Healthchecks" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://uptime.kuma.pet/"><img src="https://torsion.org/borgmatic/static/uptimekuma.png" alt="Uptime Kuma" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://cronitor.io/"><img src="https://torsion.org/borgmatic/static/cronitor.png" alt="Cronitor" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://cronhub.io/"><img src="https://torsion.org/borgmatic/static/cronhub.png" alt="Cronhub" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://www.pagerduty.com/"><img src="https://torsion.org/borgmatic/static/pagerduty.png" alt="PagerDuty" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://www.pushover.net/"><img src="https://torsion.org/borgmatic/static/pushover.png" alt="Pushover" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://ntfy.sh/"><img src="https://torsion.org/borgmatic/static/ntfy.png" alt="ntfy" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://grafana.com/oss/loki/"><img src="https://torsion.org/borgmatic/static/loki.png" alt="Loki" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://github.com/caronc/apprise/wiki"><img src="https://torsion.org/borgmatic/static/apprise.png" alt="Apprise" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://www.zabbix.com/"><img src="https://torsion.org/borgmatic/static/zabbix.png" alt="Zabbix" height="40px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://sentry.io/"><img src="https://torsion.org/borgmatic/static/sentry.png" alt="Sentry" height="40px" style="margin-bottom:20px; margin-right:20px;"></a>
### Credentials
<a href="https://systemd.io/"><img src="https://torsion.org/borgmatic/static/systemd.png" alt="Sentry" height="40px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://www.docker.com/"><img src="https://torsion.org/borgmatic/static/docker.png" alt="Docker" height="40px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://podman.io/"><img src="https://torsion.org/borgmatic/static/podman.png" alt="Podman" height="40px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://keepassxc.org/"><img src="https://torsion.org/borgmatic/static/keepassxc.png" alt="Podman" height="40px" style="margin-bottom:20px; margin-right:20px;"></a>
## Getting started
Your first step is to [install and configure
borgmatic](https://torsion.org/borgmatic/docs/how-to/set-up-backups/).
borgmatic](https://torsion.org/borgmatic/how-to/set-up-backups/).
For additional documentation, check out the links above (left panel on wide screens)
for <a href="https://torsion.org/borgmatic/#documentation">borgmatic how-to and
@@ -110,13 +129,14 @@ first. If you prefer to use an existing GitHub account, you can skip account
creation and [login directly](https://projects.torsion.org/user/login).
Also see the [security
policy](https://torsion.org/borgmatic/docs/security-policy/) for any security
policy](https://torsion.org/borgmatic/security-policy/) for any security
issues.
### Social
Follow [borgmatic on Mastodon](https://fosstodon.org/@borgmatic).
Follow <a rel="me" href="https://floss.social/@borgmatic">borgmatic on
Mastodon</a>.
### Chat
@@ -137,26 +157,30 @@ Other questions or comments? Contact
### Contributing
borgmatic [source code is
available](https://projects.torsion.org/borgmatic-collective/borgmatic) and is also mirrored
on [GitHub](https://github.com/borgmatic-collective/borgmatic) for convenience.
available](https://projects.torsion.org/borgmatic-collective/borgmatic) and also
has a read-only mirror on
[GitHub](https://github.com/borgmatic-collective/borgmatic) for convenience.
borgmatic is licensed under the GNU General Public License version 3 or any
later version.
If you'd like to contribute to borgmatic development, please feel free to
submit a [Pull
Request](https://projects.torsion.org/borgmatic-collective/borgmatic/pulls) or
If you'd like to contribute to borgmatic development, please feel free to submit
a [pull
request](https://projects.torsion.org/borgmatic-collective/borgmatic/pulls) or
open an
[issue](https://projects.torsion.org/borgmatic-collective/borgmatic/issues) to
discuss your idea. Note that you'll need to
[register](https://projects.torsion.org/user/sign_up?invite_code=borgmatic)
first. We also accept Pull Requests on GitHub, if that's more your thing. In
general, contributions are very welcome. We don't bite!
first. 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
how-to](https://torsion.org/borgmatic/how-to/develop-on-borgmatic/) for
info on cloning source code, running tests, etc.
### Recent contributors
{% include borgmatic/contributors.html %}
Thanks to all borgmatic contributors! There are multiple ways to contribute to
this project, so the following includes those who have fixed bugs, contributed
features, *or* filed tickets.
{% include borgmatic/contributors.html %}

View File

@@ -2,7 +2,6 @@ import logging
import borgmatic.borg.borg
import borgmatic.borg.repo_list
import borgmatic.config.validate
logger = logging.getLogger(__name__)
@@ -19,27 +18,22 @@ def run_borg(
'''
Run the "borg" action for the given repository.
'''
if borg_arguments.repository is None or borgmatic.config.validate.repositories_match(
repository, borg_arguments.repository
):
logger.info(
f'{repository.get("label", repository["path"])}: Running arbitrary Borg command'
)
archive_name = borgmatic.borg.repo_list.resolve_archive_name(
repository['path'],
borg_arguments.archive,
config,
local_borg_version,
global_arguments,
local_path,
remote_path,
)
borgmatic.borg.borg.run_arbitrary_borg(
repository['path'],
config,
local_borg_version,
options=borg_arguments.options,
archive=archive_name,
local_path=local_path,
remote_path=remote_path,
)
logger.info('Running arbitrary Borg command')
archive_name = borgmatic.borg.repo_list.resolve_archive_name(
repository['path'],
borg_arguments.archive,
config,
local_borg_version,
global_arguments,
local_path,
remote_path,
)
borgmatic.borg.borg.run_arbitrary_borg(
repository['path'],
config,
local_borg_version,
options=borg_arguments.options,
archive=archive_name,
local_path=local_path,
remote_path=remote_path,
)

View File

@@ -1,7 +1,6 @@
import logging
import borgmatic.borg.break_lock
import borgmatic.config.validate
logger = logging.getLogger(__name__)
@@ -18,17 +17,12 @@ def run_break_lock(
'''
Run the "break-lock" action for the given repository.
'''
if break_lock_arguments.repository is None or borgmatic.config.validate.repositories_match(
repository, break_lock_arguments.repository
):
logger.info(
f'{repository.get("label", repository["path"])}: Breaking repository and cache locks'
)
borgmatic.borg.break_lock.break_lock(
repository['path'],
config,
local_borg_version,
global_arguments,
local_path=local_path,
remote_path=remote_path,
)
logger.info('Breaking repository and cache locks')
borgmatic.borg.break_lock.break_lock(
repository['path'],
config,
local_borg_version,
global_arguments,
local_path=local_path,
remote_path=remote_path,
)

View File

@@ -1,7 +1,6 @@
import logging
import borgmatic.borg.change_passphrase
import borgmatic.config.validate
logger = logging.getLogger(__name__)
@@ -16,23 +15,15 @@ def run_change_passphrase(
remote_path,
):
'''
Run the "key change-passprhase" action for the given repository.
Run the "key change-passphrase" action for the given repository.
'''
if (
change_passphrase_arguments.repository is None
or borgmatic.config.validate.repositories_match(
repository, change_passphrase_arguments.repository
)
):
logger.info(
f'{repository.get("label", repository["path"])}: Changing repository passphrase'
)
borgmatic.borg.change_passphrase.change_passphrase(
repository['path'],
config,
local_borg_version,
change_passphrase_arguments,
global_arguments,
local_path=local_path,
remote_path=remote_path,
)
logger.info('Changing repository passphrase')
borgmatic.borg.change_passphrase.change_passphrase(
repository['path'],
config,
local_borg_version,
change_passphrase_arguments,
global_arguments,
local_path=local_path,
remote_path=remote_path,
)

View File

@@ -1,4 +1,5 @@
import calendar
import contextlib
import datetime
import hashlib
import itertools
@@ -6,17 +7,21 @@ import logging
import os
import pathlib
import random
import shlex
import shutil
import textwrap
import borgmatic.actions.config.bootstrap
import borgmatic.actions.pattern
import borgmatic.borg.check
import borgmatic.borg.create
import borgmatic.borg.environment
import borgmatic.borg.extract
import borgmatic.borg.list
import borgmatic.borg.pattern
import borgmatic.borg.repo_list
import borgmatic.borg.state
import borgmatic.config.paths
import borgmatic.config.validate
import borgmatic.execute
import borgmatic.hooks.command
@@ -52,12 +57,14 @@ def parse_checks(config, only_checks=None):
if 'disabled' in checks:
logger.warning(
'The "disabled" value for the "checks" option is deprecated and will be removed from a future release; use "skip_actions" instead'
'The "disabled" value for the "checks" option is deprecated and will be removed from a future release; use "skip_actions" instead',
)
if len(checks) > 1:
logger.warning(
'Multiple checks are configured, but one of them is "disabled"; not running any checks'
'Multiple checks are configured, but one of them is "disabled"; not running any checks',
)
return ()
return checks
@@ -161,6 +168,7 @@ def filter_checks_on_frequency(
**dict.fromkeys(day for day in days if day != 'weekday'),
**dict.fromkeys(WEEKDAY_DAYS),
}
if 'weekend' in days:
days = {
**dict.fromkeys(day for day in days if day != 'weekend'),
@@ -169,7 +177,7 @@ def filter_checks_on_frequency(
if calendar.day_name[datetime_now().weekday()] not in days:
logger.info(
f"Skipping {check} check due to day of the week; check only runs on {'/'.join(days)} (use --force to check anyway)"
f"Skipping {check} check due to day of the week; check only runs on {'/'.join(day.title() for day in days)} (use --force to check anyway)",
)
filtered_checks.remove(check)
continue
@@ -187,7 +195,7 @@ def filter_checks_on_frequency(
if datetime_now() < check_time + frequency_delta:
remaining = check_time + frequency_delta - datetime_now()
logger.info(
f'Skipping {check} check due to configured frequency; {remaining} until next check (use --force to check anyway)'
f'Skipping {check} check due to configured frequency; {remaining} until next check (use --force to check anyway)',
)
filtered_checks.remove(check)
@@ -213,7 +221,7 @@ def make_check_time_path(config, borg_repository_id, check_type, archives_check_
'''
borgmatic_state_directory = borgmatic.config.paths.get_borgmatic_state_directory(config)
if check_type in ('archives', 'data'):
if check_type in {'archives', 'data'}:
return os.path.join(
borgmatic_state_directory,
'checks',
@@ -237,7 +245,7 @@ def write_check_time(path): # pragma: no cover
logger.debug(f'Writing check time at {path}')
os.makedirs(os.path.dirname(path), mode=0o700, exist_ok=True)
pathlib.Path(path, mode=0o600).touch()
pathlib.Path(path).touch(mode=0o600)
def read_check_time(path):
@@ -248,7 +256,7 @@ def read_check_time(path):
logger.debug(f'Reading check time from {path}')
try:
return datetime.datetime.fromtimestamp(os.stat(path).st_mtime)
return datetime.datetime.fromtimestamp(os.stat(path).st_mtime) # noqa: DTZ006
except FileNotFoundError:
return None
@@ -279,7 +287,7 @@ def probe_for_check_time(config, borg_repository_id, check, archives_check_id):
(
make_check_time_path(config, borg_repository_id, check, archives_check_id),
make_check_time_path(config, borg_repository_id, check),
)
),
)
)
@@ -311,16 +319,17 @@ def upgrade_check_times(config, borg_repository_id):
{borgmatic_state_directory}/checks/1234567890/archives/all
'''
borgmatic_source_checks_path = os.path.join(
borgmatic.config.paths.get_borgmatic_source_directory(config), 'checks'
borgmatic.config.paths.get_borgmatic_source_directory(config),
'checks',
)
borgmatic_state_path = borgmatic.config.paths.get_borgmatic_state_directory(config)
borgmatic_state_checks_path = os.path.join(borgmatic_state_path, 'checks')
if os.path.exists(borgmatic_source_checks_path) and not os.path.exists(
borgmatic_state_checks_path
borgmatic_state_checks_path,
):
logger.debug(
f'Upgrading archives check times directory from {borgmatic_source_checks_path} to {borgmatic_state_checks_path}'
f'Upgrading archives check times directory from {borgmatic_source_checks_path} to {borgmatic_state_checks_path}',
)
os.makedirs(borgmatic_state_path, mode=0o700, exist_ok=True)
shutil.move(borgmatic_source_checks_path, borgmatic_state_checks_path)
@@ -335,54 +344,73 @@ def upgrade_check_times(config, borg_repository_id):
logger.debug(f'Upgrading archives check time file from {old_path} to {new_path}')
try:
with contextlib.suppress(FileNotFoundError):
shutil.move(old_path, temporary_path)
except FileNotFoundError:
pass
os.mkdir(old_path)
shutil.move(temporary_path, new_path)
def collect_spot_check_source_paths(
repository, config, local_borg_version, global_arguments, local_path, remote_path
repository,
config,
local_borg_version,
global_arguments,
local_path,
remote_path,
borgmatic_runtime_directory,
bootstrap_config_paths,
):
'''
Given a repository configuration dict, a configuration dict, the local Borg version, global
arguments as an argparse.Namespace instance, the local Borg path, and the remote Borg path,
collect the source paths that Borg would use in an actual create (but only include files).
arguments as an argparse.Namespace instance, the local Borg path, the remote Borg path, and the
bootstrap configuration paths as read from an archive's manifest, collect the source paths that
Borg would use in an actual create (but only include files). As part of this, include the
bootstrap configuration paths, so that any configuration files included in the archive to
support bootstrapping are also spot checked.
'''
stream_processes = any(
borgmatic.hooks.dispatch.call_hooks(
'use_streaming',
config,
repository['path'],
borgmatic.hooks.dump.DATA_SOURCE_HOOK_NAMES,
).values()
borgmatic.hooks.dispatch.Hook_type.DATA_SOURCE,
).values(),
)
working_directory = borgmatic.config.paths.get_working_directory(config)
(create_flags, create_positional_arguments, pattern_file, exclude_file) = (
borgmatic.borg.create.make_base_create_command(
dry_run=True,
repository_path=repository['path'],
config=config,
config_paths=(),
local_borg_version=local_borg_version,
global_arguments=global_arguments,
borgmatic_runtime_directories=(),
local_path=local_path,
remote_path=remote_path,
list_files=True,
stream_processes=stream_processes,
)
(create_flags, create_positional_arguments, _) = borgmatic.borg.create.make_base_create_command(
dry_run=True,
repository_path=repository['path'],
# Omit "progress" because it interferes with "list_details".
config=dict(
{option: value for option, value in config.items() if option != 'progress'},
list_details=True,
),
patterns=borgmatic.actions.pattern.process_patterns(
borgmatic.actions.pattern.collect_patterns(config)
+ tuple(
borgmatic.borg.pattern.Pattern(
config_path,
source=borgmatic.borg.pattern.Pattern_source.INTERNAL,
)
for config_path in bootstrap_config_paths
),
config,
working_directory,
),
local_borg_version=local_borg_version,
global_arguments=global_arguments,
borgmatic_runtime_directory=borgmatic_runtime_directory,
local_path=local_path,
remote_path=remote_path,
stream_processes=stream_processes,
)
borg_environment = borgmatic.borg.environment.make_environment(config)
working_directory = borgmatic.config.paths.get_working_directory(config)
paths_output = borgmatic.execute.execute_command_and_capture_output(
create_flags + create_positional_arguments,
capture_stderr=True,
extra_environment=borg_environment,
environment=borgmatic.borg.environment.make_environment(config),
working_directory=working_directory,
borg_local_path=local_path,
borg_exit_codes=config.get('borg_exit_codes'),
@@ -390,8 +418,8 @@ def collect_spot_check_source_paths(
paths = tuple(
path_line.split(' ', 1)[1]
for path_line in paths_output.split('\n')
if path_line and path_line.startswith('- ') or path_line.startswith('+ ')
for path_line in paths_output.splitlines()
if path_line and path_line.startswith(('- ', '+ '))
)
return tuple(
@@ -400,19 +428,29 @@ def collect_spot_check_source_paths(
BORG_DIRECTORY_FILE_TYPE = 'd'
BORG_PIPE_FILE_TYPE = 'p'
def collect_spot_check_archive_paths(
repository, archive, config, local_borg_version, global_arguments, local_path, remote_path
repository,
archive,
config,
local_borg_version,
global_arguments,
local_path,
remote_path,
borgmatic_runtime_directory,
):
'''
Given a repository configuration dict, the name of the latest archive, a configuration dict, the
local Borg version, global arguments as an argparse.Namespace instance, the local Borg path, and
the remote Borg path, collect the paths from the given archive (but only include files and
symlinks and exclude borgmatic runtime directories).
local Borg version, global arguments as an argparse.Namespace instance, the local Borg path, the
remote Borg path, and the borgmatic runtime directory, collect the paths from the given archive
(but only include files and symlinks and exclude borgmatic runtime directories).
These paths do not have a leading slash, as that's how Borg stores them. As a result, we don't
know whether they came from absolute or relative source directories.
'''
borgmatic_source_directory = borgmatic.config.paths.get_borgmatic_source_directory(config)
borgmatic_runtime_directory = borgmatic.config.paths.get_borgmatic_runtime_directory(config)
return tuple(
path
@@ -422,19 +460,21 @@ def collect_spot_check_archive_paths(
config,
local_borg_version,
global_arguments,
path_format='{type} /{path}{NL}', # noqa: FS003
path_format='{type} {path}{NUL}',
local_path=local_path,
remote_path=remote_path,
)
for (file_type, path) in (line.split(' ', 1),)
if file_type != BORG_DIRECTORY_FILE_TYPE
if pathlib.Path('/borgmatic') not in pathlib.Path(path).parents
if pathlib.Path(borgmatic_source_directory) not in pathlib.Path(path).parents
if pathlib.Path(borgmatic_runtime_directory) not in pathlib.Path(path).parents
if file_type not in {BORG_DIRECTORY_FILE_TYPE, BORG_PIPE_FILE_TYPE}
if pathlib.Path('borgmatic') not in pathlib.Path(path).parents
if pathlib.Path(borgmatic_source_directory.lstrip(os.path.sep))
not in pathlib.Path(path).parents
if pathlib.Path(borgmatic_runtime_directory.lstrip(os.path.sep))
not in pathlib.Path(path).parents
)
SAMPLE_PATHS_SUBSET_COUNT = 10000
SAMPLE_PATHS_SUBSET_COUNT = 5000
def compare_spot_check_hashes(
@@ -445,31 +485,33 @@ def compare_spot_check_hashes(
global_arguments,
local_path,
remote_path,
log_label,
source_paths,
):
'''
Given a repository configuration dict, the name of the latest archive, a configuration dict, the
local Borg version, global arguments as an argparse.Namespace instance, the local Borg path, the
remote Borg path, a log label, and spot check source paths, compare the hashes for a sampling of
the source paths with hashes from corresponding paths in the given archive. Return a sequence of
the paths that fail that hash comparison.
remote Borg path, and spot check source paths, compare the hashes for a sampling of the source
paths with hashes from corresponding paths in the given archive. Return a sequence of the paths
that fail that hash comparison.
'''
# Based on the configured sample percentage, come up with a list of random sample files from the
# source directories.
spot_check_config = next(check for check in config['checks'] if check['name'] == 'spot')
sample_count = max(
int(len(source_paths) * (min(spot_check_config['data_sample_percentage'], 100) / 100)), 1
int(len(source_paths) * (min(spot_check_config['data_sample_percentage'], 100) / 100)),
1,
)
source_sample_paths = tuple(random.sample(source_paths, sample_count))
source_sample_paths = tuple(random.SystemRandom().sample(source_paths, sample_count))
working_directory = borgmatic.config.paths.get_working_directory(config)
existing_source_sample_paths = {
hashable_source_sample_path = {
source_path
for source_path in source_sample_paths
if os.path.exists(os.path.join(working_directory or '', source_path))
for full_source_path in (os.path.join(working_directory or '', source_path),)
if os.path.exists(full_source_path)
if not os.path.islink(full_source_path)
}
logger.debug(
f'{log_label}: Sampling {sample_count} source paths (~{spot_check_config["data_sample_percentage"]}%) for spot check'
f'Sampling {sample_count} source paths (~{spot_check_config["data_sample_percentage"]}%) for spot check',
)
source_sample_paths_iterator = iter(source_sample_paths)
@@ -481,15 +523,18 @@ def compare_spot_check_hashes(
while True:
# Hash each file in the sample paths (if it exists).
source_sample_paths_subset = tuple(
itertools.islice(source_sample_paths_iterator, SAMPLE_PATHS_SUBSET_COUNT)
itertools.islice(source_sample_paths_iterator, SAMPLE_PATHS_SUBSET_COUNT),
)
if not source_sample_paths_subset:
break
hash_output = borgmatic.execute.execute_command_and_capture_output(
(spot_check_config.get('xxh64sum_command', 'xxh64sum'),)
tuple(
shlex.quote(part)
for part in shlex.split(spot_check_config.get('xxh64sum_command', 'xxh64sum'))
)
+ tuple(
path for path in source_sample_paths_subset if path in existing_source_sample_paths
path for path in source_sample_paths_subset if path in hashable_source_sample_path
),
working_directory=working_directory,
)
@@ -497,13 +542,15 @@ def compare_spot_check_hashes(
source_hashes.update(
**dict(
(reversed(line.split(' ', 1)) for line in hash_output.splitlines()),
# Represent non-existent files as having empty hashes so the comparison below still works.
# Represent non-existent files as having empty hashes so the comparison below still
# works. Same thing for filesystem links, since Borg produces empty archive hashes
# for them.
**{
path: ''
for path in source_sample_paths_subset
if path not in existing_source_sample_paths
if path not in hashable_source_sample_path
},
)
),
)
# Get the hash for each file in the archive.
@@ -517,19 +564,19 @@ def compare_spot_check_hashes(
local_borg_version,
global_arguments,
list_paths=source_sample_paths_subset,
path_format='{xxh64} /{path}{NL}', # noqa: FS003
path_format='{xxh64} {path}{NUL}',
local_path=local_path,
remote_path=remote_path,
)
if line
)
),
)
# Compare the source hashes with the archive hashes to see how many match.
failing_paths = []
for path, source_hash in source_hashes.items():
archive_hash = archive_hashes.get(path)
archive_hash = archive_hashes.get(path.lstrip(os.path.sep))
if archive_hash is not None and archive_hash == source_hash:
continue
@@ -539,6 +586,9 @@ def compare_spot_check_hashes(
return tuple(failing_paths)
MAX_SPOT_CHECK_PATHS_LENGTH = 1000
def spot_check(
repository,
config,
@@ -546,18 +596,18 @@ def spot_check(
global_arguments,
local_path,
remote_path,
borgmatic_runtime_directory,
):
'''
Given a repository dict, a loaded configuration dict, the local Borg version, global arguments
as an argparse.Namespace instance, the local Borg path, and the remote Borg path, perform a spot
check for the latest archive in the given repository.
as an argparse.Namespace instance, the local Borg path, the remote Borg path, and the borgmatic
runtime directory, perform a spot check for the latest archive in the given repository.
A spot check compares file counts and also the hashes for a random sampling of source files on
disk to those stored in the latest archive. If any differences are beyond configured tolerances,
then the check fails.
'''
log_label = f'{repository.get("label", repository["path"])}'
logger.debug(f'{log_label}: Running spot check')
logger.debug('Running spot check')
try:
spot_check_config = next(
@@ -568,19 +618,9 @@ def spot_check(
if spot_check_config['data_tolerance_percentage'] > spot_check_config['data_sample_percentage']:
raise ValueError(
'The data_tolerance_percentage must be less than or equal to the data_sample_percentage'
'The data_tolerance_percentage must be less than or equal to the data_sample_percentage',
)
source_paths = collect_spot_check_source_paths(
repository,
config,
local_borg_version,
global_arguments,
local_path,
remote_path,
)
logger.debug(f'{log_label}: {len(source_paths)} total source paths for spot check')
archive = borgmatic.borg.repo_list.resolve_archive_name(
repository['path'],
'latest',
@@ -590,7 +630,26 @@ def spot_check(
local_path,
remote_path,
)
logger.debug(f'{log_label}: Using archive {archive} for spot check')
logger.debug(f'Using archive {archive} for spot check')
source_paths = collect_spot_check_source_paths(
repository,
config,
local_borg_version,
global_arguments,
local_path,
remote_path,
borgmatic_runtime_directory,
bootstrap_config_paths=borgmatic.actions.config.bootstrap.load_config_paths_from_archive(
repository['path'],
archive,
config,
local_borg_version,
global_arguments,
borgmatic_runtime_directory,
),
)
logger.debug(f'{len(source_paths)} total source paths for spot check')
archive_paths = collect_spot_check_archive_paths(
repository,
@@ -600,22 +659,45 @@ def spot_check(
global_arguments,
local_path,
remote_path,
borgmatic_runtime_directory,
)
logger.debug(f'{log_label}: {len(archive_paths)} total archive paths for spot check')
logger.debug(f'{len(archive_paths)} total archive paths for spot check')
if len(source_paths) == 0:
truncated_archive_paths = textwrap.shorten(
', '.join(set(archive_paths)) or 'none',
width=MAX_SPOT_CHECK_PATHS_LENGTH,
placeholder=' ...',
)
logger.debug(f'Paths in latest archive but not source paths: {truncated_archive_paths}')
raise ValueError(
'Spot check failed: There are no source paths to compare against the archive',
)
# Calculate the percentage delta between the source paths count and the archive paths count, and
# compare that delta to the configured count tolerance percentage.
count_delta_percentage = abs(len(source_paths) - len(archive_paths)) / len(source_paths) * 100
if count_delta_percentage > spot_check_config['count_tolerance_percentage']:
logger.debug(
f'{log_label}: Paths in source paths but not latest archive: {", ".join(set(source_paths) - set(archive_paths)) or "none"}'
rootless_source_paths = {path.lstrip(os.path.sep) for path in source_paths}
truncated_exclusive_source_paths = textwrap.shorten(
', '.join(rootless_source_paths - set(archive_paths)) or 'none',
width=MAX_SPOT_CHECK_PATHS_LENGTH,
placeholder=' ...',
)
logger.debug(
f'{log_label}: Paths in latest archive but not source paths: {", ".join(set(archive_paths) - set(source_paths)) or "none"}'
f'Paths in source paths but not latest archive: {truncated_exclusive_source_paths}',
)
truncated_exclusive_archive_paths = textwrap.shorten(
', '.join(set(archive_paths) - rootless_source_paths) or 'none',
width=MAX_SPOT_CHECK_PATHS_LENGTH,
placeholder=' ...',
)
logger.debug(
f'Paths in latest archive but not source paths: {truncated_exclusive_archive_paths}',
)
raise ValueError(
f'Spot check failed: {count_delta_percentage:.2f}% file count delta between source paths and latest archive (tolerance is {spot_check_config["count_tolerance_percentage"]}%)'
f'Spot check failed: {count_delta_percentage:.2f}% file count delta between source paths and latest archive (tolerance is {spot_check_config["count_tolerance_percentage"]}%)',
)
failing_paths = compare_spot_check_hashes(
@@ -626,25 +708,29 @@ def spot_check(
global_arguments,
local_path,
remote_path,
log_label,
source_paths,
)
# Error if the percentage of failing hashes exceeds the configured tolerance percentage.
logger.debug(f'{log_label}: {len(failing_paths)} non-matching spot check hashes')
logger.debug(f'{len(failing_paths)} non-matching spot check hashes')
data_tolerance_percentage = spot_check_config['data_tolerance_percentage']
failing_percentage = (len(failing_paths) / len(source_paths)) * 100
if failing_percentage > data_tolerance_percentage:
truncated_failing_paths = textwrap.shorten(
', '.join(failing_paths),
width=MAX_SPOT_CHECK_PATHS_LENGTH,
placeholder=' ...',
)
logger.debug(
f'{log_label}: Source paths with data not matching the latest archive: {", ".join(failing_paths)}'
f'Source paths with data not matching the latest archive: {truncated_failing_paths}',
)
raise ValueError(
f'Spot check failed: {failing_percentage:.2f}% of source paths with data not matching the latest archive (tolerance is {data_tolerance_percentage}%)'
f'Spot check failed: {failing_percentage:.2f}% of source paths with data not matching the latest archive (tolerance is {data_tolerance_percentage}%)',
)
logger.info(
f'{log_label}: Spot check passed with a {count_delta_percentage:.2f}% file count delta and a {failing_percentage:.2f}% file data delta'
f'Spot check passed with a {count_delta_percentage:.2f}% file count delta and a {failing_percentage:.2f}% file data delta',
)
@@ -652,7 +738,6 @@ def run_check(
config_filename,
repository,
config,
hook_context,
local_borg_version,
check_arguments,
global_arguments,
@@ -664,21 +749,8 @@ def run_check(
Raise ValueError if the Borg repository ID cannot be determined.
'''
if check_arguments.repository and not borgmatic.config.validate.repositories_match(
repository, check_arguments.repository
):
return
logger.info('Running consistency checks')
borgmatic.hooks.command.execute_hook(
config.get('before_check'),
config.get('umask'),
config_filename,
'pre-check',
global_arguments.dry_run,
**hook_context,
)
logger.info(f'{repository.get("label", repository["path"])}: Running consistency checks')
repository_id = borgmatic.borg.check.get_repository_id(
repository['path'],
config,
@@ -690,7 +762,10 @@ def run_check(
upgrade_check_times(config, repository_id)
configured_checks = parse_checks(config, check_arguments.only_checks)
archive_filter_flags = borgmatic.borg.check.make_archive_filter_flags(
local_borg_version, config, configured_checks, check_arguments
local_borg_version,
config,
configured_checks,
check_arguments,
)
archives_check_id = make_archives_check_id(archive_filter_flags)
checks = filter_checks_on_frequency(
@@ -730,21 +805,15 @@ def run_check(
write_check_time(make_check_time_path(config, repository_id, 'extract'))
if 'spot' in checks:
spot_check(
repository,
config,
local_borg_version,
global_arguments,
local_path,
remote_path,
)
write_check_time(make_check_time_path(config, repository_id, 'spot'))
with borgmatic.config.paths.Runtime_directory(config) as borgmatic_runtime_directory:
spot_check(
repository,
config,
local_borg_version,
global_arguments,
local_path,
remote_path,
borgmatic_runtime_directory,
)
borgmatic.hooks.command.execute_hook(
config.get('after_check'),
config.get('umask'),
config_filename,
'post-check',
global_arguments.dry_run,
**hook_context,
)
write_check_time(make_check_time_path(config, repository_id, 'spot'))

View File

@@ -2,7 +2,6 @@ import logging
import borgmatic.borg.compact
import borgmatic.borg.feature
import borgmatic.config.validate
import borgmatic.hooks.command
logger = logging.getLogger(__name__)
@@ -12,7 +11,6 @@ def run_compact(
config_filename,
repository,
config,
hook_context,
local_borg_version,
compact_arguments,
global_arguments,
@@ -23,23 +21,8 @@ def run_compact(
'''
Run the "compact" action for the given repository.
'''
if compact_arguments.repository and not borgmatic.config.validate.repositories_match(
repository, compact_arguments.repository
):
return
borgmatic.hooks.command.execute_hook(
config.get('before_compact'),
config.get('umask'),
config_filename,
'pre-compact',
global_arguments.dry_run,
**hook_context,
)
if borgmatic.borg.feature.available(borgmatic.borg.feature.Feature.COMPACT, local_borg_version):
logger.info(
f'{repository.get("label", repository["path"])}: Compacting segments{dry_run_label}'
)
logger.info(f'Compacting segments{dry_run_label}')
borgmatic.borg.compact.compact_segments(
global_arguments.dry_run,
repository['path'],
@@ -48,19 +31,7 @@ def run_compact(
global_arguments,
local_path=local_path,
remote_path=remote_path,
progress=compact_arguments.progress,
cleanup_commits=compact_arguments.cleanup_commits,
threshold=compact_arguments.threshold,
)
else: # pragma: nocover
logger.info(
f'{repository.get("label", repository["path"])}: Skipping compact (only available/needed in Borg 1.2+)'
)
borgmatic.hooks.command.execute_hook(
config.get('after_compact'),
config.get('umask'),
config_filename,
'post-compact',
global_arguments.dry_run,
**hook_context,
)
logger.info('Skipping compact (only available/needed in Borg 1.2+)')

View File

@@ -5,7 +5,6 @@ import os
import borgmatic.borg.extract
import borgmatic.borg.repo_list
import borgmatic.config.paths
import borgmatic.config.validate
import borgmatic.hooks.command
logger = logging.getLogger(__name__)
@@ -16,49 +15,58 @@ def make_bootstrap_config(bootstrap_arguments):
Given the bootstrap arguments as an argparse.Namespace, return a corresponding config dict.
'''
return {
'ssh_command': bootstrap_arguments.ssh_command,
'borgmatic_source_directory': bootstrap_arguments.borgmatic_source_directory,
'local_path': bootstrap_arguments.local_path,
'remote_path': bootstrap_arguments.remote_path,
# In case the repo has been moved or is accessed from a different path at the point of
# bootstrapping.
'relocated_repo_access_is_ok': True,
'ssh_command': bootstrap_arguments.ssh_command,
'user_runtime_directory': bootstrap_arguments.user_runtime_directory,
}
def get_config_paths(archive_name, bootstrap_arguments, global_arguments, local_borg_version):
def load_config_paths_from_archive(
repository_path,
archive_name,
config,
local_borg_version,
global_arguments,
borgmatic_runtime_directory,
):
'''
Given an archive name, the bootstrap arguments as an argparse.Namespace (containing the
repository and archive name, Borg local path, Borg remote path, borgmatic runtime directory,
borgmatic source directory, destination directory, and whether to strip components), the global
arguments as an argparse.Namespace (containing the dry run flag and the local borg version),
return the config paths from the manifest.json file in the borgmatic source directory or runtime
directory after extracting it from the repository archive.
Given a repository path, an archive name, a configuration dict, the local Borg version, the
global arguments as an argparse.Namespace, and the borgmatic runtime directory, return the
config paths from the manifest.json file in the borgmatic source directory or runtime directory
within the repository archive.
Raise ValueError if the manifest JSON is missing, can't be decoded, or doesn't contain the
expected configuration path data.
'''
borgmatic_source_directory = borgmatic.config.paths.get_borgmatic_source_directory(
{'borgmatic_source_directory': bootstrap_arguments.borgmatic_source_directory}
)
borgmatic_runtime_directory = borgmatic.config.paths.get_borgmatic_runtime_directory(
{'user_runtime_directory': bootstrap_arguments.user_runtime_directory}
)
config = make_bootstrap_config(bootstrap_arguments)
# Probe for the manifest file in multiple locations, as the default location has moved to the
# borgmatic runtime directory (which get stored as just "/borgmatic" with Borg 1.4+). But we
# borgmatic runtime directory (which gets stored as just "/borgmatic" with Borg 1.4+). But we
# still want to support reading the manifest from previously created archives as well.
for base_directory in ('borgmatic', borgmatic_runtime_directory, borgmatic_source_directory):
borgmatic_manifest_path = os.path.join(base_directory, 'bootstrap', 'manifest.json')
for base_directory in (
'borgmatic',
borgmatic.config.paths.make_runtime_directory_glob(borgmatic_runtime_directory),
borgmatic.config.paths.get_borgmatic_source_directory(config),
):
borgmatic_manifest_path = 'sh:' + os.path.join(
base_directory,
'bootstrap',
'manifest.json',
)
extract_process = borgmatic.borg.extract.extract_archive(
global_arguments.dry_run,
bootstrap_arguments.repository,
repository_path,
archive_name,
[borgmatic_manifest_path],
config,
local_borg_version,
global_arguments,
local_path=bootstrap_arguments.local_path,
remote_path=bootstrap_arguments.remote_path,
local_path=config.get('local_path', 'borg'),
remote_path=config.get('remote_path'),
extract_to_stdout=True,
)
manifest_json = extract_process.stdout.read()
@@ -67,21 +75,21 @@ def get_config_paths(archive_name, bootstrap_arguments, global_arguments, local_
break
else:
raise ValueError(
'Cannot read configuration paths from archive due to missing bootstrap manifest'
'Cannot read configuration paths from archive due to missing archive or bootstrap manifest',
)
try:
manifest_data = json.loads(manifest_json)
except json.JSONDecodeError as error:
raise ValueError(
f'Cannot read configuration paths from archive due to invalid bootstrap manifest JSON: {error}'
f'Cannot read configuration paths from archive due to invalid bootstrap manifest JSON: {error}',
)
try:
return manifest_data['config_paths']
except KeyError:
raise ValueError(
'Cannot read configuration paths from archive due to invalid bootstrap manifest'
'Cannot read configuration paths from archive due to invalid bootstrap manifest',
)
@@ -102,9 +110,16 @@ def run_bootstrap(bootstrap_arguments, global_arguments, local_borg_version):
local_path=bootstrap_arguments.local_path,
remote_path=bootstrap_arguments.remote_path,
)
manifest_config_paths = get_config_paths(
archive_name, bootstrap_arguments, global_arguments, local_borg_version
)
with borgmatic.config.paths.Runtime_directory(config) as borgmatic_runtime_directory:
manifest_config_paths = load_config_paths_from_archive(
bootstrap_arguments.repository,
archive_name,
config,
local_borg_version,
global_arguments,
borgmatic_runtime_directory,
)
logger.info(f"Bootstrapping config paths: {', '.join(manifest_config_paths)}")
@@ -113,7 +128,9 @@ def run_bootstrap(bootstrap_arguments, global_arguments, local_borg_version):
bootstrap_arguments.repository,
archive_name,
[config_path.lstrip(os.path.sep) for config_path in manifest_config_paths],
config,
# Only add progress here and not the extract_archive() call above, because progress
# conflicts with extract_to_stdout.
dict(config, progress=bootstrap_arguments.progress or False),
local_borg_version,
global_arguments,
local_path=bootstrap_arguments.local_path,
@@ -121,5 +138,4 @@ def run_bootstrap(bootstrap_arguments, global_arguments, local_borg_version):
extract_to_stdout=False,
destination_path=bootstrap_arguments.destination,
strip_components=bootstrap_arguments.strip_components,
progress=bootstrap_arguments.progress,
)

View File

@@ -19,30 +19,37 @@ def run_generate(generate_arguments, global_arguments):
dry_run_label = ' (dry run; not actually writing anything)' if global_arguments.dry_run else ''
logger.answer(
f'Generating a configuration file at: {generate_arguments.destination_filename}{dry_run_label}'
f'Generating configuration files within: {generate_arguments.destination_path}{dry_run_label}'
if generate_arguments.split
else f'Generating a configuration file at: {generate_arguments.destination_path}{dry_run_label}'
)
borgmatic.config.generate.generate_sample_configuration(
global_arguments.dry_run,
generate_arguments.source_filename,
generate_arguments.destination_filename,
generate_arguments.destination_path,
borgmatic.config.validate.schema_filename(),
overwrite=generate_arguments.overwrite,
split=generate_arguments.split,
)
if generate_arguments.source_filename:
logger.answer(
f'''
Merged in the contents of configuration file at: {generate_arguments.source_filename}
To review the changes made, run:
diff --unified {generate_arguments.source_filename} {generate_arguments.destination_filename}'''
Merged the contents of the source configuration file: {generate_arguments.source_filename}'''
)
if not generate_arguments.split:
logger.answer(
f'''To review the changes made, run:
diff --unified {generate_arguments.source_filename} {generate_arguments.destination_path}''',
)
logger.answer(
'''
This includes all available configuration options with example values, the few
required options as indicated. Please edit the file to suit your needs.
If you ever need help: https://torsion.org/borgmatic/#issues'''
If you ever need help: https://torsion.org/borgmatic/#issues''',
)

View File

@@ -18,7 +18,7 @@ def run_validate(validate_arguments, configs):
borgmatic.logger.add_custom_log_levels()
if validate_arguments.show:
for config_path, config in configs.items():
for config in configs.values():
if len(configs) > 1:
logger.answer('---')

View File

@@ -1,51 +1,22 @@
import importlib.metadata
import json
import logging
import os
import borgmatic.actions.json
import borgmatic.borg.create
import borgmatic.borg.feature
import borgmatic.borg.rename
import borgmatic.borg.repo_list
import borgmatic.config.paths
import borgmatic.config.validate
import borgmatic.hooks.command
import borgmatic.hooks.dispatch
import borgmatic.hooks.dump
from borgmatic.actions import pattern
logger = logging.getLogger(__name__)
def create_borgmatic_manifest(config, config_paths, dry_run):
'''
Create a borgmatic manifest file to store the paths to the configuration files used to create
the archive.
'''
if dry_run:
return
borgmatic_runtime_directory = borgmatic.config.paths.get_borgmatic_runtime_directory(config)
borgmatic_manifest_path = os.path.join(
borgmatic_runtime_directory, 'bootstrap', 'manifest.json'
)
if not os.path.exists(borgmatic_manifest_path):
os.makedirs(os.path.dirname(borgmatic_manifest_path), exist_ok=True)
with open(borgmatic_manifest_path, 'w') as config_list_file:
json.dump(
{
'borgmatic_version': importlib.metadata.version('borgmatic'),
'config_paths': config_paths,
},
config_list_file,
)
def run_create(
config_filename,
repository,
config,
config_paths,
hook_context,
local_borg_version,
create_arguments,
global_arguments,
@@ -58,72 +29,172 @@ def run_create(
If create_arguments.json is True, yield the JSON output from creating the archive.
'''
if create_arguments.repository and not borgmatic.config.validate.repositories_match(
repository, create_arguments.repository
):
return
if config.get('list_details') and config.get('progress'):
raise ValueError(
'With the create action, only one of --list/--files/list_details and --progress/progress can be used.',
)
borgmatic.hooks.command.execute_hook(
config.get('before_backup'),
config.get('umask'),
config_filename,
'pre-backup',
global_arguments.dry_run,
**hook_context,
)
logger.info(f'{repository.get("label", repository["path"])}: Creating archive{dry_run_label}')
borgmatic.hooks.dispatch.call_hooks_even_if_unconfigured(
'remove_data_source_dumps',
config,
repository['path'],
borgmatic.hooks.dump.DATA_SOURCE_HOOK_NAMES,
global_arguments.dry_run,
)
active_dumps = borgmatic.hooks.dispatch.call_hooks(
'dump_data_sources',
config,
repository['path'],
borgmatic.hooks.dump.DATA_SOURCE_HOOK_NAMES,
global_arguments.dry_run,
)
if config.get('store_config_files', True):
create_borgmatic_manifest(
if config.get('list_details') and create_arguments.json:
raise ValueError(
'With the create action, only one of --list/--files/list_details and --json can be used.',
)
logger.info(f'Creating archive{dry_run_label}')
working_directory = borgmatic.config.paths.get_working_directory(config)
with borgmatic.config.paths.Runtime_directory(config) as borgmatic_runtime_directory:
patterns = pattern.process_patterns(
pattern.collect_patterns(config),
config,
config_paths,
working_directory,
borgmatic_runtime_directory,
)
original_patterns = list(patterns)
borgmatic.hooks.dispatch.call_hooks_even_if_unconfigured(
'remove_data_source_dumps',
config,
borgmatic.hooks.dispatch.Hook_type.DATA_SOURCE,
borgmatic_runtime_directory,
original_patterns,
global_arguments.dry_run,
)
active_dumps = borgmatic.hooks.dispatch.call_hooks(
'dump_data_sources',
config,
borgmatic.hooks.dispatch.Hook_type.DATA_SOURCE,
config_paths,
borgmatic_runtime_directory,
patterns,
global_arguments.dry_run,
)
stream_processes = [process for processes in active_dumps.values() for process in processes]
json_output = borgmatic.borg.create.create_archive(
global_arguments.dry_run,
repository['path'],
# Process the patterns again in case any data source hooks updated them. Without this step,
# we could end up with duplicate paths that cause Borg to hang when it tries to read from
# the same named pipe twice.
patterns = pattern.process_patterns(
patterns,
config,
working_directory,
borgmatic_runtime_directory,
skip_expand_paths=config_paths,
)
stream_processes = [process for processes in active_dumps.values() for process in processes]
# If we have stream processes, we first create an archive with .checkpoint suffix. This is
# to make sure we only create a real archive if all the streaming processes completed
# successfully (create_archive will fail if a streaming process fails, but the archive might
# have already been created at this point).
use_checkpoint = bool(stream_processes)
json_output = borgmatic.borg.create.create_archive(
global_arguments.dry_run,
repository['path'],
config,
patterns,
local_borg_version,
global_arguments,
borgmatic_runtime_directory,
archive_suffix='.checkpoint' if use_checkpoint else '',
local_path=local_path,
remote_path=remote_path,
json=create_arguments.json,
comment=create_arguments.comment,
stream_processes=stream_processes,
)
if use_checkpoint:
rename_checkpoint_archive(
repository['path'],
global_arguments,
config,
local_borg_version,
local_path,
remote_path,
)
if json_output:
output = borgmatic.actions.json.parse_json(json_output, repository.get('label'))
if use_checkpoint:
# Patch archive name and ID
renamed_archive = borgmatic.borg.repo_list.get_latest_archive(
repository['path'],
config,
local_borg_version,
global_arguments,
local_path,
remote_path,
)
output['archive']['name'] = renamed_archive['name']
output['archive']['id'] = renamed_archive['id']
yield output
# Use the original patterns so as to disregard any modifications made by any data source
# hooks, e.g. via dump_data_sources() above.
borgmatic.hooks.dispatch.call_hooks_even_if_unconfigured(
'remove_data_source_dumps',
config,
borgmatic.hooks.dispatch.Hook_type.DATA_SOURCE,
borgmatic_runtime_directory,
original_patterns,
global_arguments.dry_run,
)
def rename_checkpoint_archive(
repository_path,
global_arguments,
config,
local_borg_version,
local_path,
remote_path,
):
'''
Renames the latest archive to not have a '.checkpoint' suffix.
Raises ValueError if
- there is not latest archive
- the latest archive does not have a '.checkpoint' suffix
Implementation note: We cannot reliably get the just created archive name.
So we resort to listing the archives and picking the last one.
A similar comment applies to retrieving the ID of the renamed archive.
'''
archive = borgmatic.borg.repo_list.get_latest_archive(
repository_path,
config,
config_paths,
local_borg_version,
global_arguments,
local_path=local_path,
remote_path=remote_path,
progress=create_arguments.progress,
stats=create_arguments.stats,
json=create_arguments.json,
list_files=create_arguments.list_files,
stream_processes=stream_processes,
local_path,
remote_path,
consider_checkpoints=True,
)
if json_output:
yield borgmatic.actions.json.parse_json(json_output, repository.get('label'))
borgmatic.hooks.dispatch.call_hooks_even_if_unconfigured(
'remove_data_source_dumps',
archive_name = archive['name']
if not archive_name.endswith('.checkpoint'):
raise ValueError(f'Latest archive did not have a .checkpoint suffix. Got: {archive_name}')
new_archive_name = archive_name.removesuffix('.checkpoint')
logger.info(f'Renaming archive {archive_name} -> {new_archive_name}')
borgmatic.borg.rename.rename_archive(
repository_path,
(
archive['id']
if borgmatic.borg.feature.available(
borgmatic.borg.feature.Feature.ARCHIVE_SERIES, local_borg_version
)
else archive['name']
),
new_archive_name,
global_arguments.dry_run,
config,
config_filename,
borgmatic.hooks.dump.DATA_SOURCE_HOOK_NAMES,
global_arguments.dry_run,
)
borgmatic.hooks.command.execute_hook(
config.get('after_backup'),
config.get('umask'),
config_filename,
'post-backup',
global_arguments.dry_run,
**hook_context,
local_borg_version,
local_path,
remote_path,
)

View File

@@ -20,31 +20,28 @@ def run_delete(