~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to start-loggerhead

  • Committer: Robert Collins
  • Date: 2012-02-03 01:37:21 UTC
  • mfrom: (466.1.2 bug-728209)
  • Revision ID: robertc@robertcollins.net-20120203013721-5ntnp45xb9in5eo6
    - Avoid crashing when viewing or annotating a non-existent file.
      (William Grant, #728209)

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()