dom0/qvm-backup-restore: adjust for new QubesVmCollection API

This commit is contained in:
Marek Marczykowski 2013-01-22 00:34:13 +01:00
parent ae56b17a19
commit 82f3092803

View File

@ -21,6 +21,7 @@
# #
from qubes import QubesVm,QubesException,QubesVmCollection from qubes import QubesVm,QubesException,QubesVmCollection
from qubes import QubesVmClasses
from qubes import xs, xl_ctx, qubes_guid_path, qubes_clipd_path, qrexec_client_path from qubes import xs, xl_ctx, qubes_guid_path, qubes_clipd_path, qrexec_client_path
from qubes import qubes_store_filename, qubes_base_dir from qubes import qubes_store_filename, qubes_base_dir
from qubes import qubes_servicevms_dir, qubes_templates_dir, qubes_appvms_dir from qubes import qubes_servicevms_dir, qubes_templates_dir, qubes_appvms_dir
@ -1272,167 +1273,59 @@ def backup_restore_do(backup_dir, restore_info, host_collection = None, print_ca
host_collection.load() host_collection.load()
lock_obtained = True lock_obtained = True
# Add templates... # Add VM in right order
for vm_info in restore_info.values(): for (vm_class_name, vm_class) in sorted(QubesVmClasses.items(),
if not vm_info['good-to-go']: key=lambda _x: _x[1].load_order):
continue for vm_info in restore_info.values():
if 'vm' not in vm_info: if not vm_info['good-to-go']:
continue continue
vm = vm_info['vm'] if 'vm' not in vm_info:
if not vm.is_template(): continue
continue vm = vm_info['vm']
print_callback("-> Restoring Template VM {0}...".format(vm.name)) if not vm.__class__ == vm_class:
retcode = subprocess.call (["mkdir", "-p", vm.dir_path]) continue
if retcode != 0: print_callback("-> Restoring {type} {0}...".format(vm.name, type=vm_class_name))
error_callback("*** Cannot create directory: {0}?!".format(dest_dir)) retcode = subprocess.call (["mkdir", "-p", vm.dir_path])
error_callback("Skipping...") if retcode != 0:
continue error_callback("*** Cannot create directory: {0}?!".format(dest_dir))
error_callback("Skipping...")
continue
new_vm = None
try: template = None
restore_vm_dir (backup_dir, vm.dir_path, qubes_templates_dir); if vm.template is not None:
new_vm = host_collection.add_new_templatevm(vm.name, template_name = vm_info['template']
conf_file=vm.conf_file, template = host_collection.get_vm_by_name(template_name)
dir_path=vm.dir_path,
installed_by_rpm=False)
new_vm.verify_files() new_vm = None
except Exception as err:
error_callback("ERROR: {0}".format(err))
error_callback("*** Skipping VM: {0}".vm.name)
if new_vm:
host_collection.pop(new_vm.qid)
continue
try: try:
new_vm.clone_attrs(vm) new_vm = host_collection.add_new_vm(vm_class_name, name=vm.name,
except Exception as err: conf_file=vm.conf_file,
error_callback("ERROR: {0}".format(err)) dir_path=vm.dir_path,
error_callback("*** Some VM property will not be restored") template=template,
installed_by_rpm=False)
restore_vm_dir (backup_dir, vm.dir_path, os.path.dirname(new_vm.dir_path));
try: new_vm.verify_files()
new_vm.create_appmenus(verbose=True) except Exception as err:
except Exception as err: error_callback("ERROR: {0}".format(err))
error_callback("ERROR during appmenu restore: {0}".format(err)) error_callback("*** Skipping VM: {0}".format(vm.name))
error_callback("*** VM '{0}' will not have appmenus".format(vm.name)) if new_vm:
host_collection.pop(new_vm.qid)
continue
# ... then NetVMs... try:
for vm_info in restore_info.values(): new_vm.clone_attrs(vm)
if not vm_info['good-to-go']: except Exception as err:
continue error_callback("ERROR: {0}".format(err))
if 'vm' not in vm_info: error_callback("*** Some VM property will not be restored")
continue
vm = vm_info['vm']
if not vm.is_netvm():
continue
print_callback("-> Restoring {0} {1}...".format(vm.type, vm.name)) try:
retcode = subprocess.call (["mkdir", "-p", vm.dir_path]) new_vm.create_appmenus(verbose=True)
if retcode != 0: except Exception as err:
error_callback("*** Cannot create directory: {0}?!".format(dest_dir)) error_callback("ERROR during appmenu restore: {0}".format(err))
error_callback("Skipping...") error_callback("*** VM '{0}' will not have appmenus".format(vm.name))
continue
template = None
if vm.template is not None:
template_name = vm_info['template']
template = host_collection.get_vm_by_name(template_name)
new_vm = None
try:
restore_vm_dir (backup_dir, vm.dir_path, qubes_servicevms_dir);
if vm.type == "NetVM":
new_vm = host_collection.add_new_netvm(vm.name, template,
conf_file=vm.conf_file,
dir_path=vm.dir_path,
label=vm.label)
elif vm.type == "ProxyVM":
new_vm = host_collection.add_new_proxyvm(vm.name, template,
conf_file=vm.conf_file,
dir_path=vm.dir_path,
label=vm.label)
except Exception as err:
error_callback("ERROR: {0}".format(err))
error_callback("*** Skipping VM: {0}".format(vm.name))
if new_vm:
host_collection.pop(new_vm.qid)
continue
try:
new_vm.clone_attrs(vm)
except Exception as err:
error_callback("ERROR: {0}".format(err))
error_callback("*** Some VM property will not be restored")
try:
new_vm.verify_files()
except Exception as err:
error_callback("ERROR: {0}".format(err))
error_callback("*** Skipping VM: {0}".format(vm.name))
host_collection.pop(new_vm.qid)
continue
# ... then appvms...
for vm_info in restore_info.values():
if not vm_info['good-to-go']:
continue
if 'vm' not in vm_info:
continue
vm = vm_info['vm']
if not vm.is_appvm():
continue
print_callback("-> Restoring AppVM {0}...".format(vm.name))
retcode = subprocess.call (["mkdir", "-p", vm.dir_path])
if retcode != 0:
error_callback("*** Cannot create directory: {0}?!".format(dest_dir))
error_callback("Skipping...")
continue
template = None
if vm.template is not None:
template_name = vm_info['template']
template = host_collection.get_vm_by_name(template_name)
new_vm = None
try:
restore_vm_dir (backup_dir, vm.dir_path, qubes_appvms_dir);
if vm.type == "HVM":
new_vm = host_collection.add_new_hvm(vm.name,
label=vm.label)
else:
new_vm = host_collection.add_new_appvm(vm.name, template,
conf_file=vm.conf_file,
dir_path=vm.dir_path,
label=vm.label)
except Exception as err:
error_callback("ERROR: {0}".format(err))
error_callback("*** Skipping VM: {0}".format(vm.name))
if new_vm:
host_collection.pop(new_vm.qid)
continue
try:
new_vm.clone_attrs(vm)
except Exception as err:
error_callback("ERROR: {0}".format(err))
error_callback("*** Some VM property will not be restored")
try:
new_vm.create_appmenus(verbose=True)
except Exception as err:
error_callback("ERROR during appmenu restore: {0}".format(err))
error_callback("*** VM '{0}' will not have appmenus".format(vm.name))
try:
new_vm.verify_files()
except Exception as err:
error_callback("ERROR: {0}".format(err))
error_callback("*** Skipping VM: {0}".format(vm.name))
host_collection.pop(new_vm.qid)
continue
# Set network dependencies - only non-default netvm setting # Set network dependencies - only non-default netvm setting
for vm_info in restore_info.values(): for vm_info in restore_info.values():