~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to start-loggerhead.py

  • Committer: Michael Hudson
  • Date: 2008-06-16 10:03:24 UTC
  • mfrom: (159.1.7 remove_caches)
  • Revision ID: michael.hudson@canonical.com-20080616100324-dyzbdp3xk2i1g34a
merge martin's remove caches branch, which removes the sql revision cache and
the textindexing code.
we still have the files changed cache.
(some further changes by me)

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
 
 
 
1
#!/usr/bin/env python2.4
 
2
 
 
3
import pkg_resources
 
4
pkg_resources.require("TurboGears")
18
5
 
19
6
import logging
20
 
import logging.handlers
21
 
from optparse import OptionParser
22
7
import os
23
8
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
 
9
from optparse import OptionParser
 
10
 
 
11
import turbogears
 
12
import cherrypy
 
13
cherrypy.lowercase_api = True
31
14
 
32
15
from loggerhead import daemon, release
33
 
from loggerhead.apps.config import Root
34
16
 
35
17
 
36
18
def make_handler(config, filename):
43
25
        h = logging.FileHandler(filename)
44
26
    return h
45
27
 
46
 
 
 
28
        
47
29
def setup_logging(home, config, foreground):
48
30
    # i hate that stupid logging config format, so just set up logging here.
49
31
 
50
32
    log_folder = os.path.join(home, 'logs')
51
33
    if not os.path.exists(log_folder):
52
34
        os.mkdir(log_folder)
53
 
 
 
35
    
54
36
    f = logging.Formatter('%(levelname)-.3s [%(asctime)s.%(msecs)03d] %(name)s: %(message)s',
55
37
                          '%Y%m%d-%H:%M:%S')
56
38
    debug_log = make_handler(config, os.path.join(log_folder, 'debug.log'))
65
47
    access_log = make_handler(config, os.path.join(log_folder, 'access.log'))
66
48
    access_log.setLevel(logging.INFO)
67
49
    access_log.setFormatter(f)
68
 
 
69
 
    logging.getLogger('').setLevel(logging.DEBUG)
 
50
    
70
51
    logging.getLogger('').addHandler(debug_log)
71
 
    logging.getLogger('wsgi').addHandler(access_log)
72
 
 
 
52
    logging.getLogger('turbogears.access').addHandler(access_log)
 
53
    logging.getLogger('turbogears.controllers').setLevel(logging.INFO)
 
54
    
73
55
    if foreground:
74
56
        logging.getLogger('').addHandler(stdout_log)
75
 
 
 
57
    
76
58
 
77
59
 
78
60
def main():
79
 
    home = os.path.realpath(os.path.dirname(__file__))
80
 
    default_pidfile = os.path.join(home, 'loggerhead.pid')
81
61
    parser = OptionParser(usage='usage: %prog [options]', version='%prog ' + release.version)
82
62
    parser.add_option('-f', '--foreground', action='store_true', dest='foreground', default=False,
83
63
                      help="run in the foreground; don't daemonize")
84
64
    parser.add_option('-C', '--check', action='store_true', dest='check', default=False,
85
65
                      help="only start if not already running (useful for cron jobs)")
86
 
    parser.add_option('-p', '--pidfile', dest="pidfile", default=default_pidfile,
87
 
                      help="override pidfile location")
88
66
    options, args = parser.parse_args()
89
67
    if len(args) > 0:
90
68
        parser.error('No filename arguments are used, only options.')
91
 
 
 
69
        
 
70
        
 
71
    home = os.path.realpath(os.path.dirname(__file__))
 
72
    pidfile = os.path.join(home, 'loggerhead.pid')
 
73
    
92
74
    if options.check:
93
 
        if daemon.is_running(options.pidfile):
 
75
        if daemon.is_running(pidfile):
94
76
            sys.exit(0)
95
 
        sys.stderr.write('Did not find loggerhead running in %r; restarting...\n' % (options.pidfile,))
96
 
 
 
77
        sys.stderr.write('Did not find loggerhead running in %r; restarting...\n' % (pidfile,))
 
78
    
97
79
    # read loggerhead config
98
 
 
 
80
    
 
81
    from configobj import ConfigObj
99
82
    config = ConfigObj(os.path.join(home, 'loggerhead.conf'), encoding='utf-8')
100
83
    extra_path = config.get('bzrpath', None)
101
84
    if extra_path:
102
85
        sys.path.insert(0, extra_path)
103
 
 
104
 
    #turbogears.update_config(configfile="dev.cfg", modulename="loggerhead.config")
105
 
 
106
 
    potential_overrides = [ ('server.socket_port', int),
107
 
                            ('server.webpath', str),
108
 
                            ('server.thread_pool', int),
109
 
                            ('server.socket_host' ,str) ]
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
 
 
 
86
    
 
87
    turbogears.update_config(configfile="dev.cfg", modulename="loggerhead.config")
 
88
    
 
89
    potential_overrides = [ ('server.socket_port', int), ('server.webpath', str), ('server.thread_pool', int), ('server.socket_host' ,str) ]
115
90
    for key, keytype in potential_overrides:
116
91
        value = config.get(key, None)
117
92
        if value is not None:
118
93
            value = keytype(value)
119
 
            #turbogears.config.update({ key: value })
120
 
 
 
94
            turbogears.config.update({ key: value })
 
95
    
121
96
    if not options.foreground:
122
97
        sys.stderr.write('\n')
123
98
        sys.stderr.write('Launching loggerhead into the background.\n')
124
 
        sys.stderr.write('PID file: %s\n' % (options.pidfile,))
 
99
        sys.stderr.write('PID file: %s\n' % (pidfile,))
125
100
        sys.stderr.write('\n')
126
 
 
127
 
        daemon.daemonize(options.pidfile, home)
 
101
    
 
102
        daemon.daemonize(pidfile, home)
128
103
 
129
104
    setup_logging(home, config, foreground=options.foreground)
130
 
 
 
105
        
131
106
    log = logging.getLogger('loggerhead')
132
107
    log.info('Starting up...')
133
 
 
134
 
    app = Root(config)
135
 
 
136
 
    app = app
137
 
    app = make_middleware(app)
138
 
    app = make_filter(app, None)
139
 
 
140
 
    if webpath:
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)
146
 
 
 
108
    
 
109
    from loggerhead.controllers import Root
 
110
    
 
111
    Root = Root(config)
 
112
    
147
113
    try:
148
 
        httpserver.serve(
149
 
            app, host=server_host, port=server_port,
150
 
            threadpool_workers=nworkers)
 
114
        turbogears.start_server(Root)
151
115
    finally:
152
116
        log.info('Shutdown.')
153
117
        try:
154
 
            os.remove(options.pidfile)
 
118
            os.remove(pidfile)
155
119
        except OSError:
156
120
            pass
157
121