summaryrefslogtreecommitdiffstats
path: root/agents/cyberpower_ssh
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 06:50:17 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 06:50:17 +0000
commit86ed03f8adee56c050c73018537371c230a664a6 (patch)
treeeae3d04cdf1c49848e5a671327ab38297f4acb0d /agents/cyberpower_ssh
parentInitial commit. (diff)
downloadfence-agents-upstream/4.12.1.tar.xz
fence-agents-upstream/4.12.1.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-xagents/cyberpower_ssh/fence_cyberpower_ssh.py70
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()