diff --git a/gunicorn/main.py b/gunicorn/main.py index 06c55f01..6aa3bf6e 100644 --- a/gunicorn/main.py +++ b/gunicorn/main.py @@ -34,6 +34,8 @@ def options(): help='set the background PID FILE'), op.make_option('-D', '--daemon', dest='daemon', action="store_true", help='Run daemonized in the background.'), + op.make_option('-m', '--umask', dest="umask", type='int', + help="Define umask of daemon process"), op.make_option('--log-level', dest='loglevel', default='info', help='Log level below which to silence messages. [%default]'), op.make_option('--log-file', dest='logfile', default='-', @@ -57,12 +59,12 @@ def configure_logging(opts): h.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s %(message)s")) logger.addHandler(h) -def daemonize(): +def daemonize(umask): if not 'GUNICORN_FD' in os.environ: if os.fork() == 0: os.setsid() if os.fork() == 0: - os.umask(UMASK) + os.umask(umask) else: os._exit(0) else: @@ -106,7 +108,9 @@ def main(usage, get_app): host = bind port = 8000 addr = (host, port) - + + umask = int(opts.umask or UMASK) + kwargs = dict( debug=opts.debug, pidfile=opts.pidfile @@ -114,7 +118,7 @@ def main(usage, get_app): arbiter = Arbiter(addr, workers, app, **kwargs) if opts.daemon: - daemonize() + daemonize(umask) else: os.setpgrp() configure_logging(opts) @@ -145,6 +149,10 @@ def paste_server(app, global_conf=None, host="127.0.0.1", port=None, daemon = kwargs.get("daemon") if global_conf: daemon = global_conf.get('daemon', daemonize) + + umask = kwgars.get('umask', UMASK) + if global_conf: + umask = global_conf.get('umask', umask) kwargs = dict( debug=debug, @@ -153,7 +161,7 @@ def paste_server(app, global_conf=None, host="127.0.0.1", port=None, arbiter = Arbiter(bind_addr, workers, app, **kwargs) if daemon == "true": - daemonize() + daemonize(umask) else: os.setpgrp() arbiter.run() @@ -246,6 +254,9 @@ def run_paster(): workers = opts.workers else: workers = int(ctx.local_conf.get('workers', 1)) + + if not opts.umask: + opts.umask = int(ctx.local_conf.get('umask', UMASK)) if not opts.bind: host = ctx.local_conf.get('host') @@ -268,4 +279,4 @@ def run_paster(): return app main("%prog [OPTIONS] pasteconfig.ini", get_app) - \ No newline at end of file + diff --git a/gunicorn/management/commands/run_gunicorn.py b/gunicorn/management/commands/run_gunicorn.py index 36f4e3cf..757906b7 100644 --- a/gunicorn/management/commands/run_gunicorn.py +++ b/gunicorn/management/commands/run_gunicorn.py @@ -16,7 +16,7 @@ from django.core.servers.basehttp import AdminMediaHandler, WSGIServerException from django.core.handlers.wsgi import WSGIHandler from gunicorn.arbiter import Arbiter -from gunicorn.main import daemonize +from gunicorn.main import daemonize, UMASK class Command(BaseCommand): option_list = BaseCommand.option_list + ( @@ -28,6 +28,8 @@ class Command(BaseCommand): help='set the background PID file'), make_option( '--daemon', dest='daemon', action="store_true", help='Run daemonized in the background.'), + make_option('--umask', dest='umask', type='int', + help="Define umask of daemon process"), ) help = "Starts a fully-functional Web server using gunicorn." args = '[optional port number, or ipaddr:port or unix:/path/to/sockfile]' @@ -57,8 +59,9 @@ class Command(BaseCommand): workers = int(options.get('workers', '1')) daemon = options.get('daemon') quit_command = (sys.platform == 'win32') and 'CTRL-BREAK' or 'CONTROL-C' - pidfile = options.get('pidfile') or None - + pidfile = options.get('pidfile', None) + umask = options.get('umask', UMASK) + print "Validating models..." self.validate(display_num_errors=True) print "\nDjango version %s, using settings %r" % (django.get_version(), settings.SETTINGS_MODULE) @@ -77,7 +80,7 @@ class Command(BaseCommand): arbiter = Arbiter(addr, workers, handler, pidfile=pidfile) if daemon: - daemonize() + daemonize(umask) arbiter.run() except WSGIServerException, e: # Use helpful error messages instead of ugly tracebacks. @@ -91,4 +94,4 @@ class Command(BaseCommand): except (AttributeError, KeyError): error_text = str(e) sys.stderr.write(self.style.ERROR("Error: %s" % error_text) + '\n') - sys.exit(1) \ No newline at end of file + sys.exit(1)