From mboxrd@z Thu Jan 1 00:00:00 1970 From: fabbione@sourceware.org Date: 4 Jun 2008 04:50:32 -0000 Subject: [Cluster-devel] Cluster Project branch, RHEL5, updated. cmirror_1_1_15-111-gc3cf128 Message-ID: <20080604045032.4611.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Cluster Project". http://sources.redhat.com/git/gitweb.cgi?p=cluster.git;a=commitdiff;h=c3cf128201d791f536a92f3512398985a6aa12a9 The branch, RHEL5 has been updated via c3cf128201d791f536a92f3512398985a6aa12a9 (commit) via a3a8a55daf1c8e7e9813be576eaf68879436ad06 (commit) via 621fcef564d112388ffd8ac656ec84e102751826 (commit) via 8112d5e5554e7f19f27626c41807bf5d054af166 (commit) via 2a59dfe16c1c1d94e520b89e33222ae0cf0d2c0e (commit) via d41ae0b5c4e6c1a619d7c7b598348ae30cda9845 (commit) via d84eacae856c803d90efb3d564a153d39e84d1a1 (commit) via 1d4cb0b2984c8585e91ba45187177eb0738369ae (commit) via 929c5526a75292df26c544b7f641b36126f649be (commit) via 845094db57e388565d855bcb3291ce947fdf07ba (commit) via ab787552fc37245d1becc4d4a93f573359c229a2 (commit) via a1ed0b0efe1d71716f2b84f3954995d46846e574 (commit) via b696495fd23e8ae67e96c5e08239fe0d51864a9a (commit) via 397ee775270ae3e0c727da635cbe25c8767c2189 (commit) via 85e6034676bdd6f301b6ac49ecc2cd222990d366 (commit) from e2862bea480908959ebc2bb8c381fc3ddcf721f7 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit c3cf128201d791f536a92f3512398985a6aa12a9 Author: Fabio M. Di Nitto Date: Wed Jun 4 06:49:02 2008 +0200 Revert "fence/agents: New fencings agents" This reverts commit 8f4426c321d291911b24b506acd6df61b5482020. commit a3a8a55daf1c8e7e9813be576eaf68879436ad06 Author: Fabio M. Di Nitto Date: Wed Jun 4 06:49:02 2008 +0200 Revert "[FENCE] Enable new fence agents by default" This reverts commit acf6c1dd6ff2596493f5ffe17753dfc3511a51fe. commit 621fcef564d112388ffd8ac656ec84e102751826 Author: Fabio M. Di Nitto Date: Wed Jun 4 06:49:02 2008 +0200 Revert "[FENCE] SSH support using stdin options" This reverts commit 30231223783b5a375f25ab170c03481f127d6efc. commit 8112d5e5554e7f19f27626c41807bf5d054af166 Author: Fabio M. Di Nitto Date: Wed Jun 4 06:49:02 2008 +0200 Revert "[FENCE] Fix #444615: Support for 24 port APC fencing device" This reverts commit e865a8f5b1c34afe898055e58072dc8d5da59d70. commit 2a59dfe16c1c1d94e520b89e33222ae0cf0d2c0e Author: Fabio M. Di Nitto Date: Wed Jun 4 06:49:02 2008 +0200 Revert "[FENCE] Fix name of the option in fencing library" This reverts commit d26c1409358971a354900433c6a2e56fbfc5a376. commit d41ae0b5c4e6c1a619d7c7b598348ae30cda9845 Author: Fabio M. Di Nitto Date: Wed Jun 4 06:49:02 2008 +0200 Revert "[FENCE] Fix problem with different menu for admin/user for APC" This reverts commit 2c357fe9540c154ac886ee281abb4595f172cda7. commit d84eacae856c803d90efb3d564a153d39e84d1a1 Author: Fabio M. Di Nitto Date: Wed Jun 4 06:49:02 2008 +0200 Revert "[FENCE] Fix typo in name of the exceptions in fencing agents" This reverts commit f1b37c77e11af87ef396ab3b68390c9e25f57b71. commit 1d4cb0b2984c8585e91ba45187177eb0738369ae Author: Fabio M. Di Nitto Date: Wed Jun 4 06:49:02 2008 +0200 Revert "[BUILD] Port fence/agents/lib/Makefile to RHEL5" This reverts commit 1e8f2448af70eb5907b27a9a5f033f0dacc4afc0. commit 929c5526a75292df26c544b7f641b36126f649be Author: Fabio M. Di Nitto Date: Wed Jun 4 06:49:02 2008 +0200 Revert "[BUILD] Fix drac5 generation" This reverts commit 2efffab5f6d58ac8a8ae90f07f8a68f5452e763e. commit 845094db57e388565d855bcb3291ce947fdf07ba Author: Fabio M. Di Nitto Date: Wed Jun 4 06:49:01 2008 +0200 Revert "[FENCE] Fix #248609: SSH support in Bladecenter fencing (ssh)" This reverts commit 1f8a70aafaa307b565335652b530e72ace8176a9. commit ab787552fc37245d1becc4d4a93f573359c229a2 Author: Fabio M. Di Nitto Date: Wed Jun 4 06:49:01 2008 +0200 Revert "[FENCE] Fix #446995: Parse error: Unknown option 'switch=3'" This reverts commit d9538c73f6450c84b65f6d04e0bc7bcdaa2b7c8b. commit a1ed0b0efe1d71716f2b84f3954995d46846e574 Author: Fabio M. Di Nitto Date: Wed Jun 4 06:49:01 2008 +0200 Revert "[BUILD] Fix fence agents generation" This reverts commit 508cfb5fb512c62e618ce20d0b7bf434ac0764ba. commit b696495fd23e8ae67e96c5e08239fe0d51864a9a Author: Fabio M. Di Nitto Date: Wed Jun 4 06:49:01 2008 +0200 Revert "[FENCE] Fix #447378 - fence_apc unable to connect via ssh to APC 7900" This reverts commit 8397bb45819a981bfc112dd8140da753983fdc11. commit 397ee775270ae3e0c727da635cbe25c8767c2189 Author: Fabio M. Di Nitto Date: Wed Jun 4 06:49:01 2008 +0200 Revert "[FENCE]: Fix #448133: New fence agent for HMC/LPAR" This reverts commit 9887ba84c5be5049322e1cbf1fb6b3d91ab5acec. commit 85e6034676bdd6f301b6ac49ecc2cd222990d366 Author: Fabio M. Di Nitto Date: Wed Jun 4 06:49:01 2008 +0200 Revert "[FENCE] Fix #446995: Unknown option" This reverts commit d5a191ac885f866080bc6a1c8646a79df19ae624. ----------------------------------------------------------------------- Summary of changes: fence/agents/Makefile | 3 - fence/agents/apc/fence_apc.py | 999 ++++++++++++++++++++----- fence/agents/bladecenter/Makefile | 10 +- fence/agents/bladecenter/fence_bladecenter.py | 90 --- fence/agents/drac/Makefile | 36 +- fence/agents/drac/fence_drac5.py | 79 -- fence/agents/ilo/Makefile | 8 +- fence/agents/ilo/fence_ilo.py | 77 -- fence/agents/lib/Makefile | 39 - fence/agents/lib/fencing.py.py | 386 ---------- fence/agents/lpar/fence_lpar.py | 97 --- fence/agents/wti/Makefile | 8 +- fence/agents/wti/fence_wti.py | 109 --- 13 files changed, 839 insertions(+), 1102 deletions(-) mode change 100755 => 100644 fence/agents/apc/fence_apc.py delete mode 100755 fence/agents/bladecenter/fence_bladecenter.py delete mode 100755 fence/agents/drac/fence_drac5.py delete mode 100755 fence/agents/ilo/fence_ilo.py delete mode 100644 fence/agents/lib/Makefile delete mode 100644 fence/agents/lib/fencing.py.py delete mode 100755 fence/agents/lpar/fence_lpar.py delete mode 100755 fence/agents/wti/fence_wti.py diff --git a/fence/agents/Makefile b/fence/agents/Makefile index 74e4179..c41aedd 100644 --- a/fence/agents/Makefile +++ b/fence/agents/Makefile @@ -15,7 +15,6 @@ include ${top_srcdir}/make/defines.mk all: - ${MAKE} -C lib all ${MAKE} -C apc all ${MAKE} -C apc_snmp all ${MAKE} -C bladecenter all @@ -42,7 +41,6 @@ all: # ${MAKE} -C zvm all install: all - ${MAKE} -C lib install ${MAKE} -C apc install ${MAKE} -C apc_snmp install ${MAKE} -C bladecenter install @@ -69,7 +67,6 @@ install: all # ${MAKE} -C zvm install clean: - ${MAKE} -C lib clean ${MAKE} -C apc clean ${MAKE} -C apc_snmp clean ${MAKE} -C bladecenter clean diff --git a/fence/agents/apc/fence_apc.py b/fence/agents/apc/fence_apc.py old mode 100755 new mode 100644 index 4ac8be9..29c830f --- a/fence/agents/apc/fence_apc.py +++ b/fence/agents/apc/fence_apc.py @@ -1,200 +1,829 @@ #!/usr/bin/python +############################################################################### +############################################################################### ## -## Copyright (C) 2008 Red Hat, Inc. All Rights Reserved. +## Copyright (C) 2006 Red Hat, Inc. All rights reserved. ## -## The Following Agent Has Been Tested On: +## 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. ## -## 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 getopt, sys +import os +import socket +import time + +from telnetlib import Telnet -import sys, re, pexpect -sys.path.append("/usr/lib/fence") -from fencing import * +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="" +FENCE_RELEASE_NAME="New APC Agent - test release" REDHAT_COPYRIGHT="" -BUILD_DATE="" +BUILD_DATE="September 21, 2006" #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 " ], 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 " ], 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 to cancel :", SHELL_TIMEOUT) - conn.send("YES\r\n") - conn.log_expect(options, "Press 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) +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 to cancel :" +CONTINUE = "Press to continue..." +SCREEN_END = "- Main Menu, - Refresh, - Event Log" +SCREEN_END_2 = "- Back, - Refresh, - 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 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(): - 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 - ###### - conn.sendline("4") - conn.close() + + 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: + res = "2\r1\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): + #return (NOT_COMPLETE, "1\r") + return (NOT_COMPLETE, "\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() + main() diff --git a/fence/agents/bladecenter/Makefile b/fence/agents/bladecenter/Makefile index 34dd24d..944acdd 100644 --- a/fence/agents/bladecenter/Makefile +++ b/fence/agents/bladecenter/Makefile @@ -11,7 +11,7 @@ ############################################################################### ############################################################################### -SOURCE= fence_bladecenter.py +SOURCE= fence_bladecenter.pl TARGET= fence_bladecenter top_srcdir=../.. @@ -19,12 +19,12 @@ include ${top_srcdir}/make/defines.mk all: $(TARGET) -fence_bladecenter: fence_bladecenter.py +fence_bladecenter: fence_bladecenter.pl : > $(TARGET) awk "{print}(\$$1 ~ /#BEGIN_VERSION_GENERATION/){exit 0}" $(SOURCE) >> $(TARGET) - echo "FENCE_RELEASE_NAME=\"${RELEASE}\";" >> $(TARGET) - ${top_srcdir}/scripts/define2var ${top_srcdir}/config/copyright.cf sh REDHAT_COPYRIGHT >> $(TARGET) - echo "BUILD_DATE=\"(built `date`)\";" >> $(TARGET) + echo "\$$FENCE_RELEASE_NAME=\"${RELEASE}\";" >> $(TARGET) + ${top_srcdir}/scripts/define2var ${top_srcdir}/config/copyright.cf perl REDHAT_COPYRIGHT >> $(TARGET) + echo "\$$BUILD_DATE=\"(built `date`)\";" >> $(TARGET) awk -v p=0 "(\$$1 ~ /#END_VERSION_GENERATION/){p = 1} {if(p==1)print}" $(SOURCE) >> $(TARGET) chmod +x $(TARGET) diff --git a/fence/agents/bladecenter/fence_bladecenter.py b/fence/agents/bladecenter/fence_bladecenter.py deleted file mode 100755 index ff7ad67..0000000 --- a/fence/agents/bladecenter/fence_bladecenter.py +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/python - -## -## Copyright (C) 2008 Red Hat, Inc. All Rights Reserved. -## -## The Following Agent Has Been Tested On: -## -## Model Firmware -## +--------------------+---------------------------+ -## (1) Main application BRET85K, rev 16 -## Boot ROM BRBR67D, rev 16 -## Remote Control BRRG67D, rev 16 -## -##### - -import sys, re, pexpect -sys.path.append("/usr/lib/fence") -from fencing import * - -#BEGIN_VERSION_GENERATION -FENCE_RELEASE_NAME="" -REDHAT_COPYRIGHT="" -BUILD_DATE="" -#END_VERSION_GENERATION - -def get_power_status(conn, options): - try: - node_cmd = "system:blade\[" + options["-n"] + "\]>" - - conn.send("env -T system:blade[" + options["-n"] + "]\r\n") - conn.log_expect(options, node_cmd, SHELL_TIMEOUT) - conn.send("power -state\r\n") - conn.log_expect(options, node_cmd, SHELL_TIMEOUT) - status = conn.before.splitlines()[-1] - conn.send("env -T system\r\n") - conn.log_expect(options, options["-c"], SHELL_TIMEOUT) - except pexpect.EOF: - fail(EC_CONNECTION_LOST) - except pexpect.TIMEOUT: - fail(EC_TIMED_OUT) - - return status.lower().strip() - -def set_power_status(conn, options): - action = { - 'on' : "powerup", - 'off': "powerdown" - }[options["-o"]] - - try: - node_cmd = "system:blade\[" + options["-n"] + "\]>" - - conn.send("env -T system:blade[" + options["-n"] + "]\r\n") - conn.log_expect(options, node_cmd, SHELL_TIMEOUT) - conn.send("power -"+options["-o"]+"\r\n") - conn.log_expect(options, node_cmd, SHELL_TIMEOUT) - conn.send("env -T system\r\n") - 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", - "cmd_prompt", "secure", "port", "identity_file" ] - - options = check_input(device_opt, process_input(device_opt)) - - ## - ## Fence agent specific defaults - ##### - if 0 == options.has_key("-c"): - options["-c"] = "system>" - - ## - ## Operate the fencing device - ###### - conn = fence_login(options) - fence_action(conn, options, set_power_status, get_power_status) - - ## - ## Logout from system - ###### - conn.send("exit\r\n") - conn.close() - -if __name__ == "__main__": - main() diff --git a/fence/agents/drac/Makefile b/fence/agents/drac/Makefile index ce84f20..9ea0a7f 100644 --- a/fence/agents/drac/Makefile +++ b/fence/agents/drac/Makefile @@ -11,40 +11,28 @@ ############################################################################### ############################################################################### -SOURCE1= fence_drac.pl -TARGET1= fence_drac - -SOURCE2= fence_drac5.py -TARGET2= fence_drac5 +SOURCE= fence_drac.pl +TARGET= fence_drac top_srcdir=../.. include ${top_srcdir}/make/defines.mk -all: $(TARGET1) $(TARGET2) +all: $(TARGET) fence_drac: fence_drac.pl - : > $(TARGET1) - awk "{print}(\$$1 ~ /#BEGIN_VERSION_GENERATION/){exit 0}" $(SOURCE1) >> $(TARGET1) - echo "\$$FENCE_RELEASE_NAME=\"${RELEASE}\";" >> $(TARGET1) - ${top_srcdir}/scripts/define2var ${top_srcdir}/config/copyright.cf perl REDHAT_COPYRIGHT >> $(TARGET1) - echo "\$$BUILD_DATE=\"(built `date`)\";" >> $(TARGET1) - awk -v p=0 "(\$$1 ~ /#END_VERSION_GENERATION/){p = 1} {if(p==1)print}" $(SOURCE1) >> $(TARGET1) - chmod +x $(TARGET1) - -fence_drac5: fence_drac5.py - : > $(TARGET2) - awk "{print}(\$$1 ~ /#BEGIN_VERSION_GENERATION/){exit 0}" $(SOURCE2) >> $(TARGET2) - echo "FENCE_RELEASE_NAME=\"${RELEASE}\";" >> $(TARGET2) - ${top_srcdir}/scripts/define2var ${top_srcdir}/config/copyright.cf sh REDHAT_COPYRIGHT >> $(TARGET2) - echo "BUILD_DATE=\"(built `date`)\";" >> $(TARGET2) - awk -v p=0 "(\$$1 ~ /#END_VERSION_GENERATION/){p = 1} {if(p==1)print}" $(SOURCE2) >> $(TARGET2) - chmod +x $(TARGET2) + : > $(TARGET) + awk "{print}(\$$1 ~ /#BEGIN_VERSION_GENERATION/){exit 0}" $(SOURCE) >> $(TARGET) + echo "\$$FENCE_RELEASE_NAME=\"${RELEASE}\";" >> $(TARGET) + ${top_srcdir}/scripts/define2var ${top_srcdir}/config/copyright.cf perl REDHAT_COPYRIGHT >> $(TARGET) + echo "\$$BUILD_DATE=\"(built `date`)\";" >> $(TARGET) + awk -v p=0 "(\$$1 ~ /#END_VERSION_GENERATION/){p = 1} {if(p==1)print}" $(SOURCE) >> $(TARGET) + chmod +x $(TARGET) install: all if [ ! -d ${sbindir} ]; then \ install -d ${sbindir}; \ fi - install -m755 ${TARGET1} ${TARGET2} ${sbindir} + install -m755 ${TARGET} ${sbindir} clean: - rm -f $(TARGET1) $(TARGET2) + rm -f $(TARGET) diff --git a/fence/agents/drac/fence_drac5.py b/fence/agents/drac/fence_drac5.py deleted file mode 100755 index 12cd5f7..0000000 --- a/fence/agents/drac/fence_drac5.py +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/python - -## -## Copyright (C) 2008 Red Hat, Inc. All Rights Reserved. -## -## The Following Agent Has Been Tested On: -## -## DRAC Version Firmware -## +-----------------+---------------------------+ -## DRAC 5 1.0 (Build 06.05.12) -## DRAC 5 1.21 (Build 07.05.04) -## -## @note: drac_version, modulename were removed -##### - -import sys, re, pexpect -sys.path.append("/usr/lib/fence") -from fencing import * - -#BEGIN_VERSION_GENERATION -FENCE_RELEASE_NAME="" -REDHAT_COPYRIGHT="" -BUILD_DATE="" -#END_VERSION_GENERATION - -def get_power_status(conn, options): - try: - conn.sendline("racadm serveraction powerstatus") - 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("Server power status: (.*)", re.IGNORECASE).search(conn.before).group(1) - return status.lower().strip() - -def set_power_status(conn, options): - action = { - 'on' : "powerup", - 'off': "powerdown" - }[options["-o"]] - - try: - conn.sendline("racadm serveraction " + action) - conn.log_expect(options, options["-c"], POWER_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", - "cmd_prompt", "secure", - "drac_version", "module_name" ] - - options = check_input(device_opt, process_input(device_opt)) - - ## - ## Fence agent specific defaults - ##### - if 0 == options.has_key("-c"): - options["-c"] = "\$" - - ## - ## Operate the fencing device - ###### - conn = fence_login(options) - fence_action(conn, options, set_power_status, get_power_status) - - ## - ## Logout from system - ###### - conn.sendline("exit") - conn.close() - -if __name__ == "__main__": - main() diff --git a/fence/agents/ilo/Makefile b/fence/agents/ilo/Makefile index 089266e..4942d3b 100644 --- a/fence/agents/ilo/Makefile +++ b/fence/agents/ilo/Makefile @@ -11,7 +11,7 @@ ############################################################################### ############################################################################### -SOURCE= fence_ilo.py +SOURCE= fence_ilo.pl TARGET= fence_ilo top_srcdir=../.. @@ -22,9 +22,9 @@ all: $(TARGET) fence_ilo: $(SOURCE) : > $(TARGET) awk "{print}(\$$1 ~ /#BEGIN_VERSION_GENERATION/){exit 0}" $(SOURCE) >> $(TARGET) - echo "FENCE_RELEASE_NAME=\"${RELEASE}\";" >> $(TARGET) - ${top_srcdir}/scripts/define2var ${top_srcdir}/config/copyright.cf sh REDHAT_COPYRIGHT >> $(TARGET) - echo "BUILD_DATE=\"(built `date`)\";" >> $(TARGET) + echo "\$$FENCE_RELEASE_NAME=\"${RELEASE}\";" >> $(TARGET) + ${top_srcdir}/scripts/define2var ${top_srcdir}/config/copyright.cf perl REDHAT_COPYRIGHT >> $(TARGET) + echo "\$$BUILD_DATE=\"(built `date`)\";" >> $(TARGET) awk -v p=0 "(\$$1 ~ /#END_VERSION_GENERATION/){p = 1} {if(p==1)print}" $(SOURCE) >> $(TARGET) chmod +x $(TARGET) diff --git a/fence/agents/ilo/fence_ilo.py b/fence/agents/ilo/fence_ilo.py deleted file mode 100755 index 740add5..0000000 --- a/fence/agents/ilo/fence_ilo.py +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/python - -## -## Copyright (C) 2008 Red Hat, Inc. All Rights Reserved. -## -## The Following Agent Has Been Tested On: -## -## iLO Version -## +---------------------------------------------+ -## iLO Advanced 1.91 -## -## @note: We can't use conn.sendline because we need to send CR/LF -##### - -import sys, re, pexpect -sys.path.append("/usr/lib/fence") -from fencing import * - -#BEGIN_VERSION_GENERATION -FENCE_RELEASE_NAME="" -REDHAT_COPYRIGHT="" -BUILD_DATE="" -#END_VERSION_GENERATION - -def get_power_status(conn, options): - try: - conn.send("POWER\r\n") - 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("server power is currently: (.*)", re.IGNORECASE).search(conn.before).group(1) - return status.lower().strip() - -def set_power_status(conn, options): - action = { - 'on' : "powerup", - 'off': "powerdown" - }[options["-o"]] - - try: - conn.send("power " + options["-o"] + "\r\n") - conn.log_expect(options, options["-c"], POWER_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", "ribcl" ] - - options = check_input(device_opt, process_input(device_opt)) - - ## - ## Fence agent specific defaults - ##### - if 0 == options.has_key("-c"): - options["-c"] = "hpiLO->" - - ## - ## Operate the fencing device - #### - conn = fence_login(options) - fence_action(conn, options, set_power_status, get_power_status) - - ## - ## Logout from system - ###### - conn.send("quit\r\n") - conn.close() - -if __name__ == "__main__": - main() diff --git a/fence/agents/lib/Makefile b/fence/agents/lib/Makefile deleted file mode 100644 index 47dca9d..0000000 --- a/fence/agents/lib/Makefile +++ /dev/null @@ -1,39 +0,0 @@ -############################################################################### -############################################################################### -## -## Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. -## Copyright (C) 2004 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. -## -############################################################################### -############################################################################### - -SOURCE= fencing.py.py -TARGET= fencing.py - -top_srcdir=../.. -include ${top_srcdir}/make/defines.mk - -all: $(TARGET) - -$(TARGET): $(SOURCE) - : > $(TARGET) - awk "{print}(\$$1 ~ /#BEGIN_VERSION_GENERATION/){exit 0}" $(SOURCE) >> $(TARGET) - echo "FENCE_RELEASE_NAME=\"${RELEASE}\";" >> $(TARGET) - ${top_srcdir}/scripts/define2var ${top_srcdir}/config/copyright.cf sh REDHAT_COPYRIGHT >> $(TARGET) - echo "BUILD_DATE=\"(built `date`)\";" >> $(TARGET) - awk -v p=0 "(\$$1 ~ /#END_VERSION_GENERATION/){p = 1} {if(p==1)print}" $(SOURCE) >> $(TARGET) - chmod +x $(TARGET) - - -install: all - if [ ! -d ${DESTDIR}/usr/lib/fence ]; then \ - install -d ${DESTDIR}/usr/lib/fence; \ - fi - install -m755 ${TARGET} ${DESTDIR}/usr/lib/fence - -clean: - rm -f $(TARGET) diff --git a/fence/agents/lib/fencing.py.py b/fence/agents/lib/fencing.py.py deleted file mode 100644 index 663ff43..0000000 --- a/fence/agents/lib/fencing.py.py +++ /dev/null @@ -1,386 +0,0 @@ -#!/usr/bin/python - -## -## Copyright (C) 2008 Red Hat, Inc. All Rights Reserved. -## -##### -import sys, getopt, time, os -import pexpect, re -import telnetlib - -## do not add code here. -#BEGIN_VERSION_GENERATION -FENCE_RELEASE_NAME="" -REDHAT_COPYRIGHT="" -BUILD_DATE="" -#END_VERSION_GENERATION - -POWER_TIMEOUT = 20 -SHELL_TIMEOUT = 3 -LOGIN_TIMEOUT = 5 - -LOG_MODE_VERBOSE = 100 -LOG_MODE_QUIET = 0 - -EC_BAD_ARGS = 2 -EC_LOGIN_DENIED = 3 -EC_CONNECTION_LOST = 4 -EC_TIMED_OUT = 5 -EC_WAITING_ON = 6 -EC_WAITING_OFF = 7 - -all_opt = { - "help" : { - "getopt" : "h", - "help" : "-h Display this help and exit", - "order" : 54 }, - "version" : { - "getopt" : "V", - "help" : "-V Output version information and exit", - "order" : 53 }, - "quiet" : { - "getopt" : "q", - "help" : "-q Quiet mode", - "order" : 50 }, - "verbose" : { - "getopt" : "v", - "help" : "-v Verbose mode", - "order" : 51 }, - "debug" : { - "getopt" : "D:", - "help" : "-D Debugging to output file", - "order" : 52 }, - "agent" : { - "getopt" : "", - "help" : "", - "order" : 1 }, - "action" : { - "getopt" : "o:", - "help" : "-o Action: status, reboot (default), off or on", - "order" : 1 }, - "ipaddr" : { - "getopt" : "a:", - "help" : "-a IP address or hostname of fencing device", - "order" : 1 }, - "login" : { - "getopt" : "l:", - "help" : "-l Login name", - "order" : 1 }, - "no_login" : { - "getopt" : "", - "help" : "", - "order" : 1 }, - "passwd" : { - "getopt" : "p:", - "help" : "-p Login password or passphrase", - "order" : 1 }, - "passwd_script" : { - "getopt" : "S:", - "help" : "-S