diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 06:50:17 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 06:50:17 +0000 |
commit | 86ed03f8adee56c050c73018537371c230a664a6 (patch) | |
tree | eae3d04cdf1c49848e5a671327ab38297f4acb0d /agents/cyberpower_ssh | |
parent | Initial commit. (diff) | |
download | fence-agents-86ed03f8adee56c050c73018537371c230a664a6.tar.xz fence-agents-86ed03f8adee56c050c73018537371c230a664a6.zip |
Adding upstream version 4.12.1.upstream/4.12.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'agents/cyberpower_ssh')
-rwxr-xr-x | agents/cyberpower_ssh/fence_cyberpower_ssh.py | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/agents/cyberpower_ssh/fence_cyberpower_ssh.py b/agents/cyberpower_ssh/fence_cyberpower_ssh.py new file mode 100755 index 0000000..f0695d6 --- /dev/null +++ b/agents/cyberpower_ssh/fence_cyberpower_ssh.py @@ -0,0 +1,70 @@ +#!@PYTHON@ -tt + +##### +## +## Fence agent for CyberPower based SSH-capable power strip +## Tested with CyberPower model PDU41001, ePDU Firmware version 1.2.0 +## +##### + +import sys, re, time +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail, EC_STATUS + +def set_power_status(conn, options): + conn.send_eol("oltctrl index " + options["--plug"] + " act delay" + options["--action"]) + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + +def get_power_status(conn, options): + outlets = {} + conn.send_eol("oltsta show") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + lines = conn.before.split("\n") + show_re = re.compile(r'(\s*)(\d)\s*(.*)\s*(On|Off)\s*') + for line in lines: + res = show_re.search(line) + if res != None: + outlets[res.group(2)] = (res.group(3), res.group(4)) + if ["list", "monitor"].count(options["--action"]) == 1: + return outlets + else: + try: + (_,status) = outlets[options["--plug"]] + return status.lower().strip() + except KeyError: + fail(EC_STATUS) + +def main(): + device_opt = ["ipaddr", "login", "passwd", "cmd_prompt", "secure", \ + "port"] + + atexit.register(atexit_handler) + + all_opt["cmd_prompt"]["default"] = ["\n>", "\nCyberPower >"] + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for CyberPower over ssh" + docs["longdesc"] = "fence_cyberpower_ssh is an I/O Fencing agent \ +which can be used with the CyberPower network power switch. It logs into \ +device via ssh and reboots a specified outlet. Lengthy ssh connections \ +should be avoided while a GFS cluster is running because the connection \ +will block any necessary fencing actions." + docs["vendorurl"] = "http://www.cyberpower.com" + show_docs(options, docs) + + ## + ## Operate the fencing device + #### + conn = fence_login(options) + + result = fence_action(conn, options, set_power_status, get_power_status, get_power_status) + + fence_logout(conn, "exit") + sys.exit(result) + +if __name__ == "__main__": + main() |