Make pylint happy ♥
This commit is contained in:
parent
96a4bb650b
commit
533804ebdc
@ -91,8 +91,7 @@ def main(args=None):
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
parser.error('no such domain: {!r}'.format(args.appvm))
|
parser.error('no such domain: {!r}'.format(args.appvm))
|
||||||
args.app.log.info(("NOTE: VM {} will be excluded because it is "
|
args.app.log.info(("NOTE: VM {} will be excluded because it is "
|
||||||
"the backup destination.").format(args.appvm),
|
"the backup destination.").format(args.appvm))
|
||||||
file=sys.stderr)
|
|
||||||
|
|
||||||
if appvm:
|
if appvm:
|
||||||
args.exclude_list.append(appvm.name)
|
args.exclude_list.append(appvm.name)
|
||||||
@ -137,7 +136,7 @@ def main(args=None):
|
|||||||
appvm.start()
|
appvm.start()
|
||||||
|
|
||||||
if not args.encrypted:
|
if not args.encrypted:
|
||||||
args.app.log.info("WARNING: The backup will NOT be encrypted!", file=sys.stderr)
|
args.app.log.info("WARNING: The backup will NOT be encrypted!")
|
||||||
|
|
||||||
if args.pass_file is not None:
|
if args.pass_file is not None:
|
||||||
pass_f = open(args.pass_file) if args.pass_file != "-" else sys.stdin
|
pass_f = open(args.pass_file) if args.pass_file != "-" else sys.stdin
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#
|
#
|
||||||
# The Qubes OS Project, http://www.qubes-os.org
|
# The Qubes OS Project, http://www.qubes-os.org
|
||||||
#
|
#
|
||||||
# Copyright (C) 2016 Marek Marczykowski-Górecki
|
# Copyright (C) 2016 Marek Marczykowski-Górecki
|
||||||
# <marmarek@invisiblethingslab.com>
|
# <marmarek@invisiblethingslab.com>
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software; you can redistribute it and/or modify
|
||||||
@ -89,7 +89,104 @@ parser.add_argument('vms', nargs='*', action='store', default='[]',
|
|||||||
help='Restore only those VMs')
|
help='Restore only those VMs')
|
||||||
|
|
||||||
|
|
||||||
|
def handle_broken(app, args, restore_info):
|
||||||
|
there_are_conflicting_vms = False
|
||||||
|
there_are_missing_templates = False
|
||||||
|
there_are_missing_netvms = False
|
||||||
|
dom0_username_mismatch = False
|
||||||
|
|
||||||
|
for vm_info in restore_info.values():
|
||||||
|
assert isinstance(vm_info, qubes.backup.BackupRestore.VMToRestore)
|
||||||
|
if qubes.backup.BackupRestore.VMToRestore.EXCLUDED in vm_info.problems:
|
||||||
|
continue
|
||||||
|
if qubes.backup.BackupRestore.VMToRestore.MISSING_TEMPLATE in \
|
||||||
|
vm_info.problems:
|
||||||
|
there_are_missing_templates = True
|
||||||
|
if qubes.backup.BackupRestore.VMToRestore.MISSING_NETVM in \
|
||||||
|
vm_info.problems:
|
||||||
|
there_are_missing_netvms = True
|
||||||
|
if qubes.backup.BackupRestore.VMToRestore.ALREADY_EXISTS in \
|
||||||
|
vm_info.problems:
|
||||||
|
there_are_conflicting_vms = True
|
||||||
|
if qubes.backup.BackupRestore.Dom0ToRestore.USERNAME_MISMATCH in \
|
||||||
|
vm_info.problems:
|
||||||
|
dom0_username_mismatch = True
|
||||||
|
|
||||||
|
|
||||||
|
if there_are_conflicting_vms:
|
||||||
|
app.log.error(
|
||||||
|
"*** There are VMs with conflicting names on the host! ***")
|
||||||
|
if args.skip_conflicting:
|
||||||
|
app.log.error(
|
||||||
|
"Those VMs will not be restored. "
|
||||||
|
"The host VMs will NOT be overwritten.")
|
||||||
|
else:
|
||||||
|
raise qubes.exc.QubesException(
|
||||||
|
"Remove VMs with conflicting names from the host "
|
||||||
|
"before proceeding.\n"
|
||||||
|
"Or use --skip-conflicting to restore only those VMs that "
|
||||||
|
"do not exist on the host.\n"
|
||||||
|
"Or use --rename-conflicting to restore those VMs under "
|
||||||
|
"modified names (with numbers at the end).")
|
||||||
|
|
||||||
|
app.log.info("The above VMs will be copied and added to your system.")
|
||||||
|
app.log.info("Exisiting VMs will NOT be removed.")
|
||||||
|
|
||||||
|
if there_are_missing_templates:
|
||||||
|
app.log.warning("*** One or more TemplateVMs are missing on the "
|
||||||
|
"host! ***")
|
||||||
|
if not (args.skip_broken or args.ignore_missing):
|
||||||
|
raise qubes.exc.QubesException(
|
||||||
|
"Install them before proceeding with the restore."
|
||||||
|
"Or pass: --skip-broken or --ignore-missing.")
|
||||||
|
elif args.skip_broken:
|
||||||
|
app.log.warning("Skipping broken entries: VMs that depend on "
|
||||||
|
"missing TemplateVMs will NOT be restored.")
|
||||||
|
elif args.ignore_missing:
|
||||||
|
app.log.warning("Ignoring missing entries: VMs that depend "
|
||||||
|
"on missing TemplateVMs will NOT be restored.")
|
||||||
|
else:
|
||||||
|
raise qubes.exc.QubesException(
|
||||||
|
"INTERNAL ERROR! Please report this to the Qubes OS team!")
|
||||||
|
|
||||||
|
if there_are_missing_netvms:
|
||||||
|
app.log.warning("*** One or more NetVMs are missing on the "
|
||||||
|
"host! ***")
|
||||||
|
if not (args.skip_broken or args.ignore_missing):
|
||||||
|
raise qubes.exc.QubesException(
|
||||||
|
"Install them before proceeding with the restore."
|
||||||
|
"Or pass: --skip-broken or --ignore-missing.")
|
||||||
|
elif args.skip_broken:
|
||||||
|
app.log.warning("Skipping broken entries: VMs that depend on "
|
||||||
|
"missing NetVMs will NOT be restored.")
|
||||||
|
elif args.ignore_missing:
|
||||||
|
app.log.warning("Ignoring missing entries: VMs that depend "
|
||||||
|
"on missing NetVMs will NOT be restored.")
|
||||||
|
else:
|
||||||
|
raise qubes.exc.QubesException(
|
||||||
|
"INTERNAL ERROR! Please report this to the Qubes OS team!")
|
||||||
|
|
||||||
|
if 'dom0' in restore_info.keys() and args.dom0_home:
|
||||||
|
if dom0_username_mismatch:
|
||||||
|
app.log.warning("*** Dom0 username mismatch! This can break "
|
||||||
|
"some settings! ***")
|
||||||
|
if not args.ignore_username_mismatch:
|
||||||
|
raise qubes.exc.QubesException(
|
||||||
|
"Skip restoring the dom0 home directory "
|
||||||
|
"(--skip-dom0-home), or pass "
|
||||||
|
"--ignore-username-mismatch to continue anyway.")
|
||||||
|
else:
|
||||||
|
app.log.warning("Continuing as directed.")
|
||||||
|
app.log.warning("NOTE: Before restoring the dom0 home directory, "
|
||||||
|
"a new directory named "
|
||||||
|
"'home-pre-restore-<current-time>' will be "
|
||||||
|
"created inside the dom0 home directory. If any "
|
||||||
|
"restored files conflict with existing files, "
|
||||||
|
"the existing files will be moved to this new "
|
||||||
|
"directory.")
|
||||||
|
|
||||||
def main(args=None):
|
def main(args=None):
|
||||||
|
# pylint: disable=too-many-return-statements
|
||||||
args = parser.parse_args(args)
|
args = parser.parse_args(args)
|
||||||
|
|
||||||
appvm = None
|
appvm = None
|
||||||
@ -109,6 +206,7 @@ def main(args=None):
|
|||||||
"and (if encrypted) decrypt the backup: ")
|
"and (if encrypted) decrypt the backup: ")
|
||||||
|
|
||||||
encoding = sys.stdin.encoding or locale.getpreferredencoding()
|
encoding = sys.stdin.encoding or locale.getpreferredencoding()
|
||||||
|
# pylint: disable=redefined-variable-type
|
||||||
passphrase = passphrase.decode(encoding)
|
passphrase = passphrase.decode(encoding)
|
||||||
|
|
||||||
args.app.log.info("Checking backup content...")
|
args.app.log.info("Checking backup content...")
|
||||||
@ -145,108 +243,10 @@ def main(args=None):
|
|||||||
|
|
||||||
print(backup.get_restore_summary(restore_info))
|
print(backup.get_restore_summary(restore_info))
|
||||||
|
|
||||||
there_are_conflicting_vms = False
|
try:
|
||||||
there_are_missing_templates = False
|
handle_broken(args.app, args, restore_info)
|
||||||
there_are_missing_netvms = False
|
except qubes.exc.QubesException as e:
|
||||||
dom0_username_mismatch = False
|
parser.error_runtime(str(e))
|
||||||
|
|
||||||
for vm_info in restore_info.values():
|
|
||||||
assert isinstance(vm_info, qubes.backup.BackupRestore.VMToRestore)
|
|
||||||
if qubes.backup.BackupRestore.VMToRestore.EXCLUDED in vm_info.problems:
|
|
||||||
continue
|
|
||||||
if qubes.backup.BackupRestore.VMToRestore.MISSING_TEMPLATE in \
|
|
||||||
vm_info.problems:
|
|
||||||
there_are_missing_templates = True
|
|
||||||
if qubes.backup.BackupRestore.VMToRestore.MISSING_NETVM in \
|
|
||||||
vm_info.problems:
|
|
||||||
there_are_missing_netvms = True
|
|
||||||
if qubes.backup.BackupRestore.VMToRestore.ALREADY_EXISTS in \
|
|
||||||
vm_info.problems:
|
|
||||||
there_are_conflicting_vms = True
|
|
||||||
if qubes.backup.BackupRestore.Dom0ToRestore.USERNAME_MISMATCH in \
|
|
||||||
vm_info.problems:
|
|
||||||
dom0_username_mismatch = True
|
|
||||||
|
|
||||||
|
|
||||||
if there_are_conflicting_vms:
|
|
||||||
args.app.log.error(
|
|
||||||
"*** There are VMs with conflicting names on the host! ***")
|
|
||||||
if args.skip_conflicting:
|
|
||||||
args.app.log.error(
|
|
||||||
"Those VMs will not be restored. "
|
|
||||||
"The host VMs will NOT be overwritten.")
|
|
||||||
else:
|
|
||||||
args.app.log.error(
|
|
||||||
"Remove VMs with conflicting names from the host "
|
|
||||||
"before proceeding.")
|
|
||||||
args.app.log.error(
|
|
||||||
"Or use --skip-conflicting to restore only those VMs that "
|
|
||||||
"do not exist on the host.")
|
|
||||||
args.app.log.error(
|
|
||||||
"Or use --rename-conflicting to restore those VMs under "
|
|
||||||
"modified names (with numbers at the end).")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
args.app.log.info("The above VMs will be copied and added to your system.")
|
|
||||||
args.app.log.info("Exisiting VMs will NOT be removed.")
|
|
||||||
|
|
||||||
if there_are_missing_templates:
|
|
||||||
args.app.log.error("*** One or more TemplateVMs are missing on the "
|
|
||||||
"host! ***")
|
|
||||||
if not (args.skip_broken or args.ignore_missing):
|
|
||||||
args.app.log.error("Install them before proceeding with the "
|
|
||||||
"restore.")
|
|
||||||
args.app.log.error("Or pass: --skip-broken or --ignore-missing.")
|
|
||||||
return 1
|
|
||||||
elif args.skip_broken:
|
|
||||||
args.app.log.error("Skipping broken entries: VMs that depend on "
|
|
||||||
"missing TemplateVMs will NOT be restored.")
|
|
||||||
elif args.ignore_missing:
|
|
||||||
args.app.log.error("Ignoring missing entries: VMs that depend "
|
|
||||||
"on missing TemplateVMs will NOT be restored.")
|
|
||||||
else:
|
|
||||||
args.app.log.error("INTERNAL ERROR! Please report this to the "
|
|
||||||
"Qubes OS team!")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
if there_are_missing_netvms:
|
|
||||||
args.app.log.error("*** One or more NetVMs are missing on the "
|
|
||||||
"host! ***")
|
|
||||||
if not (args.skip_broken or args.ignore_missing):
|
|
||||||
args.app.log.error("Install them before proceeding with the "
|
|
||||||
"restore.")
|
|
||||||
args.app.log.error("Or pass: --skip-broken or --ignore-missing.")
|
|
||||||
return 1
|
|
||||||
elif args.skip_broken:
|
|
||||||
args.app.log.error("Skipping broken entries: VMs that depend on "
|
|
||||||
"missing NetVMs will NOT be restored.")
|
|
||||||
elif args.ignore_missing:
|
|
||||||
args.app.log.error("Ignoring missing entries: VMs that depend "
|
|
||||||
"on missing NetVMs will NOT be restored.")
|
|
||||||
else:
|
|
||||||
args.app.log.error("INTERNAL ERROR! Please report this to the "
|
|
||||||
"Qubes OS team!")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
if 'dom0' in restore_info.keys() and args.dom0_home:
|
|
||||||
if dom0_username_mismatch:
|
|
||||||
args.app.log.error("*** Dom0 username mismatch! This can break "
|
|
||||||
"some settings! ***")
|
|
||||||
if not args.ignore_username_mismatch:
|
|
||||||
args.app.log.error("Skip restoring the dom0 home directory "
|
|
||||||
"(--skip-dom0-home), or pass "
|
|
||||||
"--ignore-username-mismatch to continue "
|
|
||||||
"anyway.")
|
|
||||||
return 1
|
|
||||||
else:
|
|
||||||
args.app.log.error("Continuing as directed.")
|
|
||||||
args.app.log.error("NOTE: Before restoring the dom0 home directory, "
|
|
||||||
"a new directory named "
|
|
||||||
"'home-pre-restore-<current-time>' will be "
|
|
||||||
"created inside the dom0 home directory. If any "
|
|
||||||
"restored files conflict with existing files, "
|
|
||||||
"the existing files will be moved to this new "
|
|
||||||
"directory.")
|
|
||||||
|
|
||||||
if args.pass_file is None:
|
if args.pass_file is None:
|
||||||
if raw_input("Do you want to proceed? [y/N] ").upper() != "Y":
|
if raw_input("Do you want to proceed? [y/N] ").upper() != "Y":
|
||||||
@ -258,4 +258,4 @@ def main(args=None):
|
|||||||
parser.error_runtime(str(e))
|
parser.error_runtime(str(e))
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
Loading…
Reference in New Issue
Block a user