Blob Blame History Raw
diff -rupN cobbler-2.0.7.old/cobbler/action_power.py cobbler-2.0.7/cobbler/action_power.py
--- cobbler-2.0.7.old/cobbler/action_power.py	2014-11-10 15:07:00.578732736 -0500
+++ cobbler-2.0.7/cobbler/action_power.py	2014-11-10 15:11:19.692536590 -0500
@@ -30,6 +30,7 @@ import os
 import os.path
 import traceback
 import time
+import re
 
 import utils
 import func_utils
@@ -102,8 +103,22 @@ class PowerTool:
         # Try the power command 5 times before giving up.
         # Some power switches are flakey
         for x in range(0,5):
-            rc = utils.subprocess_call(self.logger, template_command, shell=False)
+            output, rc = utils.subprocess_sp(self.logger, template_command, shell=False)
             if rc == 0:
+                # If the desired state is actually a query for the status
+                # return different information than command return code
+                if desired_state == 'status':
+                    match = re.match('(^Status:\s)(ON|OFF)', output)
+                    if not match:
+                        match = re.match('(.*Chassis power\s*(=|is)\s*)(On|Off).*', output, re.IGNORECASE)
+                    if match:
+                        power_status = match.groups()[2]
+                        if power_status.upper() == 'ON':
+                            return True
+                        else:
+                            return False
+                    utils.die(self.logger,"command succeeded (rc=%s), but output ('%s') was not understood" % (rc, output))
+                    return None
                 break
             else:
                 time.sleep(2)
diff -rupN cobbler-2.0.7.old/cobbler/api.py cobbler-2.0.7/cobbler/api.py
--- cobbler-2.0.7.old/cobbler/api.py	2014-11-10 15:07:00.577732729 -0500
+++ cobbler-2.0.7/cobbler/api.py	2014-11-10 15:07:27.941923229 -0500
@@ -818,6 +818,15 @@ class BootAPI:
         time.sleep(5)
         return self.power_on(system, user, password, logger=logger)
 
+    def power_status(self, system, user=None, password=None, logger=None):
+        """
+        Returns the power status for a system that has power management configured.
+
+        @return: 0  the system is powered on, False if it's not or None on error
+        """
+        return action_power.PowerTool(self._config, system, self, user, password, logger = logger).power("status")
+
+
     # ==========================================================================
 
     def clear_logs(self, system, logger=None):
diff -rupN cobbler-2.0.7.old/cobbler/cli.py cobbler-2.0.7/cobbler/cli.py
--- cobbler-2.0.7.old/cobbler/cli.py	2014-11-10 15:07:00.575732715 -0500
+++ cobbler-2.0.7/cobbler/cli.py	2014-11-10 15:07:27.941923229 -0500
@@ -40,7 +40,7 @@ import item_image
 OBJECT_ACTIONS   = {
    "distro"  : "add copy edit find list remove rename report".split(" "),
    "profile" : "add copy dumpvars edit find getks list remove rename report".split(" "),
-   "system"  : "add copy dumpvars edit find getks list remove rename report poweron poweroff reboot".split(" "),
+   "system"  : "add copy dumpvars edit find getks list remove rename report poweron poweroff powerstatus reboot".split(" "),
    "image"   : "add copy edit find list remove rename report".split(" "),
    "repo"    : "add copy edit find list remove rename report".split(" ")
 } 
@@ -278,7 +278,7 @@ class BootCLI:
             keys.sort()
             for x in keys:
                print "%s : %s" % (x, data[x])
-        elif object_action in [ "poweron", "poweroff", "reboot" ]:
+        elif object_action in [ "poweron", "poweroff", "powerstatus", "reboot" ]:
             power={}
             power["power"] = object_action.replace("power","")
             power["systems"] = [options.name]
diff -rupN cobbler-2.0.7.old/cobbler/remote.py cobbler-2.0.7/cobbler/remote.py
--- cobbler-2.0.7.old/cobbler/remote.py	2014-11-10 15:07:00.575732715 -0500
+++ cobbler-2.0.7/cobbler/remote.py	2014-11-10 15:07:27.942923236 -0500
@@ -1706,7 +1706,7 @@ class CobblerXMLRPCInterface:
         """
         Internal implementation used by background_power, do not call
         directly if possible.  
-        Allows poweron/poweroff/reboot of a system specified by object_id.
+        Allows poweron/poweroff/powerstatus/reboot of a system specified by object_id.
         """
         obj = self.__get_object(object_id)
         self.check_access(token, "power_system", obj)
@@ -1714,10 +1714,12 @@ class CobblerXMLRPCInterface:
             rc=self.api.power_on(obj, user=None, password=None, logger=logger)
         elif power=="off":
             rc=self.api.power_off(obj, user=None, password=None, logger=logger)
+        elif power=="status":
+            rc=self.api.power_status(obj, user=None, password=None, logger=logger)
         elif power=="reboot":
             rc=self.api.reboot(obj, user=None, password=None, logger=logger)
         else:
-            utils.die(self.logger, "invalid power mode '%s', expected on/off/reboot" % power)
+            utils.die(self.logger, "invalid power mode '%s', expected on/off/status/reboot" % power)
         return rc
 
     def clear_system_logs(self, object_id, token=None, logger=None):
diff -rupN cobbler-2.0.7.old/templates/power_ipmilan.template cobbler-2.0.7/templates/power_ipmilan.template
--- cobbler-2.0.7.old/templates/power_ipmilan.template	2014-11-10 15:07:00.581732757 -0500
+++ cobbler-2.0.7/templates/power_ipmilan.template	2014-11-10 15:07:27.943923243 -0500
@@ -1,2 +1 @@
-#use power_id to pass in additional options like -P, Use Lanplus
-fence_ipmilan -i "$power_address" $power_id -l "$power_user" -p "$power_pass" -o "$power_mode"
+fence_ipmilan -a "$power_address" $power_id -l "$power_user" -p "$power_pass" -o "$power_mode"