~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to serve-branches

  • Committer: Matt Nordhoff
  • Date: 2009-04-30 10:39:05 UTC
  • mto: This revision was merged to the branch mainline in revision 406.
  • Revision ID: mnordhoff@mattnordhoff.com-20090430103905-10si14h2i325htrj
Strip trailing whitespace

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
import os
20
20
import sys
21
21
 
22
 
from optparse import OptionParser
 
22
from bzrlib.plugin import load_plugins
23
23
 
24
24
from paste import httpserver
25
 
from paste.httpexceptions import HTTPExceptionHandler
 
25
from paste.httpexceptions import HTTPExceptionHandler, HTTPInternalServerError
26
26
from paste.translogger import TransLogger
27
27
 
28
28
from loggerhead import __version__
29
29
from loggerhead.apps.filesystem import (
30
30
    BranchesFromFileSystemRoot, UserBranchesFromFileSystemRoot)
31
 
 
32
 
 
33
 
def command_line_parser():
34
 
    parser = OptionParser("%prog [options] <path>")
35
 
    parser.set_defaults(
36
 
        user_dirs=False,
37
 
        show_version=False,
38
 
        )
39
 
    parser.add_option("--user-dirs", action="store_true", dest="user_dirs",
40
 
                      help="Serve user directories as ~user.")
41
 
    parser.add_option("--trunk-dir", metavar="DIR",
42
 
                      help="The directory that contains the trunk branches.")
43
 
    parser.add_option("--port", dest="user_port",
44
 
                      help="Port Loggerhead should listen on. 8080 is the default one.")
45
 
    parser.add_option("--host", dest="user_host",
46
 
                      help="Host Loggerhead should listen on.")
47
 
    parser.add_option("--prefix", dest="user_prefix",
48
 
                      help="Specify host prefix.")
49
 
    parser.add_option("--version", action="store_true", dest="show_version",
50
 
                      help="Print the software version and exit")
51
 
    return parser
 
31
from loggerhead.config import LoggerheadConfig
 
32
from loggerhead.util import Reloader
 
33
from loggerhead.apps.error import ErrorHandlerApp
52
34
 
53
35
 
54
36
def main(args):
55
 
    logging.basicConfig()
56
 
    logging.getLogger().setLevel(logging.DEBUG)
57
 
 
58
 
    parser = command_line_parser()
59
 
    (options, args) = parser.parse_args(sys.argv[1:])
60
 
 
61
 
    if options.show_version:
 
37
    config = LoggerheadConfig()
 
38
 
 
39
    if config.get_option('show_version'):
62
40
        print "loggerhead %s" % __version__
63
41
        sys.exit(0)
64
42
 
65
 
    if len(args) > 1:
66
 
        parser.print_help()
 
43
    if config.arg_count > 1:
 
44
        config.print_help()
67
45
        sys.exit(1)
68
 
    elif len(args) == 1:
69
 
        [path] = args
 
46
    elif config.arg_count == 1:
 
47
        path = config.get_arg(0)
70
48
    else:
71
49
        path = '.'
72
50
 
74
52
        print "%s is not a directory" % path
75
53
        sys.exit(1)
76
54
 
77
 
    if options.trunk_dir and not options.user_dirs:
 
55
    if config.get_option('trunk_dir') and not config.get_option('user_dirs'):
78
56
        print "--trunk-dir is only valid with --user-dirs"
79
57
        sys.exit(1)
80
58
 
81
 
    if options.user_dirs:
82
 
        if not options.trunk_dir:
 
59
    if config.get_option('reload'):
 
60
        if Reloader.is_installed():
 
61
            Reloader.install()
 
62
        else:
 
63
            return Reloader.restart_with_reloader()
 
64
 
 
65
    if config.get_option('user_dirs'):
 
66
        if not config.get_option('trunk_dir'):
83
67
            print "You didn't specify a directory for the trunk directories."
84
68
            sys.exit(1)
85
 
        app = UserBranchesFromFileSystemRoot(path, options.trunk_dir)
86
 
    else:
87
 
        app = BranchesFromFileSystemRoot(path)
88
 
    app = HTTPExceptionHandler(app)
89
 
    app = TransLogger(app)
90
 
 
91
 
    if not options.user_prefix:
 
69
        app = UserBranchesFromFileSystemRoot(path, config)
 
70
    else:
 
71
        app = BranchesFromFileSystemRoot(path, config)
 
72
 
 
73
    # setup_logging()
 
74
    logging.basicConfig()
 
75
    logging.getLogger('').setLevel(logging.DEBUG)
 
76
    logger = getattr(app, 'log', logging.getLogger('loggerhead'))
 
77
    if config.get_option('log_folder'):
 
78
        logfile_path = os.path.join(
 
79
            config.get_option('log_folder'), 'serve-branches.log')
 
80
    else:
 
81
        logfile_path = 'serve-branches.log'
 
82
    logfile = logging.FileHandler(logfile_path, 'a')
 
83
    formatter = logging.Formatter('%(asctime)s %(levelname)-8s %(name)s:'
 
84
                                  ' %(message)s')
 
85
    logfile.setFormatter(formatter)
 
86
    logfile.setLevel(logging.DEBUG)
 
87
    logger.addHandler(logfile)
 
88
 
 
89
    # setup_logging() #end
 
90
 
 
91
    app = TransLogger(app, logger=logger)
 
92
    if config.get_option('profile'):
 
93
        from loggerhead.middleware.profile import LSProfMiddleware
 
94
        app = LSProfMiddleware(app)
 
95
    if config.get_option('memory_profile'):
 
96
        from dozer import Dozer
 
97
        app = Dozer(app)
 
98
 
 
99
    if not config.get_option('user_prefix'):
92
100
        prefix = '/'
93
101
    else:
94
 
        prefix = options.user_prefix
 
102
        prefix = config.get_option('user_prefix')
 
103
        if not prefix.startswith('/'):
 
104
            prefix = '/' + prefix
95
105
 
96
106
    try:
97
107
        from paste.deploy.config import PrefixMiddleware
98
108
    except ImportError:
99
 
        pass
 
109
        cant_proxy_correctly_message = (
 
110
            'Unsupported configuration: PasteDeploy not available, but '
 
111
            'loggerhead appears to be behind a proxy.')
 
112
        def check_not_proxied(app):
 
113
            def wrapped(environ, start_response):
 
114
                if 'HTTP_X_FORWARDED_SERVER' in environ:
 
115
                    exc = HTTPInternalServerError()
 
116
                    exc.explanation = cant_proxy_correctly_message
 
117
                    raise exc
 
118
                return app(environ, start_response)
 
119
            return wrapped
 
120
        app = check_not_proxied(app)
100
121
    else:
101
122
        app = PrefixMiddleware(app, prefix=prefix)
102
 
    
103
 
    if not options.user_port:
 
123
 
 
124
    app = HTTPExceptionHandler(app)
 
125
    app = ErrorHandlerApp(app)
 
126
 
 
127
    if not config.get_option('user_port'):
104
128
        port = '8080'
105
129
    else:
106
 
        port = options.user_port
 
130
        port = config.get_option('user_port')
107
131
 
108
 
    if not options.user_host:
 
132
    if not config.get_option('user_host'):
109
133
        host = '0.0.0.0'
110
134
    else:
111
 
        host = options.user_host
 
135
        host = config.get_option('user_host')
 
136
 
 
137
    load_plugins()
112
138
 
113
139
    httpserver.serve(app, host=host, port=port)
114
140