new cli args: userid and groupid to set user and group to change too
authorKonstantin Stepanov <kstep@p-nut.info>
Sun, 19 Dec 2010 16:21:40 +0000 (18:21 +0200)
committerKonstantin Stepanov <kstep@p-nut.info>
Sun, 19 Dec 2010 16:21:40 +0000 (18:21 +0200)
dbuscron/shell/main.py

index fbbb549..e035a5c 100644 (file)
@@ -1,14 +1,17 @@
-import sys
-from dbuscron import Logger, OptionsParser
+import os, sys
 
 def run():
 
+    from dbuscron import Logger, OptionsParser
+
     options = OptionsParser(
             daemon=dict(names=('-f', '--nodaemon'), action='store_false', default=True),
             quiet=dict(names=('--quiet', '-q'), action='count', default=0),
             verbose=dict(names=('--verbose', '-v'), action='count', default=0),
             config=dict(names=('--conf', '--config', '-c'), default='/etc/dbuscrontab'),
-            logfile=dict(names=('--log', '--logfile', '-l')))
+            logfile=dict(names=('--log', '--logfile', '-l')),
+            userid=dict(names=('-u', '--user', '--uid', '--userid')),
+            groupid=dict(names=('-g', '--group', '--gid', '--groupid')))
 
     logout = sys.stderr
     if options.logfile:
@@ -17,6 +20,48 @@ 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.daemon:
         from dbuscron.daemonize import daemonize
         daemonize(