| 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()
 | 
| 
 |