~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to start-loggerhead.py

  • Committer: Robey Pointer
  • Date: 2006-12-20 03:05:27 UTC
  • Revision ID: robey@lag.net-20061220030527-h9fh8fztifgne8q7
slowly moving the branch-specific stuff into a common structure...
the changes cache is now its own class (ChangeCache) like TextIndex, and
both are fields in History.  almost all of the cache rebuilding logic, etc,
has been moved there and out of __init__.

Show diffs side-by-side

added added

removed removed

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