2 Run a normal OpenERP HTTP process.
11 _logger = logging.getLogger(__name__)
13 def mk_signal_handler(server):
14 def signal_handler(sig, frame):
16 Specialized signal handler for the evented process.
18 print "\n\n\nStopping gevent HTTP server...\n\n\n"
22 def setup_signal_handlers(signal_handler):
23 SIGNALS = (signal.SIGINT, signal.SIGTERM)
24 map(lambda sig: signal.signal(sig, signal_handler), SIGNALS)
27 # Note that gevent monkey patching must be done before importing the
28 # `threading` module, see http://stackoverflow.com/questions/8774958/.
33 import gevent_psycopg2
34 gevent.monkey.patch_all()
35 gevent_psycopg2.monkey_patch()
38 import openerp.cli.server
39 import openerp.service.wsgi_server
40 import openerp.tools.config
41 config = openerp.tools.config
43 os.environ["TZ"] = "UTC"
44 common.set_addons(args)
46 openerp.multi_process = True
47 common.setproctitle('openerp-web')
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()
54 target = openerp.service.wsgi_server.serve
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()
65 openerp.evented = True
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))
71 server.serve_forever()
72 except KeyboardInterrupt:
76 except KeyboardInterrupt:
77 sys.stderr.write("Forced shutdown.\n")
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)")
94 parser.set_defaults(run=run)