pvl.backup.invoke: implement sudo=True to exec via sudo
authorTero Marttila <terom@paivola.fi>
Sat, 16 Feb 2013 21:40:44 +0200
changeset 68 adc190def3b1
parent 67 91153d8b499c
child 69 468704db09c4
pvl.backup.invoke: implement sudo=True to exec via sudo
pvl/backup/invoke.py
--- a/pvl/backup/invoke.py	Sat Feb 16 21:21:19 2013 +0200
+++ b/pvl/backup/invoke.py	Sat Feb 16 21:40:44 2013 +0200
@@ -7,6 +7,8 @@
 
 log = logging.getLogger('pvl.backup.invoke')
 
+SUDO = '/usr/bin/sudo'
+
 class InvokeError (Exception) :
     def __init__ (self, cmd, exit) :
         self.cmd = cmd
@@ -15,18 +17,19 @@
     def __str__ (self) :
         return "{cmd} failed: {exit}".format(cmd=self.cmd, exit=self.exit)
 
-def invoke (cmd, args, data=None) :
+def invoke (cmd, args, data=None, sudo=False) :
     """
         Invoke a command directly.
         
         data:       data to pass in on stdin, returning stdout.
                     if given as False, passes through our process stdin/out
+        sudo:       exec using sudo
 
         Doesn't give any data on stdin, and keeps process stderr.
         Returns stdout.
     """
     
-    log.debug("{cmd} {args}".format(cmd=cmd, args=' '.join(args)))
+    log.debug("{sudo}{cmd} {args}".format(sudo=('sudo ' if sudo else ''), cmd=cmd, args=' '.join(args)))
 
     if data is False :
         # keep process stdin/out
@@ -34,7 +37,12 @@
     else :
         io = subprocess.PIPE
 
-    p = subprocess.Popen([cmd] + args, stdin=io, stdout=io)
+    args = [cmd] + args
+
+    if sudo :
+        args = [SUDO] + args
+
+    p = subprocess.Popen(args, stdin=io, stdout=io)
 
     # get output
     stdout, stderr = p.communicate(input=data)