[Cluster-devel] cluster/fence/agents/rsb fence_rsb.py Makefile
jparsons at sourceware.org
jparsons at sourceware.org
Tue Nov 28 14:04:28 UTC 2006
CVSROOT: /cvs/cluster
Module name: cluster
Branch: RHEL4
Changes by: jparsons at sourceware.org 2006-11-28 14:04:27
Added files:
fence/agents/rsb: fence_rsb.py Makefile
Log message:
rsb agent and Makefile
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/fence/agents/rsb/fence_rsb.py.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=NONE&r2=1.1.6.1
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/fence/agents/rsb/Makefile.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=NONE&r2=1.2.6.1
/cvs/cluster/cluster/fence/agents/rsb/fence_rsb.py,v --> standard output
revision 1.1.6.1
--- cluster/fence/agents/rsb/fence_rsb.py
+++ - 2006-11-28 14:04:28.156489000 +0000
@@ -0,0 +1,315 @@
+#!/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=30 #How long to wait for a response from a telnet try
+MAX_TRIES = 20
+
+# 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=""
+REDHAT_COPYRIGHT=""
+BUILD_DATE=""
+#END_VERSION_GENERATION
+
+def usage():
+ print "Usage:\n"
+ print "fence_rsb [options]\n"
+ print "Options:\n"
+ print " -a <ipaddress> ip or hostname of rsb\n"
+ print " -h print out help\n"
+ print " -l [login] login name\n"
+ print " -n [telnet port] telnet port\n"
+ print " -p [password] password\n"
+ print " -o [action] Reboot (default), Off, On, or Status\n"
+ print " -v Verbose Verbose mode\n"
+ print " -V Print Version, then exit\n"
+
+ sys.exit (0)
+
+def version():
+ print "fence_rsb %s %s\n" % (FENCE_RELEASE_NAME, BUILD_DATE)
+ print "%s\n" % REDHAT_COPYRIGHT
+ sys.exit(0)
+
+def main():
+ depth = 0
+ POWER_OFF = 0
+ POWER_ON = 1
+ POWER_STATUS = 2
+ POWER_REBOOT = 3
+
+ power_command_issued = 0
+
+ address = ""
+ login = ""
+ passwd = ""
+ action = POWER_REBOOT #default action
+ telnet_port = 3172
+ verbose = False
+ power_state = None
+
+ standard_err = 2
+
+ #set up regex list
+ USERNAME = 0
+ PASSWORD = 1
+ PROMPT = 2
+ STATE = 3
+ ERROR = 4
+ CONT = 5
+ CONFIRM = 6
+ DONE = 7
+
+ regex_list = list()
+ regex_list.append("user name\s*:")
+ regex_list.append("pass phrase\s*:")
+ regex_list.append("[Ee]nter\s+[Ss]election[^\r\n]*:")
+ regex_list.append("[pP]ower Status:")
+ regex_list.append("[Ee]rror\s*:")
+ regex_list.append("[Pp]ress any key to continue")
+ regex_list.append("really want to")
+ regex_list.append("CLOSING TELNET CONNECTION")
+
+ if len(sys.argv) > 1:
+ try:
+ opts, args = getopt.getopt(sys.argv[1:], "a:hl:n:o:p: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 == "-n":
+ telnet_port = a
+ if o == "-p":
+ passwd = a
+ 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 == "":
+ usage()
+ sys.exit()
+
+ else: #Take args from stdin...
+ params = {}
+ #place params in dict
+ for line in sys.stdin:
+ val = line.split("=")
+ params[val[0]] = val[1]
+
+ try:
+ address = params["ipaddr"]
+ except KeyError, e:
+ os.write(standard_err, "FENCE: Missing ipaddr param for fence_rsb...exiting")
+ try:
+ login = params["login"]
+ except KeyError, e:
+ os.write(standard_err, "FENCE: Missing login param for fence_rsb...exiting")
+
+ try:
+ passwd = params["passwd"]
+ except KeyError, e:
+ os.write(standard_err, "FENCE: Missing passwd param for fence_rsb...exiting")
+
+ try:
+ telnet_port = params["telnet_port"]
+ 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
+
+ try:
+ telnet_port = int(telnet_port)
+ except:
+ os.write(standard_err, ("FENCE: Invalid telnet port: %s\n" % telnet_port))
+ sys.exit(1)
+
+ ##Time to open telnet session and log in.
+ try:
+ sock = Telnet(address.strip(), telnet_port)
+ except socket.error, (errno, msg):
+ my_msg = "FENCE: A problem was encountered opening a telnet session with " + address
+ os.write(standard_err, my_msg)
+ os.write(standard_err, ("FENCE: Error number: %d -- Message: %s\n" % (errno, msg)))
+ os.write(standard_err, "Firewall issue? Correct address?\n")
+ sys.exit(1)
+
+ if verbose:
+ #sock.set_debuglevel(10000)
+ print "socket open to %s %d\n" % (address, telnet_port)
+
+ tries = MAX_TRIES
+ while 1:
+ i, mo, txt = sock.expect(regex_list, TELNET_TIMEOUT)
+ if i == ERROR:
+ os.write(standard_err,("FENCE: An error was encountered when communicating with the rsb device at %s" % address))
+ buf = sock.read_eager()
+ os.write(standard_err,("FENCE: The error message is - %s" % txt + " " + buf))
+ sock.close()
+ sys.exit(1)
+
+ buf = sock.read_eager()
+ if i == USERNAME:
+ if verbose:
+ print "Sending login: %s\n" % login
+ sock.write(login + "\r")
+
+ elif i == PASSWORD:
+ if verbose:
+ print "Sending password: %s\n" % passwd
+ sock.write(passwd + "\r")
+
+ elif i == CONT:
+ if verbose:
+ print "Sending continue char..."
+ sock.write("\r")
+ time.sleep(2)
+
+ elif i == CONFIRM:
+ if verbose:
+ print "Confirming..."
+ sock.write("yes\r")
+
+ elif i == PROMPT:
+ if verbose:
+ print "Evaluating prompt...\n"
+
+ if depth == 0:
+ sock.write("2\r")
+ depth += 1
+ elif depth == 1:
+ if action == POWER_OFF or action == POWER_REBOOT:
+ if power_command_issued == 0:
+ if verbose:
+ print "Sending power off %s" % address
+ sock.write("1\r")
+ power_command_issued += 1
+ time.sleep(2)
+ elif power_command_issued and power_state == 0:
+ if verbose:
+ print "Power off was successful"
+ if action == POWER_OFF:
+ depth += 1
+ sock.write("0\r")
+ else:
+ action = POWER_ON
+ power_command_issued = 0
+ sock.write("\r")
+ elif tries > 0:
+ if verbose:
+ print "Waiting for power off to complete"
+ tries -= 1
+ sock.write("\r")
+ time.sleep(2)
+ else:
+ os.write(standard_err, "FENCE: Unable to power off server")
+ depth += 1
+ sock.write("0\r")
+
+ elif action == POWER_ON:
+ if power_command_issued == 0:
+ if verbose:
+ print "Sending power on %s" % address
+ sock.write("4\r")
+ power_command_issued += 1
+ time.sleep(2)
+ elif power_command_issued and power_state == 1:
+ if verbose:
+ print "Power on was successful"
+ depth += 1
+ sock.write("0\r")
+ elif tries > 0:
+ if verbose:
+ print "Waiting for power on to complete"
+ tries -= 1
+ sock.write("\r")
+ time.sleep(2)
+ else:
+ os.write(standard_err, "FENCE: Unable to power on server")
+ depth += 1
+ sock.write("0\r")
+ else:
+ sock.write("0\r")
+
+ elif i == STATE:
+ if buf.find(" On") != (-1):
+ power_state = 1
+ elif buf.find(" Off") != (-1):
+ power_state = 0
+ else:
+ power_state = None
+
+ if action == POWER_STATUS:
+ if verbose:
+ print "Determining power state..."
+ if power_state == 1:
+ print "Server is On"
+ elif power_state == 0:
+ print "Server is Off"
+ else:
+ os.write(standard_err, ("FENCE: Cannot determine power state: %s" % buf))
+ sys.exit(1)
+ depth = 2
+
+ elif i == DONE:
+ break
+
+ else:
+ sock.write("\r")
+
+ sock.close()
+
+if __name__ == "__main__":
+ main()
/cvs/cluster/cluster/fence/agents/rsb/Makefile,v --> standard output
revision 1.2.6.1
--- cluster/fence/agents/rsb/Makefile
+++ - 2006-11-28 14:04:28.244452000 +0000
@@ -0,0 +1,35 @@
+###############################################################################
+###############################################################################
+##
+## 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= fence_rsb.py
+TARGET= fence_rsb
+
+top_srcdir=../..
+include ${top_srcdir}/make/defines.mk
+
+all: $(TARGET)
+
+fence_rsb: fence_rsb.py
+ : > $(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)
+
+copytobin: ${TARGET}
+ cp ${TARGET} ${top_srcdir}/bin/${TARGET}
+
+clean:
+ rm -f $(TARGET)
More information about the Cluster-devel
mailing list