~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to start-loggerhead

  • Committer: Robert Collins
  • Date: 2010-04-08 01:08:33 UTC
  • Revision ID: robertc@robertcollins.net-20100408010833-bdyut0exh4o7dk7a
Merge patch from Toshio Kuratomi to work with mod_wsgi - Content-Length must be strings.

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
"""
 
17
WARNING! This script has been deprecated and will go away soon!
 
18
A script for starting the loggerhead process.
 
19
"""
 
20
 
 
21
 
 
22
import logging
 
23
from optparse import OptionParser
 
24
import os
 
25
import sys
 
26
import urlparse
 
27
 
 
28
from bzrlib.plugin import load_plugins
 
29
from bzrlib.util.configobj.configobj import ConfigObj
 
30
 
 
31
from paste import httpserver
 
32
from paste.httpexceptions import make_middleware
 
33
from paste.translogger import make_filter
 
34
 
 
35
from loggerhead import daemon
 
36
from loggerhead.apps.config import Root
 
37
from loggerhead.trace import setup_logging
 
38
from loggerhead.apps.error import ErrorHandlerApp
 
39
 
 
40
 
 
41
def main():
 
42
    sys.stderr.write('\n\n')
 
43
    sys.stderr.write('WARNING!!! This script has been deprecated by '
 
44
                     'serve-branches, and will be removed in the next '
 
45
                     'release. Please migrate to serve-branches and report '
 
46
                     'any missing features.\n')
 
47
    sys.stderr.write('\n\n')
 
48
 
 
49
    home = os.path.realpath(os.path.dirname(__file__))
 
50
    default_pidfile = os.path.join(home, 'loggerhead.pid')
 
51
    default_configfile = os.path.join(home, 'loggerhead.conf')
 
52
    default_log_folder = os.path.join(home, 'logs')
 
53
    parser = OptionParser(usage='usage: %prog [options]', version='%prog')
 
54
    parser.add_option('-f', '--foreground',
 
55
                      action='store_true', dest='foreground', default=False,
 
56
                      help="run in the foreground; don't daemonize")
 
57
    parser.add_option('-C', '--check', action='store_true',
 
58
                      dest='check', default=False,
 
59
                      help=("only start if not already running (useful for "
 
60
                            "cron jobs)"))
 
61
    parser.add_option('-p', '--pidfile', dest="pidfile",
 
62
                      default=default_pidfile,
 
63
                      type=str, help="override pidfile location")
 
64
    parser.add_option('-c', '--config-file', dest="configfile",
 
65
                      default=default_configfile,
 
66
                      type=str, help="override configuration file location")
 
67
    parser.add_option('-L', '--log-folder', dest="log_folder",
 
68
                      default=default_log_folder,
 
69
                      type=str, help="override log file directory")
 
70
    options, args = parser.parse_args()
 
71
    if len(args) > 0:
 
72
        parser.error('No filename arguments are used, only options.')
 
73
 
 
74
    if options.check:
 
75
        if daemon.is_running(options.pidfile):
 
76
            sys.exit(0)
 
77
        sys.stderr.write('Did not find loggerhead running in %r;' % (
 
78
                         options.pidfile))
 
79
        sys.stderr.write(' restarting...\n')
 
80
 
 
81
    # read loggerhead config
 
82
 
 
83
    config = ConfigObj(options.configfile, encoding='utf-8')
 
84
    extra_path = config.get('bzrpath', None)
 
85
    if extra_path:
 
86
        sys.path.insert(0, extra_path)
 
87
 
 
88
    potential_overrides = [('server.socket_port', int),
 
89
                           ('server.webpath', str),
 
90
                           ('server.thread_pool', int),
 
91
                           ('server.socket_host', str)]
 
92
    server_port = int(config.get('server.socket_port', 8080))
 
93
    nworkers = int(config.get('server.thread_pool', 10))
 
94
    server_host = config.get('server.socket_host', '0.0.0.0')
 
95
    webpath = config.get('server.webpath', None)
 
96
 
 
97
    for key, keytype in potential_overrides:
 
98
        value = config.get(key, None)
 
99
        if value is not None:
 
100
            value = keytype(value)
 
101
 
 
102
    if not options.foreground:
 
103
        sys.stderr.write('\n')
 
104
        sys.stderr.write('Launching loggerhead into the background.\n')
 
105
        sys.stderr.write('PID file: %s\n' % (options.pidfile,))
 
106
        sys.stderr.write('\n')
 
107
 
 
108
        daemon.daemonize(options.pidfile, home)
 
109
 
 
110
    setup_logging(options.log_folder, config, foreground=options.foreground)
 
111
 
 
112
    log = logging.getLogger('loggerhead')
 
113
    log.info('Starting up...')
 
114
 
 
115
    app = Root(config)
 
116
 
 
117
    app = app
 
118
    app = make_middleware(app)
 
119
    app = make_filter(app, None, logger_name=log.name+'.access')
 
120
    app = ErrorHandlerApp(app)
 
121
 
 
122
    if webpath:
 
123
        scheme, netloc, path, blah, blah, blah = urlparse.urlparse(webpath)
 
124
 
 
125
        def app(environ, start_response, orig=app):
 
126
            environ['SCRIPT_NAME'] = path
 
127
            environ['HTTP_HOST'] = netloc
 
128
            environ['wsgi.url_scheme'] = scheme
 
129
            return orig(environ, start_response)
 
130
 
 
131
    load_plugins()
 
132
 
 
133
    try:
 
134
        httpserver.serve(
 
135
            app, host=server_host, port=server_port,
 
136
            threadpool_workers=nworkers)
 
137
    finally:
 
138
        log.info('Shutdown.')
 
139
        try:
 
140
            os.remove(options.pidfile)
 
141
        except OSError:
 
142
            pass
 
143
 
 
144
 
 
145
if __name__ == '__main__':
 
146
    main()