From 6235645dde0ab8f763424d31331d8dce803e21a5 Mon Sep 17 00:00:00 2001 Message-Id: <6235645dde0ab8f763424d31331d8dce803e21a5.1381229532.git.hahn@univention.de> From: Philipp Hahn Date: Tue, 8 Oct 2013 12:25:07 +0200 Subject: [PATCH] Bug #32818: UMC: Handle connection close Organization: Univention GmbH, Bremen, Germany On network re-configuration the UMC servers are restarted, which close the connection. Handle that more gracefully to not block the browser. --- .../ucs-3.2-0/doc/changelog/changelog-3.2.xml | 4 ++++ .../univention-management-console/debian/changelog | 1 + .../management/console/protocol/modserver.py | 21 +++++++++++++------- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/branches/ucs-3.2/ucs-3.2-0/doc/changelog/changelog-3.2.xml b/branches/ucs-3.2/ucs-3.2-0/doc/changelog/changelog-3.2.xml index 8b3c2f4..e876047 100644 --- a/branches/ucs-3.2/ucs-3.2-0/doc/changelog/changelog-3.2.xml +++ b/branches/ucs-3.2/ucs-3.2-0/doc/changelog/changelog-3.2.xml @@ -710,6 +710,10 @@ The command dh-umc-module-build no longer prints a warning message for a failed import and aborts on errors when building UMC module packages (Bug 31123, Bug 32814). + + + UMC modules now handle the server restart more gracefully (Bug #32814). + diff --git a/branches/ucs-3.2/ucs-3.2-0/management/univention-management-console/debian/changelog b/branches/ucs-3.2/ucs-3.2-0/management/univention-management-console/debian/changelog index c6d0526..6115c29 100644 --- a/branches/ucs-3.2/ucs-3.2-0/management/univention-management-console/debian/changelog +++ b/branches/ucs-3.2/ucs-3.2-0/management/univention-management-console/debian/changelog @@ -2,6 +2,7 @@ univention-management-console (6.0.16-1) unstable; urgency=low * Remove warning (Bug #31123) * Abort on error (Bug #32814) + * Handle connection close (Bug #32818) -- Philipp Hahn Tue, 08 Oct 2013 10:25:50 +0200 diff --git a/branches/ucs-3.2/ucs-3.2-0/management/univention-management-console/src/univention/management/console/protocol/modserver.py b/branches/ucs-3.2/ucs-3.2-0/management/univention-management-console/src/univention/management/console/protocol/modserver.py index ac5fe0a..e22256a 100644 --- a/branches/ucs-3.2/ucs-3.2-0/management/univention-management-console/src/univention/management/console/protocol/modserver.py +++ b/branches/ucs-3.2/ucs-3.2-0/management/univention-management-console/src/univention/management/console/protocol/modserver.py @@ -51,6 +51,9 @@ _ = NullTranslation( 'univention.management.console' ).translate import locale import notifier import notifier.threads as threads +from socket import error as SocketError +import errno + class ModuleServer( Server ): """Implements an UMC module server @@ -98,7 +101,7 @@ class ModuleServer( Server ): self.__handler = self.__module.Instance() self.__handler.signal_connect( 'success', notifier.Callback( self._reply, True ) ) self.__handler.signal_connect( 'failure', notifier.Callback( self._reply, True ) ) - except Exception, e: + except Exception: import traceback traceback.print_exc() sys.exit( 5 ) @@ -126,10 +129,14 @@ class ModuleServer( Server ): notifier.timer_remove( self.__timer ) self.__timer == None - data = socket.recv( RECV_BUFFER_SIZE ) + try: + data = socket.recv( RECV_BUFFER_SIZE ) + except SocketError, ex: + MODULE.error('Failed connection: %s' % (errno.errorcode.get(ex.errno, ex.errno),)) + data = None # connection closed? - if not len( data ): + if not data: socket.close() # remove socket from notifier return False @@ -143,7 +150,7 @@ class ModuleServer( Server ): self.__buffer = msg.parse( self.__buffer ) MODULE.info( "Received request %s" % msg.id ) self.handle( msg ) - except IncompleteMessageError, e: + except IncompleteMessageError: MODULE.info( 'Failed to parse incomplete message' ) except ( ParseError, UnknownCommandError ), e: MODULE.error( 'Failed to parse message: %s' % str( e ) ) @@ -220,7 +227,7 @@ class ModuleServer( Server ): if 'acls' in msg.options and 'commands' in msg.options and 'credentials' in msg.options: try: self.__handler.init() - except BaseException, e: + except BaseException: import traceback, sys resp.status = MODULE_ERR exc_info = sys.exc_info() @@ -272,8 +279,8 @@ class ModuleServer( Server ): length = len( self.__queue ) try: ret = self.__comm.send( self.__queue ) - except socket.error, e: - if e[0] == 11: + except SocketError, ex: + if ex.errno == errno.EWOULDBLOCK: return True raise -- 1.7.10.4