~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
159.2.50 by Michael Hudson
reorder imports in start-loggerhead.py
26
from configobj import ConfigObj
27
159.2.28 by Michael Hudson
woohoo it works
28
from paste import httpserver
29
from paste.httpexceptions import make_middleware
30
from paste.translogger import make_filter
1 by Robey Pointer
initial checkin
31
204 by Martin Albisetti
Clean up unused/inexistant import
32
from loggerhead import daemon
159.2.50 by Michael Hudson
reorder imports in start-loggerhead.py
33
from loggerhead.apps.config import Root
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
34
35
36
def make_handler(config, filename):
37
    roll = config.get('log.roll', 'never')
38
    if roll == 'daily':
208 by Martin Albisetti
Make logs actually rotate. Bug #242806
39
        h = logging.handlers.TimedRotatingFileHandler(filename, 'midnight', 1, 100)
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
40
    elif roll == 'weekly':
208 by Martin Albisetti
Make logs actually rotate. Bug #242806
41
        h = logging.handlers.TimedRotatingFileHandler(filename, 'W0', 1, 100)
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
42
    else:
128.2.4 by Robey Pointer
ok i should've known those API calls wouldn't be consistent.
43
        h = logging.FileHandler(filename)
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
44
    return h
45
159.2.27 by Michael Hudson
begin a compatibility app
46
197.2.1 by Jelmer Vernooij
Fix syntax.
47
def setup_logging(log_folder, config, foreground):
93 by Robey Pointer
slight cleanup, and add '-f' option for running in the foreground.
48
    # i hate that stupid logging config format, so just set up logging here.
49
50
    if not os.path.exists(log_folder):
51
        os.mkdir(log_folder)
159.2.27 by Michael Hudson
begin a compatibility app
52
93 by Robey Pointer
slight cleanup, and add '-f' option for running in the foreground.
53
    f = logging.Formatter('%(levelname)-.3s [%(asctime)s.%(msecs)03d] %(name)s: %(message)s',
54
                          '%Y%m%d-%H:%M:%S')
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
55
    debug_log = make_handler(config, os.path.join(log_folder, 'debug.log'))
93 by Robey Pointer
slight cleanup, and add '-f' option for running in the foreground.
56
    debug_log.setLevel(logging.DEBUG)
57
    debug_log.setFormatter(f)
58
    if foreground:
59
        stdout_log = logging.StreamHandler(sys.stdout)
60
        stdout_log.setLevel(logging.DEBUG)
61
        stdout_log.setFormatter(f)
62
    f = logging.Formatter('[%(asctime)s.%(msecs)03d] %(message)s',
63
                          '%Y%m%d-%H:%M:%S')
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
64
    access_log = make_handler(config, os.path.join(log_folder, 'access.log'))
93 by Robey Pointer
slight cleanup, and add '-f' option for running in the foreground.
65
    access_log.setLevel(logging.INFO)
66
    access_log.setFormatter(f)
159.2.27 by Michael Hudson
begin a compatibility app
67
179.1.6 by Michael Hudson
updates to logging setup in start-loggerhead.py
68
    logging.getLogger('').setLevel(logging.DEBUG)
93 by Robey Pointer
slight cleanup, and add '-f' option for running in the foreground.
69
    logging.getLogger('').addHandler(debug_log)
179.1.6 by Michael Hudson
updates to logging setup in start-loggerhead.py
70
    logging.getLogger('wsgi').addHandler(access_log)
159.2.27 by Michael Hudson
begin a compatibility app
71
93 by Robey Pointer
slight cleanup, and add '-f' option for running in the foreground.
72
    if foreground:
73
        logging.getLogger('').addHandler(stdout_log)
159.2.27 by Michael Hudson
begin a compatibility app
74
93 by Robey Pointer
slight cleanup, and add '-f' option for running in the foreground.
75
76
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
77
def main():
197.1.4 by Jelmer Vernooij
Add --pidfile argument to start-loggerhead.
78
    home = os.path.realpath(os.path.dirname(__file__))
79
    default_pidfile = os.path.join(home, 'loggerhead.pid')
197.1.5 by Jelmer Vernooij
Add --configfile argument.
80
    default_configfile = os.path.join(home, 'loggerhead.conf')
197.1.6 by Jelmer Vernooij
add --log-folder option.
81
    default_log_folder = os.path.join(home, 'logs')
205 by Martin Albisetti
Further cleaning
82
    parser = OptionParser(usage='usage: %prog [options]', version='%prog')
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
83
    parser.add_option('-f', '--foreground', action='store_true', dest='foreground', default=False,
84
                      help="run in the foreground; don't daemonize")
85
    parser.add_option('-C', '--check', action='store_true', dest='check', default=False,
86
                      help="only start if not already running (useful for cron jobs)")
197.1.4 by Jelmer Vernooij
Add --pidfile argument to start-loggerhead.
87
    parser.add_option('-p', '--pidfile', dest="pidfile", default=default_pidfile,
197.2.1 by Jelmer Vernooij
Fix syntax.
88
                      type=str, help="override pidfile location")
197.1.6 by Jelmer Vernooij
add --log-folder option.
89
    parser.add_option('-c', '--config-file', dest="configfile", default=default_configfile,
197.2.1 by Jelmer Vernooij
Fix syntax.
90
					  type=str, help="override configuration file location")
91
    parser.add_option('-L', '--log-folder', dest="log_folder", default=default_log_folder,
92
                      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
93
    options, args = parser.parse_args()
94
    if len(args) > 0:
95
        parser.error('No filename arguments are used, only options.')
159.2.27 by Michael Hudson
begin a compatibility app
96
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
97
    if options.check:
197.1.4 by Jelmer Vernooij
Add --pidfile argument to start-loggerhead.
98
        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
99
            sys.exit(0)
197.1.4 by Jelmer Vernooij
Add --pidfile argument to start-loggerhead.
100
        sys.stderr.write('Did not find loggerhead running in %r; restarting...\n' % (options.pidfile,))
159.2.27 by Michael Hudson
begin a compatibility app
101
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
102
    # read loggerhead config
159.2.27 by Michael Hudson
begin a compatibility app
103
197.1.5 by Jelmer Vernooij
Add --configfile argument.
104
    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
105
    extra_path = config.get('bzrpath', None)
106
    if extra_path:
107
        sys.path.insert(0, extra_path)
159.2.27 by Michael Hudson
begin a compatibility app
108
159.2.28 by Michael Hudson
woohoo it works
109
    potential_overrides = [ ('server.socket_port', int),
110
                            ('server.webpath', str),
111
                            ('server.thread_pool', int),
112
                            ('server.socket_host' ,str) ]
159.2.36 by Michael Hudson
more compatibility
113
    server_port = int(config.get('server.socket_port', 8080))
114
    nworkers = int(config.get('server.thread_pool', 10))
115
    server_host = config.get('server.socket_host', '0.0.0.0')
116
    webpath = config.get('server.webpath', None)
117
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
118
    for key, keytype in potential_overrides:
119
        value = config.get(key, None)
120
        if value is not None:
121
            value = keytype(value)
159.2.28 by Michael Hudson
woohoo it works
122
159.2.29 by Michael Hudson
re-enable daemonization, remove require("TurboGears")
123
    if not options.foreground:
124
        sys.stderr.write('\n')
125
        sys.stderr.write('Launching loggerhead into the background.\n')
197.1.4 by Jelmer Vernooij
Add --pidfile argument to start-loggerhead.
126
        sys.stderr.write('PID file: %s\n' % (options.pidfile,))
159.2.29 by Michael Hudson
re-enable daemonization, remove require("TurboGears")
127
        sys.stderr.write('\n')
159.2.28 by Michael Hudson
woohoo it works
128
197.1.4 by Jelmer Vernooij
Add --pidfile argument to start-loggerhead.
129
        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
130
197.1.6 by Jelmer Vernooij
add --log-folder option.
131
    setup_logging(options.log_folder, config, foreground=options.foreground)
159.2.27 by Michael Hudson
begin a compatibility app
132
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
133
    log = logging.getLogger('loggerhead')
134
    log.info('Starting up...')
159.2.27 by Michael Hudson
begin a compatibility app
135
159.2.28 by Michael Hudson
woohoo it works
136
    app = Root(config)
137
138
    app = app
139
    app = make_middleware(app)
140
    app = make_filter(app, None)
141
159.2.36 by Michael Hudson
more compatibility
142
    if webpath:
166.1.2 by Michael Hudson
more loggerhead.conf compatible vhosting
143
        scheme, netloc, path, blah, blah, blah = urlparse.urlparse(webpath)
144
        def app(environ, start_response, orig=app):
145
            environ['SCRIPT_NAME'] = path
146
            environ['HTTP_HOST'] = netloc
147
            return orig(environ, start_response)
159.2.36 by Michael Hudson
more compatibility
148
159.2.45 by Michael Hudson
testing is grate
149
    try:
150
        httpserver.serve(
151
            app, host=server_host, port=server_port,
152
            threadpool_workers=nworkers)
153
    finally:
154
        log.info('Shutdown.')
155
        try:
197.1.4 by Jelmer Vernooij
Add --pidfile argument to start-loggerhead.
156
            os.remove(options.pidfile)
159.2.45 by Michael Hudson
testing is grate
157
        except OSError:
158
            pass
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
159
160
161
if __name__ == '__main__':
162
    main()