From ca86c78986d2dd908593c16adfc2a4b1af3141cf Mon Sep 17 00:00:00 2001 From: Konstantin Stepanov Date: Mon, 20 Dec 2010 00:24:01 +0200 Subject: [PATCH] moved user & group id setting code into separate function Daemonize module renamed to util, set_user_and_group() and daemonize() functions put into it. --- dbuscron/__init__.py | 5 +-- dbuscron/daemonize.py | 57 ------------------------------- dbuscron/shell/main.py | 46 +++---------------------- dbuscron/util.py | 89 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 96 insertions(+), 101 deletions(-) delete mode 100644 dbuscron/daemonize.py create mode 100644 dbuscron/util.py diff --git a/dbuscron/__init__.py b/dbuscron/__init__.py index a2127b2..2a4b1c3 100644 --- a/dbuscron/__init__.py +++ b/dbuscron/__init__.py @@ -1,9 +1,10 @@ from dbuscron.bus import DbusRule, DbusBus from dbuscron.command import Command, Commands -from dbuscron.daemonize import daemonize +from dbuscron.util import daemonize, set_user_and_group from dbuscron.parser import CrontabParser, OptionsParser from dbuscron.logger import Logger -__all__ = ['DbusRule', 'DbusBus', 'Command', 'Commands', 'daemonize', 'CrontabParser', 'OptionsParser', 'Logger'] +__all__ = ['DbusRule', 'DbusBus', 'Command', 'Commands', 'daemonize', 'set_user_and_group', 'CrontabParser', 'OptionsParser', +'Logger'] diff --git a/dbuscron/daemonize.py b/dbuscron/daemonize.py deleted file mode 100644 index 4096289..0000000 --- a/dbuscron/daemonize.py +++ /dev/null @@ -1,57 +0,0 @@ -import os, sys - -def daemonize(logfile=None, errfile=None, pidfile=None): - devnull = os.devnull if hasattr(os, 'devnull') else '/dev/null' - - initwd = os.getcwd() - def absolutize(path): - if path.startswith('/'): - return path - return os.path.join(initwd, path) - - try: - if os.fork() == 0: - os.setsid() - if os.fork() == 0: - os.chdir('/') - os.umask(0) - else: - os._exit(0) - else: - os._exit(0) - except OSError, e: - raise Exception('Failed daemonization: %s' % str(e)) - - for i in range(0, 3): - os.close(i) - - os.open(devnull, os.O_RDWR) - - def open_trunc(fname): - f = os.open(fname, \ - os.O_WRONLY|os.O_CREAT) - os.ftruncate(f, 0) - return f - - def open_or_dup(fname, fd=None): - if fname: - return open_trunc(absolutize(fname)) - elif fd: - os.dup2(*fd) - - open_or_dup(logfile, (0, 1)) - open_or_dup(errfile, (1, 2)) - - pid = os.getpid() - if pidfile: - pidfile = absolutize(pidfile) - fd = open_trunc(pidfile) - os.write(fd, str(pid)) - os.close(fd) - - def remove_pidfile(): - os.unlink(pidfile) - sys.exitfunc = remove_pidfile - - return pid - diff --git a/dbuscron/shell/main.py b/dbuscron/shell/main.py index e035a5c..717e5b7 100644 --- a/dbuscron/shell/main.py +++ b/dbuscron/shell/main.py @@ -20,50 +20,12 @@ def run(): log = Logger(__name__, out=logout) log.level = options.verbose - options.quiet + Logger.WARNING - if os.getuid() == 0: - if options.userid: - try: - import pwd - try: - userid = int(options.userid) - except ValueError: - userid = pwd.getpwnam(options.userid)[2] - - except: - log.warn('Unable to find user', options.userid) - userid = None - - else: - userid = None - - if options.groupid: - try: - try: - groupid = int(options.groupid) - except ValueError: - import grp - groupid = grp.getgrnam(options.groupid)[2] - - except: - log.warn('Unable to find group', options.groupid) - groupid = None - - elif userid: - groupid = pwd.getpwuid(userid)[3] - - else: - groupid = None - - if groupid: - os.setgid(groupid) - if userid: - os.getuid(userid) - - elif options.userid or options.groupid: - log.warn('Ignoring userid and groupid arguments: I am not a root to pretend somebody else.') + if options.userid or options.groupid: + from dbuscron.util import set_user_and_group + set_user_and_group(options.userid, options.groupid) if options.daemon: - from dbuscron.daemonize import daemonize + from dbuscron.util import daemonize daemonize( pidfile='/var/run/dbuscron.pid', logfile='/var/log/dbuscron.log' diff --git a/dbuscron/util.py b/dbuscron/util.py new file mode 100644 index 0000000..d52e16f --- /dev/null +++ b/dbuscron/util.py @@ -0,0 +1,89 @@ +import os, sys + +def daemonize(logfile=None, errfile=None, pidfile=None): + devnull = os.devnull if hasattr(os, 'devnull') else '/dev/null' + + initwd = os.getcwd() + + def absolutize(path): + if path.startswith('/'): + return path + return os.path.join(initwd, path) + + try: + if os.fork() == 0: + os.setsid() + if os.fork() == 0: + os.chdir('/') + os.umask(0) + else: + os._exit(0) + else: + os._exit(0) + except OSError, e: + raise SystemError('Failed daemonization: %s' % str(e)) + + for i in range(0, 3): + os.close(i) + + os.open(devnull, os.O_RDWR) + + def open_trunc(fname): + f = os.open(fname, os.O_WRONLY | os.O_CREAT) + os.ftruncate(f, 0) + return f + + def open_or_dup(fname, fd=None): + if fname: + return open_trunc(absolutize(fname)) + elif fd: + os.dup2(*fd) + + open_or_dup(logfile, (0, 1)) + open_or_dup(errfile, (1, 2)) + + pid = os.getpid() + if pidfile: + pidfile = absolutize(pidfile) + fd = open_trunc(pidfile) + os.write(fd, str(pid)) + os.close(fd) + + def remove_pidfile(): + os.unlink(pidfile) + sys.exitfunc = remove_pidfile + + return pid + +def set_user_and_group(user, group=None): + if os.getuid() != 0: + raise SystemError('I\'m not a root to pretend somebody else.') + + if user: + import pwd + try: + userid = int(user) + except ValueError: + userid = pwd.getpwnam(user)[2] + + else: + userid = None + + if group: + try: + groupid = int(group) + except ValueError: + import grp + groupid = grp.getgrnam(group)[2] + + elif userid: + groupid = pwd.getpwuid(userid)[3] + + else: + groupid = None + + if groupid: + os.setgid(groupid) + if userid: + os.setuid(userid) + -- 1.7.9.5