~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to start-loggerhead.py

on the changelog page, if all the changes are by the same committer,
put the commit info in the "details" block and not on the header line of
each revision.  this way, for projects with only one committer (like bzr,
which uses PQM for commits), the header line isn't cluttered with useless
repeated noise.

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