summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichael E Brown <michael_e_brown@dell.com>2007-10-17 18:22:48 -0500
committerMichael E Brown <michael_e_brown@dell.com>2007-10-17 18:22:48 -0500
commit76739828c5a8e41fde28b50ce14b5ae669b29eb4 (patch)
tree4dcca743b78d842edff093fdc39f278e0fe8d47d /src
parent4b07d5dc0bcdbd48140f5fb1412c2b55048c1889 (diff)
downloadmock-76739828c5a8e41fde28b50ce14b5ae669b29eb4.tar.gz
mock-76739828c5a8e41fde28b50ce14b5ae669b29eb4.tar.xz
mock-76739828c5a8e41fde28b50ce14b5ae669b29eb4.zip
export do_chroot() in public api. use -n option to mount/umount so it doesnt touch hosts /etc/mtab. Add option to do_chroot() to set env vars for chrooted progs.
Diffstat (limited to 'src')
-rw-r--r--src/py-libs/backend.py31
1 files changed, 16 insertions, 15 deletions
diff --git a/src/py-libs/backend.py b/src/py-libs/backend.py
index d2e2011..da5fa03 100644
--- a/src/py-libs/backend.py
+++ b/src/py-libs/backend.py
@@ -179,6 +179,7 @@ class Root(object):
mock.util.rmtree(os.path.join(self.rootdir, "dev"))
mock.util.mkdirIfAbsent(os.path.join(self.rootdir, "dev", "pts"))
os.mknod(os.path.join(self.rootdir, "dev/zero"), stat.S_IFCHR | 0666, os.makedev(1, 5))
+ os.mknod(os.path.join(self.rootdir, "dev/tty"), stat.S_IFCHR | 0666, os.makedev(5, 0))
os.mknod(os.path.join(self.rootdir, "dev/null"), stat.S_IFCHR | 0666, os.makedev(1, 3))
os.mknod(os.path.join(self.rootdir, "dev/random"), stat.S_IFCHR | 0666, os.makedev(1, 8))
os.mknod(os.path.join(self.rootdir, "dev/urandom"), stat.S_IFCHR | 0444, os.makedev(1, 9))
@@ -207,15 +208,21 @@ class Root(object):
self.state("done")
self.root_log.info("Done")
+ @traceLog(moduleLog)
+ def do_chroot(self, command, env="", *args, **kargs):
+ """execute given command in root"""
+ cmd = "%s /usr/sbin/chroot %s %s" % (env, self.rootdir, command)
+ return mock.util.do(cmd, *args, **kargs)
+
# =============
# 'Private' API
# =============
@traceLog(moduleLog)
def _mountall(self):
"""mount 'normal' fs like /dev/ /proc/ /sys"""
- cmds = ('mount -t proc mock_chroot_proc %s/proc' % self.rootdir,
- 'mount -t devpts mock_chroot_devpts %s/dev/pts' % self.rootdir,
- 'mount -t sysfs mock_chroot_sysfs %s/sys' % self.rootdir,
+ cmds = ('mount -n -t proc mock_chroot_proc %s/proc' % self.rootdir,
+ 'mount -n -t devpts mock_chroot_devpts %s/dev/pts' % self.rootdir,
+ 'mount -n -t sysfs mock_chroot_sysfs %s/sys' % self.rootdir,
)
g = [s%self.rootdir for s in ("%s/proc", "%s/dev/pts", "%s/sys")]
@@ -227,9 +234,9 @@ class Root(object):
@traceLog(moduleLog)
def _umountall(self):
"""umount all mounted chroot fs."""
- cmds = ('umount %s/proc' % self.rootdir,
- 'umount %s/dev/pts' % self.rootdir,
- 'umount %s/sys' % self.rootdir,
+ cmds = ('umount -n %s/proc' % self.rootdir,
+ 'umount -n %s/dev/pts' % self.rootdir,
+ 'umount -n %s/sys' % self.rootdir,
)
for cmd in cmds:
@@ -249,20 +256,14 @@ class Root(object):
raise mock.exception.YumError, "Error performing yum command: %s" % cmd
@traceLog(moduleLog)
- def _do_chroot(self, command, *args, **kargs):
- """execute given command in root"""
- cmd = "/usr/sbin/chroot %s %s" % (self.rootdir, command)
- return mock.util.do(cmd, *args, **kargs)
-
- @traceLog(moduleLog)
def _make_our_user(self):
if not os.path.exists(os.path.join(self.rootdir, 'usr/sbin/useradd')):
raise RootError, "Could not find useradd in chroot, maybe the install failed?"
mock.util.rmtree(os.path.join(self.rootdir, self.homedir))
- self._do_chroot('/usr/sbin/userdel -r %s' % self.chrootuser, raiseExc=False)
- self._do_chroot('/usr/sbin/groupdel %s' % self.chrootgroup, raiseExc=False)
- self._do_chroot('/usr/sbin/useradd -m -u %s -d %s %s' % (self.chrootuid, self.homedir, self.chrootuser), raiseExc=True)
+ self.do_chroot('/usr/sbin/userdel -r %s' % self.chrootuser, raiseExc=False)
+ self.do_chroot('/usr/sbin/groupdel %s' % self.chrootgroup, raiseExc=False)
+ self.do_chroot('/usr/sbin/useradd -m -u %s -d %s %s' % (self.chrootuid, self.homedir, self.chrootuser), raiseExc=True)
#