chiark / gitweb /
adt-virt-schroot: better handling of root-users/groups (#667001)
[autopkgtest.git] / virt-subproc / adt-virt-schroot
index b75f59d4b127d49f472a0302c643ee43bfe73db1..40384b9ff55a546756e1c22a6d603184352a1960 100755 (executable)
@@ -1,4 +1,4 @@
-#!/usr/bin/python2.4
+#!/usr/bin/python2.6
 #
 # adt-virt-schroot is part of autopkgtest
 # autopkgtest is a tool for testing Debian binary packages
@@ -30,13 +30,31 @@ import grp
 import pwd
 from optparse import OptionParser
 
-try: our_base = os.environ['AUTOPKGTEST_BASE']
-except KeyError: our_base = '/usr/share/autopkgtest';
-sys.path.insert(1, our_base+'/python')
+try: our_base = os.environ['AUTOPKGTEST_BASE']+'/lib'
+except KeyError: our_base = '/usr/share/autopkgtest/python';
+sys.path.insert(1, our_base)
 
 import VirtSubproc as vsp
 capabilities = []
 
+def pw_uid(exp_name):
+       try:
+               return pwd.getpwnam(exp_name).pw_uid
+       except KeyError:
+               return None
+
+def gr_gid(exp_name):
+       try:
+               return grp.getgrnam(exp_name).gr_gid
+       except KeyError:
+               return None
+
+def match(exp_names, ids, extract_id):
+       for exp_name in [n for n in exp_names.split(',') if n]:
+               if extract_id(exp_name) in ids:
+                       return True
+       return False
+
 def parse_args():
        global schroot, debuglevel
 
@@ -66,27 +84,29 @@ def parse_args():
        if regexp.search('snapshot',cfg['type']):
                capabilities.append('revert')
 
-       if [True
-               for exp_name in cfg['root-users'].split()
-               for got_uid in [os.getuid()]
-               if got_uid == pwd.getpwnam(exp_name).pw_uid
-       ] or [True
-               for exp_name in cfg['root-groups'].split()
-               for got_gid in [os.getgid()] + os.getgroups()
-               if got_gid == grp.getgrnam(exp_name).gr_gid
-       ]:
+       if (match(cfg['root-users'], [os.getuid()], pw_uid) or
+           match(cfg['root-groups'], [os.getgid()] + os.getgroups(), gr_gid)):
                capabilities.append('root-on-testbed')
 
 def hook_open():
        global schroot, sessid, downtmp
        sessid = vsp.execute('schroot -b -c',[schroot], downp=False, outp=True)
-       vsp.down = ['schroot','-r','-c',sessid]
+       vsp.down = ['schroot','-r','-d','/','-c',sessid]
        if 'root-on-testbed' in capabilities: vsp.down += ['-u','root']
-       vsp.down += ['--','sh','-c']
-       return None
+       vsp.down += ['--']
+       vsp.downkind = 'auxverb'
+
+def hook_downtmp():
+       return vsp.downtmp_mktemp()
+
+def hook_revert():
+       vsp.downtmp_remove()
+       hook_cleanup()
+       hook_open()
 
 def hook_cleanup():
        global schroot, sessid, downtmp
+       vsp.downtmp_remove()
        vsp.execute('schroot -e -c',[sessid], downp=False)
 
 def hook_forked_inchild():