94 lines
3.1 KiB
Python
94 lines
3.1 KiB
Python
"""
|
|
Run a normal OpenERP HTTP process.
|
|
"""
|
|
|
|
import logging
|
|
import os
|
|
import signal
|
|
|
|
import common
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
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
|
|
|
|
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
|
|
|
|
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()
|
|
|
|
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:
|
|
openerp.evented = True
|
|
|
|
app = openerp.service.wsgi_server.application
|
|
server = gevent.wsgi.WSGIServer((args.interface, int(args.port)), app)
|
|
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',
|
|
description='Run a normal OpenERP HTTP process. By default a '
|
|
'singly-threaded Werkzeug server is used.')
|
|
common.add_addons_argument(parser)
|
|
parser.add_argument('--interface', default='0.0.0.0',
|
|
help='HTTP interface to listen on (default is %(default)s)')
|
|
parser.add_argument('--port', metavar='INT', default=8069,
|
|
help='HTTP port to listen on (default is %(default)s)')
|
|
parser.add_argument('--threaded', action='store_true',
|
|
help='Use a multithreaded Werkzeug server (incompatible with --gevent)')
|
|
parser.add_argument('--gevent', action='store_true',
|
|
help="Use gevent's WSGI server (incompatible with --threaded)")
|
|
|
|
parser.set_defaults(run=run)
|