Commit ac90614b authored by Antoine Millet's avatar Antoine Millet
Browse files

Reworked all the logging

Each component now use its own logger. Color have been added in
stdout output.
parent a70aedb8
Loading
Loading
Loading
Loading
+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
@@ -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']),
+16 −14
Original line number Diff line number Diff line
@@ -2,7 +2,6 @@
Main class of cc-server.
'''

import logging
from fnmatch import fnmatch as glob

from sjrpc.server import SSLRpcServer
@@ -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):
        '''
@@ -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:
@@ -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)
@@ -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):
+5 −7
Original line number Diff line number Diff line
@@ -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
@@ -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):
@@ -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
@@ -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.
        """
@@ -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
+2 −4
Original line number Diff line number Diff line
import logging

from sjrpc.core import RpcError

from cloudcontrol.server.orderedset import OrderedSet
@@ -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:
@@ -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()
+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

@@ -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