diff --git a/openerp/service/wsgi_server.py b/openerp/service/wsgi_server.py index 67436a1c0bf..c9294365d71 100644 --- a/openerp/service/wsgi_server.py +++ b/openerp/service/wsgi_server.py @@ -410,22 +410,15 @@ def application(environ, start_response): # The WSGI server, started by start_server(), stopped by stop_server(). httpd = None -def serve(): +def serve(interface, port, threaded): """ Serve HTTP requests via werkzeug development server. - If werkzeug can not be imported, we fall back to wsgiref's simple_server. - Calling this function is blocking, you might want to call it in its own thread. """ global httpd - - # TODO Change the xmlrpc_* options to http_* - interface = config['xmlrpc_interface'] or '0.0.0.0' - port = config['xmlrpc_port'] - httpd = werkzeug.serving.make_server(interface, port, application, threaded=True) - _logger.info('HTTP service (werkzeug) running on %s:%s', interface, port) + httpd = werkzeug.serving.make_server(interface, port, application, threaded=threaded) httpd.serve_forever() def start_service(): @@ -433,7 +426,11 @@ def start_service(): The WSGI server can be shutdown with stop_server() below. """ - threading.Thread(target=serve).start() + # TODO Change the xmlrpc_* options to http_* + interface = config['xmlrpc_interface'] or '0.0.0.0' + port = config['xmlrpc_port'] + _logger.info('HTTP service (werkzeug) running on %s:%s', interface, port) + threading.Thread(target=serve, args=(interface, port, True)).start() def stop_service(): """ Initiate the shutdown of the WSGI server. diff --git a/openerpcommand/__init__.py b/openerpcommand/__init__.py index 53d456c7639..5a243ded229 100644 --- a/openerpcommand/__init__.py +++ b/openerpcommand/__init__.py @@ -17,9 +17,10 @@ from . import run_tests from . import scaffold from . import uninstall from . import update +from . import web command_list_server = (conf, drop, initialize, model, module, read, run_tests, - scaffold, uninstall, update, ) + scaffold, uninstall, update, web, ) command_list_client = (Call, Open, Show, ConsumeNothing, ConsumeMemory, LeakMemory, ConsumeCPU, Bench, BenchRead, diff --git a/openerpcommand/web.py b/openerpcommand/web.py new file mode 100644 index 00000000000..632aa482646 --- /dev/null +++ b/openerpcommand/web.py @@ -0,0 +1,56 @@ +""" +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 common + +_logger = logging.getLogger(__name__) + +def run(args): + os.environ["TZ"] = "UTC" + + if args.addons: + args.addons = args.addons.split(':') + else: + args.addons = [] + + config = openerp.tools.config + config['addons_path'] = ','.join(args.addons) + + 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: + arg = (args.interface, int(args.port), args.threaded) + threading.Thread(target=target, args=arg).start() + openerp.cli.server.quit_on_signals() + else: + print "The --gevent option is not yet implemented." + +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)