| Index: conmux/drivers/fence_apc_snmp.py
|
| diff --git a/conmux/drivers/fence_apc_snmp.py b/conmux/drivers/fence_apc_snmp.py
|
| deleted file mode 100755
|
| index 3595071f94c9d6aa0f482f41b05b964f290c332f..0000000000000000000000000000000000000000
|
| --- a/conmux/drivers/fence_apc_snmp.py
|
| +++ /dev/null
|
| @@ -1,370 +0,0 @@
|
| -#!/usr/bin/python
|
| -
|
| -#############################################################################
|
| -#############################################################################
|
| -##
|
| -## Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
|
| -## Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
|
| -##
|
| -## This copyrighted material is made available to anyone wishing to use,
|
| -## modify, copy, or redistribute it subject to the terms and conditions
|
| -## of the GNU General Public License v.2.
|
| -##
|
| -#############################################################################
|
| -## This APC Fence script uses snmp to control the APC power
|
| -## switch. This script requires that net-snmp-utils be installed
|
| -## on all nodes in the cluster, and that the powernet369.mib file be
|
| -## located in /usr/share/snmp/mibs/
|
| -#############################################################################
|
| -#############################################################################
|
| -
|
| -
|
| -
|
| -import getopt, sys
|
| -import os
|
| -import time
|
| -import select
|
| -import signal
|
| -from glob import glob
|
| -
|
| -#BEGIN_VERSION_GENERATION
|
| -FENCE_RELEASE_NAME=""
|
| -REDHAT_COPYRIGHT=""
|
| -BUILD_DATE=""
|
| -#END_VERSION_GENERATION
|
| -
|
| -POWER_ON="outletOn"
|
| -POWER_OFF="outletOff"
|
| -POWER_REBOOT="outletReboot"
|
| -
|
| -def usage():
|
| - print "Usage:";
|
| - print "";
|
| - print "Options:";
|
| - print " -a <ip> IP address or hostname of MasterSwitch";
|
| - print " -h usage";
|
| - print " -l <name> Login name";
|
| - print " -n <num> Outlet number to change";
|
| - print " -o <string> Action: Reboot (default), Off or On";
|
| - print " -p <string> Login password";
|
| - print " -q quiet mode";
|
| - print " -V version";
|
| - print " -v Log to file /tmp/apclog";
|
| -
|
| - print sys.argv
|
| - sys.exit(0);
|
| -
|
| -
|
| -
|
| -def main():
|
| - apc_base = "enterprises.apc.products.hardware."
|
| - apc_outletctl = "masterswitch.sPDUOutletControl.sPDUOutletControlTable.sPDUOutletControlEntry.sPDUOutletCtl."
|
| - apc_outletstatus = "masterswitch.sPDUOutletStatus.sPDUOutletStatusMSPTable.sPDUOutletStatusMSPEntry.sPDUOutletStatusMSP."
|
| -
|
| - address = ""
|
| - output = ""
|
| - port = ""
|
| - action = "outletReboot"
|
| - status_check = False
|
| - verbose = False
|
| -
|
| - if not glob('/usr/share/snmp/mibs/powernet*.mib'):
|
| - sys.stderr.write('This APC Fence script uses snmp to control the APC power switch. This script requires that net-snmp-utils be installed on all nodes in the cluster, and that the powernet369.mib file be located in /usr/share/snmp/mibs/\n')
|
| - sys.exit(1)
|
| -
|
| - if len(sys.argv) > 1:
|
| - try:
|
| - opts, args = getopt.getopt(sys.argv[1:], "a:hl:p:n:o:vV", ["help", "output="])
|
| - except getopt.GetoptError:
|
| - #print help info and quit
|
| - usage()
|
| - sys.exit(2)
|
| -
|
| - for o, a in opts:
|
| - if o == "-v":
|
| - verbose = True
|
| - if o == "-V":
|
| - print "%s\n" % FENCE_RELEASE_NAME
|
| - print "%s\n" % REDHAT_COPYRIGHT
|
| - print "%s\n" % BUILD_DATE
|
| - sys.exit(0)
|
| - if o in ("-h", "--help"):
|
| - usage()
|
| - sys.exit(0)
|
| - if o == "-n":
|
| - port = a
|
| - if o == "-o":
|
| - lcase = a.lower() #Lower case string
|
| - if lcase == "off":
|
| - action = "outletOff"
|
| - elif lcase == "on":
|
| - action = "outletOn"
|
| - elif lcase == "reboot":
|
| - action = "outletReboot"
|
| - elif lcase == "status":
|
| - #action = "sPDUOutletStatusMSPOutletState"
|
| - action = ""
|
| - status_check = True
|
| - else:
|
| - usage()
|
| - sys.exit()
|
| - if o == "-a":
|
| - address = a
|
| -
|
| - if address == "":
|
| - usage()
|
| - sys.exit(1)
|
| -
|
| - if port == "":
|
| - usage()
|
| - sys.exit(1)
|
| -
|
| - else: #Get opts from stdin
|
| - params = {}
|
| - #place params in dict
|
| - for line in sys.stdin:
|
| - val = line.split("=")
|
| - if len(val) == 2:
|
| - params[val[0].strip()] = val[1].strip()
|
| -
|
| - try:
|
| - address = params["ipaddr"]
|
| - except KeyError, e:
|
| - sys.stderr.write("FENCE: Missing ipaddr param for fence_apc...exiting")
|
| - sys.exit(1)
|
| - try:
|
| - login = params["login"]
|
| - except KeyError, e:
|
| - sys.stderr.write("FENCE: Missing login param for fence_apc...exiting")
|
| - sys.exit(1)
|
| -
|
| - try:
|
| - passwd = params["passwd"]
|
| - except KeyError, e:
|
| - sys.stderr.write("FENCE: Missing passwd param for fence_apc...exiting")
|
| - sys.exit(1)
|
| -
|
| - try:
|
| - port = params["port"]
|
| - except KeyError, e:
|
| - sys.stderr.write("FENCE: Missing port param for fence_apc...exiting")
|
| - sys.exit(1)
|
| -
|
| -
|
| - try:
|
| - a = params["option"]
|
| - if a == "Off" or a == "OFF" or a == "off":
|
| - action = POWER_OFF
|
| - elif a == "On" or a == "ON" or a == "on":
|
| - action = POWER_ON
|
| - elif a == "Reboot" or a == "REBOOT" or a == "reboot":
|
| - action = POWER_REBOOT
|
| - except KeyError, e:
|
| - action = POWER_REBOOT
|
| -
|
| - ####End of stdin section
|
| -
|
| - apc_command = apc_base + apc_outletctl + port
|
| -
|
| - args_status = list()
|
| - args_off = list()
|
| - args_on = list()
|
| -
|
| - args_status.append("/usr/bin/snmpget")
|
| - args_status.append("-Oqu") #sets printing options
|
| - args_status.append("-v")
|
| - args_status.append("1")
|
| - args_status.append("-c")
|
| - args_status.append("private")
|
| - args_status.append("-m")
|
| - args_status.append("ALL")
|
| - args_status.append(address)
|
| - args_status.append(apc_command)
|
| -
|
| - args_off.append("/usr/bin/snmpset")
|
| - args_off.append("-Oqu") #sets printing options
|
| - args_off.append("-v")
|
| - args_off.append("1")
|
| - args_off.append("-c")
|
| - args_off.append("private")
|
| - args_off.append("-m")
|
| - args_off.append("ALL")
|
| - args_off.append(address)
|
| - args_off.append(apc_command)
|
| - args_off.append("i")
|
| - args_off.append("outletOff")
|
| -
|
| - args_on.append("/usr/bin/snmpset")
|
| - args_on.append("-Oqu") #sets printing options
|
| - args_on.append("-v")
|
| - args_on.append("1")
|
| - args_on.append("-c")
|
| - args_on.append("private")
|
| - args_on.append("-m")
|
| - args_on.append("ALL")
|
| - args_on.append(address)
|
| - args_on.append(apc_command)
|
| - args_on.append("i")
|
| - args_on.append("outletOn")
|
| -
|
| - cmdstr_status = ' '.join(args_status)
|
| - cmdstr_off = ' '.join(args_off)
|
| - cmdstr_on = ' '.join(args_on)
|
| -
|
| -##This section issues the actual commands. Reboot is split into
|
| -##Off, then On to make certain both actions work as planned.
|
| -##
|
| -##The status command just dumps the outlet status to stdout.
|
| -##The status checks that are made when turning an outlet on or off, though,
|
| -##use the execWithCaptureStatus so that the stdout from snmpget can be
|
| -##examined and the desired operation confirmed.
|
| -
|
| - if status_check:
|
| - if verbose:
|
| - fd = open("/tmp/apclog", "w")
|
| - fd.write("Attempting the following command: %s\n" % cmdstr_status)
|
| - strr = os.system(cmdstr_status)
|
| - print strr
|
| - if verbose:
|
| - fd.write("Result: %s\n" % strr)
|
| - fd.close()
|
| -
|
| - else:
|
| - if action == POWER_OFF:
|
| - if verbose:
|
| - fd = open("/tmp/apclog", "w")
|
| - fd.write("Attempting the following command: %s\n" % cmdstr_off)
|
| - strr = os.system(cmdstr_off)
|
| - time.sleep(1)
|
| - strr,code = execWithCaptureStatus("/usr/bin/snmpget",args_status)
|
| - if verbose:
|
| - fd.write("Result: %s\n" % strr)
|
| - fd.close()
|
| - if strr.find(POWER_OFF) >= 0:
|
| - print "Success. Outlet off"
|
| - sys.exit(0)
|
| - else:
|
| - if verbose:
|
| - fd.write("Unable to power off apc outlet")
|
| - fd.close()
|
| - sys.exit(1)
|
| -
|
| - elif action == POWER_ON:
|
| - if verbose:
|
| - fd = open("/tmp/apclog", "w")
|
| - fd.write("Attempting the following command: %s\n" % cmdstr_on)
|
| - strr = os.system(cmdstr_on)
|
| - time.sleep(1)
|
| - strr,code = execWithCaptureStatus("/usr/bin/snmpget",args_status)
|
| - #strr = os.system(cmdstr_status)
|
| - if verbose:
|
| - fd.write("Result: %s\n" % strr)
|
| - if strr.find(POWER_ON) >= 0:
|
| - if verbose:
|
| - fd.close()
|
| - print "Success. Outlet On."
|
| - sys.exit(0)
|
| - else:
|
| - print "Unable to power on apc outlet"
|
| - if verbose:
|
| - fd.write("Unable to power on apc outlet")
|
| - fd.close()
|
| - sys.exit(1)
|
| -
|
| - elif action == POWER_REBOOT:
|
| - if verbose:
|
| - fd = open("/tmp/apclog", "w")
|
| - fd.write("Attempting the following command: %s\n" % cmdstr_off)
|
| - strr = os.system(cmdstr_off)
|
| - time.sleep(1)
|
| - strr,code = execWithCaptureStatus("/usr/bin/snmpget",args_status)
|
| - #strr = os.system(cmdstr_status)
|
| - if verbose:
|
| - fd.write("Result: %s\n" % strr)
|
| - if strr.find(POWER_OFF) < 0:
|
| - print "Unable to power off apc outlet"
|
| - if verbose:
|
| - fd.write("Unable to power off apc outlet")
|
| - fd.close()
|
| - sys.exit(1)
|
| -
|
| - if verbose:
|
| - fd.write("Attempting the following command: %s\n" % cmdstr_on)
|
| - strr = os.system(cmdstr_on)
|
| - time.sleep(1)
|
| - strr,code = execWithCaptureStatus("/usr/bin/snmpget",args_status)
|
| - #strr = os.system(cmdstr_status)
|
| - if verbose:
|
| - fd.write("Result: %s\n" % strr)
|
| - if strr.find(POWER_ON) >= 0:
|
| - if verbose:
|
| - fd.close()
|
| - print "Success: Outlet Rebooted."
|
| - sys.exit(0)
|
| - else:
|
| - print "Unable to power on apc outlet"
|
| - if verbose:
|
| - fd.write("Unable to power on apc outlet")
|
| - fd.close()
|
| - sys.exit(1)
|
| -
|
| -def execWithCaptureStatus(command, argv, searchPath = 0, root = '/', stdin = 0,
|
| - catchfd = 1, closefd = -1):
|
| -
|
| - if not os.access (root + command, os.X_OK):
|
| - raise RuntimeError, command + " cannot be run"
|
| -
|
| - (read, write) = os.pipe()
|
| -
|
| - childpid = os.fork()
|
| - if (not childpid):
|
| - if (root and root != '/'): os.chroot (root)
|
| - if isinstance(catchfd, tuple):
|
| - for fd in catchfd:
|
| - os.dup2(write, fd)
|
| - else:
|
| - os.dup2(write, catchfd)
|
| - os.close(write)
|
| - os.close(read)
|
| -
|
| - if closefd != -1:
|
| - os.close(closefd)
|
| -
|
| - if stdin:
|
| - os.dup2(stdin, 0)
|
| - os.close(stdin)
|
| -
|
| - if (searchPath):
|
| - os.execvp(command, argv)
|
| - else:
|
| - os.execv(command, argv)
|
| -
|
| - sys.exit(1)
|
| -
|
| - os.close(write)
|
| -
|
| - rc = ""
|
| - s = "1"
|
| - while (s):
|
| - select.select([read], [], [])
|
| - s = os.read(read, 1000)
|
| - rc = rc + s
|
| -
|
| - os.close(read)
|
| -
|
| - pid = -1
|
| - status = -1
|
| - try:
|
| - (pid, status) = os.waitpid(childpid, 0)
|
| - except OSError, (errno, msg):
|
| - print __name__, "waitpid:", msg
|
| -
|
| - if os.WIFEXITED(status) and (os.WEXITSTATUS(status) == 0):
|
| - status = os.WEXITSTATUS(status)
|
| - else:
|
| - status = -1
|
| -
|
| - return (rc, status)
|
| -
|
| -if __name__ == "__main__":
|
| - main()
|
|
|