summaryrefslogtreecommitdiffstats
path: root/agents/eps/fence_eps.py
diff options
context:
space:
mode:
Diffstat (limited to 'agents/eps/fence_eps.py')
-rw-r--r--agents/eps/fence_eps.py129
1 files changed, 129 insertions, 0 deletions
diff --git a/agents/eps/fence_eps.py b/agents/eps/fence_eps.py
new file mode 100644
index 0000000..f0df862
--- /dev/null
+++ b/agents/eps/fence_eps.py
@@ -0,0 +1,129 @@
+#!@PYTHON@ -tt
+
+# The Following Agent Has Been Tested On:
+# ePowerSwitch 8M+ version 1.0.0.4
+
+import sys, re
+import base64, string, socket
+import logging
+import atexit
+sys.path.append("@FENCEAGENTSLIBDIR@")
+from fencing import *
+from fencing import fail, fail_usage, EC_LOGIN_DENIED, EC_TIMED_OUT, run_delay
+
+if sys.version_info[0] > 2:
+ import http.client as httplib
+else:
+ import httplib
+
+# Run command on EPS device.
+# @param options Device options
+# @param params HTTP GET parameters (without ?)
+def eps_run_command(options, params):
+ try:
+ # New http connection
+ conn = httplib.HTTPConnection(options["--ip"])
+
+ request_str = "/"+options["--page"]
+
+ if params != "":
+ request_str += "?"+params
+
+ logging.debug("GET %s\n", request_str)
+ conn.putrequest('GET', request_str)
+
+ if "--username" in options:
+ if "--password" not in options:
+ options["--password"] = "" # Default is empty password
+
+ # String for Authorization header
+ auth_str = 'Basic ' + string.strip(base64.encodestring(options["--username"]+':'+options["--password"]))
+ logging.debug("Authorization: %s\n", auth_str)
+ conn.putheader('Authorization', auth_str)
+
+ conn.endheaders()
+
+ response = conn.getresponse()
+
+ logging.debug("%d %s\n", response.status, response.reason)
+
+ #Response != OK -> couldn't login
+ if response.status != 200:
+ fail(EC_LOGIN_DENIED)
+
+ result = response.read()
+ logging.debug("%s \n", result)
+ conn.close()
+ except socket.timeout:
+ fail(EC_TIMED_OUT)
+ except socket.error as e:
+ logging.error("Failed: {}".format(str(e)))
+ fail(EC_LOGIN_DENIED)
+
+ return result
+
+def get_power_status(conn, options):
+ del conn
+ ret_val = eps_run_command(options, "")
+
+ result = {}
+ status = re.findall(r"p(\d{2})=(0|1)\s*\<br\>", ret_val.lower())
+ for out_num, out_stat in status:
+ result[out_num] = ("", (out_stat == "1" and "on" or "off"))
+
+ if not options["--action"] in ['monitor', 'list']:
+ if not options["--plug"] in result:
+ fail_usage("Failed: You have to enter existing physical plug!")
+ else:
+ return result[options["--plug"]][1]
+ else:
+ return result
+
+def set_power_status(conn, options):
+ del conn
+ eps_run_command(options, "P%s=%s"%(options["--plug"], (options["--action"] == "on" and "1" or "0")))
+
+# Define new option
+def eps_define_new_opts():
+ all_opt["hidden_page"] = {
+ "getopt" : "c:",
+ "longopt" : "page",
+ "help":"-c, --page=[page] Name of hidden page (default: hidden.htm)",
+ "required" : "0",
+ "shortdesc" : "Name of hidden page",
+ "default" : "hidden.htm",
+ "order": 1
+ }
+
+# Starting point of fence agent
+def main():
+ device_opt = ["ipaddr", "login", "passwd", "no_login", "no_password", \
+ "port", "hidden_page", "web"]
+
+ atexit.register(atexit_handler)
+
+ eps_define_new_opts()
+
+ options = check_input(device_opt, process_input(device_opt))
+
+ docs = {}
+ docs["shortdesc"] = "Fence agent for ePowerSwitch"
+ docs["longdesc"] = "fence_eps is an I/O Fencing agent \
+which can be used with the ePowerSwitch 8M+ power switch to fence \
+connected machines. Fence agent works ONLY on 8M+ device, because \
+this is only one, which has support for hidden page feature. \
+\n.TP\n\
+Agent basically works by connecting to hidden page and pass \
+appropriate arguments to GET request. This means, that hidden \
+page feature must be enabled and properly configured."
+ docs["vendorurl"] = "http://www.epowerswitch.com"
+ show_docs(options, docs)
+
+ run_delay(options)
+ #Run fence action. Conn is None, beacause we always need open new http connection
+ result = fence_action(None, options, set_power_status, get_power_status, get_power_status)
+
+ sys.exit(result)
+
+if __name__ == "__main__":
+ main()