|
@@ -136,7 +136,7 @@ class AtticRepositoryUpgrader(Repository):
|
|
|
replacement pattern is `s/ATTIC KEY/BORG_KEY/` in
|
|
|
`get_keys_dir()`, that is `$ATTIC_KEYS_DIR` or
|
|
|
`$HOME/.attic/keys`, and moved to `$BORG_KEYS_DIR` or
|
|
|
- `$HOME/.borg/keys`.
|
|
|
+ `$HOME/.config/borg/keys`.
|
|
|
|
|
|
no need to decrypt to convert. we need to rewrite the whole
|
|
|
key file because magic string length changed, but that's not a
|
|
@@ -275,3 +275,52 @@ class AtticKeyfileKey(KeyfileKey):
|
|
|
if line and line.startswith(cls.FILE_ID) and line[10:] == id:
|
|
|
return filename
|
|
|
raise KeyfileNotFoundError(repository.path, keys_dir)
|
|
|
+
|
|
|
+
|
|
|
+class BorgRepositoryUpgrader(Repository):
|
|
|
+ def upgrade(self, dryrun=True, inplace=False, progress=False):
|
|
|
+ """convert an old borg repository to a current borg repository
|
|
|
+ """
|
|
|
+ logger.info("converting borg 0.xx to borg current")
|
|
|
+ try:
|
|
|
+ keyfile = self.find_borg0xx_keyfile()
|
|
|
+ except KeyfileNotFoundError:
|
|
|
+ logger.warning("no key file found for repository")
|
|
|
+ else:
|
|
|
+ self.move_keyfiles(keyfile, dryrun)
|
|
|
+
|
|
|
+ def find_borg0xx_keyfile(self):
|
|
|
+ return Borg0xxKeyfileKey.find_key_file(self)
|
|
|
+
|
|
|
+ def move_keyfiles(self, keyfile, dryrun):
|
|
|
+ filename = os.path.basename(keyfile)
|
|
|
+ new_keyfile = os.path.join(get_keys_dir(), filename)
|
|
|
+ try:
|
|
|
+ os.rename(keyfile, new_keyfile)
|
|
|
+ except FileExistsError:
|
|
|
+ # likely the attic -> borg upgrader already put it in the final location
|
|
|
+ pass
|
|
|
+
|
|
|
+
|
|
|
+class Borg0xxKeyfileKey(KeyfileKey):
|
|
|
+ """backwards compatible borg 0.xx key file parser"""
|
|
|
+
|
|
|
+ @staticmethod
|
|
|
+ def get_keys_dir():
|
|
|
+ return os.environ.get('BORG_KEYS_DIR',
|
|
|
+ os.path.join(os.path.expanduser('~'), '.borg', 'keys'))
|
|
|
+
|
|
|
+ @classmethod
|
|
|
+ def find_key_file(cls, repository):
|
|
|
+ get_keys_dir = cls.get_keys_dir
|
|
|
+ id = hexlify(repository.id).decode('ascii')
|
|
|
+ keys_dir = get_keys_dir()
|
|
|
+ if not os.path.exists(keys_dir):
|
|
|
+ raise KeyfileNotFoundError(repository.path, keys_dir)
|
|
|
+ for name in os.listdir(keys_dir):
|
|
|
+ filename = os.path.join(keys_dir, name)
|
|
|
+ with open(filename, 'r') as fd:
|
|
|
+ line = fd.readline().strip()
|
|
|
+ if line and line.startswith(cls.FILE_ID) and line[len(cls.FILE_ID)+1:] == id:
|
|
|
+ return filename
|
|
|
+ raise KeyfileNotFoundError(repository.path, keys_dir)
|