Blob Blame History Raw
commit 91399dd3e884c50e2317ab738eea1569faa8d55a
Author: Marek 'marx' Grac <mgrac@redhat.com>
Date:   Mon Sep 8 15:10:05 2014 +0200

    fence_cisco_ucs & fence_vmware_soap: Logout has to be performed even when fencing fails
    
    Previously, logout was not performed in the case when fence agent was aborted e.g. timeout. What could
    lead to a situation when connections were not closed correctly. In the extreme case, it was not possible
    to log into device at all
    
    Resolves: rhbz#1111599

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