From a6d079594b4235bd92934b91927b78cbd2c2327a Mon Sep 17 00:00:00 2001 From: Marek Marczykowski Date: Mon, 4 Apr 2011 18:41:02 +0200 Subject: [PATCH] Don't set template on StandaloneVM - only use it when copying template files (#189) --- dom0/qvm-core/qubes.py | 58 +++++++++++++++++++++++---------------- dom0/qvm-tools/qvm-create | 13 ++++++--- 2 files changed, 43 insertions(+), 28 deletions(-) diff --git a/dom0/qvm-core/qubes.py b/dom0/qvm-core/qubes.py index efc81daa..f82aab6a 100755 --- a/dom0/qvm-core/qubes.py +++ b/dom0/qvm-core/qubes.py @@ -588,16 +588,18 @@ class QubesVm(object): "/local/domain/{0}/qubes_secondary_dns".format(xid), self.netvm_vm.secondary_dns]) - def create_config_file(self): - assert self.template_vm is not None + def create_config_file(self, source_template = None): + if source_template is None: + source_template = self.template_vm + assert source_template is not None conf_template = None if self.type == "NetVM": - conf_template = open (self.template_vm.netvms_conf_file, "r") + conf_template = open (source_template.netvms_conf_file, "r") elif self.updateable: - conf_template = open (self.template_vm.standalonevms_conf_file, "r") + conf_template = open (source_template.standalonevms_conf_file, "r") else: - conf_template = open (self.template_vm.appvms_conf_file, "r") + conf_template = open (source_template.appvms_conf_file, "r") if os.path.isfile(self.conf_file): shutil.copy(self.conf_file, self.conf_file + ".backup") conf_appvm = open(self.conf_file, "w") @@ -611,7 +613,7 @@ class QubesVm(object): for line in conf_template: line = rx_vmname.sub (self.name, line) line = rx_vmdir.sub (self.dir_path, line) - line = rx_template.sub (self.template_vm.dir_path, line) + line = rx_template.sub (source_template.dir_path, line) line = rx_pcidevs.sub (self.pcidevs, line) line = rx_mem.sub (str(self.memory), line) line = rx_vcpus.sub (str(self.vcpus), line) @@ -620,8 +622,10 @@ class QubesVm(object): conf_template.close() conf_appvm.close() - def create_on_disk(self, verbose): - assert self.template_vm is not None + def create_on_disk(self, verbose, source_template = None): + if source_template is None: + source_template = self.template_vm + assert source_template is not None if dry_run: return @@ -633,9 +637,9 @@ class QubesVm(object): if verbose: print "--> Creating the VM config file: {0}".format(self.conf_file) - self.create_config_file() + self.create_config_file(source_template = source_template) - template_priv = self.template_vm.private_img + template_priv = source_template.private_img if verbose: print "--> Copying the template's private image: {0}".\ format(template_priv) @@ -647,7 +651,7 @@ class QubesVm(object): format(template_priv, self.private_img)) if self.is_updateable(): - template_root = self.template_vm.root_img + template_root = source_template.root_img if verbose: print "--> Copying the template's root image: {0}".\ format(template_root) @@ -661,12 +665,12 @@ class QubesVm(object): kernels_dir = self.dir_path + '/' + default_kernels_subdir if verbose: print "--> Copying the template's kernel dir: {0}".\ - format(self.template_vm.kernels_dir) - shutil.copytree (self.template_vm.kernels_dir, kernels_dir) + format(source_template.kernels_dir) + shutil.copytree (source_template.kernels_dir, kernels_dir) # Create volatile.img - self.reset_volatile_storage() + self.reset_volatile_storage(source_template = source_template) def verify_files(self): if dry_run: @@ -693,11 +697,14 @@ class QubesVm(object): format(self.private_img)) return True - def reset_volatile_storage(self): + def reset_volatile_storage(self, source_template = None): assert not self.is_running(), "Attempt to clean volatile image of running VM!" + if source_template is None: + source_template = self.template_vm + # Only makes sense on template based VM - if self.template_vm is None: + if source_template is None: return print "--> Cleaning volatile image: {0}...".format (self.volatile_img) @@ -706,10 +713,10 @@ class QubesVm(object): if os.path.exists (self.volatile_img): os.remove (self.volatile_img) - retcode = subprocess.call (["tar", "xf", self.template_vm.clean_volatile_img, "-C", self.dir_path]) + retcode = subprocess.call (["tar", "xf", source_template.clean_volatile_img, "-C", self.dir_path]) if retcode != 0: raise IOError ("Error while unpacking {0} to {1}".\ - format(self.template_vm.clean_volatile_img, self.volatile_img)) + format(source_template.clean_volatile_img, self.volatile_img)) def remove_from_disk(self): if dry_run: @@ -1562,18 +1569,18 @@ class QubesAppVm(QubesVm): def type(self): return "AppVM" - def create_on_disk(self, verbose): + def create_on_disk(self, verbose, source_template = None): if dry_run: return - super(QubesAppVm, self).create_on_disk(verbose) + super(QubesAppVm, self).create_on_disk(verbose, source_template=source_template) if verbose: print "--> Creating icon symlink: {0} -> {1}".format(self.icon_path, self.label.icon_path) os.symlink (self.label.icon_path, self.icon_path) if not self.internal: - self.create_appmenus (verbose) + self.create_appmenus (verbose, source_template=source_template) def remove_from_disk(self): if dry_run: @@ -1582,9 +1589,12 @@ class QubesAppVm(QubesVm): subprocess.check_call ([qubes_appmenu_remove_cmd, self.name]) super(QubesAppVm, self).remove_from_disk() - def create_appmenus(self, verbose): - if self.template_vm is not None: - subprocess.check_call ([qubes_appmenu_create_cmd, self.template_vm.appmenus_templates_dir, self.name]) + def create_appmenus(self, verbose, source_template = None): + if source_template is None: + source_template = self.template_vm + + if source_template is not None: + subprocess.check_call ([qubes_appmenu_create_cmd, source_template.appmenus_templates_dir, self.name]) else: # Only add apps to menu subprocess.check_call ([qubes_appmenu_create_cmd, "none", self.name]) diff --git a/dom0/qvm-tools/qvm-create b/dom0/qvm-tools/qvm-create index c0f3f478..b2d94a22 100755 --- a/dom0/qvm-tools/qvm-create +++ b/dom0/qvm-tools/qvm-create @@ -117,9 +117,14 @@ def main(): if (options.verbose): print "--> Using default TemplateVM: {0}".format(template_vm.name) + if options.standalone: + new_vm_template = None + else: + new_vm_template = template_vm + vm = None if options.netvm: - vm = qvm_collection.add_new_netvm(vmname, template_vm, label = label, updateable = options.standalone) + vm = qvm_collection.add_new_netvm(vmname, new_vm_template, label = label, updateable = options.standalone) net_devices = find_net_devices() print "Found the following net devices in your system:" @@ -132,9 +137,9 @@ def main(): vm.pcidevs = dev_str elif options.proxyvm: - vm = qvm_collection.add_new_proxyvm(vmname, template_vm, label = label, updateable = options.standalone) + vm = qvm_collection.add_new_proxyvm(vmname, new_vm_template, label = label, updateable = options.standalone) else: - vm = qvm_collection.add_new_appvm(vmname, template_vm, label = label, updateable = options.standalone) + vm = qvm_collection.add_new_appvm(vmname, new_vm_template, label = label, updateable = options.standalone) if options.internal: vm.internal = True @@ -146,7 +151,7 @@ def main(): vm.vcpus = options.vcpus try: - vm.create_on_disk(verbose=options.verbose) + vm.create_on_disk(verbose=options.verbose, source_template=template_vm) vm.add_to_xen_storage() except (IOError, OSError) as err: