Loading bin/cc-server +9 −2 Original line number Diff line number Diff line #!/usr/bin/env python #coding=utf8 from cloudcontrol.common.helpers.logger import patch_logging; patch_logging() import os import sys import atexit Loading Loading @@ -69,16 +71,21 @@ def run_server(options): if options['stdout']: handler = logging.StreamHandler() fmt = EncodingFormatter('[%(asctime)s] ' '\x1B[30;47m%(name)s\x1B[0m ' '\x1B[30;42m%(levelname)s\x1B[0m: ' '%(message)s') else: facility = logging.handlers.SysLogHandler.LOG_DAEMON handler = logging.handlers.SysLogHandler(address='/dev/log', facility=facility) fmt = EncodingFormatter('%(name)s: %(levelname)s %(message)s') fmt = EncodingFormatter('cc-server (%(name)s): %(levelname)s %(message)s') handler.setFormatter(fmt) logger.addHandler(handler) server = CCServer(conf_dir=options['account_db'], server = CCServer(logger.getChild('cc-server'), conf_dir=options['account_db'], maxcon=int(options['maxcon']), maxidle=int(options['maxidle']), port=int(options['port']), Loading cloudcontrol/server/ccserver.py +16 −14 Original line number Diff line number Diff line Loading @@ -2,7 +2,6 @@ Main class of cc-server. ''' import logging from fnmatch import fnmatch as glob from sjrpc.server import SSLRpcServer Loading Loading @@ -51,34 +50,36 @@ class CCServer(object): # These tags are reserved and cannot be setted by an user: RESERVED_TAGS = ('id', 'a', 'r', 'close', 'con', 'ip', 'p') def __init__(self, conf_dir, maxcon, maxidle, certfile=None, keyfile=None, address='0.0.0.0', port=1984): def __init__(self, logger, conf_dir, maxcon, maxidle, certfile=None, keyfile=None, address='0.0.0.0', port=1984): self.logger = logger self._clients = {} # Clients connected to the server # The interface object to the configuration directory: self.conf = CCConf(conf_dir) self.conf = CCConf(self.logger.getChild('conf'), conf_dir) # Some settings: self._maxcon = maxcon self._maxidle = maxidle # SSL configuration stuff: if certfile: logging.info('SSL Certificate: %s', certfile) self.logger.info('SSL Certificate: %s', certfile) if keyfile: logging.info('SSL Key: %s', certfile) self.logger.info('SSL Key: %s', certfile) self.db = TqlDatabase(default_requestor=SRequestor()) # Create the rpc server: logging.info('Listening on %s:%s', address, port) self.logger.info('Listening on %s:%s', address, port) self.rpc = SSLRpcServer.from_addr(address, port, certfile=certfile, keyfile=keyfile, conn_kw=dict(handler=WelcomeHandler(self), on_disconnect='on_disconnect')) # The jobs manager: self.jobs = JobsManager(self) logging.info('Server started to running') self.jobs = JobsManager(self.logger.getChild('jobs'), self) self.logger.info('Server started to running') def _update_accounts(self): ''' Loading Loading @@ -129,15 +130,15 @@ class CCServer(object): raise AuthenticationError('Unknown login') else: if 'close' in self.conf.show(login)['tags']: logging.warning(logmsg + 'account closed (%s)', conn.getpeername(), login) self.logger.warning(logmsg + 'account closed (%s)', conn.getpeername(), login) raise AuthenticationError('Account is closed') if role is None: logging.warning(logmsg + 'bad login/password (%s)', conn.getpeername(), login) self.logger.warning(logmsg + 'bad login/password (%s)', conn.getpeername(), login) raise AuthenticationError('Bad login/password') else: if role not in Client.roles: logging.warning(logmsg + 'bad role in account config (%s)', conn.getpeername(), login) self.logger.warning(logmsg + 'bad role in account config (%s)', conn.getpeername(), login) raise BadRoleError('%r is not a legal role' % role) # If authentication is a success, try to register the client: Loading @@ -152,7 +153,8 @@ class CCServer(object): :param connection: connection to register :param tags: tags to add for the client ''' client = Client.from_role(role, login, self, connection) client = Client.from_role(role, None, login, self, connection) client.logger = self.logger.getChild('clients.%s' % client.login) if client.login in self._clients: if client.KILL_ALREADY_CONNECTED: self.kill(client.login) Loading @@ -179,7 +181,7 @@ class CCServer(object): self.jobs.create('kill_oldcli', maxcon=self._maxcon, maxidle=self._maxidle, _hidden=True) logging.debug('Running rpc mainloop') self.logger.debug('Running rpc mainloop') self.rpc.run() def get_client(self, login): Loading cloudcontrol/server/clients/__init__.py +5 −7 Original line number Diff line number Diff line Loading @@ -4,8 +4,6 @@ This package store classes representing each client's role and the associated sjRPC handler. """ import logging from datetime import datetime from sjrpc.utils import ConnectionProxy Loading @@ -26,7 +24,7 @@ class RegisteredCCHandler(CCHandler): return super(RegisteredCCHandler, self).__getitem__(name) def on_disconnect(self, conn): logging.info('Client %s disconnected', self.client.login) self.logger.info('Client %s disconnected', self.client.login) self.client.shutdown() def check(self, method, tql=None): Loading Loading @@ -92,7 +90,8 @@ class Client(object): roles = {} def __init__(self, login, server, connection): def __init__(self, logger, login, server, connection): self.logger = logger self._login = login self._server = server self._connection = connection Loading @@ -105,7 +104,6 @@ class Client(object): # Remote tags registered: self._remote_tags = set() def _get_tql_object(self): """ Get the TQL object of the client from the cc-server tql database. """ Loading @@ -118,8 +116,8 @@ class Client(object): cls.roles[class_.ROLE] = class_ @classmethod def from_role(cls, role, login, server, connection): return cls.roles[role](login, server, connection) def from_role(cls, role, logger, login, server, connection): return cls.roles[role](logger, login, server, connection) # # Properties Loading cloudcontrol/server/clients/cli.py +2 −4 Original line number Diff line number Diff line import logging from sjrpc.core import RpcError from cloudcontrol.server.orderedset import OrderedSet Loading Loading @@ -64,7 +62,7 @@ class CliHandler(RegisteredCCHandler): """ self.check('list', query) logging.debug('Executed list function with query %s', query) self.logger.debug('Executed list function with query %s', query) objects = self.server.list(query) order = OrderedSet(['id']) #if tags is not None: Loading Loading @@ -719,7 +717,7 @@ class CliHandler(RegisteredCCHandler): rcode = client.rshell_wait(stun.label) except Exception as err: rcode = -1 logging.warning('Unexpected exit of tunnel: %s', err) self.logger.warning('Unexpected exit of tunnel: %s', err) self.client.unregister_tunnel(ctun.label) ctun.close() stun.close() Loading cloudcontrol/server/clients/spv.py +1 −3 Original line number Diff line number Diff line import logging from cloudcontrol.server.clients import Client, RegisteredCCHandler from cloudcontrol.server.handlers import listed Loading @@ -15,7 +13,7 @@ class SpvHandler(RegisteredCCHandler): :param query: the query to select objects to show """ logging.debug('Executed list function with query %s', query) self.logger.debug('Executed list function with query %s', query) objects = self.server.list(query) return {'objects': objects} Loading Loading
bin/cc-server +9 −2 Original line number Diff line number Diff line #!/usr/bin/env python #coding=utf8 from cloudcontrol.common.helpers.logger import patch_logging; patch_logging() import os import sys import atexit Loading Loading @@ -69,16 +71,21 @@ def run_server(options): if options['stdout']: handler = logging.StreamHandler() fmt = EncodingFormatter('[%(asctime)s] ' '\x1B[30;47m%(name)s\x1B[0m ' '\x1B[30;42m%(levelname)s\x1B[0m: ' '%(message)s') else: facility = logging.handlers.SysLogHandler.LOG_DAEMON handler = logging.handlers.SysLogHandler(address='/dev/log', facility=facility) fmt = EncodingFormatter('%(name)s: %(levelname)s %(message)s') fmt = EncodingFormatter('cc-server (%(name)s): %(levelname)s %(message)s') handler.setFormatter(fmt) logger.addHandler(handler) server = CCServer(conf_dir=options['account_db'], server = CCServer(logger.getChild('cc-server'), conf_dir=options['account_db'], maxcon=int(options['maxcon']), maxidle=int(options['maxidle']), port=int(options['port']), Loading
cloudcontrol/server/ccserver.py +16 −14 Original line number Diff line number Diff line Loading @@ -2,7 +2,6 @@ Main class of cc-server. ''' import logging from fnmatch import fnmatch as glob from sjrpc.server import SSLRpcServer Loading Loading @@ -51,34 +50,36 @@ class CCServer(object): # These tags are reserved and cannot be setted by an user: RESERVED_TAGS = ('id', 'a', 'r', 'close', 'con', 'ip', 'p') def __init__(self, conf_dir, maxcon, maxidle, certfile=None, keyfile=None, address='0.0.0.0', port=1984): def __init__(self, logger, conf_dir, maxcon, maxidle, certfile=None, keyfile=None, address='0.0.0.0', port=1984): self.logger = logger self._clients = {} # Clients connected to the server # The interface object to the configuration directory: self.conf = CCConf(conf_dir) self.conf = CCConf(self.logger.getChild('conf'), conf_dir) # Some settings: self._maxcon = maxcon self._maxidle = maxidle # SSL configuration stuff: if certfile: logging.info('SSL Certificate: %s', certfile) self.logger.info('SSL Certificate: %s', certfile) if keyfile: logging.info('SSL Key: %s', certfile) self.logger.info('SSL Key: %s', certfile) self.db = TqlDatabase(default_requestor=SRequestor()) # Create the rpc server: logging.info('Listening on %s:%s', address, port) self.logger.info('Listening on %s:%s', address, port) self.rpc = SSLRpcServer.from_addr(address, port, certfile=certfile, keyfile=keyfile, conn_kw=dict(handler=WelcomeHandler(self), on_disconnect='on_disconnect')) # The jobs manager: self.jobs = JobsManager(self) logging.info('Server started to running') self.jobs = JobsManager(self.logger.getChild('jobs'), self) self.logger.info('Server started to running') def _update_accounts(self): ''' Loading Loading @@ -129,15 +130,15 @@ class CCServer(object): raise AuthenticationError('Unknown login') else: if 'close' in self.conf.show(login)['tags']: logging.warning(logmsg + 'account closed (%s)', conn.getpeername(), login) self.logger.warning(logmsg + 'account closed (%s)', conn.getpeername(), login) raise AuthenticationError('Account is closed') if role is None: logging.warning(logmsg + 'bad login/password (%s)', conn.getpeername(), login) self.logger.warning(logmsg + 'bad login/password (%s)', conn.getpeername(), login) raise AuthenticationError('Bad login/password') else: if role not in Client.roles: logging.warning(logmsg + 'bad role in account config (%s)', conn.getpeername(), login) self.logger.warning(logmsg + 'bad role in account config (%s)', conn.getpeername(), login) raise BadRoleError('%r is not a legal role' % role) # If authentication is a success, try to register the client: Loading @@ -152,7 +153,8 @@ class CCServer(object): :param connection: connection to register :param tags: tags to add for the client ''' client = Client.from_role(role, login, self, connection) client = Client.from_role(role, None, login, self, connection) client.logger = self.logger.getChild('clients.%s' % client.login) if client.login in self._clients: if client.KILL_ALREADY_CONNECTED: self.kill(client.login) Loading @@ -179,7 +181,7 @@ class CCServer(object): self.jobs.create('kill_oldcli', maxcon=self._maxcon, maxidle=self._maxidle, _hidden=True) logging.debug('Running rpc mainloop') self.logger.debug('Running rpc mainloop') self.rpc.run() def get_client(self, login): Loading
cloudcontrol/server/clients/__init__.py +5 −7 Original line number Diff line number Diff line Loading @@ -4,8 +4,6 @@ This package store classes representing each client's role and the associated sjRPC handler. """ import logging from datetime import datetime from sjrpc.utils import ConnectionProxy Loading @@ -26,7 +24,7 @@ class RegisteredCCHandler(CCHandler): return super(RegisteredCCHandler, self).__getitem__(name) def on_disconnect(self, conn): logging.info('Client %s disconnected', self.client.login) self.logger.info('Client %s disconnected', self.client.login) self.client.shutdown() def check(self, method, tql=None): Loading Loading @@ -92,7 +90,8 @@ class Client(object): roles = {} def __init__(self, login, server, connection): def __init__(self, logger, login, server, connection): self.logger = logger self._login = login self._server = server self._connection = connection Loading @@ -105,7 +104,6 @@ class Client(object): # Remote tags registered: self._remote_tags = set() def _get_tql_object(self): """ Get the TQL object of the client from the cc-server tql database. """ Loading @@ -118,8 +116,8 @@ class Client(object): cls.roles[class_.ROLE] = class_ @classmethod def from_role(cls, role, login, server, connection): return cls.roles[role](login, server, connection) def from_role(cls, role, logger, login, server, connection): return cls.roles[role](logger, login, server, connection) # # Properties Loading
cloudcontrol/server/clients/cli.py +2 −4 Original line number Diff line number Diff line import logging from sjrpc.core import RpcError from cloudcontrol.server.orderedset import OrderedSet Loading Loading @@ -64,7 +62,7 @@ class CliHandler(RegisteredCCHandler): """ self.check('list', query) logging.debug('Executed list function with query %s', query) self.logger.debug('Executed list function with query %s', query) objects = self.server.list(query) order = OrderedSet(['id']) #if tags is not None: Loading Loading @@ -719,7 +717,7 @@ class CliHandler(RegisteredCCHandler): rcode = client.rshell_wait(stun.label) except Exception as err: rcode = -1 logging.warning('Unexpected exit of tunnel: %s', err) self.logger.warning('Unexpected exit of tunnel: %s', err) self.client.unregister_tunnel(ctun.label) ctun.close() stun.close() Loading
cloudcontrol/server/clients/spv.py +1 −3 Original line number Diff line number Diff line import logging from cloudcontrol.server.clients import Client, RegisteredCCHandler from cloudcontrol.server.handlers import listed Loading @@ -15,7 +13,7 @@ class SpvHandler(RegisteredCCHandler): :param query: the query to select objects to show """ logging.debug('Executed list function with query %s', query) self.logger.debug('Executed list function with query %s', query) objects = self.server.list(query) return {'objects': objects} Loading