~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to start-loggerhead

  • Committer: Michael Hudson
  • Date: 2009-06-25 02:45:34 UTC
  • mfrom: (371.1.13 no-transport-sharing)
  • Revision ID: michael.hudson@canonical.com-20090625024534-3kv75gtfge51r656
fix the horrible connection-sharing bug (#390972) and a few other ones about serving .bzr data

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