Commit graph

247 commits

Author SHA1 Message Date
Thomas Waldmann
cece7f9e6d merged 1.0-maint into master 2016-04-10 01:13:35 +02:00
Lauri Niskanen
327c7219df Add archive comments
- Archives now have a new metadata field 'comment'
- 'info' command shows a comment if it's present
- 'create' command now has option '--comment' for adding comments to archives.
- A new command 'comment' is added for modifying the comments on existing
  archives.

Resolves #842.
2016-04-08 19:03:14 +03:00
Marian Beermann
59886b44c3
init: clean up partial repo if passphrase input is aborted
Fixes #850
2016-04-08 12:08:10 +02:00
Marian Beermann
b59f92a533 Test suite: Reset exit code of persistent archiver
#844
2016-04-06 10:04:35 +02:00
TW
fc10ac0ef9 Merge pull request #830 from enkore/feature/1.0ctxmng
Make Repository a context manager, use decorators for wrapping withs
2016-04-03 17:36:38 +02:00
Marian Beermann
83586ae09c Make Repository a context manager, use decorators for wrapping withs
(Remote)Repository.close() is not a public API anymore, but a private
API. It shall not be used from within other classes than Repository
or it's tests. The proper way is to use a context manager now. However,
for RPC/Remote compatibility with Borg 1.0 it is kept and unchanged.

Repositories are not opened by __init__ now anymore, it is done
by binding it to a context manager. (This SHOULD be compatible both ways
with remote, since opening the repo is handled by a RepositoryServer method)

Decorators @with_repository() and @with_archive simplify
context manager handling and remove unnecessary indentation.

Backported to 1.0-maint
2016-04-03 17:14:43 +02:00
TW
d6590b4e2d Merge pull request #821 from borgbackup/1.0-maint
merge 1.0-maint
2016-04-01 00:19:01 +02:00
TW
ad57178ad7 Merge pull request #819 from enkore/fix/chunker-io2
Chunker: fix wrong EOF assumption, check for return type
2016-03-31 23:45:47 +02:00
Marian Beermann
061bf59d5d Chunker: fix wrong EOF assumption[1], check for return type[2]
[1]
This worked incidentally because OSes tend to return at least one page
worth of data when EOF is not reached. Increasing WINDOW_SIZE beyond
the page size might have lead to data loss.

[2]
If read() of the passed Python object returned something not-bytes,
PyBytes_Size returns -1 (ssize_t) which becomes a very larger number for
memcpy()s size_t.
2016-03-31 22:03:17 +02:00
TW
d56e4c5370 Merge pull request #818 from borgbackup/1.0-maint
merge append-only from 1.0 maint
2016-03-31 20:28:49 +02:00
TW
6841be3684 Merge pull request #789 from enkore/feature-hmac
Replace stdlib hmac, zero-copy decrypt
2016-03-31 18:15:57 +02:00
Lauri Niskanen
9d1a30c08b Add '--sort' option for sorting diff command output
Previously, on 'borg diff', the output always had first the modifications, then
additions, and finally removals. Output may be easier to follow if the various
kinds of changes are interleaved. This commit is a simple solution that first
collects the output lines and sorts them by file path before printing. This new
behavior is optional and disabled by default. It can be enabled with '--sort'
command line option.

This option will be especially useful after the planned multi-threading changes
arrive. Multi-threading may shuffle the archive order of files making diff
output hard to follow without sorting.

Resolves #797.
2016-03-31 18:55:02 +03:00
Marian Beermann
ffc8cf6c97 Append-only mode for repositories
New repository config item, repository.append_only, causes Borg to never
delete or append to existing data files. Hints and indices are handled
as before, old ones are deleted, because they can get quite large, but
are automatically reconstructed: no need to keep them.

When append_only is activated a file /path/to/repo/transactions/<NUMBER>
will be created for every commit.
Deleting all segments <NUMBER+1> and higher will rollback to that commit.

Note that this only influences Borg behaviour. Since repository config
can't be altered remotely (except for repository.key) this can't be
disabled when accessed remotely over SSH with "borg serve" as the
forced command.

This is only a feature to support the use case, and does not replace
appropriate file system permissions or monitoring.

Resolves #809
2016-03-31 17:29:17 +02:00
Ed Blackman
2ab324c03f Add 'x' status for excluded paths (#814)
Makes it easy to see paths excluded by --exclude* options for testing of
regexes, and for ongoing monitoring that files desired for backup aren't
getting excluded accidentally.
2016-03-30 22:38:31 -04:00
Marian Beermann
c5bd7f2216 Replace stdlib hmac with OpenSSL, zero-copy decrypt
AESKeyBase.decrypt makes less copies of the data, specifically data[41:],
which copies the payload, is gone. This is possible since this commit
makes our lil' crypto API compatible with simple buffers.

In Cython there is a syntax for creating memoryviews from buffer-enabled
objects, however, it doesn't support read-only buffers. ro_buffer gets
this job done, though, and also does the proper type checking
(by PyBUF_SIMPLE).

Note: msgpack doesn't support memoryviews. Otherwise we could avoid
      copying the en/de-crypted output with the final "return out[:ctl]"

This commit leads to a solid 10-15 % increase in performance of hash-lists
and extract.

The hmac_sha256() function releases the GIL.
2016-03-27 01:12:23 +01:00
Lauri Niskanen
1d3e69e4c7 Improve 'borg diff' output format
The main design goals of the new format:
 - One file takes exactly one line of output
 - The format is easy to read with typical, long list of changes
 - Metadata changes are visible and easy to examine
 - Unuseful information is not shown

Resolves #757.
2016-03-26 23:50:03 +02:00
Lauri Niskanen
c405122753 Add option for an explicit sign in sizeof_fmt functions in helpers 2016-03-26 23:49:24 +02:00
Marian Beermann
7caec0187f Make Repository a context manager, use decorators for wrapping withs
(Remote)Repository.close() is not a public API anymore, but a private
API. It shall not be used from within other classes than Repository
or it's tests. The proper way is to use a context manager now. However,
for RPC/Remote compatibility with Borg 1.0 it is kept and unchanged.

Repositories are not opened by __init__ now anymore, it is done
by binding it to a context manager. (This SHOULD be compatible both ways
with remote, since opening the repo is handled by a RepositoryServer method)

Decorators @with_repository() and @with_archive simplify
context manager handling and remove unnecessary indentation.
2016-03-23 00:41:15 +01:00
TW
77dfcbc31d Merge pull request #763 from enkore/issue-761
fix links failing for extracting subtrees, fixes #761
2016-03-18 00:46:39 +01:00
Marian Beermann
9211d0fa18 borg extract: fix links failing for sub-tree extractions
fixes #761
2016-03-17 22:39:57 +01:00
Marian Beermann
4151db270c Redo borg list
- This is compatible except for {formatkeys}, which has been replaced
  by "borg list --help"
- --list-format is deprecated, use --format instead
  (using deprecated arguments will print a warning and an exit code of 1)
- borg list now supports the usual [PATH [PATHS…]] syntax and excludes
- Additional keys: csize, num_chunks, unique_chunks, NUL
- Supports guaranteed_available hashlib hashes
  (to avoid varying functionality depending on environment)
  (also, the other hashes are really obscure, like MD-4)
2016-03-17 17:32:23 +01:00
enkore
26fe2a35cd borg diff: find different files between archives 2016-03-15 18:23:49 +01:00
Teemu Toivanen
79f42571ae unit test for archive format
tests formatting with {pid} and not equal results from same
time string. (adds import time to tests)
2016-02-25 00:41:24 +02:00
Thomas Waldmann
08a7ce5cc3 Merge branch 'feature/list-formatting' of https://github.com/manwegit/borg into feature/list-formatting 2016-02-21 19:15:31 +01:00
Thomas Waldmann
63ce999229 borg prune -v --list enables the keep/prune list output, fixes #658
so one can also have --stats without that.
2016-02-18 23:44:23 +01:00
Teemu Toivanen
61a40cbeac add test for list --list-format 2016-02-12 09:29:14 +02:00
Thomas Waldmann
4b339f5d69 cosmetic source cleanup (flake8) 2016-01-30 21:32:45 +01:00
TW
9797ab0130 Merge pull request #612 from ThomasWaldmann/fix-544
borg serve: overwrite client's --restrict-to-path with forced command's …
2016-01-30 20:04:09 +01:00
Thomas Waldmann
b8d954e60a use XDG_CONFIG_HOME for borg keys instead of ~/.borg, fixes #515 2016-01-28 22:26:58 +01:00
Thomas Waldmann
7ea2404048 borg serve: overwrite client's --restrict-to-path with forced command's option value, fixes #544
we also make sure the client is not cheating, like giving another subcommand or his own --restrict-to-path.
2016-01-28 21:59:24 +01:00
Thomas Waldmann
3476fffe7d remove deprecated "--compression <number>"
use --compression zlib,<number> instead
in case of 0, you could also use --compression none
2016-01-24 16:04:00 +01:00
Thomas Waldmann
ad31fcd7c0 remove deprecated "--hourly/daily/weekly/monthly/yearly"
use --keep-hourly/daily/weekly/monthly/yearly instead

note: kept the code and test, we might have deprecated option in future, too
2016-01-24 16:04:00 +01:00
Thomas Waldmann
e1515ee251 remove deprecated "borg verify"
use borg extract --dry-run ...
2016-01-24 16:04:00 +01:00
Thomas Waldmann
2f9b643edb migrate-to-repokey command, dispatch passphrase type to repokey handler
every chunk has the encryption key type as first byte and we do not want to rewrite the whole repo
to change the passphrase type to repokey type. thus we simply dispatch this type to repokey
handler.
if there is a repokey that contains the same secrets as they were derived from the passphrase, it will just work.
if there is none yet, one needs to run migrate-to-repokey command to create it.
2016-01-24 16:04:00 +01:00
Thomas Waldmann
b2dedee3c8 refactor yes(), cleanup env var semantics, fixes #355
refactorings:

- introduced concept of default answer:

if the answer string is in the defaultish sequence, the return value of yes() will be the default.
e.g. if just pressing <enter> when asked on the console or if an empty string or "default" is
in the environment variable for overriding.

if an environment var has an invalid value and no retries are enabled: return default
if retries are enabled, next retry won't use the env var again, but either ask via input().

- simplify:

only one default - this should be a SAFE default as it is used in some special conditions
like EOF or invalid input with retries disallowed.

no isatty() magic, the "yes" shell command exists, so we could receive input even if it is not from a tty.

- clean:

separate retry flag from retry_msg
2016-01-24 16:04:00 +01:00
Thomas Waldmann
6d615ec30a change encryption to be on by default (repokey mode)
it's 2015, let's be safe-by-default and unsafe-as-option.

also: show default mode in builtin help
2016-01-24 15:44:09 +01:00
Thomas Waldmann
5607e5aefe use os.urandom instead of own cython openssl RAND_bytes wrapper, fixes #493 2016-01-24 15:40:04 +01:00
Thomas Waldmann
3ade3d8a41 use hashlib.pbkdf2_hmac from py stdlib instead of own openssl wrapper
this is available in python 3.4+.

note:
before removing the pbkdf tests, i ran them with the pbkdf from stdlib to make sure it gives same result.
long term testing of this now belongs into stdlib tests, not into borg.
2016-01-24 15:40:04 +01:00
Thomas Waldmann
7c8bfe6681 __file__ is now always an absolute path (3.4) 2016-01-24 15:36:04 +01:00
Thomas Waldmann
fc52101d46 suppress unneeded exception context (PEP 409) 2016-01-24 15:36:04 +01:00
Thomas Waldmann
a6f9c29dfe use new OS and IO exception hierarchy of py 3.3 2016-01-24 15:36:04 +01:00
Thomas Waldmann
fe8762ad28 os.utime on py 3.4+ always supports fd and follow_symlinks 2016-01-24 15:16:05 +01:00
Thomas Waldmann
265da6286f remove conditionals/wrappers, we always have stat nanosecond support on 3.4+
also: no wrapper needed for binascii.unhexlify any more
2016-01-24 15:16:05 +01:00
Thomas Waldmann
19998888ba remove support for missing PermissionError on py 3.2 2016-01-24 14:57:48 +01:00
Thomas Waldmann
dabac6a4ed use mock from stdlib, fixes #145 2016-01-24 14:57:48 +01:00
Michael Hanselmann
c7fb598ab9 Add shell-style pattern syntax
The fnmatch module in Python's standard library implements a pattern
format for paths which is similar to shell patterns. However, “*”
matches any character including path separators. This newly introduced
pattern syntax with the selector “sh” no longer matches the path
separator with “*”. Instead “**/” can be used to match zero or more
directory levels.
2016-01-21 16:07:24 +01:00
Michael Hanselmann
ceae4a9fa8 Support patterns on extraction, fixes #361
This change implements the functionality requested in issue #361:
extracting files with a given extension. It does so by permitting
patterns to be used instead plain prefix paths. The pattern styles
supported are the same as for exclusions.
2016-01-18 21:26:08 +01:00
Michael Hanselmann
848375e2fe Add and document path prefix as pattern style
The “extract” command supports extracting all files underneath a given
set of prefix paths. The forthcoming support for extracting files using
a pattern (i.e. only files ending in “.zip”) requires the introduction
of path prefixes as a third pattern style, making it also available for
exclusions.
2016-01-18 21:26:08 +01:00
Michael Hanselmann
190107ada7 Replace use of “exclude_path” in tests
The newly added pattern matcher class can replace the “exclude_path”
function. The latter is going to be removed in a later change.
2016-01-18 20:59:08 +01:00
Michael Hanselmann
9747755131 Add pattern matcher wrapper
The utility functions “adjust_patterns” and “exclude_path” produce
respectively use a standard list object containing pattern objects.
With the forthcoming introduction of patterns for filtering files
to be extracted it's better to move the logic of these classes into
a single class.

The wrapper allows adding any number of patterns to an internal list
together with a value to be returned if a match function finds that
one of the patterns matches. A fallback value is returned otherwise.
2016-01-18 20:59:08 +01:00