~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to start-loggerhead

  • Committer: William Grant
  • Date: 2011-03-23 04:27:37 UTC
  • mto: This revision was merged to the branch mainline in revision 442.
  • Revision ID: william.grant@canonical.com-20110323042737-5by9wlb8wea6s82x
Add forgotten test_util.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/usr/bin/env python
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
 
 
18
 
 
19
 
import logging
20
 
import logging.handlers
21
 
from optparse import OptionParser
22
 
import os
23
 
import sys
24
 
import urlparse
25
 
 
26
 
from configobj import ConfigObj
27
 
 
28
 
from paste import httpserver
29
 
from paste.httpexceptions import make_middleware
30
 
from paste.translogger import make_filter
31
 
 
32
 
from loggerhead import daemon, release
33
 
from loggerhead.apps.config import Root
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:
43
 
        h = logging.FileHandler(filename)
44
 
    return h
45
 
 
46
 
 
47
 
def setup_logging(logdir, config, 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)
52
 
 
53
 
    f = logging.Formatter('%(levelname)-.3s [%(asctime)s.%(msecs)03d] %(name)s: %(message)s',
54
 
                          '%Y%m%d-%H:%M:%S')
55
 
    debug_log = make_handler(config, os.path.join(log_folder, 'debug.log'))
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')
64
 
    access_log = make_handler(config, os.path.join(log_folder, 'access.log'))
65
 
    access_log.setLevel(logging.INFO)
66
 
    access_log.setFormatter(f)
67
 
 
68
 
    logging.getLogger('').setLevel(logging.DEBUG)
69
 
    logging.getLogger('').addHandler(debug_log)
70
 
    logging.getLogger('wsgi').addHandler(access_log)
71
 
 
72
 
    if foreground:
73
 
        logging.getLogger('').addHandler(stdout_log)
74
 
 
75
 
 
76
 
 
77
 
def main():
78
 
    home = os.path.realpath(os.path.dirname(__file__))
79
 
    default_pidfile = os.path.join(home, 'loggerhead.pid')
80
 
    default_configfile = os.path.join(home, 'loggerhead.conf')
81
 
    default_log_folder = os.path.join(home, 'logs')
82
 
    parser = OptionParser(usage='usage: %prog [options]', version='%prog ' + release.version)
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)")
87
 
    parser.add_option('-p', '--pidfile', dest="pidfile", default=default_pidfile,
88
 
                      help="override pidfile location")
89
 
    parser.add_option('-c', '--config-file', dest="configfile", default=default_configfile,
90
 
                      help="override configuration file location")
91
 
    parser.add_option('-L', '--log-folder', dest="log-folder", default=default_log_folder,
92
 
                      help="override log file directory")
93
 
    options, args = parser.parse_args()
94
 
    if len(args) > 0:
95
 
        parser.error('No filename arguments are used, only options.')
96
 
 
97
 
    if options.check:
98
 
        if daemon.is_running(options.pidfile):
99
 
            sys.exit(0)
100
 
        sys.stderr.write('Did not find loggerhead running in %r; restarting...\n' % (options.pidfile,))
101
 
 
102
 
    # read loggerhead config
103
 
 
104
 
    config = ConfigObj(options.configfile, encoding='utf-8')
105
 
    extra_path = config.get('bzrpath', None)
106
 
    if extra_path:
107
 
        sys.path.insert(0, extra_path)
108
 
 
109
 
    #turbogears.update_config(configfile="dev.cfg", modulename="loggerhead.config")
110
 
 
111
 
    potential_overrides = [ ('server.socket_port', int),
112
 
                            ('server.webpath', str),
113
 
                            ('server.thread_pool', int),
114
 
                            ('server.socket_host' ,str) ]
115
 
    server_port = int(config.get('server.socket_port', 8080))
116
 
    nworkers = int(config.get('server.thread_pool', 10))
117
 
    server_host = config.get('server.socket_host', '0.0.0.0')
118
 
    webpath = config.get('server.webpath', None)
119
 
 
120
 
    for key, keytype in potential_overrides:
121
 
        value = config.get(key, None)
122
 
        if value is not None:
123
 
            value = keytype(value)
124
 
            #turbogears.config.update({ key: value })
125
 
 
126
 
    if not options.foreground:
127
 
        sys.stderr.write('\n')
128
 
        sys.stderr.write('Launching loggerhead into the background.\n')
129
 
        sys.stderr.write('PID file: %s\n' % (options.pidfile,))
130
 
        sys.stderr.write('\n')
131
 
 
132
 
        daemon.daemonize(options.pidfile, home)
133
 
 
134
 
    setup_logging(options.log_folder, config, foreground=options.foreground)
135
 
 
136
 
    log = logging.getLogger('loggerhead')
137
 
    log.info('Starting up...')
138
 
 
139
 
    app = Root(config)
140
 
 
141
 
    app = app
142
 
    app = make_middleware(app)
143
 
    app = make_filter(app, None)
144
 
 
145
 
    if webpath:
146
 
        scheme, netloc, path, blah, blah, blah = urlparse.urlparse(webpath)
147
 
        def app(environ, start_response, orig=app):
148
 
            environ['SCRIPT_NAME'] = path
149
 
            environ['HTTP_HOST'] = netloc
150
 
            return orig(environ, start_response)
151
 
 
152
 
    try:
153
 
        httpserver.serve(
154
 
            app, host=server_host, port=server_port,
155
 
            threadpool_workers=nworkers)
156
 
    finally:
157
 
        log.info('Shutdown.')
158
 
        try:
159
 
            os.remove(options.pidfile)
160
 
        except OSError:
161
 
            pass
162
 
 
163
 
 
164
 
if __name__ == '__main__':
165
 
    main()