[FIX] various fixes to setup.py and non-embedded launcher script, courtesy of Xavier...
[odoo/odoo.git] / openerp-web
1 #!/usr/bin/env python
2 import optparse
3 import os
4 import sys
5 import json
6 import tempfile
7 import logging
8 import logging.config
9
10 import werkzeug.serving
11 import werkzeug.contrib.fixers
12
13 optparser = optparse.OptionParser()
14 optparser.add_option("-s", "--session-path", dest="session_storage",
15                      default=os.path.join(tempfile.gettempdir(), "oe-sessions"),
16                      help="directory used for session storage", metavar="DIR")
17 optparser.add_option("--server-host", dest="server_host",
18                      default='127.0.0.1', help="OpenERP server hostname", metavar="HOST")
19 optparser.add_option("--server-port", dest="server_port", default=8069,
20                      help="OpenERP server port", type="int", metavar="NUMBER")
21 optparser.add_option("--db-filter", dest="dbfilter", default='.*',
22                      help="Filter listed database", metavar="REGEXP")
23 optparser.add_option('--addons-path', dest='addons_path', default=[], action='append',
24                     help="Path do addons directory", metavar="PATH")
25 optparser.add_option('--load', dest='server_wide_modules', default=['web'], action='append',
26                     help="Load a additional module before login (by default only 'web' is loaded)", metavar="MODULE")
27
28 server_options = optparse.OptionGroup(optparser, "Server configuration")
29 server_options.add_option("-p", "--port", dest="socket_port", default=8002,
30                           help="listening port", type="int", metavar="NUMBER")
31 server_options.add_option('--reloader', dest='reloader',
32                           default=False, action='store_true',
33                           help="Reload application when python files change")
34 server_options.add_option('--no-serve-static', dest='serve_static',
35                           default=True, action='store_false',
36                           help="Do not serve static files via this server")
37 server_options.add_option('--multi-threaded', dest='threaded',
38                           default=False, action='store_true',
39                           help="Spawn one thread per HTTP request")
40 server_options.add_option('--proxy-mode', dest='proxy_mode',
41                           default=False, action='store_true',
42                           help="Enable correct behavior when behind a reverse proxy")
43 optparser.add_option_group(server_options)
44
45 logging_opts = optparse.OptionGroup(optparser, "Logging")
46 logging_opts.add_option("--log-level", dest="log_level", type="choice",
47                         default='debug', help="Global logging level", metavar="LOG_LEVEL",
48                         choices=['debug', 'info', 'warning', 'error', 'critical'])
49 logging_opts.add_option("--log-config", dest="log_config", default=os.path.join(os.path.dirname(__file__), "logging.json"),
50                         help="Logging configuration file", metavar="FILE")
51 optparser.add_option_group(logging_opts)
52
53
54 if __name__ == "__main__":
55     (options, args) = optparser.parse_args(sys.argv[1:])
56
57     if not options.addons_path:
58         path_root = os.path.dirname(os.path.abspath(__file__))
59         path_addons = os.path.join(path_root, 'addons')
60         if os.path.exists(path_addons):
61             options.addons_path.append(path_addons)
62
63     def remove_end_slash(text):
64         if text[-1] in '/\\':
65             return text[:-1]
66         return text
67
68     def drop_false_path(path):
69         if os.path.exists(path):
70             return True
71
72     options.addons_path = map(remove_end_slash, options.addons_path)
73     options.addons_path = filter(drop_false_path, options.addons_path)
74
75     for path_addons in options.addons_path:
76         if path_addons not in sys.path:
77             sys.path.insert(0, path_addons)
78
79     try:
80         import web.common.http
81     except ImportError:
82         optparser.error('Error Importing base web module. Check correctness of --addons-path.')
83
84     options.backend =  'xmlrpc'
85     os.environ["TZ"] = "UTC"
86
87     if sys.version_info >= (2, 7) and os.path.exists(options.log_config):
88         with open(options.log_config) as file:
89             dct = json.load(file)
90         logging.config.dictConfig(dct)
91         logging.getLogger("").setLevel(getattr(logging, options.log_level.upper()))
92     else:
93         logging.basicConfig(level=getattr(logging, options.log_level.upper()))
94
95     app = web.common.http.Root(options)
96
97     if options.proxy_mode:
98         app = werkzeug.contrib.fixers.ProxyFix(app)
99
100     werkzeug.serving.run_simple(
101         '0.0.0.0', options.socket_port, app,
102         use_reloader=options.reloader, threaded=options.threaded)
103