backups: Minor styling fixes

- Run yapf

- Fix flake8 errors/warnings.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
This commit is contained in:
Sunil Mohan Adapa 2019-01-30 11:51:17 -08:00 committed by James Valleroy
parent c22bec1cf4
commit de22c79665
No known key found for this signature in database
GPG Key ID: 77C0C75E7B650808
3 changed files with 42 additions and 33 deletions

View File

@ -65,29 +65,29 @@ def parse_arguments():
export_tar = subparsers.add_parser('export-tar', help=export_help)
get_archive_apps = subparsers.add_parser(
'get-archive-apps',
help='Get list of apps included in archive')
'get-archive-apps', help='Get list of apps included in archive')
restore_archive = subparsers.add_parser(
'restore-archive', help='Restore files from an archive')
restore_archive.add_argument('--destination', help='Destination',
required=True)
for cmd in [info, init, list_repo, create_archive, delete_archive,
export_tar, get_archive_apps, restore_archive, setup]:
for cmd in [
info, init, list_repo, create_archive, delete_archive, export_tar,
get_archive_apps, restore_archive, setup
]:
cmd.add_argument('--path', help='Repository or Archive path',
required=False)
cmd.add_argument('--ssh-keyfile', help='Path of private ssh key',
default=None)
cmd.add_argument('--encryption-passphrase',
help='Encryption passphrase',
default=None)
help='Encryption passphrase', default=None)
get_exported_archive_apps = subparsers.add_parser(
'get-exported-archive-apps',
help='Get list of apps included in exported archive file')
get_exported_archive_apps.add_argument(
'--path', help='Tarball file path', required=True)
get_exported_archive_apps.add_argument('--path', help='Tarball file path',
required=True)
restore_exported_archive = subparsers.add_parser(
'restore-exported-archive',
@ -108,21 +108,23 @@ def subcommand_setup(arguments):
if not os.path.exists(path):
os.makedirs(path)
init(arguments, encryption='none')
init_repository(arguments, encryption='none')
def init(arguments, encryption):
def init_repository(arguments, encryption):
"""Initialize a local or remote borg repository"""
if encryption != 'none':
if not hasattr(arguments, 'encryption_passphrase') or not \
arguments.encryption_passphrase:
raise ValueError('No encryption passphrase provided')
cmd = ['borg', 'init', '--encryption', encryption, arguments.path]
run(cmd, arguments=arguments)
def subcommand_init(arguments):
init(arguments, encryption=arguments.encryption)
"""Initialize the borg repository."""
init_repository(arguments, encryption=arguments.encryption)
def subcommand_info(arguments):
@ -162,8 +164,7 @@ def _extract(archive_path, destination, locations=None, env=None):
os.chdir(os.path.expanduser(destination))
# TODO: with python 3.7 use subprocess.run with the 'capture_output'
# argument
process = subprocess.run(borg_call, env=env,
stdout=subprocess.PIPE,
process = subprocess.run(borg_call, env=env, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
if process.returncode != 0:
error = process.stderr.decode()
@ -190,8 +191,10 @@ def subcommand_get_archive_apps(arguments):
"""Get list of apps included in archive."""
env = get_env(arguments)
manifest_folder = os.path.relpath(MANIFESTS_FOLDER, '/')
borg_call = ['borg', 'list', arguments.path, manifest_folder,
'--format', '{path}{NEWLINE}']
borg_call = [
'borg', 'list', arguments.path, manifest_folder, '--format',
'{path}{NEWLINE}'
]
timeout = None
if 'BORG_RSH' in env and 'SSHPASS' not in env:
timeout = TIMEOUT
@ -217,24 +220,25 @@ def _get_apps_of_manifest(manifest):
Get apps of a manifest.
Supports both dict format as well as list format of plinth <=0.42
"""
if type(manifest) is list:
if isinstance(manifest, list):
apps = manifest
elif type(manifest) is dict and 'apps' in manifest:
elif isinstance(manifest, dict) and 'apps' in manifest:
apps = manifest['apps']
else:
raise RuntimeError('Unknown manifest format')
return apps
def subcommand_get_exported_archive_apps(arguments):
"""Get list of apps included in an exported archive file."""
manifest = None
with tarfile.open(arguments.path) as t:
filenames = t.getnames()
with tarfile.open(arguments.path) as tar_handle:
filenames = tar_handle.getnames()
for name in filenames:
if 'var/lib/plinth/backups-manifests/' in name \
and name.endswith('.json'):
manifest_data = t.extractfile(name).read()
manifest_data = tar_handle.extractfile(name).read()
manifest = json.loads(manifest_data)
break
@ -275,8 +279,8 @@ def read_password():
"""Read the password from stdin."""
if sys.stdin.isatty():
return ''
else:
return ''.join(sys.stdin)
return ''.join(sys.stdin)
def get_env(arguments, use_credentials=False):
@ -284,12 +288,11 @@ def get_env(arguments, use_credentials=False):
env = dict(os.environ, BORG_RELOCATED_REPO_ACCESS_IS_OK='yes')
# always provide BORG_PASSPHRASE (also if empty) so borg does not get stuck
# while asking for a passphrase.
passphrase = arguments.encryption_passphrase if \
arguments.encryption_passphrase else ''
passphrase = arguments.encryption_passphrase or ''
env['BORG_PASSPHRASE'] = passphrase
if use_credentials:
if arguments.ssh_keyfile:
env['BORG_RSH'] = "ssh -i %s" % arguments.ssh_keyfile
env['BORG_RSH'] = 'ssh -i %s' % arguments.ssh_keyfile
else:
password = read_password()
if password:
@ -297,6 +300,7 @@ def get_env(arguments, use_credentials=False):
env['BORG_RSH'] = 'sshpass -e ssh -o StrictHostKeyChecking=no'
else:
raise ValueError('could not find credentials')
return env
@ -305,9 +309,10 @@ def run(cmd, arguments, check=True):
# Set a timeout to not get stuck if the remote server asks for a password.
timeout = None
use_credentials = False
if "@" in arguments.path:
if '@' in arguments.path:
timeout = TIMEOUT
use_credentials = True
env = get_env(arguments, use_credentials=use_credentials)
subprocess.run(cmd, check=check, env=env, timeout=timeout)

View File

@ -30,7 +30,7 @@ TIMEOUT = 5
class AlreadyMountedError(Exception):
pass
"""Exception raised when mount point is already mounted."""
def parse_arguments():
@ -112,6 +112,7 @@ def _is_mounted(mountpoint):
def subcommand_is_mounted(arguments):
"""Print whether a path is already mounted."""
print(json.dumps(_is_mounted(arguments.mountpoint)))
@ -119,8 +120,8 @@ def read_password():
"""Read the password from stdin."""
if sys.stdin.isatty():
return ''
else:
return ''.join(sys.stdin)
return ''.join(sys.stdin)
def main():

View File

@ -183,15 +183,16 @@ class BorgRepository():
def run(self, arguments):
return self._run('backups', arguments)
def reraise_known_error(self, err):
@staticmethod
def reraise_known_error(err):
"""Look whether the caught error is known and reraise it accordingly"""
caught_error = str(err)
for known_error in KNOWN_ERRORS:
for error in known_error["errors"]:
if error in caught_error:
raise known_error["raise_as"](known_error["message"])
else:
raise err
raise err
class SshBorgRepository(BorgRepository):
@ -319,7 +320,8 @@ class SshBorgRepository(BorgRepository):
except Exception as err:
logger.error(err)
def _append_sshfs_arguments(self, arguments, credentials):
@staticmethod
def _append_sshfs_arguments(arguments, credentials):
"""Add credentials to a run command and kwargs"""
kwargs = {}
@ -348,6 +350,7 @@ def get_ssh_repositories():
for storage in network_storage.get_storages().values():
repository = SshBorgRepository(automount=False, **storage)
repositories[storage['uuid']] = repository.get_view_content()
return repositories