~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
1
#!/usr/bin/env python2.4
 
2
 
2
3
import pkg_resources
3
4
pkg_resources.require("TurboGears")
4
5
 
 
6
import logging
 
7
import os
 
8
import sys
 
9
from optparse import OptionParser
 
10
 
5
11
import turbogears
6
12
import cherrypy
7
13
cherrypy.lowercase_api = True
8
14
 
9
 
from os.path import *
10
 
import sys
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)
 
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
    
 
58
 
 
59
 
 
60
def main():
 
61
    parser = OptionParser(usage='usage: %prog [options]', version='%prog ' + release.version)
 
62
    parser.add_option('-f', '--foreground', action='store_true', dest='foreground', default=False,
 
63
                      help="run in the foreground; don't daemonize")
 
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)")
 
66
    options, args = parser.parse_args()
 
67
    if len(args) > 0:
 
68
        parser.error('No filename arguments are used, only options.')
 
69
        
 
70
        
 
71
    home = os.path.realpath(os.path.dirname(__file__))
 
72
    pidfile = os.path.join(home, 'loggerhead.pid')
 
73
    
 
74
    if options.check:
 
75
        if daemon.is_running(pidfile):
 
76
            sys.exit(0)
 
77
        sys.stderr.write('Did not find loggerhead running in %r; restarting...\n' % (pidfile,))
 
78
    
 
79
    # read loggerhead config
 
80
    
 
81
    from configobj import ConfigObj
 
82
    config = ConfigObj(os.path.join(home, 'loggerhead.conf'), encoding='utf-8')
 
83
    extra_path = config.get('bzrpath', None)
 
84
    if extra_path:
 
85
        sys.path.insert(0, extra_path)
 
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) ]
 
90
    for key, keytype in potential_overrides:
 
91
        value = config.get(key, None)
 
92
        if value is not None:
 
93
            value = keytype(value)
 
94
            turbogears.config.update({ key: value })
 
95
    
 
96
    if not options.foreground:
 
97
        sys.stderr.write('\n')
 
98
        sys.stderr.write('Launching loggerhead into the background.\n')
 
99
        sys.stderr.write('PID file: %s\n' % (pidfile,))
 
100
        sys.stderr.write('\n')
 
101
    
 
102
        daemon.daemonize(pidfile, home)
 
103
 
 
104
    setup_logging(home, config, foreground=options.foreground)
 
105
        
 
106
    log = logging.getLogger('loggerhead')
 
107
    log.info('Starting up...')
 
108
    
 
109
    from loggerhead.controllers import Root
 
110
    
 
111
    Root = Root(config)
 
112
    
 
113
    try:
 
114
        turbogears.start_server(Root)
 
115
    finally:
 
116
        log.info('Shutdown.')
 
117
        try:
 
118
            os.remove(pidfile)
 
119
        except OSError:
 
120
            pass
 
121
 
 
122
 
 
123
if __name__ == '__main__':
 
124
    main()