From 8b29a09986958ff0e392a1934bcf22f613eac59f Mon Sep 17 00:00:00 2001 From: Marek Marczykowski Date: Wed, 7 Mar 2012 17:04:25 +0100 Subject: [PATCH 01/21] dom0/dispvm: icons for DispVM Beautiful icons thanks to Agnieszka Kostrzewa! --- dom0/icons/dispvm-black.png | Bin 0 -> 11275 bytes dom0/icons/dispvm-blue.png | Bin 0 -> 11181 bytes dom0/icons/dispvm-gray.png | Bin 0 -> 11084 bytes dom0/icons/dispvm-green.png | Bin 0 -> 11979 bytes dom0/icons/dispvm-orange.png | Bin 0 -> 11748 bytes dom0/icons/dispvm-padlock-layers.xcf | Bin 0 -> 49215 bytes dom0/icons/dispvm-purple.png | Bin 0 -> 11764 bytes dom0/icons/dispvm-red.png | Bin 0 -> 11173 bytes dom0/icons/dispvm-yellow.png | Bin 0 -> 11762 bytes dom0/qvm-core/qubes.py | 5 +++++ 10 files changed, 5 insertions(+) create mode 100644 dom0/icons/dispvm-black.png create mode 100644 dom0/icons/dispvm-blue.png create mode 100644 dom0/icons/dispvm-gray.png create mode 100644 dom0/icons/dispvm-green.png create mode 100644 dom0/icons/dispvm-orange.png create mode 100644 dom0/icons/dispvm-padlock-layers.xcf create mode 100644 dom0/icons/dispvm-purple.png create mode 100644 dom0/icons/dispvm-red.png create mode 100644 dom0/icons/dispvm-yellow.png diff --git a/dom0/icons/dispvm-black.png b/dom0/icons/dispvm-black.png new file mode 100644 index 0000000000000000000000000000000000000000..2896be79aa4a634bc0e35c6dad68d704a6483f71 GIT binary patch literal 11275 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 G2L2CzBn(gh literal 0 HcmV?d00001 diff --git a/dom0/icons/dispvm-gray.png b/dom0/icons/dispvm-gray.png new file mode 100644 index 0000000000000000000000000000000000000000..dfd79c2099fbfb6443e1b2e5c1269c45661788e8 GIT binary patch literal 11084 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¥#LSxUaP)cV4N3 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 L>at)N^RWK`dp~gc literal 0 HcmV?d00001 diff --git a/dom0/icons/dispvm-green.png b/dom0/icons/dispvm-green.png new file mode 100644 index 0000000000000000000000000000000000000000..55325f121ebfefb61c9d6a59b9078b71dbf2f7f9 GIT binary patch literal 11979 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 literal 0 HcmV?d00001 diff --git a/dom0/icons/dispvm-orange.png b/dom0/icons/dispvm-orange.png new file mode 100644 index 0000000000000000000000000000000000000000..68197f65d6049ad482686d02d986b3287fa1499b GIT binary patch literal 11748 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 B0QUd@ literal 0 HcmV?d00001 diff --git a/dom0/icons/dispvm-padlock-layers.xcf b/dom0/icons/dispvm-padlock-layers.xcf new file mode 100644 index 0000000000000000000000000000000000000000..36cf2fb00288ed98a6af91e89aba7a653d3083ef GIT binary patch literal 49215 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 literal 0 HcmV?d00001 diff --git a/dom0/icons/dispvm-yellow.png b/dom0/icons/dispvm-yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..5fa532603d2d5e2101025ab4ee311bb9bf5d590d GIT binary patch literal 11762 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 Date: Wed, 7 Mar 2012 17:04:25 +0100 Subject: [PATCH 02/21] dom0/dispvm: icons for DispVM Beautiful icons thanks to Agnieszka Kostrzewa! --- dom0/icons/dispvm-black.png | Bin 0 -> 11275 bytes dom0/icons/dispvm-blue.png | Bin 0 -> 11181 bytes dom0/icons/dispvm-gray.png | Bin 0 -> 11084 bytes dom0/icons/dispvm-green.png | Bin 0 -> 11979 bytes dom0/icons/dispvm-orange.png | Bin 0 -> 11748 bytes dom0/icons/dispvm-padlock-layers.xcf | Bin 0 -> 49215 bytes dom0/icons/dispvm-purple.png | Bin 0 -> 11764 bytes dom0/icons/dispvm-red.png | Bin 0 -> 11173 bytes dom0/icons/dispvm-yellow.png | Bin 0 -> 11762 bytes dom0/qvm-core/qubes.py | 5 +++++ 10 files changed, 5 insertions(+) create mode 100644 dom0/icons/dispvm-black.png create mode 100644 dom0/icons/dispvm-blue.png create mode 100644 dom0/icons/dispvm-gray.png create mode 100644 dom0/icons/dispvm-green.png create mode 100644 dom0/icons/dispvm-orange.png create mode 100644 dom0/icons/dispvm-padlock-layers.xcf create mode 100644 dom0/icons/dispvm-purple.png create mode 100644 dom0/icons/dispvm-red.png create mode 100644 dom0/icons/dispvm-yellow.png diff --git a/dom0/icons/dispvm-black.png b/dom0/icons/dispvm-black.png new file mode 100644 index 0000000000000000000000000000000000000000..2896be79aa4a634bc0e35c6dad68d704a6483f71 GIT binary patch literal 11275 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 G2L2CzBn(gh literal 0 HcmV?d00001 diff --git a/dom0/icons/dispvm-gray.png b/dom0/icons/dispvm-gray.png new file mode 100644 index 0000000000000000000000000000000000000000..dfd79c2099fbfb6443e1b2e5c1269c45661788e8 GIT binary patch literal 11084 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¥#LSxUaP)cV4N3 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 L>at)N^RWK`dp~gc literal 0 HcmV?d00001 diff --git a/dom0/icons/dispvm-green.png b/dom0/icons/dispvm-green.png new file mode 100644 index 0000000000000000000000000000000000000000..55325f121ebfefb61c9d6a59b9078b71dbf2f7f9 GIT binary patch literal 11979 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 literal 0 HcmV?d00001 diff --git a/dom0/icons/dispvm-orange.png b/dom0/icons/dispvm-orange.png new file mode 100644 index 0000000000000000000000000000000000000000..68197f65d6049ad482686d02d986b3287fa1499b GIT binary patch literal 11748 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 B0QUd@ literal 0 HcmV?d00001 diff --git a/dom0/icons/dispvm-padlock-layers.xcf b/dom0/icons/dispvm-padlock-layers.xcf new file mode 100644 index 0000000000000000000000000000000000000000..36cf2fb00288ed98a6af91e89aba7a653d3083ef GIT binary patch literal 49215 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 literal 0 HcmV?d00001 diff --git a/dom0/icons/dispvm-yellow.png b/dom0/icons/dispvm-yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..5fa532603d2d5e2101025ab4ee311bb9bf5d590d GIT binary patch literal 11762 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 Date: Wed, 7 Mar 2012 18:50:56 +0100 Subject: [PATCH 03/21] dom0/dispvm: clone QubesVmLabel object for DispVM --- dom0/qvm-core/qubes.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/dom0/qvm-core/qubes.py b/dom0/qvm-core/qubes.py index 01963dea..07b28563 100755 --- a/dom0/qvm-core/qubes.py +++ b/dom0/qvm-core/qubes.py @@ -177,6 +177,17 @@ QubesVmLabels = { "black" : QubesVmLabel ("black", 8), } +QubesDispVmLabels = { + "red" : QubesVmLabel ("red", 1, icon="dispvm-red"), + "orange" : QubesVmLabel ("orange", 2, icon="dispvm-orange"), + "yellow" : QubesVmLabel ("yellow", 3, icon="dispvm-yellow"), + "green" : QubesVmLabel ("green", 4, color="0x5fa05e", icon="dispvm-green"), + "gray" : QubesVmLabel ("gray", 5, icon="dispvm-gray"), + "blue" : QubesVmLabel ("blue", 6, icon="dispvm-blue"), + "purple" : QubesVmLabel ("purple", 7, color="0xb83374", icon="dispvm-purple"), + "black" : QubesVmLabel ("black", 8, icon="dispvm-black"), +} + default_appvm_label = QubesVmLabels["red"] default_template_label = QubesVmLabels["gray"] default_servicevm_label = QubesVmLabels["red"] @@ -1993,9 +2004,9 @@ class QubesDisposableVm(QubesVm): super(QubesDisposableVm, self).__init__(dir_path="/nonexistent", **kwargs) # Use DispVM icon with the same color - self._label.icon = "dispvm-" + self.label.icon - self._label.icon_path = "/usr/share/qubes/icons/" + self.label.icon + ".png" - self.icon_path = self._label.icon_path + if self._label: + self._label = QubesDispVmLabels[self._label.name] + self.icon_path = self._label.icon_path @property def type(self): From 7d07bc718bcafedf4f378badd8ab65d0c0c45c92 Mon Sep 17 00:00:00 2001 From: Marek Marczykowski Date: Wed, 7 Mar 2012 18:50:56 +0100 Subject: [PATCH 04/21] dom0/dispvm: clone QubesVmLabel object for DispVM --- dom0/qvm-core/qubes.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/dom0/qvm-core/qubes.py b/dom0/qvm-core/qubes.py index abbdad7b..bdd3551c 100755 --- a/dom0/qvm-core/qubes.py +++ b/dom0/qvm-core/qubes.py @@ -186,6 +186,17 @@ QubesVmLabels = { "black" : QubesVmLabel ("black", 8), } +QubesDispVmLabels = { + "red" : QubesVmLabel ("red", 1, icon="dispvm-red"), + "orange" : QubesVmLabel ("orange", 2, icon="dispvm-orange"), + "yellow" : QubesVmLabel ("yellow", 3, icon="dispvm-yellow"), + "green" : QubesVmLabel ("green", 4, color="0x5fa05e", icon="dispvm-green"), + "gray" : QubesVmLabel ("gray", 5, icon="dispvm-gray"), + "blue" : QubesVmLabel ("blue", 6, icon="dispvm-blue"), + "purple" : QubesVmLabel ("purple", 7, color="0xb83374", icon="dispvm-purple"), + "black" : QubesVmLabel ("black", 8, icon="dispvm-black"), +} + default_appvm_label = QubesVmLabels["red"] default_template_label = QubesVmLabels["gray"] default_servicevm_label = QubesVmLabels["red"] @@ -2011,9 +2022,9 @@ class QubesDisposableVm(QubesVm): super(QubesDisposableVm, self).__init__(dir_path="/nonexistent", **kwargs) # Use DispVM icon with the same color - self._label.icon = "dispvm-" + self.label.icon - self._label.icon_path = "/usr/share/qubes/icons/" + self.label.icon + ".png" - self.icon_path = self._label.icon_path + if self._label: + self._label = QubesDispVmLabels[self._label.name] + self.icon_path = self._label.icon_path @property def type(self): From f6c222d957fb11cca37e3a24416370824e6170ce Mon Sep 17 00:00:00 2001 From: Marek Marczykowski Date: Wed, 7 Mar 2012 19:03:55 +0100 Subject: [PATCH 05/21] dom0/QubesVm: add include_in_backups property --- dom0/qvm-core/qubes.py | 10 ++++++++-- dom0/qvm-tools/qvm-prefs | 10 ++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/dom0/qvm-core/qubes.py b/dom0/qvm-core/qubes.py index bdd3551c..6adf817e 100755 --- a/dom0/qvm-core/qubes.py +++ b/dom0/qvm-core/qubes.py @@ -231,6 +231,7 @@ class QubesVm(object): kernelopts = "", uses_default_kernelopts = True, mac = None, + include_in_backups = True, services = None): @@ -264,6 +265,8 @@ class QubesVm(object): self.config_file_template = config_template_pv self.updateable = updateable + self.include_in_backups = include_in_backups + self._label = label if label is not None else QubesVmLabels["red"] if self.dir_path is not None: self.icon_path = self.dir_path + "/icon.png" @@ -1439,7 +1442,7 @@ class QubesVm(object): for prop in ['memory', 'maxmem', 'pcidevs', 'vcpus', 'internal',\ 'uses_default_kernel', 'kernel', 'uses_default_kernelopts',\ 'kernelopts', 'services', 'updateable', 'installed_by_rpm',\ - 'uses_default_netvm' ]: + 'uses_default_netvm', 'include_in_backups' ]: if hasattr(self, prop): attrs[prop] = str(self.__getattribute__(prop)) if self._mac is not None: @@ -2624,7 +2627,7 @@ class QubesVmCollection(dict): "installed_by_rpm", "updateable", "internal", "uses_default_netvm", "label", "memory", "vcpus", "pcidevs", "maxmem", "kernel", "uses_default_kernel", "kernelopts", "uses_default_kernelopts", - "mac", "services" ) + "mac", "services", "include_in_backups" ) for attribute in common_attr_list: kwargs[attribute] = element.get(attribute) @@ -2635,6 +2638,9 @@ class QubesVmCollection(dict): if "updateable" in kwargs: kwargs["updateable"] = True if kwargs["updateable"] == "True" else False + if "include_in_backups" in kwargs: + kwargs["include_in_backups"] = True if kwargs["include_in_backups"] == "True" else False + if "installed_by_rpm" in kwargs: kwargs["installed_by_rpm"] = True if kwargs["installed_by_rpm"] == "True" else False diff --git a/dom0/qvm-tools/qvm-prefs b/dom0/qvm-tools/qvm-prefs index 0b31053c..5692bb07 100755 --- a/dom0/qvm-tools/qvm-prefs +++ b/dom0/qvm-tools/qvm-prefs @@ -43,6 +43,7 @@ def do_list(vm): print fmt.format ("netvm", vm.netvm.name) print fmt.format ("updateable?", vm.is_updateable()) print fmt.format ("installed by RPM?", vm.installed_by_rpm) + print fmt.format ("include in backups", vm.include_in_backups) print fmt.format ("dir", vm.dir_path) print fmt.format ("config", vm.conf_file) print fmt.format ("pcidevs", vm.pcidevs) @@ -326,7 +327,16 @@ def set_drive(vms, vm, args): vm.drive = args[0] return True +def set_include_in_backups(vms, vm, args): + if len (args) != 1: + print >> sys.stderr, "Missing value (True/False)!" + return False + + vm.include_in_backups = bool(eval(args[0].capitalize())) + return True + properties = { + "include_in_backups": set_include_in_backups, "updateable": set_updateable, "nonupdateable": set_nonupdateable, "pcidevs": set_pcidevs, From 9360a18b0c87aa0563815d26f235bfa4ef581ddc Mon Sep 17 00:00:00 2001 From: Marek Marczykowski Date: Wed, 7 Mar 2012 19:03:55 +0100 Subject: [PATCH 06/21] dom0/QubesVm: add include_in_backups property --- dom0/qvm-core/qubes.py | 10 ++++++++-- dom0/qvm-tools/qvm-prefs | 10 ++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/dom0/qvm-core/qubes.py b/dom0/qvm-core/qubes.py index 07b28563..6e13f96e 100755 --- a/dom0/qvm-core/qubes.py +++ b/dom0/qvm-core/qubes.py @@ -222,6 +222,7 @@ class QubesVm(object): kernelopts = "", uses_default_kernelopts = True, mac = None, + include_in_backups = True, services = None): @@ -253,6 +254,8 @@ class QubesVm(object): self.firewall_conf = self.absolute_path(firewall_conf, default_firewall_conf_file) self.updateable = updateable + self.include_in_backups = include_in_backups + self._label = label if label is not None else QubesVmLabels["red"] if self.dir_path is not None: self.icon_path = self.dir_path + "/icon.png" @@ -1421,7 +1424,7 @@ class QubesVm(object): for prop in ['memory', 'maxmem', 'pcidevs', 'vcpus', 'internal',\ 'uses_default_kernel', 'kernel', 'uses_default_kernelopts',\ 'kernelopts', 'services', 'updateable', 'installed_by_rpm',\ - 'uses_default_netvm' ]: + 'uses_default_netvm', 'include_in_backups' ]: if hasattr(self, prop): attrs[prop] = str(self.__getattribute__(prop)) if self._mac is not None: @@ -2436,7 +2439,7 @@ class QubesVmCollection(dict): "installed_by_rpm", "updateable", "internal", "uses_default_netvm", "label", "memory", "vcpus", "pcidevs", "maxmem", "kernel", "uses_default_kernel", "kernelopts", "uses_default_kernelopts", - "mac", "services" ) + "mac", "services", "include_in_backups" ) for attribute in common_attr_list: kwargs[attribute] = element.get(attribute) @@ -2447,6 +2450,9 @@ class QubesVmCollection(dict): if "updateable" in kwargs: kwargs["updateable"] = True if kwargs["updateable"] == "True" else False + if "include_in_backups" in kwargs: + kwargs["include_in_backups"] = True if kwargs["include_in_backups"] == "True" else False + if "installed_by_rpm" in kwargs: kwargs["installed_by_rpm"] = True if kwargs["installed_by_rpm"] == "True" else False diff --git a/dom0/qvm-tools/qvm-prefs b/dom0/qvm-tools/qvm-prefs index 4329386b..7fc55c4f 100755 --- a/dom0/qvm-tools/qvm-prefs +++ b/dom0/qvm-tools/qvm-prefs @@ -43,6 +43,7 @@ def do_list(vm): print fmt.format ("netvm", vm.netvm.name) print fmt.format ("updateable?", vm.is_updateable()) print fmt.format ("installed by RPM?", vm.installed_by_rpm) + print fmt.format ("include in backups", vm.include_in_backups) print fmt.format ("dir", vm.dir_path) print fmt.format ("config", vm.conf_file) print fmt.format ("pcidevs", vm.pcidevs) @@ -310,7 +311,16 @@ def set_name(vms, vm, args): return True +def set_include_in_backups(vms, vm, args): + if len (args) != 1: + print >> sys.stderr, "Missing value (True/False)!" + return False + + vm.include_in_backups = bool(eval(args[0].capitalize())) + return True + properties = { + "include_in_backups": set_include_in_backups, "updateable": set_updateable, "nonupdateable": set_nonupdateable, "pcidevs": set_pcidevs, From 07d7620f2335e97d0c31b8ab17c9d99631ceb49d Mon Sep 17 00:00:00 2001 From: Marek Marczykowski Date: Thu, 8 Mar 2012 11:22:46 +0100 Subject: [PATCH 07/21] dom0/core: major rework of QubesVm.__init__ and serialization No more manually set attributes, each in different way. Now there is one dict with attrs, defaults, used also for object serialization to XML. --- dom0/qvm-core/qubes.py | 269 ++++++++++++++++++++--------------------- 1 file changed, 129 insertions(+), 140 deletions(-) diff --git a/dom0/qvm-core/qubes.py b/dom0/qvm-core/qubes.py index 6adf817e..6d56106e 100755 --- a/dom0/qvm-core/qubes.py +++ b/dom0/qvm-core/qubes.py @@ -209,143 +209,141 @@ class QubesVm(object): Note that qid is not the same as Xen's domid! """ - def __init__(self, qid, name, - dir_path, conf_file = None, - uses_default_netvm = True, - netvm = None, - installed_by_rpm = False, - updateable = False, - label = None, - root_img = None, - private_img = None, - memory = default_memory, - maxmem = None, - template_vm = None, - firewall_conf = None, - volatile_img = None, - pcidevs = None, - internal = False, - vcpus = None, - kernel = None, - uses_default_kernel = True, - kernelopts = "", - uses_default_kernelopts = True, - mac = None, - include_in_backups = True, - services = None): + def _get_attrs_config(self): + """ Object attributes for serialization/deserialization + inner dict keys: + - order: initialization order (to keep dependency intact) + attrs without order will be evaluated at the end + - default: default value used when attr not given to object constructor + - attr: set value to this attribute instead of parameter name + - eval: assign result of this expression instead of value directly; + local variable 'value' contains attribute value (or default if it was not given) + - save: use evaluation result as value for XML serialization; only attrs with 'save' key will be saved in XML + - save_skip: if present and evaluates to true, attr will be omitted in XML + - save_attr: save to this XML attribute instead of parameter name + """ + attrs = { + # __qid cannot be accessed by setattr, so must be set manually in __init__ + "qid": { "attr": "_qid", "order": 0 }, + "name": { "order": 1 }, + "dir_path": { "default": None, "order": 2 }, + "conf_file": { "eval": 'self.absolute_path(value, self.name + ".conf")', 'order': 3 }, + # order >= 10: have base attrs set + "root_img": { "eval": 'self.absolute_path(value, default_root_img)', 'order': 10 }, + "private_img": { "eval": 'self.absolute_path(value, default_private_img)', 'order': 10 }, + "volatile_img": { "eval": 'self.absolute_path(value, default_volatile_img)', 'order': 10 }, + "firewall_conf": { "eval": 'self.absolute_path(value, default_firewall_conf_file)', 'order': 10 }, + "installed_by_rpm": { "default": False, 'order': 10 }, + "updateable": { "default": False, 'order': 10 }, + "template_vm": { "default": None, 'order': 10 }, + # order >= 20: have template set + "uses_default_netvm": { "default": True, 'order': 20 }, + "netvm": { "default": None, 'order': 20 }, + "label": { "attr": "_label", "default": QubesVmLabels["red"], 'order': 20 }, + "memory": { "default": default_memory, 'order': 20 }, + "maxmem": { "default": None, 'order': 20 }, + "pcidevs": { "default": '[]', 'order': 20, "eval": \ + '[] if value in ["none", None] else eval(value) if value.find("[") >= 0 else eval("[" + value + "]")' }, + # Internal VM (not shown in qubes-manager, doesn't create appmenus entries + "internal": { "default": False }, + "vcpus": { "default": None }, + "kernel": { "default": None, 'eval': \ + 'self.template_vm.kernel if self.template_vm is not None else value' }, + "uses_default_kernel": { "default": True }, + "uses_default_kernelopts": { "default": True }, + "kernelopts": { "default": "", "eval": \ + 'value if not self.uses_default_kernelopts else default_kernelopts_pcidevs if len(self.pcidevs) > 0 else default_kernelopts' }, + "mac": { "attr": "_mac", "default": None }, + "include_in_backups": { "default": True }, + "services": { "default": {}, "eval": "eval(str(value))" }, + ##### Internal attributes - will be overriden in __init__ regardless of args + "appmenus_templates_dir": { "eval": \ + 'self.dir_path + "/" + default_appmenus_templates_subdir if self.updateable else ' + \ + 'self.template_vm.appmenus_templates_dir if self.template_vm is not None else None' }, + "config_file_template": { "eval": "config_template_pv" }, + "icon_path": { "eval": 'self.dir_path + "/icon.png" if self.dir_path is not None else None' }, + "kernels_dir": { 'eval': 'self.template_vm.kernels_dir if self.template_vm is not None else ' + \ + 'qubes_kernels_base_dir + "/" + self.kernel if self.kernel is not None else ' + \ + # for backward compatibility (or another rare case): kernel=None -> kernel in VM dir + 'self.dir_path + "/" + default_kernels_subdir' }, + } - assert qid < qubes_max_qid, "VM id out of bounds!" - self.__qid = qid - self.name = name + ### Mark attrs for XML inclusion + # Simple string attrs + for prop in ['qid', 'name', 'dir_path', 'memory', 'maxmem', 'pcidevs', 'vcpus', 'internal',\ + 'uses_default_kernel', 'kernel', 'uses_default_kernelopts',\ + 'kernelopts', 'services', 'updateable', 'installed_by_rpm',\ + 'uses_default_netvm', 'include_in_backups' ]: + attrs[prop]['save'] = 'str(self.%s)' % prop + # Simple paths + for prop in ['conf_file', 'root_img', 'volatile_img', 'private_img']: + attrs[prop]['save'] = 'self.relative_path(self.%s)' % prop + attrs[prop]['save_skip'] = 'self.%s is None' % prop - self.dir_path = dir_path + attrs['mac']['save'] = 'str(self._mac)' + attrs['mac']['save_skip'] = 'self._mac is None' - self.conf_file = self.absolute_path(conf_file, name + ".conf") + attrs['netvm']['save'] = 'str(self.netvm.qid) if self.netvm is not None else "none"' + attrs['netvm']['save_attr'] = "netvm_qid" + attrs['template_vm']['save'] = 'str(self.template_vm.qid) if self.template_vm and not self.is_updateable() else "none"' + attrs['template_vm']['save_attr'] = "template_qid" + attrs['label']['save'] = 'self.label.name' - self.uses_default_netvm = uses_default_netvm - self.netvm = netvm - if netvm is not None: - netvm.connected_vms[qid] = self + return attrs - self._mac = mac + def __init__(self, **kwargs): - # We use it in remove from disk to avoid removing rpm files (for templates) - self.installed_by_rpm = installed_by_rpm + attrs = self._get_attrs_config() + for attr_name in sorted(attrs, key=lambda _x: attrs[_x]['order'] if 'order' in attrs[_x] else 1000): + attr_config = attrs[attr_name] + attr = attr_name + if 'attr' in attr_config: + attr = attr_config['attr'] + value = None + if attr_name not in kwargs: + if 'default' in attr_config: + value = attr_config['default'] + else: + value = kwargs[attr_name] + if 'eval' in attr_config: + setattr(self, attr, eval(attr_config['eval'])) + else: + #print "setting %s to %s" % (attr, value) + setattr(self, attr, value) - # Setup standard VM storage; some VM types may not use them all - self.root_img = self.absolute_path(root_img, default_root_img) + #Init private attrs + self.__qid = self._qid - self.volatile_img = self.absolute_path(volatile_img, default_volatile_img) + assert self.__qid < qubes_max_qid, "VM id out of bounds!" + assert self.name is not None - self.private_img = self.absolute_path(private_img, default_private_img) + if self.netvm is not None: + self.netvm.connected_vms[self.qid] = self - self.firewall_conf = self.absolute_path(firewall_conf, default_firewall_conf_file) - - self.config_file_template = config_template_pv - - self.updateable = updateable - self.include_in_backups = include_in_backups - - self._label = label if label is not None else QubesVmLabels["red"] - if self.dir_path is not None: - self.icon_path = self.dir_path + "/icon.png" - else: - self.icon_path = None - - # PCI devices - used only by NetVM - if pcidevs is None or pcidevs == "none": - self.pcidevs = [] - elif pcidevs.find('[') < 0: - # Backward compatibility - self.pcidevs = eval('[' + pcidevs + ']') - else: - self.pcidevs = eval(pcidevs) - - self.memory = memory - - if maxmem is None: - host = QubesHost() - total_mem_mb = host.memory_total/1024 + # Not in generic way to not create QubesHost() to frequently + if self.maxmem is None: + qubes_host = QubesHost() + total_mem_mb = qubes_host.memory_total/1024 self.maxmem = total_mem_mb/2 - else: - self.maxmem = maxmem - - self.template_vm = template_vm - if template_vm is not None: - if updateable: - print >> sys.stderr, "ERROR: Template based VM cannot be updateable!" - return False - if not template_vm.is_template(): - print >> sys.stderr, "ERROR: template_qid={0} doesn't point to a valid TemplateVM".\ - format(template_vm.qid) - return False - - template_vm.appvms[qid] = self - else: - assert self.root_img is not None, "Missing root_img for standalone VM!" - - self.kernel = kernel - - if template_vm is not None: - self.kernels_dir = template_vm.kernels_dir - self.kernel = template_vm.kernel - elif self.kernel is not None: - self.kernels_dir = qubes_kernels_base_dir + "/" + self.kernel - else: - # for backward compatibility (or another rare case): kernel=None -> kernel in VM dir - self.kernels_dir = self.dir_path + "/" + default_kernels_subdir - - self.uses_default_kernel = uses_default_kernel - - self.appmenus_templates_dir = None - if updateable: - self.appmenus_templates_dir = self.dir_path + "/" + default_appmenus_templates_subdir - elif template_vm is not None: - self.appmenus_templates_dir = template_vm.appmenus_templates_dir # By default allow use all VCPUs - if vcpus is None: + if self.vcpus is None: qubes_host = QubesHost() self.vcpus = qubes_host.no_cpus + + # Some additional checks for template based VM + if self.template_vm is not None: + if self.updateable: + print >> sys.stderr, "ERROR: Template based VM cannot be updateable!" + return False + if not self.template_vm.is_template(): + print >> sys.stderr, "ERROR: template_qid={0} doesn't point to a valid TemplateVM".\ + format(self.template_vm.qid) + return False + self.template_vm.appvms[self.qid] = self else: - self.vcpus = vcpus - - self.uses_default_kernelopts = uses_default_kernelopts - if self.uses_default_kernelopts: - if len(self.pcidevs) > 0: - self.kernelopts = default_kernelopts_pcidevs - else: - self.kernelopts = default_kernelopts - else: - self.kernelopts = kernelopts - - self.services = {} - if services is not None: - self.services = eval(str(services)) - - # Internal VM (not shown in qubes-manager, doesn't create appmenus entries - self.internal = internal + assert self.root_img is not None, "Missing root_img for standalone VM!" self.xid = -1 self.xid = self.get_xid() @@ -496,7 +494,7 @@ class QubesVm(object): self.appmenus_templates_dir = self.appmenus_templates_dir.replace(old_dirpath, new_dirpath) if self.icon_path is not None: self.icon_path = self.icon_path.replace(old_dirpath, new_dirpath) - if self.kernels_dir is not None: + if hasattr(self, 'kernels_dir') and self.kernels_dir is not None: self.kernels_dir = self.kernels_dir.replace(old_dirpath, new_dirpath) self.post_rename(old_name) @@ -1431,25 +1429,16 @@ class QubesVm(object): def get_xml_attrs(self): attrs = {} - attrs["qid"] = str(self.qid) - attrs["name"] = self.name - attrs["dir_path"] = self.dir_path - # Simple paths - for prop in ['conf_file', 'root_img', 'volatile_img', 'private_img']: - if hasattr(self, prop) and self.__getattribute__(prop) is not None: - attrs[prop] = self.relative_path(self.__getattribute__(prop)) - # Simple string attrs - for prop in ['memory', 'maxmem', 'pcidevs', 'vcpus', 'internal',\ - 'uses_default_kernel', 'kernel', 'uses_default_kernelopts',\ - 'kernelopts', 'services', 'updateable', 'installed_by_rpm',\ - 'uses_default_netvm', 'include_in_backups' ]: - if hasattr(self, prop): - attrs[prop] = str(self.__getattribute__(prop)) - if self._mac is not None: - attrs["mac"] = str(self._mac) - attrs["netvm_qid"] = str(self.netvm.qid) if self.netvm is not None else "none" - attrs["template_qid"] = str(self.template_vm.qid) if self.template_vm and not self.is_updateable() else "none" - attrs["label"] = self.label.name + attrs_config = self._get_attrs_config() + for attr in attrs_config: + attr_config = attrs_config[attr] + if 'save' in attr_config: + if 'save_skip' in attr_config and eval(attr_config['save_skip']): + continue + if 'save_attr' in attr_config: + attrs[attr_config['save_attr']] = eval(attr_config['save']) + else: + attrs[attr] = eval(attr_config['save']) return attrs def create_xml_element(self): From 84339318228587cb00c91b0625cf4a1b518e8d8d Mon Sep 17 00:00:00 2001 From: Marek Marczykowski Date: Thu, 8 Mar 2012 11:22:46 +0100 Subject: [PATCH 08/21] dom0/core: major rework of QubesVm.__init__ and serialization No more manually set attributes, each in different way. Now there is one dict with attrs, defaults, used also for object serialization to XML. --- dom0/qvm-core/qubes.py | 267 ++++++++++++++++++++--------------------- 1 file changed, 129 insertions(+), 138 deletions(-) diff --git a/dom0/qvm-core/qubes.py b/dom0/qvm-core/qubes.py index 6e13f96e..3d2903eb 100755 --- a/dom0/qvm-core/qubes.py +++ b/dom0/qvm-core/qubes.py @@ -200,141 +200,141 @@ class QubesVm(object): Note that qid is not the same as Xen's domid! """ - def __init__(self, qid, name, - dir_path, conf_file = None, - uses_default_netvm = True, - netvm = None, - installed_by_rpm = False, - updateable = False, - label = None, - root_img = None, - private_img = None, - memory = default_memory, - maxmem = None, - template_vm = None, - firewall_conf = None, - volatile_img = None, - pcidevs = None, - internal = False, - vcpus = None, - kernel = None, - uses_default_kernel = True, - kernelopts = "", - uses_default_kernelopts = True, - mac = None, - include_in_backups = True, - services = None): + def _get_attrs_config(self): + """ Object attributes for serialization/deserialization + inner dict keys: + - order: initialization order (to keep dependency intact) + attrs without order will be evaluated at the end + - default: default value used when attr not given to object constructor + - attr: set value to this attribute instead of parameter name + - eval: assign result of this expression instead of value directly; + local variable 'value' contains attribute value (or default if it was not given) + - save: use evaluation result as value for XML serialization; only attrs with 'save' key will be saved in XML + - save_skip: if present and evaluates to true, attr will be omitted in XML + - save_attr: save to this XML attribute instead of parameter name + """ + attrs = { + # __qid cannot be accessed by setattr, so must be set manually in __init__ + "qid": { "attr": "_qid", "order": 0 }, + "name": { "order": 1 }, + "dir_path": { "default": None, "order": 2 }, + "conf_file": { "eval": 'self.absolute_path(value, self.name + ".conf")', 'order': 3 }, + # order >= 10: have base attrs set + "root_img": { "eval": 'self.absolute_path(value, default_root_img)', 'order': 10 }, + "private_img": { "eval": 'self.absolute_path(value, default_private_img)', 'order': 10 }, + "volatile_img": { "eval": 'self.absolute_path(value, default_volatile_img)', 'order': 10 }, + "firewall_conf": { "eval": 'self.absolute_path(value, default_firewall_conf_file)', 'order': 10 }, + "installed_by_rpm": { "default": False, 'order': 10 }, + "updateable": { "default": False, 'order': 10 }, + "template_vm": { "default": None, 'order': 10 }, + # order >= 20: have template set + "uses_default_netvm": { "default": True, 'order': 20 }, + "netvm": { "default": None, 'order': 20 }, + "label": { "attr": "_label", "default": QubesVmLabels["red"], 'order': 20 }, + "memory": { "default": default_memory, 'order': 20 }, + "maxmem": { "default": None, 'order': 20 }, + "pcidevs": { "default": '[]', 'order': 20, "eval": \ + '[] if value in ["none", None] else eval(value) if value.find("[") >= 0 else eval("[" + value + "]")' }, + # Internal VM (not shown in qubes-manager, doesn't create appmenus entries + "internal": { "default": False }, + "vcpus": { "default": None }, + "kernel": { "default": None, 'eval': \ + 'self.template_vm.kernel if self.template_vm is not None else value' }, + "uses_default_kernel": { "default": True }, + "uses_default_kernelopts": { "default": True }, + "kernelopts": { "default": "", "eval": \ + 'value if not self.uses_default_kernelopts else default_kernelopts_pcidevs if len(self.pcidevs) > 0 else default_kernelopts' }, + "mac": { "attr": "_mac", "default": None }, + "include_in_backups": { "default": True }, + "services": { "default": {}, "eval": "eval(str(value))" }, + ##### Internal attributes - will be overriden in __init__ regardless of args + "appmenus_templates_dir": { "eval": \ + 'self.dir_path + "/" + default_appmenus_templates_subdir if self.updateable else ' + \ + 'self.template_vm.appmenus_templates_dir if self.template_vm is not None else None' }, + "config_file_template": { "eval": "config_template_pv" }, + "icon_path": { "eval": 'self.dir_path + "/icon.png" if self.dir_path is not None else None' }, + "kernels_dir": { 'eval': 'self.template_vm.kernels_dir if self.template_vm is not None else ' + \ + 'qubes_kernels_base_dir + "/" + self.kernel if self.kernel is not None else ' + \ + # for backward compatibility (or another rare case): kernel=None -> kernel in VM dir + 'self.dir_path + "/" + default_kernels_subdir' }, + } - assert qid < qubes_max_qid, "VM id out of bounds!" - self.__qid = qid - self.name = name + ### Mark attrs for XML inclusion + # Simple string attrs + for prop in ['qid', 'name', 'dir_path', 'memory', 'maxmem', 'pcidevs', 'vcpus', 'internal',\ + 'uses_default_kernel', 'kernel', 'uses_default_kernelopts',\ + 'kernelopts', 'services', 'updateable', 'installed_by_rpm',\ + 'uses_default_netvm', 'include_in_backups' ]: + attrs[prop]['save'] = 'str(self.%s)' % prop + # Simple paths + for prop in ['conf_file', 'root_img', 'volatile_img', 'private_img']: + attrs[prop]['save'] = 'self.relative_path(self.%s)' % prop + attrs[prop]['save_skip'] = 'self.%s is None' % prop - self.dir_path = dir_path + attrs['mac']['save'] = 'str(self._mac)' + attrs['mac']['save_skip'] = 'self._mac is None' - self.conf_file = self.absolute_path(conf_file, name + ".conf") + attrs['netvm']['save'] = 'str(self.netvm.qid) if self.netvm is not None else "none"' + attrs['netvm']['save_attr'] = "netvm_qid" + attrs['template_vm']['save'] = 'str(self.template_vm.qid) if self.template_vm and not self.is_updateable() else "none"' + attrs['template_vm']['save_attr'] = "template_qid" + attrs['label']['save'] = 'self.label.name' - self.uses_default_netvm = uses_default_netvm - self.netvm = netvm - if netvm is not None: - netvm.connected_vms[qid] = self + return attrs - self._mac = mac + def __init__(self, **kwargs): - # We use it in remove from disk to avoid removing rpm files (for templates) - self.installed_by_rpm = installed_by_rpm + attrs = self._get_attrs_config() + for attr_name in sorted(attrs, key=lambda _x: attrs[_x]['order'] if 'order' in attrs[_x] else 1000): + attr_config = attrs[attr_name] + attr = attr_name + if 'attr' in attr_config: + attr = attr_config['attr'] + value = None + if attr_name not in kwargs: + if 'default' in attr_config: + value = attr_config['default'] + else: + value = kwargs[attr_name] + if 'eval' in attr_config: + setattr(self, attr, eval(attr_config['eval'])) + else: + #print "setting %s to %s" % (attr, value) + setattr(self, attr, value) - # Setup standard VM storage; some VM types may not use them all - self.root_img = self.absolute_path(root_img, default_root_img) + #Init private attrs + self.__qid = self._qid - self.volatile_img = self.absolute_path(volatile_img, default_volatile_img) + assert self.__qid < qubes_max_qid, "VM id out of bounds!" + assert self.name is not None - self.private_img = self.absolute_path(private_img, default_private_img) + if self.netvm is not None: + self.netvm.connected_vms[self.qid] = self - self.firewall_conf = self.absolute_path(firewall_conf, default_firewall_conf_file) - - self.updateable = updateable - self.include_in_backups = include_in_backups - - self._label = label if label is not None else QubesVmLabels["red"] - if self.dir_path is not None: - self.icon_path = self.dir_path + "/icon.png" - else: - self.icon_path = None - - # PCI devices - used only by NetVM - if pcidevs is None or pcidevs == "none": - self.pcidevs = [] - elif pcidevs.find('[') < 0: - # Backward compatibility - self.pcidevs = eval('[' + pcidevs + ']') - else: - self.pcidevs = eval(pcidevs) - - self.memory = memory - - if maxmem is None: - host = QubesHost() - total_mem_mb = host.memory_total/1024 + # Not in generic way to not create QubesHost() to frequently + if self.maxmem is None: + qubes_host = QubesHost() + total_mem_mb = qubes_host.memory_total/1024 self.maxmem = total_mem_mb/2 - else: - self.maxmem = maxmem - - self.template_vm = template_vm - if template_vm is not None: - if updateable: - print >> sys.stderr, "ERROR: Template based VM cannot be updateable!" - return False - if not template_vm.is_template(): - print >> sys.stderr, "ERROR: template_qid={0} doesn't point to a valid TemplateVM".\ - format(template_vm.qid) - return False - - template_vm.appvms[qid] = self - else: - assert self.root_img is not None, "Missing root_img for standalone VM!" - - self.kernel = kernel - - if template_vm is not None: - self.kernels_dir = template_vm.kernels_dir - self.kernel = template_vm.kernel - elif self.kernel is not None: - self.kernels_dir = qubes_kernels_base_dir + "/" + self.kernel - else: - # for backward compatibility (or another rare case): kernel=None -> kernel in VM dir - self.kernels_dir = self.dir_path + "/" + default_kernels_subdir - - self.uses_default_kernel = uses_default_kernel - - self.appmenus_templates_dir = None - if updateable: - self.appmenus_templates_dir = self.dir_path + "/" + default_appmenus_templates_subdir - elif template_vm is not None: - self.appmenus_templates_dir = template_vm.appmenus_templates_dir # By default allow use all VCPUs - if vcpus is None: + if self.vcpus is None: qubes_host = QubesHost() self.vcpus = qubes_host.no_cpus + + # Some additional checks for template based VM + if self.template_vm is not None: + if self.updateable: + print >> sys.stderr, "ERROR: Template based VM cannot be updateable!" + return False + if not self.template_vm.is_template(): + print >> sys.stderr, "ERROR: template_qid={0} doesn't point to a valid TemplateVM".\ + format(self.template_vm.qid) + return False + self.template_vm.appvms[self.qid] = self else: - self.vcpus = vcpus - - self.uses_default_kernelopts = uses_default_kernelopts - if self.uses_default_kernelopts: - if len(self.pcidevs) > 0: - self.kernelopts = default_kernelopts_pcidevs - else: - self.kernelopts = default_kernelopts - else: - self.kernelopts = kernelopts - - self.services = {} - if services is not None: - self.services = eval(str(services)) - - # Internal VM (not shown in qubes-manager, doesn't create appmenus entries - self.internal = internal + assert self.root_img is not None, "Missing root_img for standalone VM!" self.xid = -1 self.xid = self.get_xid() @@ -485,7 +485,7 @@ class QubesVm(object): self.appmenus_templates_dir = self.appmenus_templates_dir.replace(old_dirpath, new_dirpath) if self.icon_path is not None: self.icon_path = self.icon_path.replace(old_dirpath, new_dirpath) - if self.kernels_dir is not None: + if hasattr(self, 'kernels_dir') and self.kernels_dir is not None: self.kernels_dir = self.kernels_dir.replace(old_dirpath, new_dirpath) self.post_rename(old_name) @@ -1413,25 +1413,16 @@ class QubesVm(object): def get_xml_attrs(self): attrs = {} - attrs["qid"] = str(self.qid) - attrs["name"] = self.name - attrs["dir_path"] = self.dir_path - # Simple paths - for prop in ['conf_file', 'root_img', 'volatile_img', 'private_img']: - if hasattr(self, prop): - attrs[prop] = self.relative_path(self.__getattribute__(prop)) - # Simple string attrs - for prop in ['memory', 'maxmem', 'pcidevs', 'vcpus', 'internal',\ - 'uses_default_kernel', 'kernel', 'uses_default_kernelopts',\ - 'kernelopts', 'services', 'updateable', 'installed_by_rpm',\ - 'uses_default_netvm', 'include_in_backups' ]: - if hasattr(self, prop): - attrs[prop] = str(self.__getattribute__(prop)) - if self._mac is not None: - attrs["mac"] = str(self._mac) - attrs["netvm_qid"] = str(self.netvm.qid) if self.netvm is not None else "none" - attrs["template_qid"] = str(self.template_vm.qid) if self.template_vm and not self.is_updateable() else "none" - attrs["label"] = self.label.name + attrs_config = self._get_attrs_config() + for attr in attrs_config: + attr_config = attrs_config[attr] + if 'save' in attr_config: + if 'save_skip' in attr_config and eval(attr_config['save_skip']): + continue + if 'save_attr' in attr_config: + attrs[attr_config['save_attr']] = eval(attr_config['save']) + else: + attrs[attr] = eval(attr_config['save']) return attrs def create_xml_element(self): From de9f952a2ef6ff3eae0b91e7ccddf3865a920a8b Mon Sep 17 00:00:00 2001 From: Marek Marczykowski Date: Fri, 24 Feb 2012 04:17:45 +0100 Subject: [PATCH 09/21] dom0/core: more generic way to specify xen config template --- dom0/qvm-core/qubes.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dom0/qvm-core/qubes.py b/dom0/qvm-core/qubes.py index 3d2903eb..b8f8ea77 100755 --- a/dom0/qvm-core/qubes.py +++ b/dom0/qvm-core/qubes.py @@ -78,6 +78,8 @@ default_servicevm_vcpus = 1 default_kernelopts = "" default_kernelopts_pcidevs = "iommu=soft swiotlb=2048" +config_template_pv = '/usr/share/qubes/vm-template.conf' + qubes_whitelisted_appmenus = 'whitelisted-appmenus.list' dom0_update_check_interval = 6*3600 @@ -861,7 +863,7 @@ class QubesVm(object): if source_template is None: source_template = self.template_vm - f_conf_template = open('/usr/share/qubes/vm-template.conf', 'r') + f_conf_template = open(self.config_file_template, 'r') conf_template = f_conf_template.read() f_conf_template.close() From 63e19e1afafac7ff7a81f421d4d12c5816e721c6 Mon Sep 17 00:00:00 2001 From: Marek Marczykowski Date: Thu, 8 Mar 2012 11:56:26 +0100 Subject: [PATCH 10/21] dom0/core: follow new __init__ api in subclasses --- dom0/qvm-core/qubes.py | 137 ++++++++++++++++++++--------------------- 1 file changed, 67 insertions(+), 70 deletions(-) diff --git a/dom0/qvm-core/qubes.py b/dom0/qvm-core/qubes.py index b8f8ea77..f5cff8bc 100755 --- a/dom0/qvm-core/qubes.py +++ b/dom0/qvm-core/qubes.py @@ -235,8 +235,8 @@ class QubesVm(object): "netvm": { "default": None, 'order': 20 }, "label": { "attr": "_label", "default": QubesVmLabels["red"], 'order': 20 }, "memory": { "default": default_memory, 'order': 20 }, - "maxmem": { "default": None, 'order': 20 }, - "pcidevs": { "default": '[]', 'order': 20, "eval": \ + "maxmem": { "default": None, 'order': 25 }, + "pcidevs": { "default": '[]', 'order': 25, "eval": \ '[] if value in ["none", None] else eval(value) if value.find("[") >= 0 else eval("[" + value + "]")' }, # Internal VM (not shown in qubes-manager, doesn't create appmenus entries "internal": { "default": False }, @@ -1442,28 +1442,27 @@ class QubesTemplateVm(QubesVm): """ A class that represents an TemplateVM. A child of QubesVm. """ + + def _get_attrs_config(self): + attrs_config = super(QubesTemplateVm, self)._get_attrs_config() + attrs_config['dir_path']['eval'] = 'value if value is not None else qubes_templates_dir + "/" + self.name' + attrs_config['updateable']['default'] = True + attrs_config['label']['default'] = default_template_label + + # New attributes + + # Image for template changes + attrs_config['rootcow_img'] = { 'eval': 'self.dir_path + "/" + default_rootcow_img' } + # Clean image for root-cow and swap (AppVM side) + attrs_config['clean_volatile_img'] = { 'eval': 'self.dir_path + "/" + default_clean_volatile_img' } + + attrs_config['appmenus_templates_dir'] = { 'eval': 'self.dir_path + "/" + default_appmenus_templates_subdir' } + return attrs_config + def __init__(self, **kwargs): - if "dir_path" not in kwargs or kwargs["dir_path"] is None: - kwargs["dir_path"] = qubes_templates_dir + "/" + kwargs["name"] - - if "updateable" not in kwargs or kwargs["updateable"] is None : - kwargs["updateable"] = True - - if "label" not in kwargs or kwargs["label"] == None: - kwargs["label"] = default_template_label - super(QubesTemplateVm, self).__init__(**kwargs) - dir_path = kwargs["dir_path"] - - # Clean image for root-cow and swap (AppVM side) - self.clean_volatile_img = self.dir_path + "/" + default_clean_volatile_img - - # Image for template changes - self.rootcow_img = self.dir_path + "/" + default_rootcow_img - - self.appmenus_templates_dir = self.dir_path + "/" + default_appmenus_templates_subdir self.appvms = QubesVmCollection() @property @@ -1638,44 +1637,40 @@ class QubesTemplateVm(QubesVm): f_cow.close () f_root.close() - def get_xml_attrs(self): - attrs = super(QubesTemplateVm, self).get_xml_attrs() - attrs["clean_volatile_img"] = self.clean_volatile_img - attrs["rootcow_img"] = self.rootcow_img - return attrs - class QubesNetVm(QubesVm): """ A class that represents a NetVM. A child of QubesCowVM. """ + def _get_attrs_config(self): + attrs_config = super(QubesNetVm, self)._get_attrs_config() + attrs_config['dir_path']['eval'] = 'value if value is not None else qubes_servicevms_dir + "/" + self.name' + attrs_config['label']['default'] = default_servicevm_label + attrs_config['vcpus']['default'] = default_servicevm_vcpus + attrs_config['memory']['default'] = 200 + attrs_config['maxmem']['eval'] = 'self.memory' + + # New attributes + attrs_config['netid'] = { 'save': 'str(self.netid)', 'order': 30 } + attrs_config['netprefix'] = { 'eval': '"10.137.{0}.".format(self.netid)' } + attrs_config['dispnetprefix'] = { 'eval': '"10.138.{0}.".format(self.netid)' } + + # Dont save netvm prop + attrs_config['netvm'].pop('save') + attrs_config['uses_default_netvm'].pop('save') + + return attrs_config + def __init__(self, **kwargs): - netid = kwargs.pop("netid") - self.netid = netid - self.__network = "10.137.{0}.0".format(netid) - self.netprefix = "10.137.{0}.".format(netid) - self.dispnetprefix = "10.138.{0}.".format(netid) + super(QubesNetVm, self).__init__(**kwargs) + self.connected_vms = QubesVmCollection() + + self.__network = "10.137.{0}.0".format(self.netid) self.__netmask = vm_default_netmask self.__gateway = self.netprefix + "1" self.__secondary_dns = self.netprefix + "254" - if "dir_path" not in kwargs or kwargs["dir_path"] is None: - kwargs["dir_path"] = qubes_servicevms_dir + "/" + kwargs["name"] self.__external_ip_allowed_xids = set() - if "label" not in kwargs or kwargs["label"] is None: - kwargs["label"] = default_servicevm_label - - if "vcpus" not in kwargs or kwargs["vcpus"] is None: - kwargs["vcpus"] = default_servicevm_vcpus - - if "memory" not in kwargs or kwargs["memory"] is None: - kwargs["memory"] = 200 - - kwargs["maxmem"] = kwargs["memory"] - - super(QubesNetVm, self).__init__(**kwargs) - self.connected_vms = QubesVmCollection() - @property def type(self): return "NetVM" @@ -1783,19 +1778,20 @@ class QubesNetVm(QubesVm): self.__external_ip_allowed_xids.discard(int(xid)) self.update_external_ip_permissions() - def get_xml_attrs(self): - attrs = super(QubesNetVm, self).get_xml_attrs() - attrs.pop("netvm_qid") - attrs.pop("uses_default_netvm") - attrs["netid"] = str(self.netid) - return attrs - class QubesProxyVm(QubesNetVm): """ A class that represents a ProxyVM, ex FirewallVM. A child of QubesNetVM. """ + + def _get_attrs_config(self): + attrs_config = super(QubesProxyVm, self)._get_attrs_config() + attrs_config['uses_default_netvm']['eval'] = 'False' + # Save netvm prop again + attrs_config['netvm']['save'] = 'str(self.netvm.qid) if self.netvm is not None else "none"' + + return attrs_config + def __init__(self, **kwargs): - kwargs["uses_default_netvm"] = False super(QubesProxyVm, self).__init__(**kwargs) self.rules_applied = None @@ -1921,11 +1917,6 @@ class QubesProxyVm(QubesNetVm): self.rules_applied = None xs.write('', "/local/domain/{0}/qubes_iptables".format(self.get_xid()), 'reload') - def get_xml_attrs(self): - attrs = super(QubesProxyVm, self).get_xml_attrs() - attrs["netvm_qid"] = str(self.netvm.qid) if self.netvm is not None else "none" - return attrs - class QubesDom0NetVm(QubesNetVm): def __init__(self): super(QubesDom0NetVm, self).__init__(qid=0, name="dom0", netid=0, @@ -1990,15 +1981,21 @@ class QubesDisposableVm(QubesVm): """ A class that represents an DisposableVM. A child of QubesVm. """ + + def _get_attrs_config(self): + attrs_config = super(QubesDisposableVm, self)._get_attrs_config() + + # New attributes + attrs_config['dispid'] = { 'save': 'str(self.dispid)' } + + return attrs_config + def __init__(self, **kwargs): - template_vm = kwargs["template_vm"] - assert template_vm is not None, "Missing template_vm for DisposableVM!" - - self.dispid = kwargs.pop("dispid") - super(QubesDisposableVm, self).__init__(dir_path="/nonexistent", **kwargs) + assert self.template_vm is not None, "Missing template_vm for DisposableVM!" + # Use DispVM icon with the same color if self._label: self._label = QubesDispVmLabels[self._label.name] @@ -2017,6 +2014,7 @@ class QubesDisposableVm(QubesVm): def get_xml_attrs(self): + # Minimal set - do not inherit rest of attributes attrs = {} attrs["qid"] = str(self.qid) attrs["name"] = self.name @@ -2034,12 +2032,11 @@ class QubesAppVm(QubesVm): """ A class that represents an AppVM. A child of QubesVm. """ - def __init__(self, **kwargs): + def _get_attrs_config(self): + attrs_config = super(QubesAppVm, self)._get_attrs_config() + attrs_config['dir_path']['eval'] = 'value if value is not None else qubes_appvms_dir + "/" + self.name' - if "dir_path" not in kwargs or kwargs["dir_path"] is None: - kwargs["dir_path"] = qubes_appvms_dir + "/" + kwargs["name"] - - super(QubesAppVm, self).__init__(**kwargs) + return attrs_config @property def type(self): From 567229c1049d9627868d6cae969a3a7bcfe63370 Mon Sep 17 00:00:00 2001 From: Marek Marczykowski Date: Thu, 8 Mar 2012 11:56:26 +0100 Subject: [PATCH 11/21] dom0/core: follow new __init__ api in subclasses --- dom0/qvm-core/qubes.py | 137 ++++++++++++++++++++--------------------- 1 file changed, 67 insertions(+), 70 deletions(-) diff --git a/dom0/qvm-core/qubes.py b/dom0/qvm-core/qubes.py index 6d56106e..39ab7f26 100755 --- a/dom0/qvm-core/qubes.py +++ b/dom0/qvm-core/qubes.py @@ -242,8 +242,8 @@ class QubesVm(object): "netvm": { "default": None, 'order': 20 }, "label": { "attr": "_label", "default": QubesVmLabels["red"], 'order': 20 }, "memory": { "default": default_memory, 'order': 20 }, - "maxmem": { "default": None, 'order': 20 }, - "pcidevs": { "default": '[]', 'order': 20, "eval": \ + "maxmem": { "default": None, 'order': 25 }, + "pcidevs": { "default": '[]', 'order': 25, "eval": \ '[] if value in ["none", None] else eval(value) if value.find("[") >= 0 else eval("[" + value + "]")' }, # Internal VM (not shown in qubes-manager, doesn't create appmenus entries "internal": { "default": False }, @@ -1456,28 +1456,27 @@ class QubesTemplateVm(QubesVm): """ A class that represents an TemplateVM. A child of QubesVm. """ + + def _get_attrs_config(self): + attrs_config = super(QubesTemplateVm, self)._get_attrs_config() + attrs_config['dir_path']['eval'] = 'value if value is not None else qubes_templates_dir + "/" + self.name' + attrs_config['updateable']['default'] = True + attrs_config['label']['default'] = default_template_label + + # New attributes + + # Image for template changes + attrs_config['rootcow_img'] = { 'eval': 'self.dir_path + "/" + default_rootcow_img' } + # Clean image for root-cow and swap (AppVM side) + attrs_config['clean_volatile_img'] = { 'eval': 'self.dir_path + "/" + default_clean_volatile_img' } + + attrs_config['appmenus_templates_dir'] = { 'eval': 'self.dir_path + "/" + default_appmenus_templates_subdir' } + return attrs_config + def __init__(self, **kwargs): - if "dir_path" not in kwargs or kwargs["dir_path"] is None: - kwargs["dir_path"] = qubes_templates_dir + "/" + kwargs["name"] - - if "updateable" not in kwargs or kwargs["updateable"] is None : - kwargs["updateable"] = True - - if "label" not in kwargs or kwargs["label"] == None: - kwargs["label"] = default_template_label - super(QubesTemplateVm, self).__init__(**kwargs) - dir_path = kwargs["dir_path"] - - # Clean image for root-cow and swap (AppVM side) - self.clean_volatile_img = self.dir_path + "/" + default_clean_volatile_img - - # Image for template changes - self.rootcow_img = self.dir_path + "/" + default_rootcow_img - - self.appmenus_templates_dir = self.dir_path + "/" + default_appmenus_templates_subdir self.appvms = QubesVmCollection() @property @@ -1652,44 +1651,40 @@ class QubesTemplateVm(QubesVm): f_cow.close () f_root.close() - def get_xml_attrs(self): - attrs = super(QubesTemplateVm, self).get_xml_attrs() - attrs["clean_volatile_img"] = self.clean_volatile_img - attrs["rootcow_img"] = self.rootcow_img - return attrs - class QubesNetVm(QubesVm): """ A class that represents a NetVM. A child of QubesCowVM. """ + def _get_attrs_config(self): + attrs_config = super(QubesNetVm, self)._get_attrs_config() + attrs_config['dir_path']['eval'] = 'value if value is not None else qubes_servicevms_dir + "/" + self.name' + attrs_config['label']['default'] = default_servicevm_label + attrs_config['vcpus']['default'] = default_servicevm_vcpus + attrs_config['memory']['default'] = 200 + attrs_config['maxmem']['eval'] = 'self.memory' + + # New attributes + attrs_config['netid'] = { 'save': 'str(self.netid)', 'order': 30 } + attrs_config['netprefix'] = { 'eval': '"10.137.{0}.".format(self.netid)' } + attrs_config['dispnetprefix'] = { 'eval': '"10.138.{0}.".format(self.netid)' } + + # Dont save netvm prop + attrs_config['netvm'].pop('save') + attrs_config['uses_default_netvm'].pop('save') + + return attrs_config + def __init__(self, **kwargs): - netid = kwargs.pop("netid") - self.netid = netid - self.__network = "10.137.{0}.0".format(netid) - self.netprefix = "10.137.{0}.".format(netid) - self.dispnetprefix = "10.138.{0}.".format(netid) + super(QubesNetVm, self).__init__(**kwargs) + self.connected_vms = QubesVmCollection() + + self.__network = "10.137.{0}.0".format(self.netid) self.__netmask = vm_default_netmask self.__gateway = self.netprefix + "1" self.__secondary_dns = self.netprefix + "254" - if "dir_path" not in kwargs or kwargs["dir_path"] is None: - kwargs["dir_path"] = qubes_servicevms_dir + "/" + kwargs["name"] self.__external_ip_allowed_xids = set() - if "label" not in kwargs or kwargs["label"] is None: - kwargs["label"] = default_servicevm_label - - if "vcpus" not in kwargs or kwargs["vcpus"] is None: - kwargs["vcpus"] = default_servicevm_vcpus - - if "memory" not in kwargs or kwargs["memory"] is None: - kwargs["memory"] = 200 - - kwargs["maxmem"] = kwargs["memory"] - - super(QubesNetVm, self).__init__(**kwargs) - self.connected_vms = QubesVmCollection() - @property def type(self): return "NetVM" @@ -1797,19 +1792,20 @@ class QubesNetVm(QubesVm): self.__external_ip_allowed_xids.discard(int(xid)) self.update_external_ip_permissions() - def get_xml_attrs(self): - attrs = super(QubesNetVm, self).get_xml_attrs() - attrs.pop("netvm_qid") - attrs.pop("uses_default_netvm") - attrs["netid"] = str(self.netid) - return attrs - class QubesProxyVm(QubesNetVm): """ A class that represents a ProxyVM, ex FirewallVM. A child of QubesNetVM. """ + + def _get_attrs_config(self): + attrs_config = super(QubesProxyVm, self)._get_attrs_config() + attrs_config['uses_default_netvm']['eval'] = 'False' + # Save netvm prop again + attrs_config['netvm']['save'] = 'str(self.netvm.qid) if self.netvm is not None else "none"' + + return attrs_config + def __init__(self, **kwargs): - kwargs["uses_default_netvm"] = False super(QubesProxyVm, self).__init__(**kwargs) self.rules_applied = None @@ -1935,11 +1931,6 @@ class QubesProxyVm(QubesNetVm): self.rules_applied = None xs.write('', "/local/domain/{0}/qubes_iptables".format(self.get_xid()), 'reload') - def get_xml_attrs(self): - attrs = super(QubesProxyVm, self).get_xml_attrs() - attrs["netvm_qid"] = str(self.netvm.qid) if self.netvm is not None else "none" - return attrs - class QubesDom0NetVm(QubesNetVm): def __init__(self): super(QubesDom0NetVm, self).__init__(qid=0, name="dom0", netid=0, @@ -2004,15 +1995,21 @@ class QubesDisposableVm(QubesVm): """ A class that represents an DisposableVM. A child of QubesVm. """ + + def _get_attrs_config(self): + attrs_config = super(QubesDisposableVm, self)._get_attrs_config() + + # New attributes + attrs_config['dispid'] = { 'save': 'str(self.dispid)' } + + return attrs_config + def __init__(self, **kwargs): - template_vm = kwargs["template_vm"] - assert template_vm is not None, "Missing template_vm for DisposableVM!" - - self.dispid = kwargs.pop("dispid") - super(QubesDisposableVm, self).__init__(dir_path="/nonexistent", **kwargs) + assert self.template_vm is not None, "Missing template_vm for DisposableVM!" + # Use DispVM icon with the same color if self._label: self._label = QubesDispVmLabels[self._label.name] @@ -2031,6 +2028,7 @@ class QubesDisposableVm(QubesVm): def get_xml_attrs(self): + # Minimal set - do not inherit rest of attributes attrs = {} attrs["qid"] = str(self.qid) attrs["name"] = self.name @@ -2048,12 +2046,11 @@ class QubesAppVm(QubesVm): """ A class that represents an AppVM. A child of QubesVm. """ - def __init__(self, **kwargs): + def _get_attrs_config(self): + attrs_config = super(QubesAppVm, self)._get_attrs_config() + attrs_config['dir_path']['eval'] = 'value if value is not None else qubes_appvms_dir + "/" + self.name' - if "dir_path" not in kwargs or kwargs["dir_path"] is None: - kwargs["dir_path"] = qubes_appvms_dir + "/" + kwargs["name"] - - super(QubesAppVm, self).__init__(**kwargs) + return attrs_config @property def type(self): From fc573d04672915507f8dead63c927a34f69722a3 Mon Sep 17 00:00:00 2001 From: Marek Marczykowski Date: Thu, 8 Mar 2012 11:57:47 +0100 Subject: [PATCH 12/21] dom0/core: follow new __init__ API in QubesHVm --- dom0/qvm-core/qubes.py | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/dom0/qvm-core/qubes.py b/dom0/qvm-core/qubes.py index 39ab7f26..117705c0 100755 --- a/dom0/qvm-core/qubes.py +++ b/dom0/qvm-core/qubes.py @@ -2095,6 +2095,22 @@ class QubesHVm(QubesVm): # FIXME: logically should inherit after QubesAppVm, but none of its methods # are useful for HVM + + def _get_attrs_config(self): + attrs = super(QubesHVm, self)._get_attrs_config() + attrs.pop('kernel') + attrs.pop('kernels_dir') + attrs.pop('kernelopts') + attrs.pop('uses_default_kernel') + attrs.pop('uses_default_kernelopts') + attrs['private_img']['eval'] = 'None' + attrs['volatile_img']['eval'] = 'None' + attrs['config_file_template']['eval'] = 'config_template_hvm' + attrs['drive'] = { 'save': 'str(self.drive)' } + attrs['maxmem'].pop('save') + + return attrs + def __init__(self, **kwargs): if "dir_path" not in kwargs or kwargs["dir_path"] is None: @@ -2107,22 +2123,10 @@ class QubesHVm(QubesVm): kwargs["memory"] = default_hvm_memory super(QubesHVm, self).__init__(**kwargs) - self.updateable = True self.config_file_template = config_template_hvm - self.private_img = None - self.volatile_img = None - # remove settings not used by HVM (at least for now) - self.__delattr__('kernel') - self.__delattr__('kernelopts') - self.__delattr__('uses_default_kernel') - self.__delattr__('uses_default_kernelopts') # HVM doesn't support dynamic memory management self.maxmem = self.memory - self.drive = None - if 'drive' in kwargs.keys(): - self.drive = kwargs['drive'] - @property def type(self): return "HVM" @@ -2130,15 +2134,6 @@ class QubesHVm(QubesVm): def is_appvm(self): return True - def get_clone_attrs(self): - attrs = super(QubesHVm, self).get_clone_attrs() - attrs.remove('kernel') - attrs.remove('uses_default_kernel') - attrs.remove('kernelopts') - attrs.remove('uses_default_kernelopts') - attrs.remove('maxmem') - return attrs - def create_on_disk(self, verbose, source_template = None): if dry_run: return From fc283e22c8f6696b6c3b8cf2f6212fefcc2a37b9 Mon Sep 17 00:00:00 2001 From: Marek Marczykowski Date: Thu, 8 Mar 2012 12:03:49 +0100 Subject: [PATCH 13/21] dom0/core: use QubesVm.pause/unpause instead of xl directly --- dom0/qvm-core/qubes.py | 12 ++++++++++++ dom0/qvm-tools/qvm-run | 4 ++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/dom0/qvm-core/qubes.py b/dom0/qvm-core/qubes.py index f5cff8bc..e729c190 100755 --- a/dom0/qvm-core/qubes.py +++ b/dom0/qvm-core/qubes.py @@ -1406,6 +1406,18 @@ class QubesVm(object): subprocess.call (['/usr/sbin/xl', 'destroy', self.name]) #xc.domain_destroy(self.get_xid()) + def pause(self): + if dry_run: + return + + xc.domain_pause(self.get_xid()) + + def unpause(self): + if dry_run: + return + + xc.domain_unpause(self.get_xid()) + def remove_from_disk(self): if dry_run: return diff --git a/dom0/qvm-tools/qvm-run b/dom0/qvm-tools/qvm-run index 73f929d0..db5ad720 100755 --- a/dom0/qvm-tools/qvm-run +++ b/dom0/qvm-tools/qvm-run @@ -63,13 +63,13 @@ def vm_run_cmd(vm, cmd, options): if options.pause: if options.verbose: print >> sys.stderr, "Pausing VM: '{0}'...".format(vm.name) - subprocess.call (["/usr/sbin/xl", "pause", vm.name]) + vm.pause() return if options.unpause: if options.verbose: print >> sys.stderr, "UnPausing VM: '{0}'...".format(vm.name) - subprocess.call (["/usr/sbin/xl", "unpause", vm.name]) + vm.unpause() return if options.verbose: From 07f560042c5a95e5b86e5ff5342e4bab43747aff Mon Sep 17 00:00:00 2001 From: Marek Marczykowski Date: Thu, 8 Mar 2012 12:03:49 +0100 Subject: [PATCH 14/21] dom0/core: use QubesVm.pause/unpause instead of xl directly --- dom0/qvm-core/qubes.py | 12 ++++++++++++ dom0/qvm-tools/qvm-run | 4 ++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/dom0/qvm-core/qubes.py b/dom0/qvm-core/qubes.py index 117705c0..f6261a5c 100755 --- a/dom0/qvm-core/qubes.py +++ b/dom0/qvm-core/qubes.py @@ -1420,6 +1420,18 @@ class QubesVm(object): subprocess.call (['/usr/sbin/xl', 'destroy', self.name]) #xc.domain_destroy(self.get_xid()) + def pause(self): + if dry_run: + return + + xc.domain_pause(self.get_xid()) + + def unpause(self): + if dry_run: + return + + xc.domain_unpause(self.get_xid()) + def remove_from_disk(self): if dry_run: return diff --git a/dom0/qvm-tools/qvm-run b/dom0/qvm-tools/qvm-run index 73f929d0..db5ad720 100755 --- a/dom0/qvm-tools/qvm-run +++ b/dom0/qvm-tools/qvm-run @@ -63,13 +63,13 @@ def vm_run_cmd(vm, cmd, options): if options.pause: if options.verbose: print >> sys.stderr, "Pausing VM: '{0}'...".format(vm.name) - subprocess.call (["/usr/sbin/xl", "pause", vm.name]) + vm.pause() return if options.unpause: if options.verbose: print >> sys.stderr, "UnPausing VM: '{0}'...".format(vm.name) - subprocess.call (["/usr/sbin/xl", "unpause", vm.name]) + vm.unpause() return if options.verbose: From 8c794d95e296c4e4c154c9f6b9d14414292d2e0c Mon Sep 17 00:00:00 2001 From: Marek Marczykowski Date: Thu, 8 Mar 2012 12:06:30 +0100 Subject: [PATCH 15/21] dom0/core: pause also stubdom when pausing HVM --- dom0/qvm-core/qubes.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/dom0/qvm-core/qubes.py b/dom0/qvm-core/qubes.py index f6261a5c..09cb89f5 100755 --- a/dom0/qvm-core/qubes.py +++ b/dom0/qvm-core/qubes.py @@ -2247,6 +2247,20 @@ class QubesHVm(QubesVm): def start_qrexec_daemon(self, **kwargs): pass + def pause(self): + if dry_run: + return + + xc.domain_pause(self.stubdom_xid) + super(QubesHVm, self).pause() + + def unpause(self): + if dry_run: + return + + xc.domain_unpause(self.stubdom_xid) + super(QubesHVm, self).unpause() + def get_xml_attrs(self): attrs = super(QubesHVm, self).get_xml_attrs() attrs["drive"] = str(self.drive) From cae26721715561b84b2d458bcc978dc83789b959 Mon Sep 17 00:00:00 2001 From: Marek Marczykowski Date: Thu, 8 Mar 2012 14:40:00 +0100 Subject: [PATCH 16/21] dom0/qvm-firewall: make firewall IP-based, not IF-based Some VMs (especially HVM) can have more than one vif, so to not dupplicate rules, make it IP based. --- dom0/qvm-core/qubes.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/dom0/qvm-core/qubes.py b/dom0/qvm-core/qubes.py index e729c190..2d8ae4c9 100755 --- a/dom0/qvm-core/qubes.py +++ b/dom0/qvm-core/qubes.py @@ -1881,12 +1881,12 @@ class QubesProxyVm(QubesNetVm): if xid < 0: # VM not active ATM continue - vif = vm.vif - if vif is None: + ip = vm.ip + if ip is None: continue iptables += "# '{0}' VM:\n".format(vm.name) - iptables += "-A FORWARD ! -s {0}/32 -i {1} -j DROP\n".format(vm.ip, vif) + # Anti-spoof rules are added by vif-script (vif-route-qubes), here we trust IP address accept_action = "ACCEPT" reject_action = "REJECT --reject-with icmp-host-prohibited" @@ -1899,7 +1899,7 @@ class QubesProxyVm(QubesNetVm): rules_action = accept_action for rule in conf["rules"]: - iptables += "-A FORWARD -i {0} -d {1}".format(vif, rule["address"]) + iptables += "-A FORWARD -s {0} -d {1}".format(ip, rule["address"]) if rule["netmask"] != 32: iptables += "/{0}".format(rule["netmask"]) @@ -1914,12 +1914,12 @@ class QubesProxyVm(QubesNetVm): if conf["allowDns"]: # PREROUTING does DNAT to NetVM DNSes, so we need self.netvm. properties - iptables += "-A FORWARD -i {0} -p udp -d {1} --dport 53 -j ACCEPT\n".format(vif,self.netvm.gateway) - iptables += "-A FORWARD -i {0} -p udp -d {1} --dport 53 -j ACCEPT\n".format(vif,self.netvm.secondary_dns) + iptables += "-A FORWARD -s {0} -p udp -d {1} --dport 53 -j ACCEPT\n".format(ip,self.netvm.gateway) + iptables += "-A FORWARD -s {0} -p udp -d {1} --dport 53 -j ACCEPT\n".format(ip,self.netvm.secondary_dns) if conf["allowIcmp"]: - iptables += "-A FORWARD -i {0} -p icmp -j ACCEPT\n".format(vif) + iptables += "-A FORWARD -s {0} -p icmp -j ACCEPT\n".format(ip) - iptables += "-A FORWARD -i {0} -j {1}\n".format(vif, default_action) + iptables += "-A FORWARD -s {0} -j {1}\n".format(ip, default_action) iptables += "COMMIT\n" xs.write('', "/local/domain/"+str(self.get_xid())+"/qubes_iptables_domainrules/"+str(xid), iptables) # no need for ending -A FORWARD -j DROP, cause default action is DROP From 1d5f54c976eac4e5498b0a3037cbbe0ec3d95913 Mon Sep 17 00:00:00 2001 From: Marek Marczykowski Date: Thu, 8 Mar 2012 14:40:00 +0100 Subject: [PATCH 17/21] dom0/qvm-firewall: make firewall IP-based, not IF-based Some VMs (especially HVM) can have more than one vif, so to not dupplicate rules, make it IP based. --- dom0/qvm-core/qubes.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/dom0/qvm-core/qubes.py b/dom0/qvm-core/qubes.py index 09cb89f5..1bdc8ba5 100755 --- a/dom0/qvm-core/qubes.py +++ b/dom0/qvm-core/qubes.py @@ -1895,12 +1895,12 @@ class QubesProxyVm(QubesNetVm): if xid < 0: # VM not active ATM continue - vif = vm.vif - if vif is None: + ip = vm.ip + if ip is None: continue iptables += "# '{0}' VM:\n".format(vm.name) - iptables += "-A FORWARD ! -s {0}/32 -i {1} -j DROP\n".format(vm.ip, vif) + # Anti-spoof rules are added by vif-script (vif-route-qubes), here we trust IP address accept_action = "ACCEPT" reject_action = "REJECT --reject-with icmp-host-prohibited" @@ -1913,7 +1913,7 @@ class QubesProxyVm(QubesNetVm): rules_action = accept_action for rule in conf["rules"]: - iptables += "-A FORWARD -i {0} -d {1}".format(vif, rule["address"]) + iptables += "-A FORWARD -s {0} -d {1}".format(ip, rule["address"]) if rule["netmask"] != 32: iptables += "/{0}".format(rule["netmask"]) @@ -1928,12 +1928,12 @@ class QubesProxyVm(QubesNetVm): if conf["allowDns"]: # PREROUTING does DNAT to NetVM DNSes, so we need self.netvm. properties - iptables += "-A FORWARD -i {0} -p udp -d {1} --dport 53 -j ACCEPT\n".format(vif,self.netvm.gateway) - iptables += "-A FORWARD -i {0} -p udp -d {1} --dport 53 -j ACCEPT\n".format(vif,self.netvm.secondary_dns) + iptables += "-A FORWARD -s {0} -p udp -d {1} --dport 53 -j ACCEPT\n".format(ip,self.netvm.gateway) + iptables += "-A FORWARD -s {0} -p udp -d {1} --dport 53 -j ACCEPT\n".format(ip,self.netvm.secondary_dns) if conf["allowIcmp"]: - iptables += "-A FORWARD -i {0} -p icmp -j ACCEPT\n".format(vif) + iptables += "-A FORWARD -s {0} -p icmp -j ACCEPT\n".format(ip) - iptables += "-A FORWARD -i {0} -j {1}\n".format(vif, default_action) + iptables += "-A FORWARD -s {0} -j {1}\n".format(ip, default_action) iptables += "COMMIT\n" xs.write('', "/local/domain/"+str(self.get_xid())+"/qubes_iptables_domainrules/"+str(xid), iptables) # no need for ending -A FORWARD -j DROP, cause default action is DROP From a06c8c37869e1676acfeb7b957894742eae7c129 Mon Sep 17 00:00:00 2001 From: Marek Marczykowski Date: Thu, 8 Mar 2012 14:56:39 +0100 Subject: [PATCH 18/21] vm/network: really place anti-spoof rules in 'raw' table This fixes commit: 4d68998 vm/network: place anti-spoof rules in 'raw' table --- network/vif-route-qubes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/network/vif-route-qubes b/network/vif-route-qubes index 385b6656..597e2842 100755 --- a/network/vif-route-qubes +++ b/network/vif-route-qubes @@ -48,7 +48,7 @@ if [ "${ip}" ] ; then ${cmdprefix} ip route ${ipcmd} ${addr} dev ${vif} || true done echo ${cmdprefix} iptables -t raw $iptables_cmd -i ${vif} \! -s ${ip} -j DROP - ${cmdprefix} iptables $iptables_cmd -i ${vif} \! -s ${ip} -j DROP + ${cmdprefix} iptables -t raw $iptables_cmd -i ${vif} \! -s ${ip} -j DROP fi log debug "Successful vif-route-qubes $command for $vif." From 05db5c9f928781a4dc4dfaf192580faa03698a55 Mon Sep 17 00:00:00 2001 From: Marek Marczykowski Date: Thu, 8 Mar 2012 14:57:10 +0100 Subject: [PATCH 19/21] vm/network: use metric to allow multiple routes to same VM This is required when VM has multiple interfaces (eg HVM: PV and stubdom). Prefer the later one. --- network/vif-route-qubes | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/network/vif-route-qubes b/network/vif-route-qubes index 597e2842..c8070177 100755 --- a/network/vif-route-qubes +++ b/network/vif-route-qubes @@ -29,7 +29,7 @@ case "$command" in online) ifconfig ${vif} up echo 1 >/proc/sys/net/ipv4/conf/${vif}/proxy_arp - ipcmd='replace' + ipcmd='add' iptables_cmd='-I PREROUTING 1' cmdprefix='' ;; @@ -41,11 +41,17 @@ case "$command" in ;; esac +domid=${vif/vif/} +domid=${domid/.*/} +# metric must be possitive, but prefer later interface +# 32752 is max XID aka domid +metric=$[ 32752 - $domid ] + if [ "${ip}" ] ; then # If we've been given a list of IP addresses, then add routes from dom0 to # the guest using those addresses. for addr in ${ip} ; do - ${cmdprefix} ip route ${ipcmd} ${addr} dev ${vif} || true + ${cmdprefix} ip route ${ipcmd} ${addr} dev ${vif} metric $metric done echo ${cmdprefix} iptables -t raw $iptables_cmd -i ${vif} \! -s ${ip} -j DROP ${cmdprefix} iptables -t raw $iptables_cmd -i ${vif} \! -s ${ip} -j DROP From 4d0839d05b52261bc2e8551c6ef783c1c3c9ba81 Mon Sep 17 00:00:00 2001 From: Marek Marczykowski Date: Thu, 8 Mar 2012 14:56:39 +0100 Subject: [PATCH 20/21] vm/network: really place anti-spoof rules in 'raw' table This fixes commit: 4d68998 vm/network: place anti-spoof rules in 'raw' table --- network/vif-route-qubes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/network/vif-route-qubes b/network/vif-route-qubes index 385b6656..597e2842 100755 --- a/network/vif-route-qubes +++ b/network/vif-route-qubes @@ -48,7 +48,7 @@ if [ "${ip}" ] ; then ${cmdprefix} ip route ${ipcmd} ${addr} dev ${vif} || true done echo ${cmdprefix} iptables -t raw $iptables_cmd -i ${vif} \! -s ${ip} -j DROP - ${cmdprefix} iptables $iptables_cmd -i ${vif} \! -s ${ip} -j DROP + ${cmdprefix} iptables -t raw $iptables_cmd -i ${vif} \! -s ${ip} -j DROP fi log debug "Successful vif-route-qubes $command for $vif." From eed0b16174b66da6a69a30a1bfd9570db23713c6 Mon Sep 17 00:00:00 2001 From: Marek Marczykowski Date: Thu, 8 Mar 2012 14:57:10 +0100 Subject: [PATCH 21/21] vm/network: use metric to allow multiple routes to same VM This is required when VM has multiple interfaces (eg HVM: PV and stubdom). Prefer the later one. --- network/vif-route-qubes | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/network/vif-route-qubes b/network/vif-route-qubes index 597e2842..c8070177 100755 --- a/network/vif-route-qubes +++ b/network/vif-route-qubes @@ -29,7 +29,7 @@ case "$command" in online) ifconfig ${vif} up echo 1 >/proc/sys/net/ipv4/conf/${vif}/proxy_arp - ipcmd='replace' + ipcmd='add' iptables_cmd='-I PREROUTING 1' cmdprefix='' ;; @@ -41,11 +41,17 @@ case "$command" in ;; esac +domid=${vif/vif/} +domid=${domid/.*/} +# metric must be possitive, but prefer later interface +# 32752 is max XID aka domid +metric=$[ 32752 - $domid ] + if [ "${ip}" ] ; then # If we've been given a list of IP addresses, then add routes from dom0 to # the guest using those addresses. for addr in ${ip} ; do - ${cmdprefix} ip route ${ipcmd} ${addr} dev ${vif} || true + ${cmdprefix} ip route ${ipcmd} ${addr} dev ${vif} metric $metric done echo ${cmdprefix} iptables -t raw $iptables_cmd -i ${vif} \! -s ${ip} -j DROP ${cmdprefix} iptables -t raw $iptables_cmd -i ${vif} \! -s ${ip} -j DROP