[MERGE] Gantt view fix/update. This addons branch adds the progress attribute on...
[odoo/odoo.git] / openerpcommand / web.py
1 """
2 Run a normal OpenERP HTTP process.
3 """
4
5 import logging
6 import os
7 import signal
8
9 import common
10
11 _logger = logging.getLogger(__name__)
12
13 def mk_signal_handler(server):
14     def signal_handler(sig, frame):
15         """
16         Specialized signal handler for the evented process.
17         """
18         print "\n\n\nStopping gevent HTTP server...\n\n\n"
19         server.stop()
20     return signal_handler
21
22 def setup_signal_handlers(signal_handler):
23     SIGNALS = (signal.SIGINT, signal.SIGTERM)
24     map(lambda sig: signal.signal(sig, signal_handler), SIGNALS)
25
26 def run(args):
27     # Note that gevent monkey patching must be done before importing the
28     # `threading` module, see http://stackoverflow.com/questions/8774958/.
29     if args.gevent:
30         import gevent
31         import gevent.monkey
32         import gevent.wsgi
33         import gevent_psycopg2
34         gevent.monkey.patch_all()
35         gevent_psycopg2.monkey_patch()
36     import threading
37     import openerp
38     import openerp.cli.server
39     import openerp.service.wsgi_server
40     import openerp.tools.config
41     config = openerp.tools.config
42
43     os.environ["TZ"] = "UTC"
44     common.set_addons(args)
45
46     openerp.multi_process = True
47     common.setproctitle('openerp-web')
48
49     openerp.cli.server.check_root_user()
50     openerp.netsvc.init_logger()
51     #openerp.cli.server.report_configuration()
52     openerp.cli.server.configure_babel_localedata_path()
53
54     target = openerp.service.wsgi_server.serve
55     if not args.gevent:
56         openerp.evented = False
57         openerp.cli.server.setup_signal_handlers(openerp.cli.server.signal_handler)
58         # TODO openerp.multi_process with a multi-threaded process probably
59         # doesn't work very well (e.g. waiting for all threads to complete
60         # before killing the process is not implemented).
61         arg = (args.interface, int(args.port), args.threaded)
62         threading.Thread(target=target, args=arg).start()
63         openerp.cli.server.quit_on_signals()
64     else:
65         openerp.evented = True
66
67         app = openerp.service.wsgi_server.application
68         server = gevent.wsgi.WSGIServer((args.interface, int(args.port)), app)
69         setup_signal_handlers(mk_signal_handler(server))
70         try:
71             server.serve_forever()
72         except KeyboardInterrupt:
73             try:
74                 server.stop()
75                 gevent.shutdown()
76             except KeyboardInterrupt:
77                 sys.stderr.write("Forced shutdown.\n")
78                 gevent.shutdown()
79
80 def add_parser(subparsers):
81     parser = subparsers.add_parser('web',
82         description='Run a normal OpenERP HTTP process. By default a '
83         'singly-threaded Werkzeug server is used.')
84     common.add_addons_argument(parser)
85     parser.add_argument('--interface', default='0.0.0.0',
86         help='HTTP interface to listen on (default is %(default)s)')
87     parser.add_argument('--port', metavar='INT', default=8069,
88         help='HTTP port to listen on (default is %(default)s)')
89     parser.add_argument('--threaded', action='store_true',
90         help='Use a multithreaded Werkzeug server (incompatible with --gevent)')
91     parser.add_argument('--gevent', action='store_true',
92         help="Use gevent's WSGI server (incompatible with --threaded)")
93
94     parser.set_defaults(run=run)