add umask option

This commit is contained in:
benoitc 2010-02-15 11:30:15 +01:00
parent 2d760e492d
commit 07d252eb4d
2 changed files with 25 additions and 11 deletions

View File

@ -34,6 +34,8 @@ def options():
help='set the background PID FILE'), help='set the background PID FILE'),
op.make_option('-D', '--daemon', dest='daemon', action="store_true", op.make_option('-D', '--daemon', dest='daemon', action="store_true",
help='Run daemonized in the background.'), 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', op.make_option('--log-level', dest='loglevel', default='info',
help='Log level below which to silence messages. [%default]'), help='Log level below which to silence messages. [%default]'),
op.make_option('--log-file', dest='logfile', 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")) h.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s %(message)s"))
logger.addHandler(h) logger.addHandler(h)
def daemonize(): def daemonize(umask):
if not 'GUNICORN_FD' in os.environ: if not 'GUNICORN_FD' in os.environ:
if os.fork() == 0: if os.fork() == 0:
os.setsid() os.setsid()
if os.fork() == 0: if os.fork() == 0:
os.umask(UMASK) os.umask(umask)
else: else:
os._exit(0) os._exit(0)
else: else:
@ -106,7 +108,9 @@ def main(usage, get_app):
host = bind host = bind
port = 8000 port = 8000
addr = (host, port) addr = (host, port)
umask = int(opts.umask or UMASK)
kwargs = dict( kwargs = dict(
debug=opts.debug, debug=opts.debug,
pidfile=opts.pidfile pidfile=opts.pidfile
@ -114,7 +118,7 @@ def main(usage, get_app):
arbiter = Arbiter(addr, workers, app, **kwargs) arbiter = Arbiter(addr, workers, app, **kwargs)
if opts.daemon: if opts.daemon:
daemonize() daemonize(umask)
else: else:
os.setpgrp() os.setpgrp()
configure_logging(opts) 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") daemon = kwargs.get("daemon")
if global_conf: if global_conf:
daemon = global_conf.get('daemon', daemonize) daemon = global_conf.get('daemon', daemonize)
umask = kwgars.get('umask', UMASK)
if global_conf:
umask = global_conf.get('umask', umask)
kwargs = dict( kwargs = dict(
debug=debug, 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) arbiter = Arbiter(bind_addr, workers, app, **kwargs)
if daemon == "true": if daemon == "true":
daemonize() daemonize(umask)
else: else:
os.setpgrp() os.setpgrp()
arbiter.run() arbiter.run()
@ -246,6 +254,9 @@ def run_paster():
workers = opts.workers workers = opts.workers
else: else:
workers = int(ctx.local_conf.get('workers', 1)) 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: if not opts.bind:
host = ctx.local_conf.get('host') host = ctx.local_conf.get('host')
@ -268,4 +279,4 @@ def run_paster():
return app return app
main("%prog [OPTIONS] pasteconfig.ini", get_app) main("%prog [OPTIONS] pasteconfig.ini", get_app)

View File

@ -16,7 +16,7 @@ from django.core.servers.basehttp import AdminMediaHandler, WSGIServerException
from django.core.handlers.wsgi import WSGIHandler from django.core.handlers.wsgi import WSGIHandler
from gunicorn.arbiter import Arbiter from gunicorn.arbiter import Arbiter
from gunicorn.main import daemonize from gunicorn.main import daemonize, UMASK
class Command(BaseCommand): class Command(BaseCommand):
option_list = BaseCommand.option_list + ( option_list = BaseCommand.option_list + (
@ -28,6 +28,8 @@ class Command(BaseCommand):
help='set the background PID file'), help='set the background PID file'),
make_option( '--daemon', dest='daemon', action="store_true", make_option( '--daemon', dest='daemon', action="store_true",
help='Run daemonized in the background.'), 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." help = "Starts a fully-functional Web server using gunicorn."
args = '[optional port number, or ipaddr:port or unix:/path/to/sockfile]' 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')) workers = int(options.get('workers', '1'))
daemon = options.get('daemon') daemon = options.get('daemon')
quit_command = (sys.platform == 'win32') and 'CTRL-BREAK' or 'CONTROL-C' 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..." print "Validating models..."
self.validate(display_num_errors=True) self.validate(display_num_errors=True)
print "\nDjango version %s, using settings %r" % (django.get_version(), settings.SETTINGS_MODULE) 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, arbiter = Arbiter(addr, workers, handler,
pidfile=pidfile) pidfile=pidfile)
if daemon: if daemon:
daemonize() daemonize(umask)
arbiter.run() arbiter.run()
except WSGIServerException, e: except WSGIServerException, e:
# Use helpful error messages instead of ugly tracebacks. # Use helpful error messages instead of ugly tracebacks.
@ -91,4 +94,4 @@ class Command(BaseCommand):
except (AttributeError, KeyError): except (AttributeError, KeyError):
error_text = str(e) error_text = str(e)
sys.stderr.write(self.style.ERROR("Error: %s" % error_text) + '\n') sys.stderr.write(self.style.ERROR("Error: %s" % error_text) + '\n')
sys.exit(1) sys.exit(1)