[FIX] database restore dont prepend a space before the tempfile
[odoo/odoo.git] / openerp / service / netrpc_server.py
index e3c181d..3252887 100644 (file)
@@ -19,6 +19,8 @@
 #
 ##############################################################################
 
+#.apidoc title: NET-RPC Server
+
 """ This file contains instance of the net-rpc server
 
     
@@ -29,12 +31,14 @@ import socket
 import sys
 import threading
 import traceback
-
+import openerp
 import openerp.netsvc as netsvc
 import openerp.tiny_socket as tiny_socket
 import openerp.tools as tools
 
-class TinySocketClientThread(threading.Thread, netsvc.OpenERPDispatcher):
+_logger = logging.getLogger(__name__)
+
+class TinySocketClientThread(threading.Thread):
     def __init__(self, sock, threads):
         spn = sock and sock.getpeername()
         spn = 'netrpc-client-%s:%s' % spn[0:2]
@@ -45,16 +49,6 @@ class TinySocketClientThread(threading.Thread, netsvc.OpenERPDispatcher):
         self.sock.settimeout(1200)
         self.threads = threads
 
-    def __del__(self):
-        if self.sock:
-            try:
-                self.socket.shutdown(
-                    getattr(socket, 'SHUT_RDWR', 2))
-            except Exception:
-                pass
-            # That should garbage-collect and close it, too
-            self.sock = None
-
     def run(self):
         self.running = True
         try:
@@ -67,38 +61,43 @@ class TinySocketClientThread(threading.Thread, netsvc.OpenERPDispatcher):
         while self.running:
             try:
                 msg = ts.myreceive()
-                result = self.dispatch(msg[0], msg[1], msg[2:])
+                result = netsvc.dispatch_rpc(msg[0], msg[1], msg[2:])
                 ts.mysend(result)
             except socket.timeout:
                 #terminate this channel because other endpoint is gone
                 break
-            except netsvc.OpenERPDispatcherException, e:
-                try:
-                    new_e = Exception(tools.exception_to_unicode(e.exception)) # avoid problems of pickeling
-                    logging.getLogger('web-services').debug("netrpc: rpc-dispatching exception", exc_info=True)
-                    ts.mysend(new_e, exception=True, traceback=e.traceback)
-                except Exception:
-                    #terminate this channel if we can't properly send back the error
-                    logging.getLogger('web-services').exception("netrpc: cannot deliver exception message to client")
-                    break
             except Exception, e:
                 try:
-                    tb = getattr(e, 'traceback', sys.exc_info())
-                    tb_s = "".join(traceback.format_exception(*tb))
-                    logging.getLogger('web-services').debug("netrpc: communication-level exception", exc_info=True)
-                    ts.mysend(e, exception=True, traceback=tb_s)
+                    valid_exception = Exception(netrpc_handle_exception_legacy(e)) 
+                    valid_traceback = getattr(e, 'traceback', sys.exc_info())
+                    formatted_traceback = "".join(traceback.format_exception(*valid_traceback))
+                    _logger.debug("netrpc: communication-level exception", exc_info=True)
+                    ts.mysend(valid_exception, exception=True, traceback=formatted_traceback)
+                    break
                 except Exception, ex:
                     #terminate this channel if we can't properly send back the error
-                    logging.getLogger('web-services').exception("netrpc: cannot deliver exception message to client")
+                    _logger.exception("netrpc: cannot deliver exception message to client")
                     break
 
+        netsvc.close_socket(self.sock)
+        self.sock = None
         self.threads.remove(self)
         self.running = False
         return True
 
     def stop(self):
         self.running = False
-
+        
+def netrpc_handle_exception_legacy(e):
+    if isinstance(e, openerp.osv.osv.except_osv):
+        return 'warning -- ' + e.name + '\n\n' + e.value
+    if isinstance(e, openerp.exceptions.Warning):
+        return 'warning -- Warning\n\n' + str(e)
+    if isinstance(e, openerp.exceptions.AccessError):
+        return 'warning -- AccessError\n\n' + str(e)
+    if isinstance(e, openerp.exceptions.AccessDenied):
+        return 'AccessDenied ' + str(e)
+    return openerp.tools.exception_to_unicode(e)
 
 class TinySocketServerThread(threading.Thread,netsvc.Server):
     def __init__(self, interface, port, secure=False):
@@ -111,8 +110,7 @@ class TinySocketServerThread(threading.Thread,netsvc.Server):
         self.socket.bind((self.__interface, self.__port))
         self.socket.listen(5)
         self.threads = []
-        netsvc.Logger().notifyChannel("web-services", netsvc.LOG_INFO, 
-                         "starting NET-RPC service at %s port %d" % (interface or '0.0.0.0', port,))
+        _logger.info("starting NET-RPC service on %s:%s", interface or '0.0.0.0', port)
 
     def run(self):
         try:
@@ -130,11 +128,10 @@ class TinySocketServerThread(threading.Thread,netsvc.Server):
                 if (lt > 10) and (lt % 10 == 0):
                      # Not many threads should be serving at the same time, so log
                      # their abuse.
-                     netsvc.Logger().notifyChannel("web-services", netsvc.LOG_DEBUG,
-                        "Netrpc: %d threads" % len(self.threads))
+                     _logger.debug("Netrpc: %d threads", len(self.threads))
             self.socket.close()
         except Exception, e:
-            logging.getLogger('web-services').warning("Netrpc: closing because of exception %s" % str(e))
+            _logger.warning("Netrpc: closing because of exception %s" % str(e))
             self.socket.close()
             return False
 
@@ -166,3 +163,5 @@ def init_servers():
         netrpcd = TinySocketServerThread(
             tools.config.get('netrpc_interface', ''), 
             int(tools.config.get('netrpc_port', 8070)))
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: