diff options
Diffstat (limited to 'agents/hpblade/fence_hpblade.py')
-rw-r--r-- | agents/hpblade/fence_hpblade.py | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/agents/hpblade/fence_hpblade.py b/agents/hpblade/fence_hpblade.py new file mode 100644 index 0000000..fbc89f6 --- /dev/null +++ b/agents/hpblade/fence_hpblade.py @@ -0,0 +1,134 @@ +#!@PYTHON@ -tt + +##### +## +## The Following Agent Has Been Tested On: +## * HP BladeSystem c7000 Enclosure +## * HP Integrity Superdome X (BL920s) +##### + +import sys, re +import pexpect +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail, EC_STATUS + +def get_enclosure_type(conn, options): + conn.send_eol("show enclosure info") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + + type_re=re.compile(r"^\s*Enclosure Type: (\w+)(.*?)\s*$") + enclosure="unknown" + for line in conn.before.splitlines(): + res = type_re.search(line) + if res != None: + enclosure=res.group(1) + + if enclosure == "unknown": + fail(EC_GENERIC_ERROR) + + return enclosure.lower().strip() + +def get_power_status(conn, options): + if options["enc_type"] == "superdome": + cmd_send = "parstatus -M -p " + options["--plug"] + powrestr = "^partition:\\d\\s+:\\w+\\s+/(\\w+)\\s.*$" + else: + cmd_send = "show server status " + options["--plug"] + powrestr = "^\\s*Power: (.*?)\\s*$" + + conn.send_eol(cmd_send) + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + + power_re = re.compile(powrestr) + status = "unknown" + for line in conn.before.splitlines(): + res = power_re.search(line) + if res != None: + if options["enc_type"] == "superdome": + if res.group(1) == "DOWN": + status = "off" + else: + status = "on" + else: + status = res.group(1) + + if status == "unknown": + if "--missing-as-off" in options: + return "off" + else: + fail(EC_STATUS) + + return status.lower().strip() + +def set_power_status(conn, options): + if options["enc_type"] == "superdome": + dev="partition " + else: + dev="server " + + if options["--action"] == "on": + conn.send_eol("poweron " + dev + options["--plug"]) + elif options["--action"] == "off": + conn.send_eol("poweroff " + dev + options["--plug"] + " force") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + +def get_instances_list(conn, options): + outlets = {} + if options["enc_type"] == "superdome": + cmd_send = "parstatus -P -M" + listrestr = "^partition:(\\d+)\\s+:\\w+\\s+/(\\w+)\\s+:OK.*?:(\\w+)\\s*$" + else: + cmd_send = "show server list" + listrestr = "^\\s*(\\d+)\\s+(.*?)\\s+(.*?)\\s+OK\\s+(.*?)\\s+(.*?)\\s*$" + + conn.send_eol(cmd_send) + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + + list_re = re.compile(listrestr) + for line in conn.before.splitlines(): + res = list_re.search(line) + if res != None: + if options["enc_type"] == "superdome": + outlets[res.group(1)] = (res.group(3), res.group(2).lower()) + else: + outlets[res.group(1)] = (res.group(2), res.group(4).lower()) + + return outlets + +def main(): + device_opt = ["ipaddr", "login", "passwd", "cmd_prompt", "secure", \ + "port", "missing_as_off", "telnet"] + + atexit.register(atexit_handler) + + all_opt["cmd_prompt"]["default"] = ["c7000oa>"] + all_opt["login_timeout"]["default"] = "10" + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for HP BladeSystem" + docs["longdesc"] = "fence_hpblade is an I/O Fencing agent \ +which can be used with HP BladeSystem and HP Integrity Superdome X. \ +It logs into the onboard administrator of an enclosure via telnet or \ +ssh and uses the command line interface to power blades or partitions \ +on or off." + docs["vendorurl"] = "http://www.hp.com" + show_docs(options, docs) + + ## + ## Operate the fencing device + ###### + options["eol"] = "\n" + conn = fence_login(options) + + options["enc_type"] = get_enclosure_type(conn, options) + + result = fence_action(conn, options, set_power_status, get_power_status, get_instances_list) + fence_logout(conn, "exit") + sys.exit(result) + +if __name__ == "__main__": + main() |