diff --git a/core-modules/003QubesTemplateVm.py b/core-modules/003QubesTemplateVm.py index 72488db6..912e3989 100644 --- a/core-modules/003QubesTemplateVm.py +++ b/core-modules/003QubesTemplateVm.py @@ -45,16 +45,6 @@ class QubesTemplateVm(QubesVm): os.path.join(system_path["qubes_templates_dir"], self.name) attrs_config['label']['default'] = defaults["template_label"] - # New attributes - - # Image for template changes - attrs_config['rootcow_img'] = { - 'func': lambda x: os.path.join(self.dir_path, vm_files["rootcow_img"]) } - # Clean image for root-cow and swap (AppVM side) - # TODO: not used anymore - clean up when all references removed - attrs_config['clean_volatile_img'] = { - 'func': lambda x: os.path.join(self.dir_path, vm_files["clean_volatile_img"]) } - return attrs_config def __init__(self, **kwargs): @@ -77,6 +67,9 @@ class QubesTemplateVm(QubesVm): def get_firewall_defaults(self): return { "rules": list(), "allow": False, "allowDns": False, "allowIcmp": False, "allowYumProxy": True } + def rootcow_img(self): + return self.storage.rootcow_img + def clone_disk_files(self, src_vm, verbose): if dry_run: return @@ -86,14 +79,6 @@ class QubesTemplateVm(QubesVm): # Create root-cow.img self.commit_changes(verbose=verbose) - def post_rename(self, old_name): - super(QubesTemplateVm, self).post_rename(old_name) - - old_dirpath = os.path.join(os.path.dirname(self.dir_path), old_name) - # TODO: clean_volatile_img not used anymore - self.clean_volatile_img = self.clean_volatile_img.replace(old_dirpath, self.dir_path) - self.rootcow_img = self.rootcow_img.replace(old_dirpath, self.dir_path) - def commit_changes (self, verbose = False): if not vmm.offline_mode: diff --git a/core-modules/01QubesHVm.py b/core-modules/01QubesHVm.py index 73508f94..a5cf565e 100644 --- a/core-modules/01QubesHVm.py +++ b/core-modules/01QubesHVm.py @@ -198,6 +198,9 @@ class QubesHVm(QubesVm): if dry_run: return + if source_template is None: + source_template = self.template + # create empty disk self.storage.private_img_size = defaults["hvm_private_img_size"] self.storage.root_img_size = defaults["hvm_disk_size"] diff --git a/core-modules/02QubesTemplateHVm.py b/core-modules/02QubesTemplateHVm.py index 27fa076f..7ced9206 100644 --- a/core-modules/02QubesTemplateHVm.py +++ b/core-modules/02QubesTemplateHVm.py @@ -70,6 +70,9 @@ class QubesTemplateHVm(QubesHVm): def is_appvm(self): return False + def rootcow_img(self): + return self.storage.rootcow_img + @classmethod def is_template_compatible(cls, template): if template is None: diff --git a/core/qubes.py b/core/qubes.py index 5b6a5e28..087ee9d5 100755 --- a/core/qubes.py +++ b/core/qubes.py @@ -87,7 +87,6 @@ vm_files = { 'root_img': 'root.img', 'rootcow_img': 'root-cow.img', 'volatile_img': 'volatile.img', - 'clean_volatile_img': 'clean-volatile.img.tar', 'private_img': 'private.img', 'kernels_subdir': 'kernels', 'firewall_conf': 'firewall.xml', diff --git a/core/storage/xen.py b/core/storage/xen.py index 361b6324..77257358 100644 --- a/core/storage/xen.py +++ b/core/storage/xen.py @@ -29,7 +29,8 @@ import sys import re from qubes.storage import QubesVmStorage -from qubes.qubes import QubesException +from qubes.qubes import QubesException, vm_files + class QubesXenVmStorage(QubesVmStorage): """ @@ -44,6 +45,11 @@ class QubesXenVmStorage(QubesVmStorage): self.volatile_dev = "xvdc" self.modules_dev = "xvdd" + if self.vm.is_template(): + self.rootcow_img = os.path.join(self.vmdir, vm_files["rootcow_img"]) + else: + self.rootcow_img = None + def _format_disk_dev(self, path, script, vdev, rw=True, type="disk", domain=None): if path is None: return '' @@ -134,6 +140,16 @@ class QubesXenVmStorage(QubesVmStorage): f_root = open (self.root_img, "a+b") f_root.truncate (self.root_img_size) f_root.close () + if self.vm.is_template(): + self.commit_template_changes() + + def rename(self, old_name, new_name): + super(QubesXenVmStorage, self).rename(old_name, new_name) + + old_dirpath = os.path.join(os.path.dirname(self.vmdir), old_name) + if self.rootcow_img: + self.rootcow_img = self.rootcow_img.replace(old_dirpath, + self.vmdir) def resize_private_img(self, size): f_private = open (self.private_img, "a+b") @@ -154,11 +170,11 @@ class QubesXenVmStorage(QubesVmStorage): def commit_template_changes(self): assert self.vm.is_template() # TODO: move rootcow_img to this class; the same for vm.is_outdated() - if os.path.exists (self.vm.rootcow_img): - os.rename (self.vm.rootcow_img, self.vm.rootcow_img + '.old') + if os.path.exists (self.rootcow_img): + os.rename (self.rootcow_img, self.rootcow_img + '.old') old_umask = os.umask(002) - f_cow = open (self.vm.rootcow_img, "w") + f_cow = open (self.rootcow_img, "w") f_root = open (self.root_img, "r") f_root.seek(0, os.SEEK_END) f_cow.truncate (f_root.tell()) # make empty sparse file of the same size as root.img