Blame SOURCES/bz1111599-1-fence_cisco_and_soap_logout.patch

e4ffb1
commit 91399dd3e884c50e2317ab738eea1569faa8d55a
e4ffb1
Author: Marek 'marx' Grac <mgrac@redhat.com>
e4ffb1
Date:   Mon Sep 8 15:10:05 2014 +0200
e4ffb1
e4ffb1
    fence_cisco_ucs & fence_vmware_soap: Logout has to be performed even when fencing fails
e4ffb1
    
e4ffb1
    Previously, logout was not performed in the case when fence agent was aborted e.g. timeout. What could
e4ffb1
    lead to a situation when connections were not closed correctly. In the extreme case, it was not possible
e4ffb1
    to log into device at all
e4ffb1
    
e4ffb1
    Resolves: rhbz#1111599
e4ffb1
e4ffb1
diff --git a/fence/agents/cisco_ucs/fence_cisco_ucs.py b/fence/agents/cisco_ucs/fence_cisco_ucs.py
e4ffb1
index 888d689..f411433 100644
e4ffb1
--- a/fence/agents/cisco_ucs/fence_cisco_ucs.py
e4ffb1
+++ b/fence/agents/cisco_ucs/fence_cisco_ucs.py
e4ffb1
@@ -19,6 +19,8 @@ RE_STATUS = re.compile("
e4ffb1
 RE_GET_DN = re.compile(" dn=\"(.*?)\"", re.IGNORECASE)
e4ffb1
 RE_GET_DESC = re.compile(" descr=\"(.*?)\"", re.IGNORECASE)
e4ffb1
 
e4ffb1
+options_global = None
e4ffb1
+
e4ffb1
 def get_power_status(conn, options):
e4ffb1
 	del conn
e4ffb1
 
e4ffb1
@@ -115,27 +117,37 @@ def define_new_opts():
e4ffb1
 		"default" : "",
e4ffb1
 		"order" : 1}
e4ffb1
 
e4ffb1
+def logout():
e4ffb1
+	### Logout; we do not care about result as we will end in any case
e4ffb1
+	try:
e4ffb1
+		send_command(options_global, "<aaaLogout inCookie=\"" + options_global["cookie"] + "\" />",
e4ffb1
+				int(options_global["--shell-timeout"]))
e4ffb1
+	except Exception:
e4ffb1
+		pass
e4ffb1
+
e4ffb1
 def main():
e4ffb1
+	global options_global
e4ffb1
 	device_opt = ["ipaddr", "login", "passwd", "ssl", "notls", "port", "web", "suborg"]
e4ffb1
 
e4ffb1
 	atexit.register(atexit_handler)
e4ffb1
+	atexit.register(logout)
e4ffb1
 
e4ffb1
 	define_new_opts()
e4ffb1
 
e4ffb1
-	options = check_input(device_opt, process_input(device_opt))
e4ffb1
+	options_global = check_input(device_opt, process_input(device_opt))
e4ffb1
 
e4ffb1
 	docs = {}
e4ffb1
 	docs["shortdesc"] = "Fence agent for Cisco UCS"
e4ffb1
 	docs["longdesc"] = "fence_cisco_ucs is an I/O Fencing agent which can be \
e4ffb1
 used with Cisco UCS to fence machines."
e4ffb1
 	docs["vendorurl"] = "http://www.cisco.com"
e4ffb1
-	show_docs(options, docs)
e4ffb1
+	show_docs(options_global, docs)
e4ffb1
 
e4ffb1
-	run_delay(options)
e4ffb1
+	run_delay(options_global)
e4ffb1
 	### Login
e4ffb1
 	try:
e4ffb1
-		res = send_command(options, "
e4ffb1
-				"\" inPassword=\"" + options["--password"] + "\" />", int(options["--login-timeout"]))
e4ffb1
+		res = send_command(options_global, "
e4ffb1
+				"\" inPassword=\"" + options_global["--password"] + "\" />", int(options_global["--login-timeout"]))
e4ffb1
 		result = RE_COOKIE.search(res)
e4ffb1
 		if result == None:
e4ffb1
 			## Cookie is absenting in response
e4ffb1
@@ -143,22 +155,19 @@ used with Cisco UCS to fence machines."
e4ffb1
 	except Exception:
e4ffb1
 		fail(EC_LOGIN_DENIED)
e4ffb1
 
e4ffb1
-	options["cookie"] = result.group(1)
e4ffb1
+	options_global["cookie"] = result.group(1)
e4ffb1
 
e4ffb1
 	##
e4ffb1
 	## Modify suborg to format /suborg
e4ffb1
-	if options["--suborg"] != "":
e4ffb1
-		options["--suborg"] = "/" + options["--suborg"].lstrip("/").rstrip("/")
e4ffb1
+	if options_global["--suborg"] != "":
e4ffb1
+		options_global["--suborg"] = "/" + options_global["--suborg"].lstrip("/").rstrip("/")
e4ffb1
 
e4ffb1
 	##
e4ffb1
 	## Fence operations
e4ffb1
 	####
e4ffb1
-	result = fence_action(None, options, set_power_status, get_power_status, get_list)
e4ffb1
-
e4ffb1
-	### Logout; we do not care about result as we will end in any case
e4ffb1
-	send_command(options, "<aaaLogout inCookie=\"" + options["cookie"] + "\" />",
e4ffb1
-			int(options["--shell-timeout"]))
e4ffb1
+	result = fence_action(None, options_global, set_power_status, get_power_status, get_list)
e4ffb1
 
e4ffb1
+	## Logout is done every time at atexit phase
e4ffb1
 	sys.exit(result)
e4ffb1
 
e4ffb1
 if __name__ == "__main__":
e4ffb1
diff --git a/fence/agents/vmware_soap/fence_vmware_soap.py b/fence/agents/vmware_soap/fence_vmware_soap.py
e4ffb1
index 3217c6b..2cea105 100644
e4ffb1
--- a/fence/agents/vmware_soap/fence_vmware_soap.py
e4ffb1
+++ b/fence/agents/vmware_soap/fence_vmware_soap.py
e4ffb1
@@ -20,6 +20,9 @@ REDHAT_COPYRIGHT=""
e4ffb1
 BUILD_DATE="April, 2011"
e4ffb1
 #END_VERSION_GENERATION
e4ffb1
 
e4ffb1
+options_global = None
e4ffb1
+conn_global = None
e4ffb1
+
e4ffb1
 class RequestsTransport(HttpAuthenticated):
e4ffb1
 	def __init__(self, **kwargs):
e4ffb1
 		self.cert = kwargs.pop('cert', None)
e4ffb1
@@ -203,12 +206,21 @@ def set_power_status(conn, options):
e4ffb1
 def remove_tmp_dir(tmp_dir):
e4ffb1
 	shutil.rmtree(tmp_dir)
e4ffb1
 
e4ffb1
+def logout():
e4ffb1
+	try:
e4ffb1
+		conn_global.service.Logout(options_global["mo_SessionManager"])
e4ffb1
+	except Exception:
e4ffb1
+		pass
e4ffb1
+
e4ffb1
 def main():
e4ffb1
+	global options_global
e4ffb1
+	global conn_global
e4ffb1
 	device_opt = ["ipaddr", "login", "passwd", "web", "ssl", "notls", "port"]
e4ffb1
 
e4ffb1
 	atexit.register(atexit_handler)
e4ffb1
+	atexit.register(logout)
e4ffb1
 
e4ffb1
-	options = check_input(device_opt, process_input(device_opt))
e4ffb1
+	options_global = check_input(device_opt, process_input(device_opt))
e4ffb1
 
e4ffb1
 	##
e4ffb1
 	## Fence agent specific defaults
e4ffb1
@@ -224,7 +236,7 @@ format (e.g. /datacenter/vm/Discovered virtual machine/myMachine). \
e4ffb1
 In the cases when name of yours VM is unique you can use it instead. \
e4ffb1
 Alternatively you can always use UUID to access virtual machine."
e4ffb1
 	docs["vendorurl"] = "http://www.vmware.com"
e4ffb1
-	show_docs(options, docs)
e4ffb1
+	show_docs(options_global, docs)
e4ffb1
 
e4ffb1
 	logging.basicConfig(level=logging.INFO)
e4ffb1
 	logging.getLogger('suds.client').setLevel(logging.CRITICAL)
e4ffb1
@@ -234,18 +246,11 @@ Alternatively you can always use UUID to access virtual machine."
e4ffb1
 	##
e4ffb1
 	## Operate the fencing device
e4ffb1
 	####
e4ffb1
-	conn = soap_login(options)
e4ffb1
-
e4ffb1
-	result = fence_action(conn, options, set_power_status, get_power_status, get_power_status)
e4ffb1
+	conn_global = soap_login(options_global)
e4ffb1
 
e4ffb1
-	##
e4ffb1
-	## Logout from system
e4ffb1
-	#####
e4ffb1
-	try:
e4ffb1
-		conn.service.Logout(options["mo_SessionManager"])
e4ffb1
-	except Exception:
e4ffb1
-		pass
e4ffb1
+	result = fence_action(conn_global, options_global, set_power_status, get_power_status, get_power_status)
e4ffb1
 
e4ffb1
+	## Logout from system is done automatically via atexit()
e4ffb1
 	sys.exit(result)
e4ffb1
 
e4ffb1
 if __name__ == "__main__":