moved user & group id setting code into separate function
authorKonstantin Stepanov <kstep@p-nut.info>
Sun, 19 Dec 2010 22:24:01 +0000 (00:24 +0200)
committerKonstantin Stepanov <kstep@p-nut.info>
Mon, 20 Dec 2010 00:06:57 +0000 (02:06 +0200)
Daemonize module renamed to util, set_user_and_group() and daemonize()
functions put into it.

dbuscron/__init__.py
dbuscron/daemonize.py [deleted file]
dbuscron/shell/main.py
dbuscron/util.py [new file with mode: 0644]

index a2127b2..2a4b1c3 100644 (file)
@@ -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 (file)
index 4096289..0000000
+++ /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
-
index e035a5c..717e5b7 100644 (file)
@@ -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 (file)
index 0000000..d52e16f
--- /dev/null
@@ -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)
+