[REF] Clean the old code
bzr revid: stephane@tinyerp.com-20090105185520-ctkecsx6dagy3jkk
This commit is contained in:
parent
390780c216
commit
6d1312b739
176
bin/netsvc.py
176
bin/netsvc.py
|
@ -38,81 +38,22 @@ import time
|
||||||
import xmlrpclib
|
import xmlrpclib
|
||||||
import release
|
import release
|
||||||
|
|
||||||
_service = {}
|
SERVICES = {}
|
||||||
_group = {}
|
GROUPS = {}
|
||||||
_res_id = 1
|
|
||||||
_res = {}
|
|
||||||
|
|
||||||
class ServiceEndPointCall(object):
|
|
||||||
def __init__(self, id, method):
|
|
||||||
self._id = id
|
|
||||||
self._meth = method
|
|
||||||
|
|
||||||
def __call__(self, *args):
|
|
||||||
_res[self._id] = self._meth(*args)
|
|
||||||
return self._id
|
|
||||||
|
|
||||||
|
|
||||||
class ServiceEndPoint(object):
|
|
||||||
def __init__(self, name, id):
|
|
||||||
self._id = id
|
|
||||||
self._meth = {}
|
|
||||||
s = _service[name]
|
|
||||||
for m in s._method:
|
|
||||||
self._meth[m] = s._method[m]
|
|
||||||
|
|
||||||
def __getattr__(self, name):
|
|
||||||
return ServiceEndPointCall(self._id, self._meth[name])
|
|
||||||
|
|
||||||
|
|
||||||
class Service(object):
|
class Service(object):
|
||||||
_serviceEndPointID = 0
|
|
||||||
|
|
||||||
def __init__(self, name, audience=''):
|
def __init__(self, name, audience=''):
|
||||||
_service[name] = self
|
SERVICES[name] = self
|
||||||
self.__name = name
|
self.__name = name
|
||||||
self._method = {}
|
self._methods = {}
|
||||||
self.exportedMethods = None
|
|
||||||
self._response_process = None
|
|
||||||
self._response_process_id = None
|
|
||||||
self._response = None
|
self._response = None
|
||||||
|
|
||||||
def joinGroup(self, name):
|
def joinGroup(self, name):
|
||||||
if not name in _group:
|
GROUPS.setdefault(name, {})[self.__name] = self
|
||||||
_group[name] = {}
|
|
||||||
_group[name][self.__name] = self
|
|
||||||
|
|
||||||
def exportMethod(self, m):
|
def exportMethod(self, method):
|
||||||
if callable(m):
|
if callable(method):
|
||||||
self._method[m.__name__] = m
|
self._methods[method.__name__] = method
|
||||||
|
|
||||||
def serviceEndPoint(self, s):
|
|
||||||
if Service._serviceEndPointID >= 2**16:
|
|
||||||
Service._serviceEndPointID = 0
|
|
||||||
Service._serviceEndPointID += 1
|
|
||||||
return ServiceEndPoint(s, self._serviceEndPointID)
|
|
||||||
|
|
||||||
def conversationId(self):
|
|
||||||
return 1
|
|
||||||
|
|
||||||
def processResponse(self, s, id):
|
|
||||||
self._response_process, self._response_process_id = s, id
|
|
||||||
|
|
||||||
def processFailure(self, s, id):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def resumeResponse(self, s):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def cancelResponse(self, s):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def suspendResponse(self, s):
|
|
||||||
if self._response_process:
|
|
||||||
self._response_process(self._response_process_id,
|
|
||||||
_res[self._response_process_id])
|
|
||||||
self._response_process = None
|
|
||||||
self._response = s(self._response_process_id)
|
|
||||||
|
|
||||||
def abortResponse(self, error, description, origin, details):
|
def abortResponse(self, error, description, origin, details):
|
||||||
if not tools.config['debug_mode']:
|
if not tools.config['debug_mode']:
|
||||||
|
@ -120,24 +61,19 @@ class Service(object):
|
||||||
else:
|
else:
|
||||||
raise
|
raise
|
||||||
|
|
||||||
def currentFailure(self, s):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class LocalService(Service):
|
class LocalService(Service):
|
||||||
def __init__(self, name):
|
def __init__(self, name):
|
||||||
self.__name = name
|
self.__name = name
|
||||||
try:
|
try:
|
||||||
s = _service[name]
|
self._service = SERVICES[name]
|
||||||
self._service = s
|
for method_name, method_definition in self._service._methods.items():
|
||||||
for m in s._method:
|
setattr(self, method_name, method_definition)
|
||||||
setattr(self, m, s._method[m])
|
|
||||||
except KeyError, keyError:
|
except KeyError, keyError:
|
||||||
Logger().notifyChannel('module', LOG_ERROR, 'This service does not exists: %s' % (str(keyError),) )
|
Logger().notifyChannel('module', LOG_ERROR, 'This service does not exists: %s' % (str(keyError),) )
|
||||||
raise
|
raise
|
||||||
|
|
||||||
def service_exist(name):
|
def service_exist(name):
|
||||||
return _service.get(name, False)
|
return SERVICES.get(name, False)
|
||||||
|
|
||||||
LOG_NOTSET = 'notset'
|
LOG_NOTSET = 'notset'
|
||||||
LOG_DEBUG_RPC = 'debug_rpc'
|
LOG_DEBUG_RPC = 'debug_rpc'
|
||||||
|
@ -268,26 +204,30 @@ class xmlrpc(object):
|
||||||
def __init__(self, name):
|
def __init__(self, name):
|
||||||
self.name = name
|
self.name = name
|
||||||
|
|
||||||
class GenericXMLRPCRequestHandler:
|
class OpenERPDispatcherException(Exception):
|
||||||
|
def __init__(self, exception, traceback):
|
||||||
|
self.exception = exception
|
||||||
|
self.traceback = traceback
|
||||||
|
|
||||||
|
class OpenERPDispatcher:
|
||||||
def log(self, title, msg):
|
def log(self, title, msg):
|
||||||
from pprint import pformat
|
from pprint import pformat
|
||||||
Logger().notifyChannel('XMLRPC-%s' % title, LOG_DEBUG_RPC, pformat(msg))
|
Logger().notifyChannel('%s' % title, LOG_DEBUG_RPC, pformat(msg))
|
||||||
|
|
||||||
def _dispatch(self, method, params):
|
def dispatch(self, service_name, method, params):
|
||||||
try:
|
try:
|
||||||
|
self.log('service', service_name)
|
||||||
self.log('method', method)
|
self.log('method', method)
|
||||||
self.log('params', params)
|
self.log('params', params)
|
||||||
n = self.path.split("/")[-1]
|
service = LocalService(service_name)
|
||||||
s = LocalService(n)
|
method_call = getattr(service, method)
|
||||||
m = getattr(s, method)
|
service._service.response = None
|
||||||
s._service._response = None
|
result = method_call(*params)
|
||||||
r = m(*params)
|
response = service._service._response
|
||||||
self.log('result', r)
|
if response is not None:
|
||||||
res = s._service._response
|
result = response
|
||||||
if res is not None:
|
self.log('result', result)
|
||||||
r = res
|
return result
|
||||||
self.log('res',r)
|
|
||||||
return r
|
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
self.log('exception', e)
|
self.log('exception', e)
|
||||||
tb = sys.exc_info()
|
tb = sys.exc_info()
|
||||||
|
@ -295,7 +235,15 @@ class GenericXMLRPCRequestHandler:
|
||||||
if tools.config['debug_mode']:
|
if tools.config['debug_mode']:
|
||||||
import pdb
|
import pdb
|
||||||
pdb.post_mortem(tb[2])
|
pdb.post_mortem(tb[2])
|
||||||
raise xmlrpclib.Fault(str(e), tb_s)
|
raise OpenERPDispatcherException(e, tb_s)
|
||||||
|
|
||||||
|
class GenericXMLRPCRequestHandler(OpenERPDispatcher):
|
||||||
|
def _dispatch(self, method, params):
|
||||||
|
try:
|
||||||
|
service_name = self.path.split("/")[-1]
|
||||||
|
return self.dispatch(service_name, method, params)
|
||||||
|
except OpenERPDispatcherException, e:
|
||||||
|
raise xmlrpclib.Fault(str(e.exception), e.traceback)
|
||||||
|
|
||||||
class SSLSocket(object):
|
class SSLSocket(object):
|
||||||
def __init__(self, socket):
|
def __init__(self, socket):
|
||||||
|
@ -315,7 +263,7 @@ class SSLSocket(object):
|
||||||
return getattr(self.socket, name)
|
return getattr(self.socket, name)
|
||||||
|
|
||||||
class SimpleXMLRPCRequestHandler(GenericXMLRPCRequestHandler, SimpleXMLRPCServer.SimpleXMLRPCRequestHandler):
|
class SimpleXMLRPCRequestHandler(GenericXMLRPCRequestHandler, SimpleXMLRPCServer.SimpleXMLRPCRequestHandler):
|
||||||
rpc_paths = map(lambda s: '/xmlrpc/%s' % s, _service)
|
rpc_paths = map(lambda s: '/xmlrpc/%s' % s, SERVICES.keys())
|
||||||
|
|
||||||
class SecureXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
class SecureXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
||||||
def setup(self):
|
def setup(self):
|
||||||
|
@ -348,11 +296,10 @@ class HttpDaemon(threading.Thread):
|
||||||
from OpenSSL.SSL import Error as SSLError
|
from OpenSSL.SSL import Error as SSLError
|
||||||
else:
|
else:
|
||||||
class SSLError(Exception): pass
|
class SSLError(Exception): pass
|
||||||
|
try:
|
||||||
try:
|
|
||||||
self.server = server_class((interface, port), handler_class, 0)
|
self.server = server_class((interface, port), handler_class, 0)
|
||||||
except SSLError, e:
|
except SSLError, e:
|
||||||
Logger().notifyChannel('xml-rpc-ssl', LOG_CRITICAL, "Can't load the certificate and/or the private key files")
|
Logger().notifyChannel('xml-rpc-ssl', LOG_CRITICAL, "Can not load the certificate and/or the private key files")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
Logger().notifyChannel('xml-rpc', LOG_CRITICAL, "Error occur when strarting the server daemon: %s" % (e,))
|
Logger().notifyChannel('xml-rpc', LOG_CRITICAL, "Error occur when strarting the server daemon: %s" % (e,))
|
||||||
|
@ -385,19 +332,13 @@ class HttpDaemon(threading.Thread):
|
||||||
#signal.alarm(0) # Disable the alarm
|
#signal.alarm(0) # Disable the alarm
|
||||||
|
|
||||||
import tiny_socket
|
import tiny_socket
|
||||||
class TinySocketClientThread(threading.Thread):
|
class TinySocketClientThread(threading.Thread, OpenERPDispatcher):
|
||||||
def __init__(self, sock, threads):
|
def __init__(self, sock, threads):
|
||||||
threading.Thread.__init__(self)
|
threading.Thread.__init__(self)
|
||||||
self.sock = sock
|
self.sock = sock
|
||||||
self.threads = threads
|
self.threads = threads
|
||||||
self._logger = Logger()
|
|
||||||
|
|
||||||
def log(self, msg):
|
|
||||||
from pprint import pformat
|
|
||||||
self._logger.notifyChannel('NETRPC', LOG_DEBUG_RPC, pformat(msg))
|
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
import time
|
|
||||||
import select
|
import select
|
||||||
self.running = True
|
self.running = True
|
||||||
try:
|
try:
|
||||||
|
@ -414,27 +355,12 @@ class TinySocketClientThread(threading.Thread):
|
||||||
self.threads.remove(self)
|
self.threads.remove(self)
|
||||||
return False
|
return False
|
||||||
try:
|
try:
|
||||||
self.log(msg)
|
result = self.dispatch(msg[0], msg[1], msg[2:])
|
||||||
service = LocalService(msg[0])
|
ts.mysend(result)
|
||||||
method = getattr(service, msg[1])
|
except OpenERPDispatcherException, e:
|
||||||
service._service._response = None
|
new_e = Exception(tools.ustr(e.exception)) # avoid problems of pickeling
|
||||||
result_from_method = method(*msg[2:])
|
ts.mysend(new_e, exception=True, traceback=e.traceback)
|
||||||
res = service._service._response
|
|
||||||
if res != None:
|
|
||||||
result_from_method = res
|
|
||||||
self.log(result_from_method)
|
|
||||||
ts.mysend(result_from_method)
|
|
||||||
except Exception, e:
|
|
||||||
self.log(e)
|
|
||||||
tb = sys.exc_info()
|
|
||||||
tb_s = "".join(traceback.format_exception(*tb))
|
|
||||||
if tools.config['debug_mode']:
|
|
||||||
import pdb
|
|
||||||
pdb.post_mortem(tb[2])
|
|
||||||
e = Exception(tools.ustr(e)) # avoid problems of pickeling
|
|
||||||
ts.mysend(e, exception=True, traceback=tb_s)
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
self.sock.close()
|
self.sock.close()
|
||||||
self.threads.remove(self)
|
self.threads.remove(self)
|
||||||
return True
|
return True
|
||||||
|
@ -481,8 +407,4 @@ class TinySocketServerThread(threading.Thread):
|
||||||
except:
|
except:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||||
|
|
||||||
|
|
|
@ -87,7 +87,6 @@ class osv_pool(netsvc.Service):
|
||||||
self._init_parent = {}
|
self._init_parent = {}
|
||||||
netsvc.Service.__init__(self, 'object_proxy', audience='')
|
netsvc.Service.__init__(self, 'object_proxy', audience='')
|
||||||
self.joinGroup('web-services')
|
self.joinGroup('web-services')
|
||||||
self.exportMethod(self.exportedMethods)
|
|
||||||
self.exportMethod(self.obj_list)
|
self.exportMethod(self.obj_list)
|
||||||
self.exportMethod(self.exec_workflow)
|
self.exportMethod(self.exec_workflow)
|
||||||
self.exportMethod(self.execute)
|
self.exportMethod(self.execute)
|
||||||
|
|
Loading…
Reference in New Issue