#
##############################################################################
-import SimpleXMLRPCServer
-import SocketServer
import logging
import logging.handlers
-import os
-import signal
-import socket
import sys
import threading
import time
-import xmlrpclib
import release
+from pprint import pformat
import warnings
class Service(object):
Any instance of this class will behave like the single instance
of Service(name)
"""
+ __logger = logging.getLogger('service')
def __init__(self, name):
self.__name = name
try:
for method_name, method_definition in self._service._methods.items():
setattr(self, method_name, method_definition)
except KeyError, keyError:
- Logger().notifyChannel('module', LOG_ERROR, 'This service does not exist: %s' % (str(keyError),) )
+ self.__logger.error('This service does not exist: %s' % (str(keyError),) )
raise
+
def __call__(self, method, *params):
return getattr(self, method)(*params)
LOG_NOTSET = 'notset'
LOG_DEBUG_RPC = 'debug_rpc'
LOG_DEBUG = 'debug'
+LOG_TEST = 'test'
LOG_INFO = 'info'
LOG_WARNING = 'warn'
LOG_ERROR = 'error'
logging.DEBUG_RPC = logging.DEBUG - 2
logging.addLevelName(logging.DEBUG_RPC, 'DEBUG_RPC')
+logging.TEST = logging.INFO - 5
+logging.addLevelName(logging.TEST, 'TEST')
+
def init_logger():
import os
from tools.translate import resetlocale
'DEBUG_RPC': ('blue', 'white'),
'DEBUG': ('blue', 'default'),
'INFO': ('green', 'default'),
+ 'TEST': ('white', 'blue'),
'WARNING': ('yellow', 'default'),
'ERROR': ('red', 'default'),
'CRITICAL': ('white', 'red'),
log = logging.getLogger(tools.ustr(name))
- if level == LOG_DEBUG_RPC and not hasattr(log, level):
- fct = lambda msg, *args, **kwargs: log.log(logging.DEBUG_RPC, msg, *args, **kwargs)
- setattr(log, LOG_DEBUG_RPC, fct)
+ if level in [LOG_DEBUG_RPC, LOG_TEST] and not hasattr(log, level):
+ fct = lambda msg, *args, **kwargs: log.log(getattr(logging, level.upper()), msg, *args, **kwargs)
+ setattr(log, level, fct)
+
level_method = getattr(log, level)
try:
msg = tools.ustr(msg).strip()
- if level in (LOG_ERROR,LOG_CRITICAL) and tools.config.get_misc('debug','env_info',False):
+ if level in (LOG_ERROR, LOG_CRITICAL) and tools.config.get_misc('debug','env_info',False):
msg = common().exp_get_server_environment() + "\n" + msg
result = msg.split('\n')
_timers = {}
_logger = Logger()
+ __logger = logging.getLogger('timer')
+
def setAlarm(self, fn, dt, db_name, *args, **kwargs):
wait = dt - time.time()
if wait > 0:
- self._logger.notifyChannel('timers', LOG_DEBUG, "Job scheduled in %.3g seconds for %s.%s" % (wait, fn.im_class.__name__, fn.func_name))
+ self.__logger.debug("Job scheduled in %.3g seconds for %s.%s" % (wait, fn.im_class.__name__, fn.func_name))
timer = threading.Timer(wait, fn, args, kwargs)
timer.start()
self._timers.setdefault(db_name, []).append(timer)
class Server:
""" Generic interface for all servers with an event loop etc.
Override this to impement http, net-rpc etc. servers.
-
+
Servers here must have threaded behaviour. start() must not block,
there is no run().
"""
__is_started = False
__servers = []
-
+
+
+ __logger = logging.getLogger('server')
+
def __init__(self):
if Server.__is_started:
raise Exception('All instances of servers must be inited before the startAll()')
Server.__servers.append(self)
def start(self):
- print "called stub Server.start"
- pass
-
+ self.__logger.debug("called stub Server.start")
+
def stop(self):
- print "called stub Server.stop"
- pass
+ self.__logger.debug("called stub Server.stop")
def stats(self):
""" This function should return statistics about the server """
def startAll(cls):
if cls.__is_started:
return
- Logger().notifyChannel("services", LOG_INFO,
- "Starting %d services" % len(cls.__servers))
+ cls.__logger.info("Starting %d services" % len(cls.__servers))
for srv in cls.__servers:
srv.start()
cls.__is_started = True
-
+
@classmethod
def quitAll(cls):
if not cls.__is_started:
return
- Logger().notifyChannel("services", LOG_INFO,
- "Stopping %d services" % len(cls.__servers))
+ cls.__logger.info("Stopping %d services" % len(cls.__servers))
for srv in cls.__servers:
srv.stop()
cls.__is_started = False
@classmethod
def allStats(cls):
- res = ''
- if cls.__is_started:
- res += "Servers started\n"
- else:
- res += "Servers stopped\n"
- for srv in cls.__servers:
- try:
- res += srv.stats() + "\n"
- except:
- pass
- return res
+ res = ["Servers %s" % ('stopped', 'started')[cls.__is_started]]
+ res.extend(srv.stats() for srv in cls.__servers)
+ return '\n'.join(res)
class OpenERPDispatcherException(Exception):
def __init__(self, exception, traceback):
class OpenERPDispatcher:
def log(self, title, msg):
- from pprint import pformat
Logger().notifyChannel('%s' % title, LOG_DEBUG_RPC, pformat(msg))
def dispatch(self, service_name, method, params):