[FIX] website_blog: category active
[odoo/odoo.git] / openerpcommand / web.py
index a1eb7ab..5875978 100644 (file)
@@ -4,50 +4,77 @@ Run a normal OpenERP HTTP process.
 
 import logging
 import os
-import threading
-
-import openerp.cli.server
-import openerp.service.wsgi_server
-import openerp.tools.config
+import signal
 
 import common
 
 _logger = logging.getLogger(__name__)
 
-def run(args):
-    os.environ["TZ"] = "UTC"
+def mk_signal_handler(server):
+    def signal_handler(sig, frame):
+        """
+        Specialized signal handler for the evented process.
+        """
+        print "\n\n\nStopping gevent HTTP server...\n\n\n"
+        server.stop()
+    return signal_handler
 
-    if args.addons:
-        args.addons = args.addons.split(':')
-    else:
-        args.addons = []
+def setup_signal_handlers(signal_handler):
+    SIGNALS = (signal.SIGINT, signal.SIGTERM)
+    map(lambda sig: signal.signal(sig, signal_handler), SIGNALS)
 
+def run(args):
+    # Note that gevent monkey patching must be done before importing the
+    # `threading` module, see http://stackoverflow.com/questions/8774958/.
+    if args.gevent:
+        import gevent
+        import gevent.monkey
+        import gevent.wsgi
+        import gevent_psycopg2
+        gevent.monkey.patch_all()
+        gevent_psycopg2.monkey_patch()
+    import threading
+    import openerp
+    import openerp.cli.server
+    import openerp.service.wsgi_server
+    import openerp.tools.config
     config = openerp.tools.config
-    config['addons_path'] = ','.join(args.addons)
+
+    os.environ["TZ"] = "UTC"
+    common.set_addons(args)
+
+    openerp.multi_process = True
+    common.setproctitle('openerp-web')
 
     openerp.cli.server.check_root_user()
     openerp.netsvc.init_logger()
     #openerp.cli.server.report_configuration()
-    openerp.cli.server.configure_babel_localedata_path()
-    openerp.cli.server.setup_signal_handlers()
 
     target = openerp.service.wsgi_server.serve
     if not args.gevent:
+        openerp.evented = False
+        openerp.cli.server.setup_signal_handlers(openerp.cli.server.signal_handler)
+        # TODO openerp.multi_process with a multi-threaded process probably
+        # doesn't work very well (e.g. waiting for all threads to complete
+        # before killing the process is not implemented).
         arg = (args.interface, int(args.port), args.threaded)
         threading.Thread(target=target, args=arg).start()
         openerp.cli.server.quit_on_signals()
     else:
-        config.options["gevent"] = True
-        import gevent.monkey
-        import gevent.wsgi
-        import gevent_psycopg2
-        gevent.monkey.patch_all()
-        gevent_psycopg2.monkey_patch()
+        openerp.evented = True
 
         app = openerp.service.wsgi_server.application
         server = gevent.wsgi.WSGIServer((args.interface, int(args.port)), app)
-        server.serve_forever()
-        # TODO quit_on_signals
+        setup_signal_handlers(mk_signal_handler(server))
+        try:
+            server.serve_forever()
+        except KeyboardInterrupt:
+            try:
+                server.stop()
+                gevent.shutdown()
+            except KeyboardInterrupt:
+                sys.stderr.write("Forced shutdown.\n")
+                gevent.shutdown()
 
 def add_parser(subparsers):
     parser = subparsers.add_parser('web',