cluster-devel.redhat.com archive mirror
 help / color / mirror / Atom feed
From: Ondrej Mular <omular@redhat.com>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] [PATCH 1/2] fence_ipmilan: port to fencing library
Date: Tue, 3 Dec 2013 10:28:13 -0500 (EST)	[thread overview]
Message-ID: <1709660938.3279953.1386084493204.JavaMail.root@redhat.com> (raw)
In-Reply-To: <816037694.3277550.1386083494068.JavaMail.root@redhat.com>

Port of fence_ipmilan to fencing library. 

---
 fence/agents/ipmilan/fence_ipmilan.py | 207 ++++++++++++++++++++++++++++++++++
 1 file changed, 207 insertions(+)
 create mode 100644 fence/agents/ipmilan/fence_ipmilan.py

diff --git a/fence/agents/ipmilan/fence_ipmilan.py b/fence/agents/ipmilan/fence_ipmilan.py
new file mode 100644
index 0000000..1cb26d0
--- /dev/null
+++ b/fence/agents/ipmilan/fence_ipmilan.py
@@ -0,0 +1,207 @@
+#!/usr/bin/python
+
+import sys, shlex, stat, subprocess, re, os
+from pipes import quote
+sys.path.append("@FENCEAGENTSLIBDIR@")
+from fencing import *
+
+#BEGIN_VERSION_GENERATION
+RELEASE_VERSION=""
+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(shlex.split(cmd), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    except OSError:
+        fail_usage("Ipmitool not found or not accessible")
+
+    process.wait()
+
+    out = process.communicate()
+    process.stdout.close()
+
+    match = re.search('[Cc]hassis [Pp]ower is [\\s]*([a-zA-Z]{2,3})', str(out))
+    status = match.group(1) if match else None
+
+    return status
+
+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(shlex.split(cmd), stdout=null, stderr=null)
+    except OSError:
+        null.close()
+        fail_usage("Ipmitool 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")
+
+    try:
+        process = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    except OSError:
+        fail_usage("Ipmitool not found or not accessible")
+
+    process.wait()
+
+    out = process.communicate()
+    process.stdout.close()
+
+    return bool(re.search('chassis power control: cycle', str(out).lower()))
+
+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):
+    cmd = options["--ipmitool-path"]
+
+    # --lanplus / -L
+    if options.has_key("--lanplus") and options["--lanplus"] in ["", "1"]:
+        cmd += " -I lanplus"
+    else:
+        cmd += " -I lan"
+    # --ip / -a
+    cmd += " -H " + options["--ip"]
+
+    # --username / -l
+    if options.has_key("--username") and len(options["--username"]) != 0:
+        cmd += " -U " + quote(options["--username"])
+
+    # --auth / -A
+    if options.has_key("--auth"):
+        cmd += " -A " + options["--auth"]
+
+    # --password / -p
+    if options.has_key("--password"):
+        cmd += " -P " + quote(options["--password"])
+
+    # --cipher / -C
+    cmd += " -C " + options["--cipher"]
+
+    # --port / -n
+    if options.has_key("--ipport"):
+        cmd += " -p " + options["--ipport"]
+
+    if options.has_key("--privlvl"):
+        cmd += " -L " + options["--privlvl"]
+
+    # --action / -o
+    cmd += " chassis power " + action
+
+     # --use-sudo / -d
+    if options.has_key("--use-sudo"):
+        cmd = SUDO_PATH + " " + cmd
+
+    return cmd
+
+def define_new_opts():
+    all_opt["lanplus"] = {
+        "getopt" : "L",
+        "longopt" : "lanplus",
+        "help" : "-L, --lanplus                  Use Lanplus to improve security of connection",
+        "required" : "0",
+        "default" : "0",
+        "shortdesc" : "Use Lanplus to improve security of connection",
+        "order": 1
+        }
+    all_opt["auth"] = {
+        "getopt" : "A:",
+        "longopt" : "auth",
+        "help" : "-A, --auth=[auth]              IPMI Lan Auth type (md5|password|none)",
+        "required" : "0",
+        "shortdesc" : "IPMI Lan Auth type.",
+        "default" : "none",
+        "choices" : ["md5", "password", "none"],
+        "order": 1
+        }
+    all_opt["cipher"] = {
+        "getopt" : "C:",
+        "longopt" : "cipher",
+        "help" : "-C, --cipher=[cipher]          Ciphersuite to use (same as ipmitool -C parameter)",
+        "required" : "0",
+        "shortdesc" : "Ciphersuite to use (same as ipmitool -C parameter)",
+        "default" : "0",
+        "order": 1
+        }
+    all_opt["privlvl"] = {
+        "getopt" : "P:",
+        "longopt" : "privlvl",
+        "help" : "-P, --privlvl=[level]          Privilege level on IPMI device (callback|user|operator|administrator)",
+        "required" : "0",
+        "shortdesc" : "Privilege level on IPMI device",
+        "default" : "administrator",
+        "choices" : ["callback", "user", "operator", "administrator"],
+        "order": 1
+        }
+    all_opt["ipmitool_path"] = {
+        "getopt" : "i:",
+        "longopt" : "ipmitool-path",
+        "help" : "--ipmitool-path=[path]         Path to ipmitool binary",
+        "required" : "0",
+        "shortdesc" : "Path to ipmitool binary",
+        "default" : "#@IPMITOOL_PATH@",
+        "order": 200
+        }
+
+def main():
+
+    atexit.register(atexit_handler)
+
+    device_opt = ["ipaddr", "login", "no_login", "no_password", "passwd",
+                  "lanplus", "auth", "cipher", "privlvl", "sudo", "ipmitool_path", "method"]
+    define_new_opts()
+
+    if os.path.basename(sys.argv[0]) == "fence_ilo3":
+        all_opt["power_wait"]["default"] = "4"
+        all_opt["method"]["default"] = "cycle"
+        all_opt["lanplus"]["default"] = "1"
+    elif os.path.basename(sys.argv[0]) == "fence_ilo4":
+        all_opt["lanplus"]["default"] = "1"
+
+    all_opt["ipport"]["default"] = "623"
+
+    options = check_input(device_opt, process_input(device_opt))
+
+    docs = { }
+    docs["shortdesc"] = "Fence agent for IPMI"
+    docs["longdesc"] = "Fence agent for IPMI"
+    docs["vendorurl"] = ""
+    docs["symlink"] = [("fence_ilo3", "Fence agent for HP iLO3"),
+                       ("fence_ilo4", "Fence agent for HP iLO4"),
+                       ("fence_imm", "Fence agent for IBM Integrated Management Module"),
+                       ("fence_idrac", "Fence agent for Dell iDRAC")]
+    show_docs(options, docs)
+
+    if not is_executable(options["--ipmitool-path"]):
+        fail_usage("Ipmitool 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



       reply	other threads:[~2013-12-03 15:28 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <816037694.3277550.1386083494068.JavaMail.root@redhat.com>
2013-12-03 15:28 ` Ondrej Mular [this message]
2013-12-19 15:44   ` [Cluster-devel] [PATCH 1/2] fence_ipmilan: port to fencing library Marek Grac

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=1709660938.3279953.1386084493204.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).