diff options
Diffstat (limited to 'agents/raritan')
-rw-r--r-- | agents/raritan/fence_raritan.py | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/agents/raritan/fence_raritan.py b/agents/raritan/fence_raritan.py new file mode 100644 index 0000000..169fa81 --- /dev/null +++ b/agents/raritan/fence_raritan.py @@ -0,0 +1,87 @@ +#!@PYTHON@ -tt + +import sys, re, pexpect +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fspawn, fail, EC_LOGIN_DENIED, run_delay + +def get_power_status(conn, options): + conn.send_eol("show -d properties=powerState %s" % options["--plug"]) + re_status = re.compile(".*powerState is [12].*") + conn.log_expect(re_status, int(options["--shell-timeout"])) + status = { + #"0" : "off", + "1" : "on", + "2" : "off", + }[conn.after.split()[2]] + + return status + +def set_power_status(conn, options): + action = { + "on" : "on", + "off" : "off", + }[options["--action"]] + + conn.send_eol("set %s powerState=%s" % (options["--plug"], action)) + +def main(): + device_opt = ["ipaddr", "login", "passwd", "port", "telnet"] + + atexit.register(atexit_handler) + + opt = process_input(device_opt) + + all_opt["ipport"]["default"] = "23" + + opt["eol"] = "\r\n" + options = check_input(device_opt, opt) + + docs = {} + docs["shortdesc"] = "I/O Fencing agent for Raritan Dominion PX" + docs["longdesc"] = "fence_raritan is an I/O Fencing agent which can be \ +used with the Raritan DPXS12-20 Power Distribution Unit. It logs into \ +device via telnet and reboots a specified outlet. Lengthy telnet connections \ +should be avoided while a GFS cluster is running because the connection will \ +block any necessary fencing actions." + docs["vendorurl"] = "http://www.raritan.com/" + show_docs(options, docs) + + # add support also for delay before login which is very useful for 2-node clusters + run_delay(options) + + # Convert pure port/plug number to /system1/outlet${plug} + try: + plug_int = int(options["--plug"]) + options["--plug"] = "/system1/outlet" + str(plug_int) + except ValueError: + pass + ## + ## Operate the fencing device + ## We can not use fence_login(), username and passwd are sent on one line + #### + try: + conn = fspawn(options, options["--telnet-path"], encoding="latin1") + conn.send("set binary\n") + conn.send("open %s -%s\n"%(options["--ip"], options["--ipport"])) + conn.read_nonblocking(size=100, timeout=int(options["--shell-timeout"])) + conn.log_expect("Login.*", int(options["--shell-timeout"])) + conn.send_eol("%s" % (options["--username"])) + conn.log_expect("Password.*", int(options["--shell-timeout"])) + conn.send_eol("%s" % (options["--password"])) + conn.log_expect("clp.*", int(options["--shell-timeout"])) + except pexpect.EOF: + fail(EC_LOGIN_DENIED) + except pexpect.TIMEOUT: + fail(EC_LOGIN_DENIED) + + result = 0 + if options["--action"] != "monitor": + result = fence_action(conn, options, set_power_status, get_power_status) + + fence_logout(conn, "exit\n") + sys.exit(result) + +if __name__ == "__main__": + main() |