From: Ondrej Mular <omular@redhat.com>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] [PATCH 2/2] fence_amt: new fence agent for Intel AMT
Date: Tue, 3 Dec 2013 10:28:16 -0500 (EST) [thread overview]
Message-ID: <1907891632.3279962.1386084496717.JavaMail.root@redhat.com> (raw)
In-Reply-To: <956669175.3277212.1386083353560.JavaMail.root@redhat.com>
New fence agent for Intel AMT.
---
fence/agents/amt/fence_amt.py | 161 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 161 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..6f00727
--- /dev/null
+++ b/fence/agents/amt/fence_amt.py
@@ -0,0 +1,161 @@
+#!/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()
+
+ 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")
+
+ null = open('/dev/null', 'w')
+ try:
+ process = subprocess.Popen(cmd, stdout=null, stderr=null, shell=True)
+ except OSError:
+ null.close()
+ fail_usage("Amttool not found or not accessible")
+
+ process.wait()
+ null.close()
+
+ return
+
+def reboot_cycle(_, options):
+ cmd = create_command(options, "cycle")
+
+ if options["log"] >= LOG_MODE_VERBOSE:
+ options["debug_fh"].write("executing: " + cmd + "\n")
+
+ null = open('/dev/null', 'w')
+ try:
+ process = subprocess.Popen(cmd, stdout=null, stderr=null, shell=True)
+ except OSError:
+ null.close()
+ fail_usage("Amttool not found or not accessible")
+
+ status = process.wait()
+ null.close()
+
+ return not bool(status)
+
+def is_executable(path):
+ if os.path.exists(path):
+ stats = os.stat(path)
+ if stat.S_ISREG(stats.st_mode) and os.access(path, os.X_OK):
+ return True
+ return False
+
+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
next parent reply other threads:[~2013-12-03 15:28 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <956669175.3277212.1386083353560.JavaMail.root@redhat.com>
2013-12-03 15:28 ` Ondrej Mular [this message]
2013-12-19 15:40 ` [Cluster-devel] [PATCH 2/2] fence_amt: new fence agent for Intel AMT Marek Grac
[not found] <930308315.2340076.1385046294848.JavaMail.root@redhat.com>
2013-11-21 15:16 ` Ondrej Mular
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1907891632.3279962.1386084496717.JavaMail.root@redhat.com \
--to=omular@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).