All of lore.kernel.org
 help / color / mirror / Atom feed
* [Cluster-devel] [PATCH 4/4] fence_amt: new fence agent for Intel AMT
       [not found] <1691846177.7770206.1388420638278.JavaMail.root@redhat.com>
@ 2013-12-30 16:24 ` Ondrej Mular
  0 siblings, 0 replies; only message in thread
From: Ondrej Mular @ 2013-12-30 16:24 UTC (permalink / raw)
  To: cluster-devel.redhat.com

New fence agent for Intel AMT.

---
 fence/agents/amt/fence_amt.py | 149 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 149 insertions(+)
 create mode 100755 fence/agents/amt/fence_amt.py

diff --git a/fence/agents/amt/fence_amt.py b/fence/agents/amt/fence_amt.py
new file mode 100755
index 0000000..c164c66
--- /dev/null
+++ b/fence/agents/amt/fence_amt.py
@@ -0,0 +1,149 @@
+#!/usr/bin/python
+
+import sys, subprocess, re, os, stat
+from pipes import quote
+sys.path.append("@FENCEAGENTSLIBDIR@")
+from fencing import *
+
+#BEGIN_VERSION_GENERATION
+RELEASE_VERSION="Fence agent for Intel AMT"
+REDHAT_COPYRIGHT=""
+BUILD_DATE=""
+#END_VERSION_GENERATION
+
+def get_power_status(_, options):
+
+    cmd = create_command(options, "status")
+
+    if options["log"] >= LOG_MODE_VERBOSE:
+        options["debug_fh"].write("executing: " + cmd + "\n")
+
+    try:
+        process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
+    except OSError:
+        fail_usage("Amttool not found or not accessible")
+
+    process.wait()
+
+    output = process.communicate()
+    process.stdout.close()
+    options["debug_fh"].write(output)
+
+    match = re.search('Powerstate:[\\s]*(..)', str(output))
+    status = match.group(1) if match else None
+
+    if (status == None):
+        return "fail"
+    elif (status == "S0"): # SO = on; S3 = sleep; S5 = off
+        return "on"
+    else:
+        return "off"
+
+def set_power_status(_, options):
+
+    cmd = create_command(options, options["--action"])
+
+    if options["log"] >= LOG_MODE_VERBOSE:
+        options["debug_fh"].write("executing: " + cmd + "\n")
+
+    try:
+        process = subprocess.Popen(cmd, stdout=options["debug_fh"], stderr=options["debug_fh"], shell=True)
+    except OSError:
+        fail_usage("Amttool not found or not accessible")
+
+    process.wait()
+
+    return
+
+def reboot_cycle(_, options):
+    cmd = create_command(options, "cycle")
+
+    if options["log"] >= LOG_MODE_VERBOSE:
+        options["debug_fh"].write("executing: " + cmd + "\n")
+
+    try:
+        process = subprocess.Popen(cmd, stdout=options["debug_fh"], stderr=options["debug_fh"], shell=True)
+    except OSError:
+        fail_usage("Amttool not found or not accessible")
+
+    status = process.wait()
+    
+    return not bool(status)
+
+def create_command(options, action):
+
+    # --password / -p
+    cmd = "AMT_PASSWORD=" + quote(options["--password"])
+
+    cmd += " " + options["--amttool-path"]
+
+    # --ip / -a
+    cmd += " " + options["--ip"]
+
+    # --action / -o
+    if action == "status":
+        cmd += " info"
+    elif action == "on":
+        cmd = "echo \"y\"|" + cmd
+        cmd += " powerup"
+    elif action == "off":
+        cmd = "echo \"y\"|" + cmd
+        cmd += " powerdown"
+    elif action == "cycle":
+        cmd = "echo \"y\"|" + cmd
+        cmd += " powercycle"
+    if action in ["on", "off", "cycle"] and options.has_key("--boot-option"):
+        cmd += options["--boot-option"]
+
+    # --use-sudo / -d
+    if options.has_key("--use-sudo"):
+        cmd = SUDO_PATH + " " + cmd
+
+    return cmd
+
+def define_new_opts():
+    all_opt["boot_option"] = {
+        "getopt" : "b:",
+        "longopt" : "boot-option",
+        "help" : "-b, --boot-option=[option]     Change the default boot behavior of the machine. (pxe|hd|hdsafe|cd|diag)",
+        "required" : "0",
+        "shortdesc" : "Change the default boot behavior of the machine.",
+        "choices" : ["pxe", "hd", "hdsafe", "cd", "diag"],
+        "order" : 1
+        }
+    all_opt["amttool_path"] = {
+        "getopt" : "i:",
+        "longopt" : "amttool-path",
+        "help" : "--amttool-path=[path]          Path to amttool binary",
+        "required" : "0",
+        "shortdesc" : "Path to amttool binary",
+        "default" : "@AMTTOOL_PATH@",
+        "order": 200
+        }
+
+def main():
+
+    atexit.register(atexit_handler)
+
+    device_opt = [ "ipaddr", "no_login", "passwd", "boot_option", "no_port",
+         "sudo", "amttool_path", "method" ]
+
+    define_new_opts()
+
+    options = check_input(device_opt, process_input(device_opt))
+
+    docs = { }
+    docs["shortdesc"] = "Fence agent for AMT"
+    docs["longdesc"] = "Fence agent for AMT"
+    docs["vendorurl"] = "http://www.intel.com/"
+    show_docs(options, docs)
+
+    if not is_executable(options["--amttool-path"]):
+        fail_usage("Amttool not found or not accessible")
+
+    result = fence_action(None, options, set_power_status, get_power_status, None, reboot_cycle)
+
+    sys.exit(result)
+
+if __name__ == "__main__":
+    main()
-- 
1.8.3.1



^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2013-12-30 16:24 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <1691846177.7770206.1388420638278.JavaMail.root@redhat.com>
2013-12-30 16:24 ` [Cluster-devel] [PATCH 4/4] fence_amt: new fence agent for Intel AMT Ondrej Mular

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.