~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
148.3.4 by Michael Hudson
decruft
32
from loggerhead import daemon, release
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':
39
        h = logging.handlers.TimedRotatingFileHandler(filename, 'midnight', 0, 100)
40
    elif roll == 'weekly':
41
        h = logging.handlers.TimedRotatingFileHandler(filename, 'W0', 0, 100)
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
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
47
def setup_logging(home, 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
    log_folder = os.path.join(home, 'logs')
51
    if not os.path.exists(log_folder):
52
        os.mkdir(log_folder)
159.2.27 by Michael Hudson
begin a compatibility app
53
93 by Robey Pointer
slight cleanup, and add '-f' option for running in the foreground.
54
    f = logging.Formatter('%(levelname)-.3s [%(asctime)s.%(msecs)03d] %(name)s: %(message)s',
55
                          '%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
56
    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.
57
    debug_log.setLevel(logging.DEBUG)
58
    debug_log.setFormatter(f)
59
    if foreground:
60
        stdout_log = logging.StreamHandler(sys.stdout)
61
        stdout_log.setLevel(logging.DEBUG)
62
        stdout_log.setFormatter(f)
63
    f = logging.Formatter('[%(asctime)s.%(msecs)03d] %(message)s',
64
                          '%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
65
    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.
66
    access_log.setLevel(logging.INFO)
67
    access_log.setFormatter(f)
159.2.27 by Michael Hudson
begin a compatibility app
68
179.1.6 by Michael Hudson
updates to logging setup in start-loggerhead.py
69
    logging.getLogger('').setLevel(logging.DEBUG)
93 by Robey Pointer
slight cleanup, and add '-f' option for running in the foreground.
70
    logging.getLogger('').addHandler(debug_log)
179.1.6 by Michael Hudson
updates to logging setup in start-loggerhead.py
71
    logging.getLogger('wsgi').addHandler(access_log)
159.2.27 by Michael Hudson
begin a compatibility app
72
93 by Robey Pointer
slight cleanup, and add '-f' option for running in the foreground.
73
    if foreground:
74
        logging.getLogger('').addHandler(stdout_log)
159.2.27 by Michael Hudson
begin a compatibility app
75
93 by Robey Pointer
slight cleanup, and add '-f' option for running in the foreground.
76
77
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
78
def main():
79
    parser = OptionParser(usage='usage: %prog [options]', version='%prog ' + release.version)
80
    parser.add_option('-f', '--foreground', action='store_true', dest='foreground', default=False,
81
                      help="run in the foreground; don't daemonize")
82
    parser.add_option('-C', '--check', action='store_true', dest='check', default=False,
83
                      help="only start if not already running (useful for cron jobs)")
84
    options, args = parser.parse_args()
85
    if len(args) > 0:
86
        parser.error('No filename arguments are used, only options.')
159.2.27 by Michael Hudson
begin a compatibility app
87
88
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
89
    home = os.path.realpath(os.path.dirname(__file__))
90
    pidfile = os.path.join(home, 'loggerhead.pid')
159.2.27 by Michael Hudson
begin a compatibility app
91
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
92
    if options.check:
93
        if daemon.is_running(pidfile):
94
            sys.exit(0)
128.2.5 by Robey Pointer
it's called loggerhead :)
95
        sys.stderr.write('Did not find loggerhead running in %r; restarting...\n' % (pidfile,))
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
    # read loggerhead config
159.2.27 by Michael Hudson
begin a compatibility app
98
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
99
    config = ConfigObj(os.path.join(home, 'loggerhead.conf'), encoding='utf-8')
100
    extra_path = config.get('bzrpath', None)
101
    if extra_path:
102
        sys.path.insert(0, extra_path)
159.2.27 by Michael Hudson
begin a compatibility app
103
159.2.28 by Michael Hudson
woohoo it works
104
    #turbogears.update_config(configfile="dev.cfg", modulename="loggerhead.config")
159.2.27 by Michael Hudson
begin a compatibility app
105
159.2.28 by Michael Hudson
woohoo it works
106
    potential_overrides = [ ('server.socket_port', int),
107
                            ('server.webpath', str),
108
                            ('server.thread_pool', int),
109
                            ('server.socket_host' ,str) ]
159.2.36 by Michael Hudson
more compatibility
110
    server_port = int(config.get('server.socket_port', 8080))
111
    nworkers = int(config.get('server.thread_pool', 10))
112
    server_host = config.get('server.socket_host', '0.0.0.0')
113
    webpath = config.get('server.webpath', None)
114
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
115
    for key, keytype in potential_overrides:
116
        value = config.get(key, None)
117
        if value is not None:
118
            value = keytype(value)
159.2.28 by Michael Hudson
woohoo it works
119
            #turbogears.config.update({ key: value })
120
159.2.29 by Michael Hudson
re-enable daemonization, remove require("TurboGears")
121
    if not options.foreground:
122
        sys.stderr.write('\n')
123
        sys.stderr.write('Launching loggerhead into the background.\n')
124
        sys.stderr.write('PID file: %s\n' % (pidfile,))
125
        sys.stderr.write('\n')
159.2.28 by Michael Hudson
woohoo it works
126
159.2.29 by Michael Hudson
re-enable daemonization, remove require("TurboGears")
127
        daemon.daemonize(pidfile, home)
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
128
129
    setup_logging(home, config, foreground=options.foreground)
159.2.27 by Michael Hudson
begin a compatibility app
130
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
131
    log = logging.getLogger('loggerhead')
132
    log.info('Starting up...')
159.2.27 by Michael Hudson
begin a compatibility app
133
159.2.28 by Michael Hudson
woohoo it works
134
    app = Root(config)
135
136
    app = app
137
    app = make_middleware(app)
138
    app = make_filter(app, None)
139
159.2.36 by Michael Hudson
more compatibility
140
    if webpath:
166.1.2 by Michael Hudson
more loggerhead.conf compatible vhosting
141
        scheme, netloc, path, blah, blah, blah = urlparse.urlparse(webpath)
142
        def app(environ, start_response, orig=app):
143
            environ['SCRIPT_NAME'] = path
144
            environ['HTTP_HOST'] = netloc
145
            return orig(environ, start_response)
159.2.36 by Michael Hudson
more compatibility
146
159.2.45 by Michael Hudson
testing is grate
147
    try:
148
        httpserver.serve(
149
            app, host=server_host, port=server_port,
150
            threadpool_workers=nworkers)
151
    finally:
152
        log.info('Shutdown.')
153
        try:
154
            os.remove(pidfile)
155
        except OSError:
156
            pass
128.2.3 by Robey Pointer
add a '-C' option for ensuring loggerhead is running (from a cron job, for
157
158
159
if __name__ == '__main__':
160
    main()