Răsfoiți Sursa

Use firewal rules in Python data structure

Tomasz Sterna 13 ani în urmă
părinte
comite
ee3cfbb95f
1 a modificat fișierele cu 25 adăugiri și 46 ștergeri
  1. 25 46
      qubesmanager/firewall.py

+ 25 - 46
qubesmanager/firewall.py

@@ -149,61 +149,40 @@ class QubesFirewallRulesModel(QAbstractItemModel):
 
         self.clearChildren()
 
-        root = vm.get_firewall_conf()
-        for element in root:
-            try:
-                kwargs = { "allow": element.tag=="allow" }
-                attr_list = ("name", "address", "netmask", "port", "toport")
-
-                for attribute in attr_list:
-                    kwargs[attribute] = element.get(attribute)
-
-                kwargs["netmask"] = int(kwargs["netmask"])
-                kwargs["portBegin"] = int(kwargs["port"])
-                if kwargs["toport"] is not None:
-                    kwargs["portEnd"] = int(kwargs["toport"])
-                del(kwargs["port"])
-                del(kwargs["toport"])
-
-                self.appendChild(QubesFirewallRuleItem(**kwargs))
-
-            except (ValueError, LookupError) as err:
-                print "{0}: load error: {1}".format(
-                        os.path.basename(sys.argv[0]), err)
-                return False
-
-        return True
+        conf = vm.get_firewall_conf()
+        for rule in conf["rules"]:
+            self.appendChild(QubesFirewallRuleItem(
+                rule["name"], rule["allow"], rule["address"],
+                rule["netmask"], rule["portBegin"], rule["portEnd"]
+                ))
 
     def apply_rules(self):
         assert self.__vm is not None
 
-        root = xml.etree.ElementTree.Element(
-                "QubesFirwallRules",
-                policy="allow"
-        )
+        conf = { "allow": True, "rules": list() }
 
         for rule in self.children:
-            element = xml.etree.ElementTree.Element(
-                    "allow" if rule.allow else "deny",
-                    name=rule.name,
-                    address=rule.address,
-                    netmask=str(rule.netmask),
-                    port=str(rule.portBegin),
+            conf["rules"].append(
+                    {
+                        "allow": rule.allow,
+                        "name": rule.name,
+                        "address": rule.address,
+                        "netmask": rule.netmask,
+                        "portBegin": rule.portBegin,
+                        "portEnd": rule.portEnd
+                    }
             )
-            if rule.portEnd is not None:
-                element.set("toport", str(rule.portEnd)) 
-            root.append(element)
 
-        tree = xml.etree.ElementTree.ElementTree(root)
+        self.__vm.write_firewall_conf(conf)
 
-        try:
-            self.__vm.write_firewall_conf(tree)
-        except EnvironmentError as err:
-            print "{0}: save error: {1}".format(
-                    os.path.basename(sys.argv[0]), err)
-            return False
+        qvm_collection = QubesVmCollection()
+        qvm_collection.lock_db_for_reading()
+        qvm_collection.load()
+        qvm_collection.unlock_db()
 
-        return True
+        for vm in qvm_collection.values():
+            if vm.is_fwvm():
+                vm.write_iptables_xenstore_entry()
 
     def index(self, row, column, parent=QModelIndex()):
         if not self.hasIndex(row, column, parent):
@@ -261,7 +240,7 @@ class QubesFirewallRulesModel(QAbstractItemModel):
         self.endRemoveRows()
         index = self.createIndex(i, 0)
         self.dataChanged.emit(index, index)
-        
+
     def clearChildren(self):
         self.__children = list()