From mboxrd@z Thu Jan 1 00:00:00 1970 From: kupcevic@sourceware.org Date: 14 Feb 2007 17:03:03 -0000 Subject: [Cluster-devel] cluster/fence/agents apc/fence_apc.py baytech/ ... Message-ID: <20070214170303.22834.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 CVSROOT: /cvs/cluster Module name: cluster Branch: RHEL4 Changes by: kupcevic at sourceware.org 2007-02-14 17:03:01 Modified files: fence/agents/apc: fence_apc.py fence/agents/baytech: fence_baytech.py fence/agents/rsa: fence_rsa.py fence/agents/rsb: fence_rsb.py Log message: Support "passwd_script" parameter in python fence agents. If both "passwd" and "passwd_script" parameters are specified, "passwd_script" will be used first (if it fails, fencing will be attempted using "passwd" parameter). Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/fence/agents/apc/fence_apc.py.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.1.2.1&r2=1.1.2.2 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/fence/agents/baytech/fence_baytech.py.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.1.2.1&r2=1.1.2.2 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/fence/agents/rsa/fence_rsa.py.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.1.2.4&r2=1.1.2.5 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/fence/agents/rsb/fence_rsb.py.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.1.6.1&r2=1.1.6.2 --- cluster/fence/agents/apc/fence_apc.py 2007/01/31 18:57:29 1.1.2.1 +++ cluster/fence/agents/apc/fence_apc.py 2007/02/14 17:03:01 1.1.2.2 @@ -47,6 +47,7 @@ address = "" login = "" passwd = "" +passwd_script = "" port = "" switchnum = "" action = POWER_REBOOT #default action @@ -88,6 +89,7 @@ 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" @@ -101,16 +103,16 @@ def main(): - global address, login, passwd, port, action, verbose, logfile, switchnum + 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:vV", ["help", "output="]) + 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 @@ -123,6 +125,8 @@ login = a if o == "-p": passwd = a + if o == "-S": + passwd_script = a if o == "-n": dex = a.find(":") if dex == (-1): @@ -144,16 +148,17 @@ sys.exit() if o == "-a": address = a - if address == "" or login == "" or passwd == "" or port == "": + 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("=") - params[val[0]] = val[1] + if len(val) == 2: + params[val[0].strip()] = val[1].strip() try: address = params["ipaddr"] @@ -166,9 +171,14 @@ 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") + 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"] @@ -195,9 +205,67 @@ 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 --- cluster/fence/agents/baytech/Attic/fence_baytech.py 2006/11/28 15:39:29 1.1.2.1 +++ cluster/fence/agents/baytech/Attic/fence_baytech.py 2007/02/14 17:03:01 1.1.2.2 @@ -35,18 +35,19 @@ #END_VERSION_GENERATION def usage(): - print "Usage:\n" - print "fence_baytech [options]\n" - print "Options:\n" - print " -a ip or hostname of baytech switch\n" - print " -h print out help\n" - print " -l [login] login name\n" - print " -p [password] password\n" - print " -o [action] Reboot (default), Off, or On\n" - print " -n [outlet] Switch outlet number to control\n" - print " -v Verbose Verbose mode\n" - print " -V Print Version, then exit\n" - + print "Usage:" + print "fence_baytech [options]" + print "Options:" + print " -a ip or hostname of baytech switch" + print " -h print out help" + print " -l [login] login name" + print " -p [password] password" + print " -S [path] script to run to retrieve password" + print " -o [action] Reboot (default), Off, or On" + print " -n [outlet] Switch outlet number to control" + print " -v Verbose Verbose mode" + print " -V Print Version, then exit" + sys.exit (0) def version(): @@ -64,10 +65,11 @@ address = "" login = "" passwd = "" + passwd_script = "" port_num = "" action = POWER_REBOOT #default action verbose = False - + standard_err = 2 #set up regex list @@ -81,13 +83,13 @@ if len(sys.argv) > 1: try: - opts, args = getopt.getopt(sys.argv[1:], "a:hl:o:n:p:vV", ["help", "output="]) + 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 @@ -95,13 +97,15 @@ version() if o in ("-h", "--help"): usage() - sys.exit() + sys.exit(0) if o == "-l": login = a if o == "-n": port_num = a if o == "-p": passwd = a + if o == "-S": + passwd_script = a if o == "-o": if a == "Off" or a == "OFF" or a == "off": action = POWER_OFF @@ -111,40 +115,50 @@ action = POWER_REBOOT else: usage() - sys.exit() + sys.exit(1) if o == "-a": address = a - if address == "" or login == "" or passwd == "" or port_num == "": + if address == "" or login == "" or (passwd == "" and passwd_script == "") or port_num == "": usage() - sys.exit() + sys.exit(1) else: #Take args from stdin... params = {} #place params in dict for line in sys.stdin: val = line.split("=") - params[val[0]] = val[1] - + if len(val) == 2: + params[val[0].strip()] = val[1].strip() + try: address = params["ipaddr"] except KeyError, e: os.write(standard_err, "FENCE: Missing ipaddr param for fence_baytech...exiting") + sys.exit(1) + try: login = params["login"] except KeyError, e: os.write(standard_err, "FENCE: Missing login param for fence_baytech...exiting") - + sys.exit(1) + try: port_num = params["port"] except KeyError, e: os.write(standard_err, "FENCE: Missing port param for fence_baytech...exiting") - + sys.exit(1) + try: - passwd = params["passwd"] + 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 KeyError, e: os.write(standard_err, "FENCE: Missing passwd param for fence_baytech...exiting") - - + sys.exit(1) + try: a = params["option"] if a == "Off" or a == "OFF" or a == "off": @@ -157,7 +171,65 @@ 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 + + + ##Time to open telnet session and log in. try: sock = Telnet(address.strip()) --- cluster/fence/agents/rsa/fence_rsa.py 2007/01/31 19:55:47 1.1.2.4 +++ cluster/fence/agents/rsa/fence_rsa.py 2007/02/14 17:03:01 1.1.2.5 @@ -32,17 +32,18 @@ #END_VERSION_GENERATION def usage(): - print "Usage:\n" - print "fence_rsa [options]\n" - print "Options:\n" - print " -a ip or hostname of rsa II port\n" - print " -h print out help\n" - print " -l [login] login name\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" - + print "Usage:" + print "fence_rsa [options]" + print "Options:" + print " -a ip or hostname of rsa II port" + print " -h print out help" + print " -l [login] login name" + 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" + print " -V Print Version, then exit" + sys.exit (0) def version(): @@ -60,6 +61,7 @@ address = "" login = "" passwd = "" + passwd_script = "" action = POWER_REBOOT #default action verbose = False @@ -80,7 +82,7 @@ if len(sys.argv) > 1: try: - opts, args = getopt.getopt(sys.argv[1:], "a:hl:o:p:vV", ["help", "output="]) + opts, args = getopt.getopt(sys.argv[1:], "a:hl:o:p:S:vV", ["help", "output="]) except getopt.GetoptError: #print help info and quit usage() @@ -94,11 +96,13 @@ version() if o in ("-h", "--help"): usage() - sys.exit() + sys.exit(0) if o == "-l": login = a if o == "-p": passwd = a + if o == "-S": + passwd_script = a if o == "-o": if a == "Off" or a == "OFF" or a == "off": action = POWER_OFF @@ -110,35 +114,44 @@ action = POWER_REBOOT else: usage() - sys.exit() + sys.exit(1) if o == "-a": address = a - if address == "" or login == "" or passwd == "": + if address == "" or login == "" or (passwd == "" and passwd_script == ""): usage() - sys.exit() + sys.exit(1) else: #Take args from stdin... params = {} #place params in dict for line in sys.stdin: val = line.split("=") - params[val[0]] = val[1] - + if len(val) == 2: + params[val[0].strip()] = val[1].strip() + try: address = params["ipaddr"] except KeyError, e: os.write(standard_err, "FENCE: Missing ipaddr param for fence_rsa...exiting") + sys.exit(1) + try: login = params["login"] except KeyError, e: os.write(standard_err, "FENCE: Missing login param for fence_rsa...exiting") - + sys.exit(1) + try: - passwd = params["passwd"] + 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 KeyError, e: os.write(standard_err, "FENCE: Missing passwd param for fence_rsa...exiting") - - + sys.exit(1) + try: a = params["option"] if a == "Off" or a == "OFF" or a == "off": @@ -149,9 +162,67 @@ 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 + + + ##Time to open telnet session and log in. try: sock = Telnet(address.strip()) --- cluster/fence/agents/rsb/fence_rsb.py 2006/11/28 14:04:27 1.1.6.1 +++ cluster/fence/agents/rsb/fence_rsb.py 2007/02/14 17:03:01 1.1.6.2 @@ -33,17 +33,18 @@ #END_VERSION_GENERATION def usage(): - print "Usage:\n" - print "fence_rsb [options]\n" - print "Options:\n" - print " -a 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" + print "Usage:" + print "fence_rsb [options]" + print "Options:" + print " -a ip or hostname of rsb" + print " -h print out help" + print " -l [login] login name" + print " -n [telnet port] telnet 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" + print " -V Print Version, then exit" sys.exit (0) @@ -64,6 +65,7 @@ address = "" login = "" passwd = "" + passwd_script = "" action = POWER_REBOOT #default action telnet_port = 3172 verbose = False @@ -93,7 +95,7 @@ if len(sys.argv) > 1: try: - opts, args = getopt.getopt(sys.argv[1:], "a:hl:n:o:p:vV", ["help", "output="]) + opts, args = getopt.getopt(sys.argv[1:], "a:hl:n:o:p:S:vV", ["help", "output="]) except getopt.GetoptError: #print help info and quit usage() @@ -106,13 +108,15 @@ version() if o in ("-h", "--help"): usage() - sys.exit() + sys.exit(0) if o == "-l": login = a if o == "-n": telnet_port = a if o == "-p": passwd = a + if o == "-S": + passwd_script = a if o == "-o": if a == "Off" or a == "OFF" or a == "off": action = POWER_OFF @@ -124,34 +128,44 @@ action = POWER_REBOOT else: usage() - sys.exit() + sys.exit(1) if o == "-a": address = a - if address == "" or login == "" or passwd == "": + if address == "" or login == "" or (passwd == "" and passwd_script == ""): usage() - sys.exit() + sys.exit(1) else: #Take args from stdin... params = {} #place params in dict for line in sys.stdin: val = line.split("=") - params[val[0]] = val[1] + if len(val) == 2: + params[val[0].strip()] = val[1].strip() try: address = params["ipaddr"] except KeyError, e: os.write(standard_err, "FENCE: Missing ipaddr param for fence_rsb...exiting") + sys.exit(1) + try: login = params["login"] except KeyError, e: os.write(standard_err, "FENCE: Missing login param for fence_rsb...exiting") - + sys.exit(1) + try: - passwd = params["passwd"] + 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 KeyError, e: os.write(standard_err, "FENCE: Missing passwd param for fence_rsb...exiting") - + sys.exit(1) + try: telnet_port = params["telnet_port"] except KeyError, e: @@ -169,7 +183,65 @@ 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 + + + try: telnet_port = int(telnet_port) except: