#
##############################################################################
-#.apidoc title: Common Services: netsvc
-#.apidoc module-mods: member-order: bysource
import errno
import logging
import os
import platform
import release
-import socket
import sys
import threading
import time
_logger = logging.getLogger(__name__)
-
-def close_socket(sock):
- """ Closes a socket instance cleanly
-
- :param sock: the network socket to close
- :type sock: socket.socket
- """
- try:
- sock.shutdown(socket.SHUT_RDWR)
- except socket.error, e:
- # On OSX, socket shutdowns both sides if any side closes it
- # causing an error 57 'Socket is not connected' on shutdown
- # of the other side (or something), see
- # http://bugs.python.org/issue4397
- # note: stdlib fixed test, not behavior
- if e.errno != errno.ENOTCONN or platform.system() not in ['Darwin', 'Windows']:
- raise
- sock.close()
-
-class Service(object):
- """ Base class for Local services
- Functionality here is trusted, no authentication.
- Workflow engine and reports subclass this.
- """
- _services = {}
- def __init__(self, name):
- Service._services[name] = self
- self.__name = name
-
- @classmethod
- def exists(cls, name):
- return name in cls._services
-
- @classmethod
- def remove(cls, name):
- if cls.exists(name):
- cls._services.pop(name)
-
def LocalService(name):
# Special case for addons support, will be removed in a few days when addons
# are updated to directly use openerp.osv.osv.service.
- if name == 'object_proxy':
- return openerp.service.model
- if name == 'db':
- return openerp.service.db
+ if name == 'workflow':
+ return openerp.workflow
- return Service._services[name]
+ return openerp.report.interface.report_int._reports[name]
BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, _NOTHING, DEFAULT = range(10)
#The background is set with 40 plus the number of the color, and the foreground with 30
# Normal Handler on standard output
handler = logging.StreamHandler(sys.stdout)
- if isinstance(handler, logging.StreamHandler) and os.isatty(handler.stream.fileno()):
+ # Check that handler.stream has a fileno() method: when running OpenERP
+ # behind Apache with mod_wsgi, handler.stream will have type mod_wsgi.Log,
+ # which has no fileno() method. (mod_wsgi.Log is what is being bound to
+ # sys.stderr when the logging.StreamHandler is being constructed above.)
+ if isinstance(handler, logging.StreamHandler) \
+ and hasattr(handler.stream, 'fileno') \
+ and os.isatty(handler.stream.fileno()):
formatter = ColoredFormatter(format)
else:
formatter = DBFormatter(format)
threading.current_thread().uid = None
threading.current_thread().dbname = None
- service = None
- if service_name == 'object':
- service = openerp.service.model
- if service_name == 'db':
- service = openerp.service.db
if service_name == 'common':
- service = openerp.service.common
- if service_name == 'report':
- service = openerp.service.report
- result = service.dispatch(method, params)
+ dispatch = openerp.service.common.dispatch
+ elif service_name == 'db':
+ dispatch = openerp.service.db.dispatch
+ elif service_name == 'object':
+ dispatch = openerp.service.model.dispatch
+ elif service_name == 'report':
+ dispatch = openerp.service.report.dispatch
+ else:
+ dispatch = openerp.service.wsgi_server.rpc_handlers.get(service_name)
+ result = dispatch(method, params)
if rpc_request_flag or rpc_response_flag:
end_time = time.time()