-
Notifications
You must be signed in to change notification settings - Fork 97
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Run arbitrary Borg commands with new "borgmatic borg" action (#425).
- Loading branch information
Showing
13 changed files
with
436 additions
and
130 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,7 +2,7 @@ | |
*.pyc | ||
*.swp | ||
.cache | ||
.coverage | ||
.coverage* | ||
.pytest_cache | ||
.tox | ||
__pycache__ | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
import logging | ||
|
||
from borgmatic.borg.flags import make_flags | ||
from borgmatic.execute import execute_command | ||
|
||
logger = logging.getLogger(__name__) | ||
|
||
|
||
REPOSITORYLESS_BORG_COMMANDS = {'serve', None} | ||
|
||
|
||
def run_arbitrary_borg( | ||
repository, storage_config, options, archive=None, local_path='borg', remote_path=None | ||
): | ||
''' | ||
Given a local or remote repository path, a storage config dict, a sequence of arbitrary | ||
command-line Borg options, and an optional archive name, run an arbitrary Borg command on the | ||
given repository/archive. | ||
''' | ||
lock_wait = storage_config.get('lock_wait', None) | ||
|
||
try: | ||
options = options[1:] if options[0] == '--' else options | ||
borg_command = options[0] | ||
command_options = tuple(options[1:]) | ||
except IndexError: | ||
borg_command = None | ||
command_options = () | ||
|
||
repository_archive = '::'.join((repository, archive)) if repository and archive else repository | ||
|
||
full_command = ( | ||
(local_path,) | ||
+ ((borg_command,) if borg_command else ()) | ||
+ ((repository_archive,) if borg_command and repository_archive else ()) | ||
+ command_options | ||
+ (('--info',) if logger.getEffectiveLevel() == logging.INFO else ()) | ||
+ (('--debug', '--show-rc') if logger.isEnabledFor(logging.DEBUG) else ()) | ||
+ make_flags('remote-path', remote_path) | ||
+ make_flags('lock-wait', lock_wait) | ||
) | ||
|
||
return execute_command( | ||
full_command, output_log_level=logging.WARNING, borg_local_path=local_path, | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
--- | ||
title: How to run arbitrary Borg commands | ||
eleventyNavigation: | ||
key: Run arbitrary Borg commands | ||
parent: How-to guides | ||
order: 10 | ||
--- | ||
## Running Borg with borgmatic | ||
|
||
Borg has several commands (and options) that borgmatic does not currently | ||
support. Sometimes though, as a borgmatic user, you may find yourself wanting | ||
to take advantage of these off-the-beaten-path Borg features. You could of | ||
course drop down to running Borg directly. But then you'd give up all the | ||
niceties of your borgmatic configuration. You could file a [borgmatic | ||
ticket](https://torsion.org/borgmatic/#issues) or even a [pull | ||
request](https://torsion.org/borgmatic/#contributing) to add the feature. But | ||
what if you need it *now*? | ||
|
||
That's where borgmatic's support for running "arbitrary" Borg commands comes | ||
in. Running Borg commands with borgmatic takes advantage of the following, all | ||
based on your borgmatic configuration files or command-line arguments: | ||
|
||
* configured repositories (automatically runs your Borg command once for each | ||
one) | ||
* local and remote Borg binary paths | ||
* SSH settings and Borg environment variables | ||
* lock wait settings | ||
* verbosity | ||
|
||
|
||
### borg action | ||
|
||
The way you run Borg with borgmatic is via the `borg` action. Here's a simple | ||
example: | ||
|
||
```bash | ||
borgmatic borg break-lock | ||
``` | ||
|
||
(No `borg` action in borgmatic? Time to upgrade!) | ||
|
||
This runs Borg's `break-lock` command once on each configured borgmatic | ||
repository. Notice how the repository isn't present in the specified Borg | ||
options, as that part is provided by borgmatic. | ||
|
||
You can also specify Borg options for relevant commands: | ||
|
||
```bash | ||
borgmatic borg list --progress | ||
``` | ||
|
||
This runs Borg's `list` command once on each configured borgmatic | ||
repository. However, the native `borgmatic list` action should be preferred | ||
for most use. | ||
|
||
What if you only want to run Borg on a single configured borgmatic repository | ||
when you've got several configured? Not a problem. | ||
|
||
```bash | ||
borgmatic borg --repository repo.borg break-lock | ||
``` | ||
|
||
And what about a single archive? | ||
|
||
```bash | ||
borgmatic borg --archive your-archive-name list | ||
``` | ||
|
||
### Limitations | ||
|
||
borgmatic's `borg` action is not without limitations: | ||
|
||
* The Borg command you want to run (`create`, `list`, etc.) *must* come first | ||
after the `borg` action. If you have any other Borg options to specify, | ||
provide them after. For instance, `borgmatic borg list --progress` will work, | ||
but `borgmatic borg --progress list` will not. | ||
* borgmatic supplies the repository/archive name to Borg for you (based on | ||
your borgmatic configuration or the `borgmatic borg --repository`/`--archive` | ||
arguments), so do not specify the repository/archive otherwise. | ||
* The `borg` action will not currently work for any Borg commands like `borg | ||
serve` that do not accept a repository/archive name. | ||
* Do not specify any global borgmatic arguments to the right of the `borg` | ||
action. (They will be passed to Borg instead of borgmatic.) If you have | ||
global borgmatic arguments, specify them *before* the `borg` action. | ||
* Unlike other borgmatic actions, you cannot combine the `borg` action with | ||
other borgmatic actions. This is to prevent ambiguity in commands like | ||
`borgmatic borg list`, in which `list` is both a valid Borg command and a | ||
borgmatic action. In this case, only the Borg command is run. | ||
* Unlike normal borgmatic actions that support JSON, the `borg` action will | ||
not disable certain borgmatic logs to avoid interfering with JSON output. | ||
|
||
In general, this `borgmatic borg` feature should be considered an escape | ||
valve—a feature of second resort. In the long run, it's preferable to wrap | ||
Borg commands with borgmatic actions that can support them fully. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.