ACM: Recover if XML policy representation is missing.
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 6 Dec 2007 12:13:12 +0000 (12:13 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 6 Dec 2007 12:13:12 +0000 (12:13 +0000)
Recover the system if the XML representation of the currently loaded
policy is missing. Force the installation of the DEFAULT policy.

Signed-off-by: Stefan Berger <stefanb@us.ibm.com>
tools/python/xen/util/acmpolicy.py
tools/python/xen/xend/XendXSPolicyAdmin.py

index 7a794d6dd40c21b0d44012489728d6ae52c66974..a89acb34dde9ae0c3eaf93d2408ce9bc2af0c975 100644 (file)
@@ -347,6 +347,33 @@ class ACMPolicy(XSPolicy):
             rc = self.compile()
         return rc, errors
 
+    def force_default_policy(klass):
+        """
+           Force the installation of the DEFAULT policy if for
+           example no XML of the current policy is available and
+           the update path with comparisons of old and new policy
+           cannot be taken.
+           This only succeeds if only Domain-0 is running or
+           all guest have the same ssidref as Domain-0.
+        """
+        errors = ""
+
+        acmpol_new = ACMPolicy(xml = get_DEFAULT_policy())
+
+        from xen.lowlevel import acm
+        dom0_ssidref = acm.getssid(0)
+        del_array = ""
+        chg_array = struct.pack("ii",
+                                dom0_ssidref['ssidref'] & 0xffff,
+                                0x1)
+
+        rc, pol_map, bin_pol = acmpol_new.policy_create_map_and_bin()
+        if rc != xsconstants.XSERR_SUCCESS:
+            return rc, errors, acmpol_new
+        rc, errors = security.hv_chg_policy(bin_pol, del_array, chg_array)
+        return rc, errors, acmpol_new
+
+    force_default_policy = classmethod(force_default_policy)
 
     def __do_update_version_check(self, acmpol_new):
         acmpol_old = self
index d5fcf398b79454518691270a6fb754ce2d8224c5..cc861fda804a9f8c6ec3dea136947ffa3888203b 100644 (file)
@@ -57,6 +57,12 @@ class XSPolicyAdmin:
         except Exception, e:
             log.error("Could not find XML representation of policy '%s': "
                       "%s" % (act_pol_name,e))
+            rc, errors, acmpol_def = ACMPolicy.force_default_policy()
+            if rc == xsconstants.XSERR_SUCCESS:
+                self.xsobjs[ref] = acmpol_def
+                self.policies[ref] = (acmpol_def.get_name(),
+                                      xsconstants.ACM_POLICY_ID)
+                log.info("Switched to DEFAULT policy.")
 
         log.debug("XSPolicyAdmin: Known policies: %s" % self.policies)