/usr/sbin/fence_eps is in fence-agents 3.1.5-2ubuntu2.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | #!/usr/bin/python
# The Following Agent Has Been Tested On:
# ePowerSwitch 8M+ version 1.0.0.4
import sys, re, time
import httplib, base64, string,socket
sys.path.append("/usr/share/fence")
from fencing import *
#BEGIN_VERSION_GENERATION
RELEASE_VERSION="3.1.5"
BUILD_DATE="(built Mon Feb 6 23:36:21 UTC 2012)"
REDHAT_COPYRIGHT="Copyright (C) Red Hat, Inc. 2004-2010 All rights reserved."
#END_VERSION_GENERATION
# Log actions and results from EPS device
def eps_log(options,str):
if options["log"]>=LOG_MODE_VERBOSE:
options["debug_fh"].write(str)
# 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["-a"])
request_str="/"+options["-c"]
if (params!=""):
request_str+="?"+params
eps_log(options,"GET "+request_str+"\n")
conn.putrequest('GET', request_str)
if (options.has_key("-l")):
if (not options.has_key("-p")):
options["-p"]="" # Default is empty password
# String for Authorization header
auth_str = 'Basic ' + string.strip(base64.encodestring(options["-l"]+':'+options["-p"]))
eps_log(options,"Authorization:"+auth_str+"\n")
conn.putheader('Authorization',auth_str)
conn.endheaders()
response = conn.getresponse()
eps_log(options,"%d %s\n"%(response.status,response.reason))
#Response != OK -> couldn't login
if (response.status!=200):
fail(EC_LOGIN_DENIED)
result=response.read()
eps_log(options,result+"\n")
conn.close()
except socket.timeout:
fail(EC_TIMED_OUT)
except socket.error:
fail(EC_LOGIN_DENIED)
return result
def get_power_status(conn, options):
ret_val=eps_run_command(options,"")
result={}
status=re.findall("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["-o"] in ['monitor','list'])):
if (not (options["-n"] in result)):
fail_usage("Failed: You have to enter existing physical plug!")
else:
return result[options["-n"]][1]
else:
return result
def set_power_status(conn, options):
ret_val=eps_run_command(options,"P%s=%s"%(options["-n"],(options["-o"]=="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 = [ "help", "version", "agent", "quiet", "verbose", "debug",
"action", "ipaddr", "login", "passwd", "passwd_script",
"test", "port", "hidden_page", "no_login", "no_password",
"separator" ]
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 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()
|