mirror of
https://github.com/frappe/gunicorn.git
synced 2026-01-14 11:09:11 +08:00
When Gunicorn is configured to change the effective user or group of the worker processes, it changes the owner and group fo the the temporary files used for interprocess communication. With this change, Gunicorn does not change the owner or group of the files if the worker processes will run as the current effective user and gorup. This change avoids calling chown when it is not necessary, which may allow Gunicorn to be used in environments that restrict use of the chown syscall. Relates to #2059.
54 lines
1.4 KiB
Python
54 lines
1.4 KiB
Python
# -*- coding: utf-8 -
|
|
#
|
|
# This file is part of gunicorn released under the MIT license.
|
|
# See the NOTICE for more information.
|
|
|
|
import os
|
|
import platform
|
|
import tempfile
|
|
|
|
from gunicorn import util
|
|
|
|
PLATFORM = platform.system()
|
|
IS_CYGWIN = PLATFORM.startswith('CYGWIN')
|
|
|
|
|
|
class WorkerTmp(object):
|
|
|
|
def __init__(self, cfg):
|
|
old_umask = os.umask(cfg.umask)
|
|
fdir = cfg.worker_tmp_dir
|
|
if fdir and not os.path.isdir(fdir):
|
|
raise RuntimeError("%s doesn't exist. Can't create workertmp." % fdir)
|
|
fd, name = tempfile.mkstemp(prefix="wgunicorn-", dir=fdir)
|
|
os.umask(old_umask)
|
|
|
|
# change the owner and group of the file if the worker will run as
|
|
# a different user or group, so that the worker can modify the file
|
|
if cfg.uid != os.geteuid() or cfg.gid != os.getegid():
|
|
util.chown(name, cfg.uid, cfg.gid)
|
|
|
|
# unlink the file so we don't leak tempory files
|
|
try:
|
|
if not IS_CYGWIN:
|
|
util.unlink(name)
|
|
self._tmp = os.fdopen(fd, 'w+b', 1)
|
|
except:
|
|
os.close(fd)
|
|
raise
|
|
|
|
self.spinner = 0
|
|
|
|
def notify(self):
|
|
self.spinner = (self.spinner + 1) % 2
|
|
os.fchmod(self._tmp.fileno(), self.spinner)
|
|
|
|
def last_update(self):
|
|
return os.fstat(self._tmp.fileno()).st_ctime
|
|
|
|
def fileno(self):
|
|
return self._tmp.fileno()
|
|
|
|
def close(self):
|
|
return self._tmp.close()
|