From bd170f06917930694790c2a69281cb6110902293 Mon Sep 17 00:00:00 2001 From: Marek 'marx' Grac <mgrac@redhat.com> Date: Tue, 20 Apr 2010 19:07:32 +0200 Subject: [PATCH] fencing: Correct return codes for operation 'status' Fixes all perl + python based fence agents (except fence_scsi) Resolves: rhbz#583034 (partially) --- fence/agents/apc/fence_apc.py | 4 +++- fence/agents/apc_snmp/fence_apc_snmp.py | 3 ++- fence/agents/baytech/fence_baytech.pl | 8 +++++++- fence/agents/bladecenter/fence_bladecenter.py | 4 +++- fence/agents/bullpap/fence_bullpap.pl | 6 +++++- fence/agents/cisco_mds/fence_cisco_mds.py | 4 +++- fence/agents/drac/fence_drac.pl | 17 ++++++++++++----- fence/agents/drac/fence_drac5.py | 6 ++++-- fence/agents/eps/fence_eps.py | 4 +++- fence/agents/ibmblade/fence_ibmblade.py | 3 ++- fence/agents/ilo/fence_ilo.py | 4 +++- fence/agents/ilo_mp/fence_ilo_mp.py | 4 +++- fence/agents/lib/fencing.py.py | 10 ++++++++-- fence/agents/lpar/fence_lpar.py | 3 ++- fence/agents/rsa/fence_rsa.py | 6 ++++-- fence/agents/rsb/fence_rsb.py | 8 ++++++++ fence/agents/sanbox2/fence_sanbox2.py | 4 +++- fence/agents/virsh/fence_virsh.py | 3 ++- fence/agents/vmware/fence_vmware.py | 3 ++- fence/agents/wti/fence_wti.py | 4 +++- 20 files changed, 82 insertions(+), 26 deletions(-) diff --git a/fence/agents/apc/fence_apc.py b/fence/agents/apc/fence_apc.py index 3a8c194..2985072 100755 --- a/fence/agents/apc/fence_apc.py +++ b/fence/agents/apc/fence_apc.py @@ -213,7 +213,7 @@ def main(): ## Operate the fencing device #### conn = fence_login(options) - fence_action(conn, options, set_power_status, get_power_status, get_power_status) + result = fence_action(conn, options, set_power_status, get_power_status, get_power_status) ## ## Logout from system @@ -229,6 +229,8 @@ def main(): pass except pexpect.ExceptionPexpect: pass + + sys.exit(result) if __name__ == "__main__": main() diff --git a/fence/agents/apc_snmp/fence_apc_snmp.py b/fence/agents/apc_snmp/fence_apc_snmp.py index 943902c..d2d67b2 100755 --- a/fence/agents/apc_snmp/fence_apc_snmp.py +++ b/fence/agents/apc_snmp/fence_apc_snmp.py @@ -192,7 +192,8 @@ def main(): show_docs(options) # Operate the fencing device - fence_action(FencingSnmp(options), options, set_power_status, get_power_status, get_outlets_status) + result = fence_action(FencingSnmp(options), options, set_power_status, get_power_status, get_outlets_status) + sys.exit(result) if __name__ == "__main__": main() diff --git a/fence/agents/baytech/fence_baytech.pl b/fence/agents/baytech/fence_baytech.pl index 39d91da..1549430 100755 --- a/fence/agents/baytech/fence_baytech.pl +++ b/fence/agents/baytech/fence_baytech.pl @@ -583,7 +583,13 @@ elsif ($action =~ /status/i) { print "Outlet '$bt_name' is $bt_state and is ". (($bt_locked eq "")?"not ":"")."Locked\n"; - $exit=0; + + if ($bt_state =~ /on/i) + { + $exit=0; + } else { + $exit=2; + } } elsif ($bt_locked ne "") { diff --git a/fence/agents/bladecenter/fence_bladecenter.py b/fence/agents/bladecenter/fence_bladecenter.py index b5b2238..0cc189c 100755 --- a/fence/agents/bladecenter/fence_bladecenter.py +++ b/fence/agents/bladecenter/fence_bladecenter.py @@ -111,7 +111,7 @@ def main(): ## Operate the fencing device ###### conn = fence_login(options) - fence_action(conn, options, set_power_status, get_power_status, get_blades_list) + result = fence_action(conn, options, set_power_status, get_power_status, get_blades_list) ## ## Logout from system @@ -123,6 +123,8 @@ def main(): pass except pexpect.ExceptionPexpect: pass + + sys.exit(result) if __name__ == "__main__": main() diff --git a/fence/agents/bullpap/fence_bullpap.pl b/fence/agents/bullpap/fence_bullpap.pl index a53c8e1..a63b19c 100755 --- a/fence/agents/bullpap/fence_bullpap.pl +++ b/fence/agents/bullpap/fence_bullpap.pl @@ -309,6 +309,7 @@ elsif (/^status$/i) { $action = "status"; } # $success=0; $_ = $action; +my $exit_code=0; if (/(on|off)/) { my $timeout = 120; # 120 = max of (60, 120). Max timeout for "on" @@ -353,6 +354,9 @@ elsif (/status/) get_power_state $host,$domain,$login,$passwd; $state=$_; $success = 1 if defined $state; + if ($state eq "OFF") { + $exit_code = 2; + } } else { @@ -363,7 +367,7 @@ if ($success) { print "success: domain $domain $action". ((defined $state) ? ": $state":"") ."\n" unless defined $quiet; - exit 0; + exit $exit_code; } else { diff --git a/fence/agents/cisco_mds/fence_cisco_mds.py b/fence/agents/cisco_mds/fence_cisco_mds.py index cd25e96..032983d 100644 --- a/fence/agents/cisco_mds/fence_cisco_mds.py +++ b/fence/agents/cisco_mds/fence_cisco_mds.py @@ -113,7 +113,9 @@ def main(): port_oid=cisco_port2oid(options["-n"]) # Operate the fencing device - fence_action(FencingSnmp(options), options, set_power_status, get_power_status, get_outlets_status) + result = fence_action(FencingSnmp(options), options, set_power_status, get_power_status, get_outlets_status) + + sys.exit(result) if __name__ == "__main__": main() diff --git a/fence/agents/drac/fence_drac.pl b/fence/agents/drac/fence_drac.pl index 3d8c497..e6dfbd9 100755 --- a/fence/agents/drac/fence_drac.pl +++ b/fence/agents/drac/fence_drac.pl @@ -457,7 +457,7 @@ sub do_action if ($status =~ /^on$/i) { msg "success: already on"; - return; + return 0; } set_power_status on; @@ -470,7 +470,7 @@ sub do_action if ($status =~ /^off$/i) { msg "success: already off"; - return; + return 0; } set_power_status off; @@ -494,12 +494,19 @@ sub do_action elsif ($action =~ /^status$/i) { msg "status: $status"; - return; + if ($status =~ /on/i) + { + return 0; + } else { + return 2; + } } else { fail "failed: unrecognised action: '$action'"; } + + return 0; } # @@ -663,10 +670,10 @@ elsif ($drac_version eq $DRAC_VERSION_MC) unless defined $modulename; } -do_action; +my $res = do_action; logout; -exit 0; +exit $res; diff --git a/fence/agents/drac/fence_drac5.py b/fence/agents/drac/fence_drac5.py index d93501a..11d8434 100755 --- a/fence/agents/drac/fence_drac5.py +++ b/fence/agents/drac/fence_drac5.py @@ -98,7 +98,7 @@ def main(): options["-c"] = "\$" show_docs(options) - + ## ## Operate the fencing device ###### @@ -115,7 +115,7 @@ def main(): ## Assume this is DRAC 5 by default as we don't want to break anything options["model"]="DRAC 5" - fence_action(conn, options, set_power_status, get_power_status, get_list_devices) + result = fence_action(conn, options, set_power_status, get_power_status, get_list_devices) ## ## Logout from system @@ -127,6 +127,8 @@ def main(): pass except pexpect.ExceptionPexpect: pass + + sys.exit(result) if __name__ == "__main__": main() diff --git a/fence/agents/eps/fence_eps.py b/fence/agents/eps/fence_eps.py index 1660931..daec240 100644 --- a/fence/agents/eps/fence_eps.py +++ b/fence/agents/eps/fence_eps.py @@ -110,7 +110,9 @@ def main(): show_docs(options) #Run fence action. Conn is None, beacause we always need open new http connection - fence_action(None, options, set_power_status, get_power_status,get_power_status) + result = fence_action(None, options, set_power_status, get_power_status,get_power_status) + + sys.exit(result) if __name__ == "__main__": main() diff --git a/fence/agents/ibmblade/fence_ibmblade.py b/fence/agents/ibmblade/fence_ibmblade.py index 08022ea..a0d0884 100644 --- a/fence/agents/ibmblade/fence_ibmblade.py +++ b/fence/agents/ibmblade/fence_ibmblade.py @@ -73,7 +73,8 @@ def main(): show_docs(options) # Operate the fencing device - fence_action(FencingSnmp(options), options, set_power_status, get_power_status, get_outlets_status) + result = fence_action(FencingSnmp(options), options, set_power_status, get_power_status, get_outlets_status) + sys.exit(result) if __name__ == "__main__": main() diff --git a/fence/agents/ilo/fence_ilo.py b/fence/agents/ilo/fence_ilo.py index cf2993d..fcf4b0c 100755 --- a/fence/agents/ilo/fence_ilo.py +++ b/fence/agents/ilo/fence_ilo.py @@ -107,7 +107,9 @@ def main(): ## ## Fence operations #### - fence_action(conn, options, set_power_status, get_power_status, None) + result = fence_action(conn, options, set_power_status, get_power_status, None) + + sys.exit(result) if __name__ == "__main__": main() diff --git a/fence/agents/ilo_mp/fence_ilo_mp.py b/fence/agents/ilo_mp/fence_ilo_mp.py index 98d7d69..c1ef5da 100644 --- a/fence/agents/ilo_mp/fence_ilo_mp.py +++ b/fence/agents/ilo_mp/fence_ilo_mp.py @@ -65,7 +65,7 @@ def main(): ## ## Fence operations #### - fence_action(conn, options, set_power_status, get_power_status) + result = fence_action(conn, options, set_power_status, get_power_status) try: conn.send("exit\r\n") @@ -74,5 +74,7 @@ def main(): except pexpect.ExceptionPexpect: pass + sys.exit(result) + if __name__ == "__main__": main() diff --git a/fence/agents/lib/fencing.py.py b/fence/agents/lib/fencing.py.py index b54d1a8..a7647f7 100644 --- a/fence/agents/lib/fencing.py.py +++ b/fence/agents/lib/fencing.py.py @@ -387,7 +387,7 @@ def fail_usage(message = ""): if len(message) > 0: sys.stderr.write(message+"\n") sys.stderr.write("Please use '-h' for usage\n") - sys.exit(EC_BAD_ARGS) + sys.exit(EC_GENERIC_ERROR) def fail(error_code): message = { @@ -400,7 +400,7 @@ def fail(error_code): EC_STATUS_HMC : "Failed: Either unable to obtaion correct plug status, partition is not available or incorrect HMC version used" }[error_code] + "\n" sys.stderr.write(message) - sys.exit(error_code) + sys.exit(EC_GENERIC_ERROR) def usage(avail_opt): global all_opt @@ -703,6 +703,8 @@ def show_docs(options, docs = None): sys.exit(0) def fence_action(tn, options, set_power_fn, get_power_fn, get_outlet_list = None): + result = 0 + ## Process options that manipulate fencing device ##### if (options["-o"] == "list") and (0 == options["device_opt"].count("port")) and (0 == options["device_opt"].count("partition")): @@ -784,8 +786,12 @@ def fence_action(tn, options, set_power_fn, get_power_fn, get_outlet_list = None print "Success: Rebooted" elif options["-o"] == "status": print "Status: " + status.upper() + if status.upper() == "OFF": + result = 2 elif options["-o"] == "monitor": 1 + + return result def fence_login(options): force_ipvx="" diff --git a/fence/agents/lpar/fence_lpar.py b/fence/agents/lpar/fence_lpar.py index 3a22edc..a2b672c 100755 --- a/fence/agents/lpar/fence_lpar.py +++ b/fence/agents/lpar/fence_lpar.py @@ -168,7 +168,7 @@ def main(): ## Operate the fencing device #### conn = fence_login(options) - fence_action(conn, options, set_power_status, get_power_status, get_lpar_list) + result = fence_action(conn, options, set_power_status, get_power_status, get_lpar_list) ## ## Logout from system @@ -181,5 +181,6 @@ def main(): except pexpect.ExceptionPexpect: pass + sys.exit(result) if __name__ == "__main__": main() diff --git a/fence/agents/rsa/fence_rsa.py b/fence/agents/rsa/fence_rsa.py index ed794fa..e9eac5f 100755 --- a/fence/agents/rsa/fence_rsa.py +++ b/fence/agents/rsa/fence_rsa.py @@ -64,7 +64,7 @@ def main(): ## Operate the fencing device ###### conn = fence_login(options) - fence_action(conn, options, set_power_status, get_power_status, None) + result = fence_action(conn, options, set_power_status, get_power_status, None) ## ## Logout from system @@ -75,7 +75,9 @@ def main(): except exceptions.OSError: pass except pexpect.ExceptionPexpect: - pass + pass + + sys.exit(result) if __name__ == "__main__": main() diff --git a/fence/agents/rsb/fence_rsb.py b/fence/agents/rsb/fence_rsb.py index 25a2826..a98c0f5 100755 --- a/fence/agents/rsb/fence_rsb.py +++ b/fence/agents/rsb/fence_rsb.py @@ -60,6 +60,9 @@ def main(): POWER_STATUS = 2 POWER_REBOOT = 3 + STATUS_ON = 0 + STATUS_OFF = 2 + power_command_issued = 0 address = "" @@ -73,6 +76,8 @@ def main(): standard_err = 2 + result = 0 + completed_action = 0 #set up regex list @@ -382,8 +387,10 @@ def main(): print "Determining power state..." if power_state == 1: print "Server is On" + result = STATUS_ON elif power_state == 0: print "Server is Off" + result = STATUS_OFF else: os.write(standard_err, ("FENCE: Cannot determine power state: %s" % buf)) sys.exit(1) @@ -397,6 +404,7 @@ def main(): sock.write("\r") sock.close() + sys.exit(result) if __name__ == "__main__": main() diff --git a/fence/agents/sanbox2/fence_sanbox2.py b/fence/agents/sanbox2/fence_sanbox2.py index 4581974..12c0e2e 100644 --- a/fence/agents/sanbox2/fence_sanbox2.py +++ b/fence/agents/sanbox2/fence_sanbox2.py @@ -139,7 +139,7 @@ def main(): sys.stderr.write("Failed: Unable to switch to admin section\n") sys.exit(EC_GENERIC_ERROR) - fence_action(conn, options, set_power_status, get_power_status, get_list_devices) + result = fence_action(conn, options, set_power_status, get_power_status, get_list_devices) ## ## Logout from system @@ -153,5 +153,7 @@ def main(): except pexpect.ExceptionPexpect: pass + sys.exit(result) + if __name__ == "__main__": main() diff --git a/fence/agents/virsh/fence_virsh.py b/fence/agents/virsh/fence_virsh.py index 7913cd2..9cb5a12 100644 --- a/fence/agents/virsh/fence_virsh.py +++ b/fence/agents/virsh/fence_virsh.py @@ -83,7 +83,7 @@ def main(): ## Operate the fencing device conn = fence_login(options) - fence_action(conn, options, set_power_status, get_power_status, get_outlets_status) + result = fence_action(conn, options, set_power_status, get_power_status, get_outlets_status) ## Logout from system try: @@ -94,5 +94,6 @@ def main(): except pexpect.ExceptionPexpect: pass + sys.exit(result) if __name__ == "__main__": main() diff --git a/fence/agents/vmware/fence_vmware.py b/fence/agents/vmware/fence_vmware.py index 7e51df5..a5e2277 100644 --- a/fence/agents/vmware/fence_vmware.py +++ b/fence/agents/vmware/fence_vmware.py @@ -310,8 +310,9 @@ def main(): fail_usage("Unsupported version of vmrun command! You must use at least version %d!"%(VMRUN_MINIMUM_REQUIRED_VERSION)) # Operate the fencing device - fence_action(None, options, set_power_status, get_power_status, get_outlets_status) + result = fence_action(None, options, set_power_status, get_power_status, get_outlets_status) + sys.exit(result) if __name__ == "__main__": main() diff --git a/fence/agents/wti/fence_wti.py b/fence/agents/wti/fence_wti.py index 888695f..3198aeb 100755 --- a/fence/agents/wti/fence_wti.py +++ b/fence/agents/wti/fence_wti.py @@ -131,7 +131,7 @@ def main(): else: conn = fence_login(options) - fence_action(conn, options, set_power_status, get_power_status, get_power_status) + result = fence_action(conn, options, set_power_status, get_power_status, get_power_status) ## ## Logout from system @@ -143,6 +143,8 @@ def main(): pass except pexpect.ExceptionPexpect: pass + + sys.exit(result) if __name__ == "__main__": main() -- 1.6.0.6