~loggerhead-team/loggerhead/trunk-rich

161 by Michael Hudson
don't insist on python 2.4
1
#!/usr/bin/env python
183.2.1 by John Arbash Meinel
Add Copyright information to most files.
2
# This program is free software; you can redistribute it and/or modify
3
# it under the terms of the GNU General Public License as published by
4
# the Free Software Foundation; either version 2 of the License, or
5
# (at your option) any later version.
6
#
7
# This program is distributed in the hope that it will be useful,
8
# but WITHOUT ANY WARRANTY; without even the implied warranty of
9
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10
# GNU General Public License for more details.
11
#
12
# You should have received a copy of the GNU General Public License
13
# along with this program; if not, write to the Free Software
14
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
15
16
"""A script for starting the loggerhead process."""
17
89 by Robey Pointer
fix up dev.cfg so that nobody will ever have to edit it, by letting the
18
93 by Robey Pointer
slight cleanup, and add '-f' option for running in the foreground.
19
import logging
159.2.46 by Michael Hudson
add explicit import of logging.handlers
20
import logging.handlers
166.1.2 by Michael Hudson
more loggerhead.conf compatible vhosting
21
from optparse import OptionParser
89 by Robey Pointer
fix up dev.cfg so that nobody will ever have to edit it, by letting the
22
import os
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
23
import sys
166.1.2 by Michael Hudson
more loggerhead.conf compatible vhosting
24
import urlparse
89 by Robey Pointer
fix up dev.cfg so that nobody will ever have to edit it, by letting the
25
270.1.1 by Michael Hudson
defer loading of plugins until after we've set up the logging
26
from bzrlib.plugin import load_plugins
255.1.1 by Jelmer Vernooij
Fix import of ConfigObj.
27
from bzrlib.util.configobj.configobj import ConfigObj
159.2.50 by Michael Hudson
reorder imports in start-loggerhead.py
28
159.2.28 by Michael Hudson
woohoo it works
29
from paste import httpserver
30
from paste.httpexceptions import make_middleware
31
from paste.translogger import make_filter
1 by Robey Pointer
initial checkin
32
204 by Martin Albisetti
Clean up unused/inexistant import
33
from loggerhead import daemon
159.2.50 by Michael Hudson
reorder imports in start-loggerhead.py
34
from loggerhead.apps.config import Root
217.1.1 by Guillermo Gonzalez
* refactor of logging-related functions (setup_logging and make_handler) into (new) trace module
35
from loggerhead.trace import make_handler, setup_logging
217.1.4 by Guillermo Gonzalez
* new apps module: "error" and ErrorHandlerApp middleware
36
from loggerhead.apps.error import ErrorHandlerApp
93 by Robey Pointer
slight cleanup, and add '-f' option for running in the foreground.
37
230.1.1 by Steve 'Ashcrow' Milner
Updated to follow pep8.
38
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
39
def main():
197.1.4 by Jelmer Vernooij
Add --pidfile argument to start-loggerhead.
40
    home = os.path.realpath(os.path.dirname(__file__))
41
    default_pidfile = os.path.join(home, 'loggerhead.pid')
197.1.5 by Jelmer Vernooij
Add --configfile argument.
42
    default_configfile = os.path.join(home, 'loggerhead.conf')
197.1.6 by Jelmer Vernooij
add --log-folder option.
43
    default_log_folder = os.path.join(home, 'logs')
205 by Martin Albisetti
Further cleaning
44
    parser = OptionParser(usage='usage: %prog [options]', version='%prog')
230.1.1 by Steve 'Ashcrow' Milner
Updated to follow pep8.
45
    parser.add_option('-f', '--foreground',
46
                      action='store_true', dest='foreground', default=False,
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
47
                      help="run in the foreground; don't daemonize")
230.1.1 by Steve 'Ashcrow' Milner
Updated to follow pep8.
48
    parser.add_option('-C', '--check', action='store_true',
49
                      dest='check', default=False,
50
                      help=("only start if not already running (useful for "
51
                            "cron jobs)"))
52
    parser.add_option('-p', '--pidfile', dest="pidfile",
53
                      default=default_pidfile,
197.2.1 by Jelmer Vernooij
Fix syntax.
54
                      type=str, help="override pidfile location")
230.1.1 by Steve 'Ashcrow' Milner
Updated to follow pep8.
55
    parser.add_option('-c', '--config-file', dest="configfile",
56
                      default=default_configfile,
57
                      type=str, help="override configuration file location")
58
    parser.add_option('-L', '--log-folder', dest="log_folder",
59
                      default=default_log_folder,
197.2.1 by Jelmer Vernooij
Fix syntax.
60
                      type=str, help="override log file directory")
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
61
    options, args = parser.parse_args()
62
    if len(args) > 0:
63
        parser.error('No filename arguments are used, only options.')
159.2.27 by Michael Hudson
begin a compatibility app
64
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
65
    if options.check:
197.1.4 by Jelmer Vernooij
Add --pidfile argument to start-loggerhead.
66
        if daemon.is_running(options.pidfile):
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
67
            sys.exit(0)
230.1.1 by Steve 'Ashcrow' Milner
Updated to follow pep8.
68
        sys.stderr.write('Did not find loggerhead running in %r;' % (
69
                         options.pidfile))
70
        sys.stderr.write(' restarting...\n')
159.2.27 by Michael Hudson
begin a compatibility app
71
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
72
    # read loggerhead config
159.2.27 by Michael Hudson
begin a compatibility app
73
197.1.5 by Jelmer Vernooij
Add --configfile argument.
74
    config = ConfigObj(options.configfile, encoding='utf-8')
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
75
    extra_path = config.get('bzrpath', None)
76
    if extra_path:
77
        sys.path.insert(0, extra_path)
159.2.27 by Michael Hudson
begin a compatibility app
78
230.1.1 by Steve 'Ashcrow' Milner
Updated to follow pep8.
79
    potential_overrides = [('server.socket_port', int),
80
                           ('server.webpath', str),
81
                           ('server.thread_pool', int),
82
                           ('server.socket_host', str)]
159.2.36 by Michael Hudson
more compatibility
83
    server_port = int(config.get('server.socket_port', 8080))
84
    nworkers = int(config.get('server.thread_pool', 10))
85
    server_host = config.get('server.socket_host', '0.0.0.0')
86
    webpath = config.get('server.webpath', None)
87
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
88
    for key, keytype in potential_overrides:
89
        value = config.get(key, None)
90
        if value is not None:
91
            value = keytype(value)
159.2.28 by Michael Hudson
woohoo it works
92
159.2.29 by Michael Hudson
re-enable daemonization, remove require("TurboGears")
93
    if not options.foreground:
94
        sys.stderr.write('\n')
95
        sys.stderr.write('Launching loggerhead into the background.\n')
230.1.1 by Steve 'Ashcrow' Milner
Updated to follow pep8.
96
        sys.stderr.write('PID file: %s\n' % options.pidfile)
159.2.29 by Michael Hudson
re-enable daemonization, remove require("TurboGears")
97
        sys.stderr.write('\n')
159.2.28 by Michael Hudson
woohoo it works
98
197.1.4 by Jelmer Vernooij
Add --pidfile argument to start-loggerhead.
99
        daemon.daemonize(options.pidfile, home)
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
100
197.1.6 by Jelmer Vernooij
add --log-folder option.
101
    setup_logging(options.log_folder, config, foreground=options.foreground)
159.2.27 by Michael Hudson
begin a compatibility app
102
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
103
    log = logging.getLogger('loggerhead')
104
    log.info('Starting up...')
159.2.27 by Michael Hudson
begin a compatibility app
105
159.2.28 by Michael Hudson
woohoo it works
106
    app = Root(config)
107
108
    app = app
109
    app = make_middleware(app)
217.1.4 by Guillermo Gonzalez
* new apps module: "error" and ErrorHandlerApp middleware
110
    app = make_filter(app, None, logger_name=log.name+'.access')
111
    app = ErrorHandlerApp(app)
159.2.28 by Michael Hudson
woohoo it works
112
159.2.36 by Michael Hudson
more compatibility
113
    if webpath:
166.1.2 by Michael Hudson
more loggerhead.conf compatible vhosting
114
        scheme, netloc, path, blah, blah, blah = urlparse.urlparse(webpath)
230.1.1 by Steve 'Ashcrow' Milner
Updated to follow pep8.
115
166.1.2 by Michael Hudson
more loggerhead.conf compatible vhosting
116
        def app(environ, start_response, orig=app):
117
            environ['SCRIPT_NAME'] = path
118
            environ['HTTP_HOST'] = netloc
266 by Michael Hudson
apply neror's patch to fix bug #260547 ("start-loggerhead script doesn't properly set the wsgi.url_scheme from the server.webpath option")
119
            environ['wsgi.url_scheme'] = scheme
166.1.2 by Michael Hudson
more loggerhead.conf compatible vhosting
120
            return orig(environ, start_response)
159.2.36 by Michael Hudson
more compatibility
121
270.1.1 by Michael Hudson
defer loading of plugins until after we've set up the logging
122
    load_plugins()
123
159.2.45 by Michael Hudson
testing is grate
124
    try:
125
        httpserver.serve(
126
            app, host=server_host, port=server_port,
127
            threadpool_workers=nworkers)
128
    finally:
129
        log.info('Shutdown.')
130
        try:
197.1.4 by Jelmer Vernooij
Add --pidfile argument to start-loggerhead.
131
            os.remove(options.pidfile)
159.2.45 by Michael Hudson
testing is grate
132
        except OSError:
133
            pass
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
134
135
136
if __name__ == '__main__':
137
    main()