~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to start-loggerhead

  • Committer: John Arbash Meinel
  • Date: 2008-07-26 14:52:44 UTC
  • mto: This revision was merged to the branch mainline in revision 185.
  • Revision ID: john@arbash-meinel.com-20080726145244-l7h1ndtlu5mnm9tg
Add Copyright information to most files.

Fix the documentation for start/stop in the README.txt

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
26
23
import sys
27
24
import urlparse
28
25
 
29
 
from bzrlib.plugin import load_plugins
30
 
from bzrlib.util.configobj.configobj import ConfigObj
 
26
from configobj import ConfigObj
31
27
 
32
28
from paste import httpserver
33
29
from paste.httpexceptions import make_middleware
34
30
from paste.translogger import make_filter
35
31
 
36
 
from loggerhead import daemon
 
32
from loggerhead import daemon, release
37
33
from loggerhead.apps.config import Root
38
 
from loggerhead.trace import make_handler, setup_logging
39
 
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
 
40
76
 
41
77
 
42
78
def main():
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,
 
79
    parser = OptionParser(usage='usage: %prog [options]', version='%prog ' + release.version)
 
80
    parser.add_option('-f', '--foreground', action='store_true', dest='foreground', default=False,
57
81
                      help="run in the foreground; don't daemonize")
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")
 
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)")
71
84
    options, args = parser.parse_args()
72
85
    if len(args) > 0:
73
86
        parser.error('No filename arguments are used, only options.')
74
87
 
 
88
 
 
89
    home = os.path.realpath(os.path.dirname(__file__))
 
90
    pidfile = os.path.join(home, 'loggerhead.pid')
 
91
 
75
92
    if options.check:
76
 
        if daemon.is_running(options.pidfile):
 
93
        if daemon.is_running(pidfile):
77
94
            sys.exit(0)
78
 
        sys.stderr.write('Did not find loggerhead running in %r;' % (
79
 
                         options.pidfile))
80
 
        sys.stderr.write(' restarting...\n')
 
95
        sys.stderr.write('Did not find loggerhead running in %r; restarting...\n' % (pidfile,))
81
96
 
82
97
    # read loggerhead config
83
98
 
84
 
    config = ConfigObj(options.configfile, encoding='utf-8')
 
99
    config = ConfigObj(os.path.join(home, 'loggerhead.conf'), encoding='utf-8')
85
100
    extra_path = config.get('bzrpath', None)
86
101
    if extra_path:
87
102
        sys.path.insert(0, extra_path)
88
103
 
89
 
    potential_overrides = [('server.socket_port', int),
90
 
                           ('server.webpath', str),
91
 
                           ('server.thread_pool', int),
92
 
                           ('server.socket_host', str)]
 
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) ]
93
110
    server_port = int(config.get('server.socket_port', 8080))
94
111
    nworkers = int(config.get('server.thread_pool', 10))
95
112
    server_host = config.get('server.socket_host', '0.0.0.0')
99
116
        value = config.get(key, None)
100
117
        if value is not None:
101
118
            value = keytype(value)
 
119
            #turbogears.config.update({ key: value })
102
120
 
103
121
    if not options.foreground:
104
122
        sys.stderr.write('\n')
105
123
        sys.stderr.write('Launching loggerhead into the background.\n')
106
 
        sys.stderr.write('PID file: %s\n' % options.pidfile)
 
124
        sys.stderr.write('PID file: %s\n' % (pidfile,))
107
125
        sys.stderr.write('\n')
108
126
 
109
 
        daemon.daemonize(options.pidfile, home)
 
127
        daemon.daemonize(pidfile, home)
110
128
 
111
 
    setup_logging(options.log_folder, config, foreground=options.foreground)
 
129
    setup_logging(home, config, foreground=options.foreground)
112
130
 
113
131
    log = logging.getLogger('loggerhead')
114
132
    log.info('Starting up...')
117
135
 
118
136
    app = app
119
137
    app = make_middleware(app)
120
 
    app = make_filter(app, None, logger_name=log.name+'.access')
121
 
    app = ErrorHandlerApp(app)
 
138
    app = make_filter(app, None)
122
139
 
123
140
    if webpath:
124
141
        scheme, netloc, path, blah, blah, blah = urlparse.urlparse(webpath)
125
 
 
126
142
        def app(environ, start_response, orig=app):
127
143
            environ['SCRIPT_NAME'] = path
128
144
            environ['HTTP_HOST'] = netloc
129
 
            environ['wsgi.url_scheme'] = scheme
130
145
            return orig(environ, start_response)
131
146
 
132
 
    load_plugins()
133
 
 
134
147
    try:
135
148
        httpserver.serve(
136
149
            app, host=server_host, port=server_port,
138
151
    finally:
139
152
        log.info('Shutdown.')
140
153
        try:
141
 
            os.remove(options.pidfile)
 
154
            os.remove(pidfile)
142
155
        except OSError:
143
156
            pass
144
157