Page Menu
Home
ClusterLabs Projects
Search
Configure Global Search
Log In
Files
F1842031
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/fence/agents/apc/fence_apc.py b/fence/agents/apc/fence_apc.py
index 65b95022c..b8f063750 100644
--- a/fence/agents/apc/fence_apc.py
+++ b/fence/agents/apc/fence_apc.py
@@ -1,199 +1,206 @@
#!/usr/bin/python
#####
##
## The Following Agent Has Been Tested On:
##
## Model Firmware
## +---------------------------------------------+
## AP7951 AOS v2.7.0, PDU APP v2.7.3
## AP7941 AOS v3.5.7, PDU APP v3.5.6
## AP9606 AOS v2.5.4, PDU APP v2.7.3
##
## @note: ssh is very slow on AP79XX devices protocol (1) and
## cipher (des/blowfish) have to be defined
#####
-import sys, re, pexpect
+import sys, re, pexpect, exceptions
sys.path.append("@FENCEAGENTSLIBDIR@")
from fencing import *
#BEGIN_VERSION_GENERATION
RELEASE_VERSION="New APC Agent - test release on steroids"
REDHAT_COPYRIGHT=""
BUILD_DATE="March, 2008"
#END_VERSION_GENERATION
def get_power_status(conn, options):
result = ""
try:
conn.send("1\r\n")
conn.log_expect(options, options["-c"], SHELL_TIMEOUT)
version = 0
admin = 0
switch = 0;
if (None != re.compile('.* MasterSwitch plus.*', re.IGNORECASE | re.S).match(conn.before)):
switch = 1;
if (None != re.compile('.* MasterSwitch plus 2', re.IGNORECASE | re.S).match(conn.before)):
if (0 == options.has_key("-s")):
fail_usage("Failed: You have to enter physical switch number")
else:
if (0 == options.has_key("-s")):
options["-s"] = 1
if (None == re.compile('.*Outlet Management.*', re.IGNORECASE | re.S).match(conn.before)):
version = 2
else:
version = 3
if (None == re.compile('.*Outlet Control/Configuration.*', re.IGNORECASE | re.S).match(conn.before)):
admin = 0
else:
admin = 1
if switch == 0:
if version == 2:
if admin == 0:
conn.send("2\r\n")
else:
conn.send("3\r\n")
else:
conn.send("2\r\n")
conn.log_expect(options, options["-c"], SHELL_TIMEOUT)
conn.send("1\r\n")
else:
conn.send(options["-s"]+"\r\n")
while 1 == conn.log_expect(options, [ options["-c"], "Press <ENTER>" ], SHELL_TIMEOUT):
result += conn.before
conn.send("\r\n")
result += conn.before
conn.send(chr(03))
conn.log_expect(options, "- Logout", SHELL_TIMEOUT)
conn.log_expect(options, options["-c"], SHELL_TIMEOUT)
except pexpect.EOF:
fail(EC_CONNECTION_LOST)
except pexpect.TIMEOUT:
fail(EC_TIMED_OUT)
status = re.compile("\s*"+options["-n"]+"-.*(ON|OFF)", re.IGNORECASE).search(result).group(1)
return status.lower().strip()
def set_power_status(conn, options):
action = {
'on' : "1",
'off': "2"
}[options["-o"]]
try:
conn.send("1\r\n")
conn.log_expect(options, options["-c"], SHELL_TIMEOUT)
version = 0
admin = 0
switch = 0
if (None != re.compile('.* MasterSwitch plus.*', re.IGNORECASE | re.S).match(conn.before)):
switch = 1;
## MasterSwitch has different schema for on/off actions
action = {
'on' : "1",
'off': "3"
}[options["-o"]]
if (None != re.compile('.* MasterSwitch plus 2', re.IGNORECASE | re.S).match(conn.before)):
if (0 == options.has_key("-s")):
fail_usage("Failed: You have to enter physical switch number")
else:
if (0 == options.has_key("-s")):
options["-s"] = 1
if (None == re.compile('.*Outlet Management.*', re.IGNORECASE | re.S).match(conn.before)):
version = 2
else:
version = 3
if (None == re.compile('.*Outlet Control/Configuration.*', re.IGNORECASE | re.S).match(conn.before)):
admin = 0
else:
admin = 1
if switch == 0:
if version == 2:
if admin == 0:
conn.send("2\r\n")
else:
conn.send("3\r\n")
else:
conn.send("2\r\n")
conn.log_expect(options, options["-c"], SHELL_TIMEOUT)
conn.send("1\r\n")
else:
conn.send(options["-s"] + "\r\n")
while 1 == conn.log_expect(options, [ options["-c"], "Press <ENTER>" ], SHELL_TIMEOUT):
conn.send("\r\n")
conn.send(options["-n"]+"\r\n")
conn.log_expect(options, options["-c"], SHELL_TIMEOUT)
if switch == 0:
if admin == 1:
conn.send("1\r\n")
conn.log_expect(options, options["-c"], SHELL_TIMEOUT)
if version == 3:
conn.send("1\r\n")
conn.log_expect(options, options["-c"], SHELL_TIMEOUT)
else:
conn.send("1\r\n")
conn.log_expect(options, options["-c"], SHELL_TIMEOUT)
conn.send(action+"\r\n")
conn.log_expect(options, "Enter 'YES' to continue or <ENTER> to cancel :", SHELL_TIMEOUT)
conn.send("YES\r\n")
conn.log_expect(options, "Press <ENTER> to continue...", SHELL_TIMEOUT)
conn.send("\r\n")
conn.log_expect(options, options["-c"], SHELL_TIMEOUT)
conn.send(chr(03))
conn.log_expect(options, "- Logout", SHELL_TIMEOUT)
conn.log_expect(options, options["-c"], SHELL_TIMEOUT)
except pexpect.EOF:
fail(EC_CONNECTION_LOST)
except pexpect.TIMEOUT:
fail(EC_TIMED_OUT)
def main():
device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
"action", "ipaddr", "login", "passwd", "passwd_script",
"secure", "port", "switch", "test" ]
options = check_input(device_opt, process_input(device_opt))
##
## Fence agent specific defaults
#####
options["ssh_options"] = "-1 -c blowfish"
if 0 == options.has_key("-c"):
options["-c"] = "\n>"
## Support for -n [switch]:[plug] notation that was used before
if (-1 != options["-n"].find(":")):
(switch, plug) = options["-n"].split(":", 1)
options["-s"] = switch;
options["-n"] = plug;
##
## Operate the fencing device
####
conn = fence_login(options)
fence_action(conn, options, set_power_status, get_power_status)
##
## Logout from system
+ ##
+ ## In some special unspecified cases it is possible that
+ ## connection will be closed before we run close(). This is not
+ ## a problem because everything is checked before.
######
- conn.sendline("4")
- conn.close()
+ try:
+ conn.sendline("4")
+ conn.close()
+ except exceptions.OSError:
+ pass
if __name__ == "__main__":
main()
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sat, Nov 23, 11:08 AM (1 d, 12 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1018653
Default Alt Text
(5 KB)
Attached To
Mode
rR Resource Agents
Attached
Detach File
Event Timeline
Log In to Comment