~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to serve-branches

  • Committer: Guillermo Gonzalez
  • Date: 2008-09-09 22:45:53 UTC
  • mto: This revision was merged to the branch mainline in revision 221.
  • Revision ID: guillo.gonzo@gmail.com-20080909224553-eev34llmsdwwnjdl
 * added --reload option

Show diffs side-by-side

added added

removed removed

Lines of Context:
29
29
from loggerhead.apps.filesystem import (
30
30
    BranchesFromFileSystemRoot, UserBranchesFromFileSystemRoot)
31
31
 
 
32
_reloader_environ_key = 'PYTHON_RELOADER_SHOULD_RUN'
32
33
 
33
34
def command_line_parser():
34
35
    parser = OptionParser("%prog [options] <path>")
40
41
                      help="Serve user directories as ~user.")
41
42
    parser.add_option("--trunk-dir", metavar="DIR",
42
43
                      help="The directory that contains the trunk branches.")
 
44
    parser.add_option("--port", dest="user_port",
 
45
                      help="Port Loggerhead should listen on (defaults to 8080).")
 
46
    parser.add_option("--host", dest="user_host",
 
47
                      help="Host Loggerhead should listen on.")
 
48
    parser.add_option("--prefix", dest="user_prefix",
 
49
                      help="Specify host prefix.")
 
50
    parser.add_option("--reload", action="store_true", dest="reload",
 
51
                      help="Use a file monitor to restart the application")
43
52
    parser.add_option("--version", action="store_true", dest="show_version",
44
53
                      help="Print the software version and exit")
45
54
    return parser
71
80
    if options.trunk_dir and not options.user_dirs:
72
81
        print "--trunk-dir is only valid with --user-dirs"
73
82
        sys.exit(1)
 
83
        
 
84
    if options.reload:
 
85
        if os.environ.get(_reloader_environ_key):
 
86
            from paste import reloader
 
87
            reloader.install(int(1))
 
88
        else:
 
89
            return restart_with_reloader()
74
90
 
75
91
    if options.user_dirs:
76
92
        if not options.trunk_dir:
82
98
    app = HTTPExceptionHandler(app)
83
99
    app = TransLogger(app)
84
100
 
 
101
    if not options.user_prefix:
 
102
        prefix = '/'
 
103
    else:
 
104
        prefix = options.user_prefix
 
105
 
85
106
    try:
86
107
        from paste.deploy.config import PrefixMiddleware
87
108
    except ImportError:
88
109
        pass
89
110
    else:
90
 
        app = PrefixMiddleware(app)
91
 
 
92
 
    httpserver.serve(app, host='0.0.0.0', port='8080')
 
111
        app = PrefixMiddleware(app, prefix=prefix)
 
112
    
 
113
    if not options.user_port:
 
114
        port = '8080'
 
115
    else:
 
116
        port = options.user_port
 
117
 
 
118
    if not options.user_host:
 
119
        host = '0.0.0.0'
 
120
    else:
 
121
        host = options.user_host
 
122
 
 
123
    httpserver.serve(app, host=host, port=port)
 
124
    
 
125
 
 
126
def restart_with_reloader():
 
127
    print 'Starting subprocess with file monitor'
 
128
    while 1:
 
129
        args = [sys.executable] + sys.argv
 
130
        new_environ = os.environ.copy()
 
131
        new_environ[_reloader_environ_key] = 'true'
 
132
        proc = None
 
133
        try:
 
134
            try:
 
135
                import paste.script.serve
 
136
                import subprocess
 
137
                paste.script.serve._turn_sigterm_into_systemexit()
 
138
                proc = subprocess.Popen(args, env=new_environ)
 
139
                exit_code = proc.wait()
 
140
                proc = None
 
141
            except KeyboardInterrupt:
 
142
                print '^C caught in monitor process'
 
143
                return 1
 
144
        finally:
 
145
            if (proc is not None
 
146
                and hasattr(os, 'kill')):
 
147
                import signal
 
148
                try:
 
149
                    os.kill(proc.pid, signal.SIGTERM)
 
150
                except (OSError, IOError):
 
151
                    pass
 
152
            
 
153
        # Reloader always exits with code 3; but if we are
 
154
        # a monitor, any exit code will restart
 
155
        if exit_code != 3:
 
156
            return exit_code
 
157
        print '-'*20, 'Restarting', '-'*20
93
158
 
94
159
 
95
160
if __name__ == "__main__":