~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to start-loggerhead

  • Committer: Matt Nordhoff
  • Date: 2009-06-26 09:42:43 UTC
  • Revision ID: mnordhoff@mattnordhoff.com-20090626094243-8ia9poyixoj1en6l
Pass around and use argv correctly

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
 
"""A script for starting the loggerhead process."""
 
16
"""
 
17
WARNING! This script has been deprecated and will go away soon!
 
18
A script for starting the loggerhead process.
 
19
"""
17
20
 
18
21
 
19
22
import logging
23
26
import sys
24
27
import urlparse
25
28
 
26
 
from configobj import ConfigObj
 
29
from bzrlib.plugin import load_plugins
 
30
from bzrlib.util.configobj.configobj import ConfigObj
27
31
 
28
32
from paste import httpserver
29
33
from paste.httpexceptions import make_middleware
30
34
from paste.translogger import make_filter
31
35
 
32
 
from loggerhead import daemon, release
 
36
from loggerhead import daemon
33
37
from loggerhead.apps.config import Root
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
 
 
 
38
from loggerhead.trace import make_handler, setup_logging
 
39
from loggerhead.apps.error import ErrorHandlerApp
76
40
 
77
41
 
78
42
def main():
79
 
    parser = OptionParser(usage='usage: %prog [options]', version='%prog ' + release.version)
80
 
    parser.add_option('-f', '--foreground', action='store_true', dest='foreground', default=False,
 
43
    sys.stderr.write('\n\n')
 
44
    sys.stderr.write('WARNING!!! This script has been deprecated by '
 
45
                     'serve-branches, and will be removed in the next '
 
46
                     'release. Please migrate to serve-branches and report '
 
47
                     'any missing features.\n')
 
48
    sys.stderr.write('\n\n')
 
49
 
 
50
    home = os.path.realpath(os.path.dirname(__file__))
 
51
    default_pidfile = os.path.join(home, 'loggerhead.pid')
 
52
    default_configfile = os.path.join(home, 'loggerhead.conf')
 
53
    default_log_folder = os.path.join(home, 'logs')
 
54
    parser = OptionParser(usage='usage: %prog [options]', version='%prog')
 
55
    parser.add_option('-f', '--foreground',
 
56
                      action='store_true', dest='foreground', default=False,
81
57
                      help="run in the foreground; don't daemonize")
82
 
    parser.add_option('-C', '--check', action='store_true', dest='check', default=False,
83
 
                      help="only start if not already running (useful for cron jobs)")
 
58
    parser.add_option('-C', '--check', action='store_true',
 
59
                      dest='check', default=False,
 
60
                      help=("only start if not already running (useful for "
 
61
                            "cron jobs)"))
 
62
    parser.add_option('-p', '--pidfile', dest="pidfile",
 
63
                      default=default_pidfile,
 
64
                      type=str, help="override pidfile location")
 
65
    parser.add_option('-c', '--config-file', dest="configfile",
 
66
                      default=default_configfile,
 
67
                      type=str, help="override configuration file location")
 
68
    parser.add_option('-L', '--log-folder', dest="log_folder",
 
69
                      default=default_log_folder,
 
70
                      type=str, help="override log file directory")
84
71
    options, args = parser.parse_args()
85
72
    if len(args) > 0:
86
73
        parser.error('No filename arguments are used, only options.')
87
74
 
88
 
 
89
 
    home = os.path.realpath(os.path.dirname(__file__))
90
 
    pidfile = os.path.join(home, 'loggerhead.pid')
91
 
 
92
75
    if options.check:
93
 
        if daemon.is_running(pidfile):
 
76
        if daemon.is_running(options.pidfile):
94
77
            sys.exit(0)
95
 
        sys.stderr.write('Did not find loggerhead running in %r; restarting...\n' % (pidfile,))
 
78
        sys.stderr.write('Did not find loggerhead running in %r;' % (
 
79
                         options.pidfile))
 
80
        sys.stderr.write(' restarting...\n')
96
81
 
97
82
    # read loggerhead config
98
83
 
99
 
    config = ConfigObj(os.path.join(home, 'loggerhead.conf'), encoding='utf-8')
 
84
    config = ConfigObj(options.configfile, encoding='utf-8')
100
85
    extra_path = config.get('bzrpath', None)
101
86
    if extra_path:
102
87
        sys.path.insert(0, extra_path)
103
88
 
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) ]
 
89
    potential_overrides = [('server.socket_port', int),
 
90
                           ('server.webpath', str),
 
91
                           ('server.thread_pool', int),
 
92
                           ('server.socket_host', str)]
110
93
    server_port = int(config.get('server.socket_port', 8080))
111
94
    nworkers = int(config.get('server.thread_pool', 10))
112
95
    server_host = config.get('server.socket_host', '0.0.0.0')
116
99
        value = config.get(key, None)
117
100
        if value is not None:
118
101
            value = keytype(value)
119
 
            #turbogears.config.update({ key: value })
120
102
 
121
103
    if not options.foreground:
122
104
        sys.stderr.write('\n')
123
105
        sys.stderr.write('Launching loggerhead into the background.\n')
124
 
        sys.stderr.write('PID file: %s\n' % (pidfile,))
 
106
        sys.stderr.write('PID file: %s\n' % options.pidfile)
125
107
        sys.stderr.write('\n')
126
108
 
127
 
        daemon.daemonize(pidfile, home)
 
109
        daemon.daemonize(options.pidfile, home)
128
110
 
129
 
    setup_logging(home, config, foreground=options.foreground)
 
111
    setup_logging(options.log_folder, config, foreground=options.foreground)
130
112
 
131
113
    log = logging.getLogger('loggerhead')
132
114
    log.info('Starting up...')
135
117
 
136
118
    app = app
137
119
    app = make_middleware(app)
138
 
    app = make_filter(app, None)
 
120
    app = make_filter(app, None, logger_name=log.name+'.access')
 
121
    app = ErrorHandlerApp(app)
139
122
 
140
123
    if webpath:
141
124
        scheme, netloc, path, blah, blah, blah = urlparse.urlparse(webpath)
 
125
 
142
126
        def app(environ, start_response, orig=app):
143
127
            environ['SCRIPT_NAME'] = path
144
128
            environ['HTTP_HOST'] = netloc
 
129
            environ['wsgi.url_scheme'] = scheme
145
130
            return orig(environ, start_response)
146
131
 
 
132
    load_plugins()
 
133
 
147
134
    try:
148
135
        httpserver.serve(
149
136
            app, host=server_host, port=server_port,
151
138
    finally:
152
139
        log.info('Shutdown.')
153
140
        try:
154
 
            os.remove(pidfile)
 
141
            os.remove(options.pidfile)
155
142
        except OSError:
156
143
            pass
157
144