[Linux-cluster] Fencing /w APC 7900

Josh Gray jgray at nicusa.com
Thu Oct 18 22:05:02 UTC 2007


Jim could you send that script as an attachment?   When I run it from luci
I'm getting the following errors in /var/log/messages    Seems to work when
I do it from the command line though


Oct 18 18:03:33 nfs-7 fence_node[11985]: agent "fence_apc" reports:
Traceback (most recent call last):   File "/sbin/fence_apc", line 832, in ?
main()   File "/sbin/fence_apc", line 303, in main     do_power_off(sock)
File "/sbin/fence_apc", line 816, in do_power_off     x =
do_power_switch(sock, "off")   File "/sbi
Oct 18 18:03:33 nfs-7 fence_node[11985]: agent "fence_apc" reports:
n/fence_apc", line 611, in do_power_switch     result_code, response =
power_off(txt + ndbuf)   File "/sbin/fence_apc", line 820, in power_off
x = power_switch(buffer, False, "2", "3");   File "/sbin/fence_apc", line
813, in power_switch     raise "un
Oct 18 18:03:33 nfs-7 fence_node[11985]: agent "fence_apc" reports: known
screen encountered in \n" + str(lines) + "\n" unknown screen encountered in
['', '> 1', '', '', '------- Phase Management
------------------------------------------------------', '', '        Phase
Load :  3.9', '        Phase State: Normal Load ',
Oct 18 18:03:33 nfs-7 fence_node[11985]: agent "fence_apc" reports:  '', '
1- Overload Alarm Threshold(amps)       : 12', '     2- Near Overload
Warning Threshold(amps): 8', '     3- Low Load Warning Threshold(amps)     :
0', '     4- Accept Changes                       : ', '', '     ?- Help,
<ESC>- Back, <ENTER>- R
Oct 18 18:03:33 nfs-7 fence_node[11985]: agent "fence_apc" reports: efresh,
<CTRL-L>- Event Log']
Oct 18 18:03:33 nfs-7 fence_node[11985]: Fence of "nfs-6.cdc.nicusa.com" was
unsuccessful 




On 10/18/07 5:21 PM, "jim parsons" <jparsons at redhat.com> wrote:

> Try this one. It is slated for the next update. Just drop in to /sbin on
> every node.
> 
> -j
> 
> 
> On Thu, 2007-10-18 at 17:14 -0400, Josh Gray wrote:
>> I'm getting a menu not recognized error when I try fencing with the switches
>> I just picked up.  Is a certain OS or Firmware required?
>> 
>> 
>> # /sbin/fence_apc -a 10.0.0.xxx -l admin -n 2 -o off -p xxx -v
>> failed: unrecognised menu response
>> 
>> # cat /tmp/apclog
>> 
>> User Name : admin
>> Password  : **********
>> 
>> 
>>> From the gui:
>>       
>> Hardware Factory
>>        
>> Model Number:     AP7900
>> Hardware Revision:     B2
>> Manufacture Date:     08/17/2007
>> Management Uptime:     0 Days 3 Hours 8 Minutes
>>      
>>              
>>       
>> Application Module
>>        
>> Name:     rpdu
>> Version:     v3.3.3
>> Date:     01/05/2007
>> Time:     14:56:33
>>      
>>              
>>       
>> APC OS (AOS)
>>        
>> Name:     aos
>> Version:     v3.3.4
>> Date:     01/05/2007
>> Time:     
>> 
>> 
> #!/usr/bin/python
> 
> 
##############################################################################>
#
> 
##############################################################################>
#
> ##
> ##  Copyright (C) 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.
> ##
> 
##############################################################################>
#
> 
##############################################################################>
#
> 
> import getopt, sys
> import os
> import socket
> import time
> 
> from telnetlib import Telnet
> 
> TELNET_TIMEOUT=5  #How long to wait for a response from a telnet try
> 
> # WARNING!! Do not add code bewteen "#BEGIN_VERSION_GENERATION" and
> # "#END_VERSION_GENERATION"  It is generated by the Makefile
> 
> #BEGIN_VERSION_GENERATION
> FENCE_RELEASE_NAME="New APC Agent - test release"
> REDHAT_COPYRIGHT=""
> BUILD_DATE="September 21, 2006"
> #END_VERSION_GENERATION
> 
> POWER_OFF = 0
> POWER_ON = 1
> POWER_STATUS = 2
> POWER_REBOOT = 3
> 
> COMPLETE = 0
> NOT_COMPLETE = 1
> 
> ON = "ON"
> OFF = "OFF"
> 
> SUCCESS = "success"
> FAIL = "fail"
> 
> address = ""
> login = ""
> passwd = ""
> passwd_script = ""
> port = ""
> switchnum = ""
> action = POWER_REBOOT   #default action
> verbose = False
> 
> logfile = None
> 
> #set up regex list
> CONTROL_CONSOLE = "Control Console -----"
> DEVICE_MANAGER = "Device Manager -----"
> OUTLET_CONTROL = "- Outlet Control/Configuration -----"
> OUTLET_MANAGE = "- Outlet Management -----"
> CONTROL_OUTLET = "- Control Outlet -----"
> CONTROL_OUTLET_2 = "- Outlet Control "
> COMMAND_SUCCESS = "Command successfully issued."
> COMMAND_SUCCESS_2 = " Success"
> CONFIRM = "Enter 'YES' to continue or <ENTER> to cancel :"
> CONTINUE = "Press <ENTER> to continue..."
> SCREEN_END = "<ESC>- Main Menu, <ENTER>- Refresh, <CTRL-L>- Event Log"
> SCREEN_END_2 = "<ESC>- Back, <ENTER>- Refresh, <CTRL-L>- Event Log"
> USERNAME = "User Name :"
> PASSWORD = "Password  :"
> MASTER = "------- MasterSwitch"
> FIRMWARE_STR = "Rack PDU APP"
> 
> CONTINUE_INDEX = 0
> 
> FIRMWARE_REV = 2
> 
> regex_list = list()
> regex_list.append(CONTINUE)
> regex_list.append(SCREEN_END)
> regex_list.append(SCREEN_END_2)
> regex_list.append(USERNAME)
> regex_list.append(PASSWORD)
> 
> def usage():
>   print "Usage:\n"
>   print "fence_apc [options]"
>   print "Options:"
>   print "   -a <ipaddress>           ip or hostname of APC switch"
>   print "   -h                       print out help"
>   print "   -l [login]               login name"
>   print "   -n [port]                switch port"
>   print "   -p [password]            password"
>   print "   -S [path]                script to run to retrieve password"
>   print "   -o [action]              Reboot (default), Off, On, or Status"
>   print "   -v Verbose               Verbose mode - writes file to
> /tmp/apclog"
>   print "   -V                       Print Version, then exit"
> 
>   sys.exit (0)
> 
> def version():
>   print "fence_apc %s  %s\n" % (FENCE_RELEASE_NAME, BUILD_DATE)
>   print "%s\n" % REDHAT_COPYRIGHT
>   sys.exit(0)
> 
> def main():
> 
>   global address, login, passwd, passwd_script, port, action, verbose,
> logfile, switchnum
> 
>   if len(sys.argv) > 1:
>     try:
>       opts, args = getopt.getopt(sys.argv[1:], "a:hl:o:n:p:S: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":
>         version()
>       if o in ("-h", "--help"):
>         usage()
>         sys.exit()
>       if o == "-l":
>         login = a
>       if o == "-p":
>         passwd = a
>       if o == "-S":
>         passwd_script = a
>       if o == "-n":
>         dex = a.find(":")
>         if dex == (-1):
>           port = a
>         else:
>           switchnum = a[:dex]
>           port = a[(dex+1):]
>       if o  == "-o":
>         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 == "Status" or a == "STATUS" or a == "status":
>           action = POWER_STATUS
>         elif a == "Reboot" or a == "REBOOT" or a == "reboot":
>           action = POWER_REBOOT
>         else:
>           usage()
>           sys.exit()
>       if o == "-a":
>         address = a
>     if address == "" or login == "" or (passwd == "" and passwd_script == "")
> or port == "":
>       usage()
>       sys.exit()
>     
>   else: #Take args 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:
>       if 'passwd' in params:
>         passwd = params["passwd"]
>       if 'passwd_script' in params:
>         passwd_script = params['passwd_script']
>       if passwd == "" and passwd_script == "":
>         raise "missing password"
>     except:
>       sys.stderr.write("FENCE: Missing passwd 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:
>       switchnum = params["switch"]
>     except KeyError, e:
>       pass
>     try:
>       verbose = params["verbose"]
>       verbose = (verbose == 'True' or verbose == 'true' or verbose == 'TRUE')
>     except KeyError, e:
>       pass
>     
>     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
>   
>   
>   # retrieve passwd from passwd_script (if specified)
>   passwd_scr = ''
>   if len(passwd_script):
>     try:
>       if not os.access(passwd_script, os.X_OK):
>         raise 'script not executable'
>       p = os.popen(passwd_script, 'r', 1024)
>       passwd_scr = p.readline().strip()
>       if p.close() != None:
>         raise 'script failed'
>     except:
>       sys.stderr.write('password-script "%s" failed\n' % passwd_script)
>       passwd_scr = ''
>     
>   if passwd == "" and passwd_scr == "":
>     sys.stderr.write('password not available, exiting...')
>     sys.exit(1)
>   elif passwd == passwd_scr:
>     pass
>   elif passwd and passwd_scr:
>     # execute self, with password_scr as passwd,
>     # if that fails, continue with "passwd" argument as password
>     if len(sys.argv) > 1:
>       comm = sys.argv[0]
>       skip_next = False
>       for w in sys.argv[1:]:
>         if skip_next:
>           skip_next = False
>         elif w in ['-p', '-S']:
>           skip_next = True
>         else:
>           comm += ' ' + w
>       comm += ' -p ' + passwd_scr
>       ret = os.system(comm)
>       if ret != -1 and os.WIFEXITED(ret) and os.WEXITSTATUS(ret) == 0:
>         # success
>         sys.exit(0)
>       else:
>         sys.stderr.write('Use of password from "passwd_script" failed, trying
> "passwd" argument\n')
>     else: # use stdin
>       p = os.popen(sys.argv[0], 'w', 1024)
>       for par in params:
>         if par not in ['passwd', 'passwd_script']:
>           p.write(par + '=' + params[par] + '\n')
>       p.write('passwd=' + passwd_scr + '\n')
>       p.flush()
>       if p.close() == None:
>         # success
>         sys.exit(0)
>       else:
>         sys.stderr.write('Use of password from "passwd_script" failed, trying
> "passwd" argument\n')
>   elif passwd_scr:
>     passwd = passwd_scr
>   # passwd all set
>   
>   
>   
>   ### Order of events
>   # 0) If verbose, prepare log file handle
>   # 1) Open socket
>   # 2) Log in
>   # 3) Evaluate task. Task will be one of:
>   # 3a - Check status and print to stdout (or log file if verbose)
>   # 3b - Turn a port off, then confirm
>   # 3c - Turn a port on, then confirm
>   # 3d - Reboot by turning a port off, then on, and confirming each step.
> 
>   if verbose:
>     setup_logging()
> 
>   sock = setup_socket()
> 
>   # Ok, now lets log in...
>   do_login(sock)
> 
>   # Now we should be at the outside Control screen
>     
>   if action == POWER_STATUS:
>     # We should be at the Control screen, so we need to write a '1'
>     # to kick things off
>     sock.write("1\r")
>     statusval = do_status_check(sock)
>     backout(sock)
>     sock.write("4\r")  # Logs out
>     
>   elif action == POWER_OFF:
>     sock.write("1\r")
>     do_power_off(sock)
>     backout(sock) # Return to control screen
>     statusval = do_status_check(sock)
>     if statusval == OFF:
>       if verbose:
>         logit("Power Off successful\n")
>       print "Power Off successful"
>       backout(sock)
>       sock.write("4\r")  # Logs out
>       sock.close()
>       sys.exit(0)
>     else:
>       if verbose:
>         logit("Power Off unsuccessful\n")
>         logit("Undetermined error\n")
>       sys.stderr.write("Power Off unsuccessful")
>       backout(sock)
>       sock.write("4\r")  # Logs out
>       sock.close()
>       sys.exit(1)
>     
>   elif action == POWER_ON:
>     sock.write("1\r")
>     do_power_on(sock)
>     backout(sock) # Return to control screen
>     statusval = do_status_check(sock)
>     if statusval == ON:
>       if verbose:
>         logit("Power On successful\n")
>       print "Power On successful"
>       backout(sock)
>       sock.write("4\r")  # logs out
>       sock.close()
>       sys.exit(0)
>     else:
>       if verbose:
>         logit("Power On unsuccessful\n")
>         logit("Undetermined error\n")
>       sys.stderr.write("Power On unsuccessful")
>       backout(sock)
>       sock.write("4\r")  # Logs out
>       sock.close()
>       sys.exit(1)
> 
>   elif action == POWER_REBOOT:
>     sock.write("1\r")
>     do_power_off(sock)
>     backout(sock) # Return to control screen
>     statusval = do_status_check(sock)
>     if statusval == OFF:
>       if verbose:
>         logit("Power Off successful\n")
>       print "Power Off successful"
>       backout(sock)
>     else:
>       if verbose:
>         logit("Power Off unsuccessful\n")
>         logit("Undetermined error\n")
>       sys.stderr.write("Power Off unsuccessful")
>       backout(sock)
>       sock.write("4\r")  # Logs out
>       sock.close()
>       sys.exit(1)
>     do_power_on(sock)
>     backout(sock) # Return to control screen
>     statusval = do_status_check(sock)
>     if statusval == ON:
>       if verbose:
>         logit("Power Reboot successful\n")
>       print "Power Reboot successful"
>       backout(sock)
>       sock.write("4\r")  # Logs out
>       sock.close()
>       sys.exit(0)
>     else:
>       if verbose:
>         logit("Power Reboot unsuccessful\n")
>         logit("Undetermined error\n")
>       sys.stderr.write("Power Reboot unsuccessful")
>       backout(sock)
>       sock.write("4\r")  # Logs out
>       sock.close()
>       sys.exit(1)
>     
>   sock.close()
> 
> def backout(sock):
>   sock.write(chr(27))
>   
>   while (1):
>     i, mo, txt = sock.expect(regex_list, TELNET_TIMEOUT)
> 
>     if regex_list[i] == SCREEN_END:
>       break
>     elif regex_list[i] == SCREEN_END_2:
>       sock.write(chr(27))
> 
> def setup_socket():
>   ## Time to open telnet session and log in.
>   try:
>     sock = Telnet(address.strip())
>   except socket.error, (errno, msg):
>     my_msg = "FENCE: A problem was encountered opening a telnet session with "
> + address
>     if verbose:
>       logit(my_msg)
>       logit("FENCE: Error number: %d -- Message: %s\n" % (errno, msg))
>       logit("Firewall issue? Correct address?\n")
> 
>     sys.stderr.write(my_msg)
>     sys.stderr.write(("FENCE: Error number: %d -- Message: %s\n" % (errno,
> msg)))
>     sys.stderr.write("Firewall issue? Correct address?\n")
>     sys.exit(1)
> 
>   if verbose:
>     logit("\nsocket open to %s\n" % address)
> 
>   return sock
> 
> def setup_logging( log_location="/tmp/apclog"):
>   global logfile
>   try:
>     logfile = open(log_location, 'a')
>     logfile.write("###############################################\n")
>     logfile.write("Telnetting to apc switch %s\n" % address)
>     now = time.localtime(time.time())
>     logfile.write(time.asctime(now))
>   except IOError, e:
>     sys.stderr.write("Failed to open log file %s" % log_location)
>     logfile = None
> 
> def logit(instr):
>   if logfile != None:
>     logfile.write(instr)
> 
> def do_login(sock):
>   result_code = 1
> 
>   ## This loop tries to assemble complete telnet screens and passes
>   ## them to helper methods to handle responses accordingly.
>   while result_code:
>     try:
>       i, mo, txt = sock.expect(regex_list, TELNET_TIMEOUT)
>     except socket.error, (errno, msg):
>       my_msg = "FENCE: A problem was encountered opening a telnet session with
> " + address + "\n"
>       if verbose:
>         logit(my_msg)
>         logit("FENCE: Error number: %d -- Message: %s\n" % (errno, msg))
> 
>       sys.stderr.write(my_msg)
>       sys.stderr.write(("FENCE: Error number: %d -- Message: %s\n" % (errno,
> msg)))
>       sys.exit(1)
> 
>     if i == CONTINUE_INDEX: # Capture the rest of the screen...
>       sock.write("\r")
>       ii,moo,txtt = sock.expect(regex_list, TELNET_TIMEOUT)
>       txt = txt + txtt
> 
>     ndbuf = sock.read_eager() # Scoop up remainder
>     if verbose:
>       logit(txt + ndbuf)
>     result_code,response = log_in(txt + ndbuf)
>     if result_code:
>       try:
>         sock.write(response)
>       except socket.error, (errno, msg):
>         if verbose:
>           logit("Error #%s" % errno)
>           logit(msg)
>         sys.stderr.write("Error #%s:  %s" % (errno,msg))
>         sys.exit(1)
> 
> def log_in(buffer):
>   global FIRMWARE_REV
>   lines = buffer.splitlines()
> 
>   for i in lines:
>     if i.find(USERNAME) != (-1):
>       if verbose:
>         logit("Sending login: %s\n" % login)
>       return (NOT_COMPLETE, login + "\r")
>     elif i.find(PASSWORD) != (-1):
>       if verbose:
>         logit("Sending password: %s\n" % passwd)
>       return (NOT_COMPLETE, passwd + "\r")
>     elif i.find(CONTROL_CONSOLE) != (-1):
>       #while we are here, grab the firmware revision
>       rev_search_lines = buffer.splitlines()
>       for rev_search_line in rev_search_lines: #search screen again
>         rev_dex = rev_search_line.find(FIRMWARE_STR)
>         if rev_dex != (-1): #found revision line
>           scratch_rev = rev_search_line[rev_dex:]
>           v_dex = scratch_rev.find("v")
>           if v_dex != (-1):
>             if scratch_rev[v_dex + 1] == "3": #format is v3.3.4
>               FIRMWARE_REV = 3
>               break
>       return (COMPLETE, "1\r")
> 
> def do_status_check(sock):
>   result_code = 1
>   while result_code:
>     i, mo, txt = sock.expect(regex_list, TELNET_TIMEOUT)
>     if i == CONTINUE_INDEX: # Capture the rest of the screen...
>       sock.write("\r")
>       ii,moo,txtt = sock.expect(regex_list, TELNET_TIMEOUT)
>       txt = txt + txtt
> 
>     ndbuf = sock.read_eager() # Scoop up remainder
>     if verbose:
>       logit(txt + ndbuf)
>     (result_code,response,statusval) = return_status(txt + ndbuf)
>     if result_code:
>       try:
>         sock.write(response)
>       except socket.error, (errno, msg):
>         if verbose:
>           logit("Status check failed.")
>           logit("Error #%s" % errno)
>           logit(msg)
>         sys.stderr.write("Status check failed.")
>         sys.stderr.write("Error #%s:  %s" % (errno,msg))
>         sys.exit(1)
>   # Back from status check - value should be in status var
>   if response == SUCCESS:
>     if switchnum == "":
>       if verbose:
>         logit("Status check successful. Port %s is %s" % (port,statusval))
>       print "Status check successful. Port %s is %s" % (port,statusval)
>     else:
>       if verbose:
>         logit("Status check successful. Port %s:%s is %s" % (switchnum, port,
> statusval))
>       print "Status check successful. Port %s:%s is %s" % (switchnum, port,
> statusval)
> 
>     return statusval
>   else:
>     if verbose:
>       logit("Status check failed, unknown reason.")
>     sys.stderr.write("Status check failed, unknown reason.\n")
>     sock.close()
>     sys.exit(1) 
> 
> def return_status(buffer):
>   global switchnum, port
> 
>   lines = buffer.splitlines()
> 
>   for i in lines:
>     if i.find(CONTROL_CONSOLE) != (-1):
>       return (NOT_COMPLETE, "1\r", "Status Unknown")
>     elif i.find(DEVICE_MANAGER) != (-1):
>       if switchnum != "":
>         res = switchnum + "\r"
>       else:
>         if FIRMWARE_REV == 2:
>           res = "3\r"
>         elif FIRMWARE_REV == 3:
>           res = "2\r1\r"
>         else: #placeholder for future revisions
>           res = "3\r"
>       return (NOT_COMPLETE, res, "Status Unknown")
>     elif i.find(OUTLET_CONTROL) != (-1):
>       ls = buffer.splitlines()
>       portval = port.strip()
>       portval = " " + portval + " "
>       portval2 = " " + port.strip() + "- "
>       found_portval = False
>       for l in ls:
>         if l.find(portval) != (-1) or l.find(portval2) != (-1):
>           found_portval = True
>           linesplit = l.split()
>           linelen = len(linesplit)
>           return (COMPLETE,SUCCESS,linesplit[linelen - 1])
>     elif i.find(MASTER) != (-1):
>       try:
>         e = int(port.strip())
>         portval = port.strip()
>         switchval = switchnum.strip()
>         portval = switchval + ":" + portval
>       except ValueError, e:
>         portval = port.strip()
>       ls = buffer.splitlines()
>       found_portval = False
>       for l in ls:
>         words = l.split()
>         if len(words) > 3:
>           if words[2] == portval or words[3] == portval:
>             found_portval = True
>             linesplit = l.split()
>             linelen = len(linesplit)
>             return (COMPLETE, SUCCESS, linesplit[linelen - 3])
>       return (COMPLETE, FAIL, "Incorrect port number")
>   return (NOT_COMPLETE, chr(27), "Status Unknown")
> 
> def do_power_switch(sock, status):
>   result_code = 1
> 
>   while result_code:
>     i, mo, txt = sock.expect(regex_list, TELNET_TIMEOUT)
>     if i == CONTINUE_INDEX: # Capture the rest of the screen...
>       sock.write("\r")
>       ii,moo,txtt = sock.expect(regex_list, TELNET_TIMEOUT)
>       txt = txt + txtt
> 
>     ndbuf = sock.read_eager() # Scoop up remainder
>     if verbose:
>       logit(txt + ndbuf)
> 
>     if status == "off":
>       result_code, response = power_off(txt + ndbuf)
>     elif status == "on":
>       result_code, response = power_on(txt + ndbuf)
>     else:
>       if verbose:
>         logit("Invalid status in do_power_switch() function")
>       sys.stderr.write("Invalid status in do_power_switch() function")
>       sys.exit(1)
> 
>     if result_code:
>       try:
>         sock.write(response)
>       except socket.error, (errno, msg):
>         if verbose:
>           logit("Error #%s" % errno)
>           logit(msg)
>         sys.stderr.write("Error #%s:  %s" % (errno,msg))
>         sys.exit(1)
>       # FIXME: always returns COMPLETE (0)
>     else:
>       try:
>         sock.write(response)
>       except socket.error, (errno, msg):
>         if verbose:
>           logit("Error #%s" % errno)
>           logit(msg)
>         sys.stderr.write("Error #%s:  %s" % (errno,msg))
>         sys.exit(1)
>       return COMPLETE
> 
> 
> def power_switch(buffer, escape, control_outlet, control_outlet2):
>   # If port is not aliased, then outlet control screen will have the word
>   # 'Outlet' in the header. If the name is aliased, it will only have the
>   # alias in the header.
> 
>   outlet_search_str1 = "Outlet " + port.strip() + " ------------"
>   outlet_search_str2 = port.strip() + " ------------"
>   outlet_search_str3 = "Outlet " + switchnum.strip() + ":" + port.strip() + "
> ------"
>   outlet_search_str4 = "        Outlet       : " + port.strip()
>   outlet_search_str5 = "        Outlet Name : " + port.strip()
>   master_search_str1 = "-------- Master"
>   lines = buffer.splitlines()
> 
>   for i in lines:
>     if i.find(CONTROL_CONSOLE) != (-1):
>       return (NOT_COMPLETE,"1\r")
> 
>     elif i.find(DEVICE_MANAGER) != (-1):
>       if switchnum != "":
>         res = switchnum + "\r"
>       else:
>         if FIRMWARE_REV == 2:
>           res = "3\r"
>         elif FIRMWARE_REV == 3:
>           #Changed for bz299191
>           #res = "2\r1\r"
>           res = "2\r"
>         else: #placeholder for future revisions - sheesh
>           res = "3\r"
>       return (NOT_COMPLETE, res)
>       
>     elif (i.find(master_search_str1) != (-1)):
>       return (NOT_COMPLETE, port.strip() + "\r")
>       
>     elif i.find(outlet_search_str1) != (-1) and (switchnum == ""):
>       return (NOT_COMPLETE,"1\r")
> 
>     elif i.find(outlet_search_str2) != (-1) and (switchnum == ""):
>       return (NOT_COMPLETE,"1\r")
>     
>     elif i.find(outlet_search_str3) != (-1):
>       return (NOT_COMPLETE, "1\r")
>     
>     elif i == outlet_search_str4:
>       return (NOT_COMPLETE, "1\r")
>     
>     elif i == outlet_search_str5:
>       return (NOT_COMPLETE, "1\r")
>     
>     elif i.find(OUTLET_MANAGE) != (-1):
>       #Changed for bz299191
>       #return (NOT_COMPLETE, "\r")
>       return (NOT_COMPLETE, "1\r")
> 
>     #elif i.find(OUTLET_CONTROL) != (-1) or i.find(OUTLET_MANAGE) != (-1):
>     elif i.find(OUTLET_CONTROL) != (-1):
>       ls = buffer.splitlines()
>       portval = port.strip()
>       portval = " " + portval + " "
>       found_portval = False
>       i = 0
>       # look for aliased name
>       for l in ls:
>         i = i + 1
>         if l.find(portval) != (-1):
>           found_portval = True
>           linesplit = l.split()
>           outlet_str = linesplit[0]
>           dex = outlet_str.find("-")
>           if dex <= (0):
>             if verbose:
>               logit("Problem identifying outlet\n")
>               logit("Looking for %s in string %s\n" % (portval,outlet_str))
>             sys.stderr.write("Problem identifying outlet\n")
>             sys.stderr.write("Looking for %s in string %s\n" %
> (portval,outlet_str))
>             sys.exit(1)
>           normalized_outlet_str = outlet_str[:dex]
>           return (NOT_COMPLETE, normalized_outlet_str + "\r")
>       # look for portnum
>       portval = " " + port.strip() + "-"
>       i = 0
>       for l in ls:
>         i = i + 1
>         if l.find(portval) != (-1):
>           found_portval = True
>           linesplit = l.split()
>           outlet_str = linesplit[0]
>           dex = outlet_str.find("-")
>           if dex <= (0):
>             if verbose:
>               logit("Problem identifying outlet\n")
>               logit("Looking for %s in string %s\n" % (portval,outlet_str))
>             sys.stderr.write("Problem identifying outlet\n")
>             sys.stderr.write("Looking for %s in string %s\n" %
> (portval,outlet_str))
>             sys.exit(1)
>           normalized_outlet_str = outlet_str[:dex]
>           return (NOT_COMPLETE, normalized_outlet_str + "\r")
>       if found_portval == False:
>         if verbose:
>           logit("Problem identifying outlet\n")
>           logit("Looking for '%s' in string '%s'\n" % (portval, ls))
>         sys.stderr.write("Problem identifying outlet\n")
>         sys.stderr.write("Looking for '%s' in string '%s'\n" % (portval, ls))
>         sys.exit(1)
> 
>     elif i.find(MASTER) != (-1):
>       ls = buffer.splitlines()
>       found_portval = False
>       # look for aliased name
>       portval = port.strip()
>       for l in ls:
>         words = l.strip().split()
>         if len(words) > 3:
>           if '----' not in words[0] and words[3].strip() == portval:
>             outlet_str = words[0]
>             dex = outlet_str.find("-")
>             if dex <= (0):
>               if verbose:
>                 logit("Problem identifying outlet\n")
>                 logit("Looking for %s in string %s\n" % (portval, outlet_str))
>               sys.stderr.write("Problem identifying outlet\n")
>               sys.stderr.write("Looking for %s in string %s\n" % (portval,
> outlet_str))
>               sys.exit(1)
>             normalized_outlet_str = outlet_str[:dex]
>             return (NOT_COMPLETE, (normalized_outlet_str + "\r"))
>       # look for portnum
>       portval = port.strip()
>       portval = switchnum.strip() + ":" + portval + " "
>       i = 0
>       for l in ls:
>         i = i + 1
>         if l.find(portval) != (-1):
>           found_portval = True
>           linesplit = l.split()
>           outlet_str = linesplit[0]
>           dex = outlet_str.find("-")
>           if dex <= (0):
>             if verbose:
>               logit("Problem identifying outlet\n")
>               logit("Looking for %s in string %s\n" % (portval,outlet_str))
>             sys.stderr.write("Problem identifying outlet\n")
>             sys.stderr.write("Looking for %s in string %s\n" %
> (portval,outlet_str))
>             sys.exit(1)
>           normalized_outlet_str = outlet_str[:dex]
>           return (NOT_COMPLETE, (normalized_outlet_str + "\r"))
>       if found_portval == False:
>         if verbose:
>           logit("Problem identifying outlet\n")
>           logit("Looking for '%s' in string '%s'\n" % (portval, ls))
>         sys.stderr.write("Problem identifying outlet\n")
>         sys.stderr.write("Looking for '%s' in string '%s'\n" % (portval, ls))
>         sys.exit(1)
> 
>     elif i.find(CONFIRM) != (-1):
>       return (NOT_COMPLETE,"YES\r")
> 
>     elif i.find(COMMAND_SUCCESS) != (-1):
>       return (COMPLETE,"\r")
> 
>     elif i.find(COMMAND_SUCCESS_2) != (-1):
>       return (COMPLETE,"\r")
> 
>     elif i.find(CONTROL_OUTLET) != (-1):
>       return (NOT_COMPLETE, control_outlet + "\r")
> 
>     elif i.find(CONTROL_OUTLET_2) != (-1):
>       return (NOT_COMPLETE, control_outlet2 + "\r")
>   
>   if (escape == True):
>     return (NOT_COMPLETE, chr(27))
>   else:
>     raise "unknown screen encountered in \n" + str(lines) + "\n"
> 
> def do_power_off(sock):
>   x = do_power_switch(sock, "off")
>   return x
> 
> def power_off(buffer):
>   x = power_switch(buffer, False, "2", "3");
>   return x
> 
> def do_power_on(sock):
>   x = do_power_switch(sock, "on")
>   return x
> 
> def power_on(buffer):
>   x = power_switch(buffer, True, "1", "1");
>   return x
> 
> if __name__ == "__main__":
>   main()
> --
> Linux-cluster mailing list
> Linux-cluster at redhat.com
> https://www.redhat.com/mailman/listinfo/linux-cluster

-- 
Josh Gray
Systems Administrator
NIC, Inc

Email: jgray at nicusa.com
Desk/Mobile: 913-221-1520

"Talent is cheaper than table salt.
 What separates the talented individual
 from the successful one is a lot of hard work."
- Stephen King






More information about the Linux-cluster mailing list