mirror of
https://github.com/frappe/gunicorn.git
synced 2026-01-14 11:09:11 +08:00
add user/group option. uid/gid or username/groupname can now be passed
in daemon mode.
This commit is contained in:
parent
07d252eb4d
commit
53814c1af4
@ -4,4 +4,4 @@
|
|||||||
# See the NOTICE for more information.
|
# See the NOTICE for more information.
|
||||||
|
|
||||||
|
|
||||||
__version__ = "0.4.2"
|
__version__ = "0.5"
|
||||||
|
|||||||
@ -4,9 +4,11 @@
|
|||||||
# See the NOTICE for more information.
|
# See the NOTICE for more information.
|
||||||
|
|
||||||
|
|
||||||
|
import grp
|
||||||
import logging
|
import logging
|
||||||
import optparse as op
|
import optparse as op
|
||||||
import os
|
import os
|
||||||
|
import pwd
|
||||||
import pkg_resources
|
import pkg_resources
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
@ -36,6 +38,10 @@ def options():
|
|||||||
help='Run daemonized in the background.'),
|
help='Run daemonized in the background.'),
|
||||||
op.make_option('-m', '--umask', dest="umask", type='int',
|
op.make_option('-m', '--umask', dest="umask", type='int',
|
||||||
help="Define umask of daemon process"),
|
help="Define umask of daemon process"),
|
||||||
|
op.make_option('-u', '--user', dest="user",
|
||||||
|
help="Change user in daemon mode"),
|
||||||
|
op.make_option('-g', '--group', dest="group",
|
||||||
|
help="Change group in daemon mode"),
|
||||||
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='-',
|
||||||
@ -59,12 +65,24 @@ 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(umask):
|
def daemonize(umask, user=None, group=None):
|
||||||
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)
|
||||||
|
if group:
|
||||||
|
if group.isdigit():
|
||||||
|
gid = int(group)
|
||||||
|
else:
|
||||||
|
gid = grp.getgrnam(group).gr_gid
|
||||||
|
os.setgid(gid)
|
||||||
|
if user:
|
||||||
|
if user.isdigit():
|
||||||
|
uid = int(user)
|
||||||
|
else:
|
||||||
|
uid = pwd.getpwnam(user).pw_uid
|
||||||
|
os.setuid(uid)
|
||||||
else:
|
else:
|
||||||
os._exit(0)
|
os._exit(0)
|
||||||
else:
|
else:
|
||||||
@ -84,6 +102,9 @@ def daemonize(umask):
|
|||||||
os.dup2(0, 1)
|
os.dup2(0, 1)
|
||||||
os.dup2(0, 2)
|
os.dup2(0, 2)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def main(usage, get_app):
|
def main(usage, get_app):
|
||||||
parser = op.OptionParser(usage=usage, option_list=options(),
|
parser = op.OptionParser(usage=usage, option_list=options(),
|
||||||
version="%prog " + __version__)
|
version="%prog " + __version__)
|
||||||
@ -118,7 +139,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(umask)
|
daemonize(umask, user=opts.user, group=opts.group)
|
||||||
else:
|
else:
|
||||||
os.setpgrp()
|
os.setpgrp()
|
||||||
configure_logging(opts)
|
configure_logging(opts)
|
||||||
@ -132,27 +153,26 @@ def paste_server(app, global_conf=None, host="127.0.0.1", port=None,
|
|||||||
else:
|
else:
|
||||||
port = 8000
|
port = 8000
|
||||||
bind_addr = (host, int(port))
|
bind_addr = (host, int(port))
|
||||||
|
|
||||||
|
# set others options
|
||||||
|
debug = kwargs.get('debug')
|
||||||
workers = kwargs.get("workers", 1)
|
workers = kwargs.get("workers", 1)
|
||||||
|
pid = kwargs.get("pid")
|
||||||
|
daemon = kwargs.get("daemon")
|
||||||
|
umask = kwgars.get('umask', UMASK)
|
||||||
|
user = kwgars.get('user')
|
||||||
|
group = kwgars.get('group')
|
||||||
if global_conf:
|
if global_conf:
|
||||||
workers = int(global_conf.get('workers', workers))
|
workers = int(global_conf.get('workers', workers))
|
||||||
|
debug = global_conf.get('debug', debug) == "true"
|
||||||
debug = global_conf.get('debug') == "true"
|
if debug:
|
||||||
if debug:
|
# we force to one worker in debug mode.
|
||||||
# we force to one worker in debug mode.
|
workers = 1
|
||||||
workers = 1
|
|
||||||
|
|
||||||
pid = kwargs.get("pid")
|
|
||||||
if global_conf:
|
|
||||||
pid = global_conf.get('pid', pid)
|
pid = global_conf.get('pid', pid)
|
||||||
|
|
||||||
daemon = kwargs.get("daemon")
|
|
||||||
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)
|
umask = global_conf.get('umask', umask)
|
||||||
|
user = global_conf.get('user', user)
|
||||||
|
group = global_conf.get('group', group)
|
||||||
|
|
||||||
kwargs = dict(
|
kwargs = dict(
|
||||||
debug=debug,
|
debug=debug,
|
||||||
@ -161,7 +181,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(umask)
|
daemonize(umask, user=user, group=group)
|
||||||
else:
|
else:
|
||||||
os.setpgrp()
|
os.setpgrp()
|
||||||
arbiter.run()
|
arbiter.run()
|
||||||
@ -257,6 +277,12 @@ def run_paster():
|
|||||||
|
|
||||||
if not opts.umask:
|
if not opts.umask:
|
||||||
opts.umask = int(ctx.local_conf.get('umask', UMASK))
|
opts.umask = int(ctx.local_conf.get('umask', UMASK))
|
||||||
|
|
||||||
|
if not opts.group:
|
||||||
|
opts.group = ctx.local_conf.get('group')
|
||||||
|
|
||||||
|
if not opts.user:
|
||||||
|
opts.user = ctx.local_conf.get('user')
|
||||||
|
|
||||||
if not opts.bind:
|
if not opts.bind:
|
||||||
host = ctx.local_conf.get('host')
|
host = ctx.local_conf.get('host')
|
||||||
|
|||||||
@ -30,6 +30,10 @@ class Command(BaseCommand):
|
|||||||
help='Run daemonized in the background.'),
|
help='Run daemonized in the background.'),
|
||||||
make_option('--umask', dest='umask', type='int',
|
make_option('--umask', dest='umask', type='int',
|
||||||
help="Define umask of daemon process"),
|
help="Define umask of daemon process"),
|
||||||
|
make_option('-u', '--user', dest="user",
|
||||||
|
help="Change user in daemon mode"),
|
||||||
|
make_option('-g', '--group', dest="group",
|
||||||
|
help="Change group in daemon mode"),
|
||||||
)
|
)
|
||||||
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]'
|
||||||
@ -61,6 +65,8 @@ class Command(BaseCommand):
|
|||||||
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', None)
|
pidfile = options.get('pidfile', None)
|
||||||
umask = options.get('umask', UMASK)
|
umask = options.get('umask', UMASK)
|
||||||
|
uid = options.get('user')
|
||||||
|
gid = options.get('group')
|
||||||
|
|
||||||
print "Validating models..."
|
print "Validating models..."
|
||||||
self.validate(display_num_errors=True)
|
self.validate(display_num_errors=True)
|
||||||
@ -80,7 +86,7 @@ class Command(BaseCommand):
|
|||||||
arbiter = Arbiter(addr, workers, handler,
|
arbiter = Arbiter(addr, workers, handler,
|
||||||
pidfile=pidfile)
|
pidfile=pidfile)
|
||||||
if daemon:
|
if daemon:
|
||||||
daemonize(umask)
|
daemonize(umask, user=user, group=group)
|
||||||
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.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user