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']
+++ /dev/null
-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
-
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'
--- /dev/null
+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)
+