Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > d236c5da97a239a1b6991cfba2865b66 > files > 49

cman-2.0.115-68.el5_6.1.src.rpm

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