From 057c7b6535ece659383124da0972b948182e68b7 Mon Sep 17 00:00:00 2001 From: Antoine Millet Date: Thu, 12 May 2011 16:44:35 +0200 Subject: [PATCH] Implemented bootstrap role. --- ccserver/ccserver.py | 7 +++++++ ccserver/handlers.py | 16 +++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/ccserver/ccserver.py b/ccserver/ccserver.py index 0320d35..4eaa570 100644 --- a/ccserver/ccserver.py +++ b/ccserver/ccserver.py @@ -126,6 +126,13 @@ class CCServer(object): else: self._connected[login] = CCClient(login, role, self, connection) + # If the registered role is bootstrap, we need to register the object + # on objectdb because it have no account: + if role == 'bootstrap': + obj = TqlObject(id=login, r=role) + logging.info('%s' % obj) + self.objects.register(obj) + def unregister(self, connection): ''' Unregister an already connected account. diff --git a/ccserver/handlers.py b/ccserver/handlers.py index 131ea53..71144c7 100644 --- a/ccserver/handlers.py +++ b/ccserver/handlers.py @@ -825,6 +825,15 @@ class CliHandler(OnlineCCHandler): return client.connection.call(command, *args, **kwargs) +class BootstrapHandler(OnlineCCHandler): + + ''' + Handler for bootstrap clients. + ''' + + pass + + class WelcomeHandler(CCHandler): ''' Default handler used on client connections of the server. @@ -837,6 +846,7 @@ class WelcomeHandler(CCHandler): 'hv': HypervisorHandler, 'host': None, 'spv': SpvHandler, + 'bootstrap': BootstrapHandler, } @listed @@ -874,14 +884,18 @@ class WelcomeHandler(CCHandler): raise BadRoleError('%r is not a legal role' % role) # If authentication is a success, try to register the client: + if role == 'bootstrap': + # Set a bootstrap id for the object: + login = '%s.%s' % (login, conn.get_fd()) + try: self._server.register(login, role, conn) except AlreadyRegistered: logging.warning(logmsg + 'already connected (%s)', conn.getpeername(), login) raise AuthenticationError('Already connected') - conn.set_handler(WelcomeHandler.ROLES.get(role)(self._server)) + conn.set_handler(WelcomeHandler.ROLES.get(role)(self._server)) logging.info('Authentication success from %s with login %s', conn.getpeername(), login) return role -- GitLab