annotate examples/trac/trac/web/standalone.py @ 39:93b4dcbafd7b trunk

Copy Trac to main branch.
author cmlenz
date Mon, 03 Jul 2006 18:53:27 +0000
parents
children
rev   line source
39
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
1 # -*- coding: utf-8 -*-
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
2 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
3 # Copyright (C) 2003-2006 Edgewall Software
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
4 # Copyright (C) 2003-2005 Jonas Borgström <jonas@edgewall.com>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
5 # Copyright (C) 2005-2006 Matthew Good <trac@matt-good.net>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
6 # Copyright (C) 2005-2006 Christopher Lenz <cmlenz@gmx.de>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
7 # All rights reserved.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
8 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
9 # This software is licensed as described in the file COPYING, which
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
10 # you should have received as part of this distribution. The terms
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
11 # are also available at http://trac.edgewall.com/license.html.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
12 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
13 # This software consists of voluntary contributions made by many
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
14 # individuals. For the exact contribution history, see the revision
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
15 # history and logs, available at http://projects.edgewall.com/trac/.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
16 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
17 # Author: Jonas Borgström <jonas@edgewall.com>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
18 # Matthew Good <trac@matt-good.net>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
19 # Christopher Lenz <cmlenz@gmx.de>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
20
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
21 import errno
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
22 import os
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
23 import sys
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
24 from SocketServer import ThreadingMixIn
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
25
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
26 from trac import __version__ as VERSION
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
27 from trac.util import autoreload, daemon
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
28 from trac.web.auth import BasicAuthentication, DigestAuthentication
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
29 from trac.web.main import dispatch_request
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
30 from trac.web.wsgi import WSGIServer, WSGIRequestHandler
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
31
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
32
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
33 class AuthenticationMiddleware(object):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
34
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
35 def __init__(self, application, auths):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
36 self.application = application
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
37 self.auths = auths
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
38
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
39 def __call__(self, environ, start_response):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
40 path_info = environ.get('PATH_INFO', '')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
41 path_parts = filter(None, path_info.split('/'))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
42 if len(path_parts) > 1 and path_parts[1] == 'login':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
43 env_name = path_parts[0]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
44 if env_name:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
45 auth = self.auths.get(env_name, self.auths.get('*'))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
46 if auth:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
47 remote_user = auth.do_auth(environ, start_response)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
48 if not remote_user:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
49 return []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
50 environ['REMOTE_USER'] = remote_user
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
51 return self.application(environ, start_response)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
52
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
53
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
54 class BasePathMiddleware(object):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
55
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
56 def __init__(self, application, base_path):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
57 self.base_path = '/' + base_path.strip('/')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
58 self.application = application
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
59
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
60 def __call__(self, environ, start_response):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
61 path = environ['SCRIPT_NAME'] + environ.get('PATH_INFO', '')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
62 environ['PATH_INFO'] = path[len(self.base_path):]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
63 environ['SCRIPT_NAME'] = self.base_path
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
64 return self.application(environ, start_response)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
65
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
66
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
67 class TracEnvironMiddleware(object):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
68
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
69 def __init__(self, application, env_parent_dir, env_paths):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
70 self.application = application
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
71 self.environ = {}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
72 self.environ['trac.env_path'] = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
73 if env_parent_dir:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
74 self.environ['trac.env_parent_dir'] = env_parent_dir
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
75 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
76 self.environ['trac.env_paths'] = env_paths
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
77
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
78 def __call__(self, environ, start_response):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
79 for k,v in self.environ.iteritems():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
80 environ.setdefault(k, v)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
81 return self.application(environ, start_response)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
82
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
83
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
84 class TracHTTPServer(ThreadingMixIn, WSGIServer):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
85
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
86 def __init__(self, server_address, application, env_parent_dir, env_paths):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
87 WSGIServer.__init__(self, server_address, application,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
88 request_handler=TracHTTPRequestHandler)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
89
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
90
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
91 class TracHTTPRequestHandler(WSGIRequestHandler):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
92
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
93 server_version = 'tracd/' + VERSION
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
94
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
95
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
96 def main():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
97 from optparse import OptionParser, OptionValueError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
98 parser = OptionParser(usage='usage: %prog [options] [projenv] ...',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
99 version='%%prog %s' % VERSION)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
100
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
101 auths = {}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
102 def _auth_callback(option, opt_str, value, parser, cls):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
103 info = value.split(',', 3)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
104 if len(info) != 3:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
105 raise OptionValueError("Incorrect number of parameters for %s"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
106 % option)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
107
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
108 env_name, filename, realm = info
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
109 if env_name in auths:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
110 print >>sys.stderr, 'Ignoring duplicate authentication option for ' \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
111 'project: %s' % env_name
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
112 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
113 auths[env_name] = cls(filename, realm)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
114
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
115 def _validate_callback(option, opt_str, value, parser, valid_values):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
116 if value not in valid_values:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
117 raise OptionValueError('%s must be one of: %s, not %s'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
118 % (opt_str, '|'.join(valid_values), value))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
119 setattr(parser.values, option.dest, value)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
120
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
121 parser.add_option('-a', '--auth', action='callback', type='string',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
122 metavar='DIGESTAUTH', callback=_auth_callback,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
123 callback_args=(DigestAuthentication,),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
124 help='[projectdir],[htdigest_file],[realm]')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
125 parser.add_option('--basic-auth', action='callback', type='string',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
126 metavar='BASICAUTH', callback=_auth_callback,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
127 callback_args=(BasicAuthentication,),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
128 help='[projectdir],[htpasswd_file],[realm]')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
129
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
130 parser.add_option('-p', '--port', action='store', type='int', dest='port',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
131 help='the port number to bind to')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
132 parser.add_option('-b', '--hostname', action='store', dest='hostname',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
133 help='the host name or IP address to bind to')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
134 parser.add_option('--protocol', action='callback', type="string",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
135 dest='protocol', callback=_validate_callback,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
136 callback_args=(('http', 'scgi', 'ajp'),),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
137 help='http|scgi|ajp')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
138 parser.add_option('-e', '--env-parent-dir', action='store',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
139 dest='env_parent_dir', metavar='PARENTDIR',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
140 help='parent directory of the project environments')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
141 parser.add_option('--base-path', action='store', type='string', # XXX call this url_base_path?
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
142 dest='base_path',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
143 help='base path')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
144
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
145 parser.add_option('-r', '--auto-reload', action='store_true',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
146 dest='autoreload',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
147 help='restart automatically when sources are modified')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
148
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
149 if os.name == 'posix':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
150 parser.add_option('-d', '--daemonize', action='store_true',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
151 dest='daemonize',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
152 help='run in the background as a daemon')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
153 parser.add_option('--pidfile', action='store',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
154 dest='pidfile',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
155 help='When daemonizing, file to which to write pid')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
156
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
157 parser.set_defaults(port=None, hostname='', base_path='', daemonize=False,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
158 protocol='http')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
159 options, args = parser.parse_args()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
160
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
161 if not args and not options.env_parent_dir:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
162 parser.error('either the --env-parent-dir option or at least one '
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
163 'environment must be specified')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
164
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
165 if options.port is None:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
166 options.port = {
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
167 'http': 80,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
168 'scgi': 4000,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
169 'ajp': 8009,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
170 }[options.protocol]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
171 server_address = (options.hostname, options.port)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
172
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
173 wsgi_app = TracEnvironMiddleware(dispatch_request,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
174 options.env_parent_dir, args)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
175 if auths:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
176 wsgi_app = AuthenticationMiddleware(wsgi_app, auths)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
177 base_path = options.base_path.strip('/')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
178 if base_path:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
179 wsgi_app = BasePathMiddleware(wsgi_app, base_path)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
180
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
181 if options.protocol == 'http':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
182 def serve():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
183 httpd = TracHTTPServer(server_address, wsgi_app,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
184 options.env_parent_dir, args)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
185 httpd.serve_forever()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
186 elif options.protocol in ('scgi', 'ajp'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
187 def serve():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
188 server_cls = __import__('flup.server.%s' % options.protocol,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
189 None, None, ['']).WSGIServer
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
190 ret = server_cls(wsgi_app, bindAddress=server_address).run()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
191 sys.exit(ret and 42 or 0) # if SIGHUP exit with status 42
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
192
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
193 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
194 if os.name == 'posix':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
195 if options.pidfile:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
196 options.pidfile = os.path.abspath(options.pidfile)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
197 if os.path.exists(options.pidfile):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
198 pidfile = open(options.pidfile)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
199 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
200 pid = int(pidfile.read())
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
201 finally:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
202 pidfile.close()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
203
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
204 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
205 # signal the process to see if it is still running
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
206 os.kill(pid, 0)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
207 except OSError, e:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
208 if e.errno != errno.ESRCH:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
209 raise
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
210 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
211 sys.exit("tracd is already running with pid %s" % pid)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
212 realserve = serve
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
213 def serve():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
214 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
215 pidfile = open(options.pidfile, 'w')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
216 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
217 pidfile.write(str(os.getpid()))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
218 finally:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
219 pidfile.close()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
220 realserve()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
221 finally:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
222 if os.path.exists(options.pidfile):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
223 os.remove(options.pidfile)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
224
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
225 if options.daemonize:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
226 daemon.daemonize()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
227
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
228 if options.autoreload:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
229 def modification_callback(file):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
230 print>>sys.stderr, 'Detected modification of %s, restarting.' \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
231 % file
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
232 autoreload.main(serve, modification_callback)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
233 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
234 serve()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
235
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
236 except OSError:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
237 sys.exit(1)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
238 except KeyboardInterrupt:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
239 pass
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
240
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
241 if __name__ == '__main__':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
242 main()
Copyright (C) 2012-2017 Edgewall Software