diff --git a/ccserver/ccserver.py b/ccserver/ccserver.py index 0320d35616c04e89af4349d641f73209624d2e62..4eaa570300c997fa80f06835b34bc18071a1349c 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 131ea53652ca63add40f0ab3998a7b420e197a6d..71144c752483f18bde26308a84187c4242c13698 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