~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to start-loggerhead

  • Committer: Jelmer Vernooij
  • Date: 2008-08-06 18:27:51 UTC
  • mto: (197.1.9 pathargs)
  • mto: This revision was merged to the branch mainline in revision 202.
  • Revision ID: jelmer@samba.org-20080806182751-s68wtdpxaryvylhp
Add --configfile argument.

Show diffs side-by-side

added added

removed removed

Lines of Context:
13
13
# along with this program; if not, write to the Free Software
14
14
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
15
15
 
16
 
"""
17
 
WARNING! This script has been deprecated and will go away soon!
18
 
A script for starting the loggerhead process.
19
 
"""
 
16
"""A script for starting the loggerhead process."""
20
17
 
21
18
 
22
19
import logging
 
20
import logging.handlers
23
21
from optparse import OptionParser
24
22
import os
25
23
import sys
26
24
import urlparse
27
25
 
28
 
from bzrlib.plugin import load_plugins
29
 
from bzrlib.util.configobj.configobj import ConfigObj
 
26
from configobj import ConfigObj
30
27
 
31
28
from paste import httpserver
32
29
from paste.httpexceptions import make_middleware
33
30
from paste.translogger import make_filter
34
31
 
35
 
from loggerhead import daemon
 
32
from loggerhead import daemon, release
36
33
from loggerhead.apps.config import Root
37
 
from loggerhead.trace import setup_logging
38
 
from loggerhead.apps.error import ErrorHandlerApp
 
34
 
 
35
 
 
36
def make_handler(config, filename):
 
37
    roll = config.get('log.roll', 'never')
 
38
    if roll == 'daily':
 
39
        h = logging.handlers.TimedRotatingFileHandler(filename, 'midnight', 0, 100)
 
40
    elif roll == 'weekly':
 
41
        h = logging.handlers.TimedRotatingFileHandler(filename, 'W0', 0, 100)
 
42
    else:
 
43
        h = logging.FileHandler(filename)
 
44
    return h
 
45
 
 
46
 
 
47
def setup_logging(home, config, foreground):
 
48
    # i hate that stupid logging config format, so just set up logging here.
 
49
 
 
50
    log_folder = os.path.join(home, 'logs')
 
51
    if not os.path.exists(log_folder):
 
52
        os.mkdir(log_folder)
 
53
 
 
54
    f = logging.Formatter('%(levelname)-.3s [%(asctime)s.%(msecs)03d] %(name)s: %(message)s',
 
55
                          '%Y%m%d-%H:%M:%S')
 
56
    debug_log = make_handler(config, os.path.join(log_folder, 'debug.log'))
 
57
    debug_log.setLevel(logging.DEBUG)
 
58
    debug_log.setFormatter(f)
 
59
    if foreground:
 
60
        stdout_log = logging.StreamHandler(sys.stdout)
 
61
        stdout_log.setLevel(logging.DEBUG)
 
62
        stdout_log.setFormatter(f)
 
63
    f = logging.Formatter('[%(asctime)s.%(msecs)03d] %(message)s',
 
64
                          '%Y%m%d-%H:%M:%S')
 
65
    access_log = make_handler(config, os.path.join(log_folder, 'access.log'))
 
66
    access_log.setLevel(logging.INFO)
 
67
    access_log.setFormatter(f)
 
68
 
 
69
    logging.getLogger('').setLevel(logging.DEBUG)
 
70
    logging.getLogger('').addHandler(debug_log)
 
71
    logging.getLogger('wsgi').addHandler(access_log)
 
72
 
 
73
    if foreground:
 
74
        logging.getLogger('').addHandler(stdout_log)
 
75
 
39
76
 
40
77
 
41
78
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
79
    home = os.path.realpath(os.path.dirname(__file__))
50
80
    default_pidfile = os.path.join(home, 'loggerhead.pid')
51
81
    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,
 
82
    parser = OptionParser(usage='usage: %prog [options]', version='%prog ' + release.version)
 
83
    parser.add_option('-f', '--foreground', action='store_true', dest='foreground', default=False,
56
84
                      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")
 
85
    parser.add_option('-C', '--check', action='store_true', dest='check', default=False,
 
86
                      help="only start if not already running (useful for cron jobs)")
 
87
    parser.add_option('-p', '--pidfile', dest="pidfile", default=default_pidfile,
 
88
                      help="override pidfile location")
 
89
    parser.add_option('-c', '--configfile', dest="configfile", default=default_configfile,
 
90
                      help="override configuration file location")
70
91
    options, args = parser.parse_args()
71
92
    if len(args) > 0:
72
93
        parser.error('No filename arguments are used, only options.')
74
95
    if options.check:
75
96
        if daemon.is_running(options.pidfile):
76
97
            sys.exit(0)
77
 
        sys.stderr.write('Did not find loggerhead running in %r;' % (
78
 
                         options.pidfile))
79
 
        sys.stderr.write(' restarting...\n')
 
98
        sys.stderr.write('Did not find loggerhead running in %r; restarting...\n' % (options.pidfile,))
80
99
 
81
100
    # read loggerhead config
82
101
 
85
104
    if extra_path:
86
105
        sys.path.insert(0, extra_path)
87
106
 
88
 
    potential_overrides = [('server.socket_port', int),
89
 
                           ('server.webpath', str),
90
 
                           ('server.thread_pool', int),
91
 
                           ('server.socket_host', str)]
 
107
    #turbogears.update_config(configfile="dev.cfg", modulename="loggerhead.config")
 
108
 
 
109
    potential_overrides = [ ('server.socket_port', int),
 
110
                            ('server.webpath', str),
 
111
                            ('server.thread_pool', int),
 
112
                            ('server.socket_host' ,str) ]
92
113
    server_port = int(config.get('server.socket_port', 8080))
93
114
    nworkers = int(config.get('server.thread_pool', 10))
94
115
    server_host = config.get('server.socket_host', '0.0.0.0')
98
119
        value = config.get(key, None)
99
120
        if value is not None:
100
121
            value = keytype(value)
 
122
            #turbogears.config.update({ key: value })
101
123
 
102
124
    if not options.foreground:
103
125
        sys.stderr.write('\n')
107
129
 
108
130
        daemon.daemonize(options.pidfile, home)
109
131
 
110
 
    setup_logging(options.log_folder, config, foreground=options.foreground)
 
132
    setup_logging(home, config, foreground=options.foreground)
111
133
 
112
134
    log = logging.getLogger('loggerhead')
113
135
    log.info('Starting up...')
116
138
 
117
139
    app = app
118
140
    app = make_middleware(app)
119
 
    app = make_filter(app, None, logger_name=log.name+'.access')
120
 
    app = ErrorHandlerApp(app)
 
141
    app = make_filter(app, None)
121
142
 
122
143
    if webpath:
123
144
        scheme, netloc, path, blah, blah, blah = urlparse.urlparse(webpath)
124
 
 
125
145
        def app(environ, start_response, orig=app):
126
146
            environ['SCRIPT_NAME'] = path
127
147
            environ['HTTP_HOST'] = netloc
128
 
            environ['wsgi.url_scheme'] = scheme
129
148
            return orig(environ, start_response)
130
149
 
131
 
    load_plugins()
132
 
 
133
150
    try:
134
151
        httpserver.serve(
135
152
            app, host=server_host, port=server_port,