Fix dom0-related issues

This commit is contained in:
Christopher Laprise 2017-12-11 10:16:53 -05:00
parent d84423b0b2
commit c6bc4f05cb
No known key found for this signature in database
GPG Key ID: 448568C8B281C952
2 changed files with 34 additions and 43 deletions

View File

@ -793,7 +793,7 @@ class BackupRestore(object):
super(BackupRestore.Dom0ToRestore, self).__init__(vm)
if subdir:
self.subdir = subdir
self.username = os.path.basename(subdir)
self.username = os.path.basename(subdir)
def __init__(self, app, backup_location, backup_vm, passphrase):
super(BackupRestore, self).__init__()
@ -1357,6 +1357,7 @@ class BackupRestore(object):
# This all means that if the file was correctly verified
# + decrypted, we will surely access the right file
filename = self._verify_and_decrypt(filename)
if not self.options.verify_only:
to_extract.put(os.path.join(self.tmpdir, filename))
else:
@ -1537,7 +1538,8 @@ class BackupRestore(object):
if self.options.dom0_home and \
self.backup_app.domains['dom0'].included_in_backup:
vm = self.backup_app.domains['dom0']
vms_to_restore['dom0'] = self.Dom0ToRestore(vm)
vms_to_restore['dom0'] = self.Dom0ToRestore(vm,
self.backup_app.domains['dom0'].backup_path)
local_user = grp.getgrnam('qubes').gr_mem[0]
if vms_to_restore['dom0'].username != local_user:
@ -1627,6 +1629,10 @@ class BackupRestore(object):
vm_info.problems:
summary_line += " <-- No matching netvm on the host " \
"or in the backup found!"
elif vm_info.name == "dom0" and \
BackupRestore.Dom0ToRestore.USERNAME_MISMATCH in \
restore_info['dom0'].problems:
summary_line += " <-- username in backup and dom0 mismatch"
else:
if vm_info.template != vm_info.vm.template:
summary_line += " <-- Template change to '{}'".format(
@ -1637,23 +1643,6 @@ class BackupRestore(object):
summary += summary_line + "\n"
if 'dom0' in restore_info.keys():
summary_line = ""
for field in fields_to_display:
# noinspection PyTypeChecker
fmt = "{{0:>{0}}} |".format(fields[field]["max_width"] + 1)
if field == "name":
summary_line += fmt.format("Dom0")
elif field == "type":
summary_line += fmt.format("Home")
else:
summary_line += fmt.format("")
if BackupRestore.Dom0ToRestore.USERNAME_MISMATCH in \
restore_info['dom0'].problems:
summary_line += " <-- username in backup and dom0 mismatch"
summary += summary_line + "\n"
return summary
@staticmethod
@ -1751,32 +1740,33 @@ class BackupRestore(object):
for vm_info in self._templates_first(restore_info.values()):
vm = vm_info.restored_vm
if vm and vm_info.subdir:
vms_size += int(vm_info.size)
vms_dirs.append(vm_info.subdir)
if isinstance(vm_info, self.Dom0ToRestore) and \
vm_info.good_to_go:
vms_dirs.append(os.path.dirname(restore_info['dom0'].subdir))
vms_size += int(restore_info['dom0'].size)
if not self.options.verify_only:
handlers[restore_info['dom0'].subdir] = (self._handle_dom0, None)
else:
vms_size += int(vm_info.size)
vms_dirs.append(vm_info.subdir)
if self.options.verify_only:
continue
for name, volume in vm.volumes.items():
if not volume.save_on_stop:
if self.options.verify_only:
continue
data_func = functools.partial(
self._handle_volume_data, vm, volume)
size_func = functools.partial(
self._handle_volume_size, vm, volume)
handlers[os.path.join(vm_info.subdir, name + '.img')] = \
(data_func, size_func)
handlers[os.path.join(vm_info.subdir, 'firewall.xml')] = (
functools.partial(vm_info.vm.handle_firewall_xml, vm), None)
handlers[os.path.join(vm_info.subdir,
'whitelisted-appmenus.list')] = (
functools.partial(self._handle_appmenus_list, vm), None)
for name, volume in vm.volumes.items():
if not volume.save_on_stop:
continue
data_func = functools.partial(
self._handle_volume_data, vm, volume)
size_func = functools.partial(
self._handle_volume_size, vm, volume)
handlers[os.path.join(vm_info.subdir, name + '.img')] = \
(data_func, size_func)
handlers[os.path.join(vm_info.subdir, 'firewall.xml')] = (
functools.partial(vm_info.vm.handle_firewall_xml, vm), None)
handlers[os.path.join(vm_info.subdir,
'whitelisted-appmenus.list')] = (
functools.partial(self._handle_appmenus_list, vm), None)
if 'dom0' in restore_info.keys() and \
restore_info['dom0'].good_to_go:
vms_dirs.append(os.path.dirname(restore_info['dom0'].subdir))
vms_size += restore_info['dom0'].size
if not self.options.verify_only:
handlers[restore_info['dom0'].subdir] = (self._handle_dom0, None)
try:
self._restore_vm_data(vms_dirs=vms_dirs, vms_size=vms_size,
handlers=handlers)

View File

@ -176,7 +176,8 @@ def handle_broken(app, args, restore_info):
raise qubesadmin.exc.QubesException(
"INTERNAL ERROR! Please report this to the Qubes OS team!")
if 'dom0' in restore_info.keys() and args.dom0_home:
if 'dom0' in restore_info.keys() and args.dom0_home \
and not args.verify_only:
if dom0_username_mismatch:
app.log.warning("*** Dom0 username mismatch! This can break "
"some settings! ***")