#!/usr/bin/env python import sys import os import optparse import pwd, grp from quixote.util import import_object def drop_root(user): # drop root if necessary if os.getuid() == 0: uid, gid = pwd.getpwnam(user)[2:4] os.setgid(gid) os.setuid(uid) def fork_background(): pid = os.fork() if pid != 0: sys.exit(0) os.chdir('/') os.setsid() os.umask(0) pid = os.fork() if pid != 0: sys.exit(0) def redirect_output(filename): sys.stdout = sys.stderr = open(filename, 'a', 1) os.dup2(sys.stdout.fileno(), 1) os.dup2(sys.stderr.fileno(), 2) os.close(0) def write_pid(filename): fp = open(filename, 'w') fp.write(str(os.getpid())) fp.close() def main(): parser = optparse.OptionParser() parser.add_option('--factory', default='quixote.demo.create_publisher', help='Path to factory function to create the site ' 'publisher.') parser.add_option('--pidfile', default=None, help='If provided, the PID of the server process will ' 'be written to this file.') parser.add_option('--background', action='store_true', default=False, help='Fork server process into the background.') parser.add_option('--server-type', default='simple', choices=['simple', 'scgi'], help='Type of server to run ("simple" or "scgi")') parser.add_option('--host', dest="host", default='localhost', help="Host interface to listen on.") parser.add_option('--port', dest="port", default=None, type="int", help="Port to listen on.") parser.add_option('--user', default='web', help='If started as root, use setuid to run as the ' 'specified user.') parser.add_option('--logfile', default=None, help='If specified, stderr and stdout will be redirected ' 'to the file.') options, args = parser.parse_args() if options.background: fork_background() if options.pidfile: write_pid(options.pidfile) drop_root(options.user) if options.logfile: redirect_output(options.logfile) create_publisher = import_object(options.factory) if options.server_type == 'simple': from quixote.server.simple_server import run run(create_publisher, host=options.host, port=options.port or 8080) elif options.server_type == 'scgi': from quixote.server.scgi_server import run run(create_publisher, host=options.host, port=options.port or 3000) else: assert 0 if __name__ == '__main__': main()