Skip to content
Snippets Groups Projects
Commit 4eba2347 authored by Sebastien Luttringer's avatar Sebastien Luttringer
Browse files

add istrick file in {,un}prepare_chroot functions

prepare and uprepare chroot functions now track non existant files
preparing are now done more carrefully about tricks
parent 1a802392
No related branches found
No related tags found
No related merge requests found
...@@ -373,27 +373,38 @@ def prepare_chroot(path, mount=True): ...@@ -373,27 +373,38 @@ def prepare_chroot(path, mount=True):
check_call(["mount", "--bind", origin, target], close_fds=True) check_call(["mount", "--bind", origin, target], close_fds=True)
except CalledProcessError as e: except CalledProcessError as e:
warn("Mount failed: %s.\n" % e) warn("Mount failed: %s.\n" % e)
arrow("Cheating") arrow("Tricks")
exists = os.path.exists
join = os.path.join
# check path is a kind of linux FHS # check path is a kind of linux FHS
if not os.path.exists(os.path.join(path, "etc")) or not os.path.exists(os.path.join(path, "usr")): if not exists(join(path, "etc")) or not exists(join(path, "usr")):
return return
# trick resolv.conf # trick resolv.conf
try: try:
if os.path.exists("/etc/resolv.conf"): resolv_path = join(path, "etc", "resolv.conf")
resolv_backup_path = join(path, "etc", "resolv.conf.isbackup")
resolv_trick_path = join(path, "etc", "resolv.conf.istrick")
if (exists("/etc/resolv.conf")
and not exists(resolv_backup_path)
and not exists(resolv_trick_path)):
arrow("resolv.conf", 1) arrow("resolv.conf", 1)
resolv_path = os.path.join(path, "etc", "resolv.conf") if exists(resolv_path):
if os.path.exists(resolv_path): os.rename(resolv_path, resolv_backup_path)
os.rename(resolv_path, "%s.isbackup" % resolv_path) else:
open(resolv_trick_path, "wb")
shutil.copy("/etc/resolv.conf", resolv_path) shutil.copy("/etc/resolv.conf", resolv_path)
except Exception as e: except Exception as e:
warn("resolv.conf tricks fail: %s" % e) warn("resolv.conf tricks fail: %s" % e)
# trick mtab # trick mtab
try: try:
mtab_path = os.path.join(path, "etc", "mtab") mtab_path = join(path, "etc", "mtab")
arrow("mtab", 1) mtab_backup_path = join(path, "etc", "mtab.isbackup")
if os.path.exists(mtab_path): mtab_trick_path = join(path, "etc", "mtab.istrick")
os.rename(mtab_path, "%s.isbackup" % mtab_path) if not exists(mtab_backup_path) and not exists(mtab_trick_path):
os.symlink("/proc/self/mounts", mtab_path) arrow("mtab", 1)
if os.path.exists(mtab_path):
os.rename(mtab_path, mtab_backup_path)
os.symlink("/proc/self/mounts", mtab_path)
except Exception as e: except Exception as e:
warn("mtab tricks fail: %s" % e) warn("mtab tricks fail: %s" % e)
# try to guest distro # try to guest distro
...@@ -402,10 +413,10 @@ def prepare_chroot(path, mount=True): ...@@ -402,10 +413,10 @@ def prepare_chroot(path, mount=True):
if distro == "debian": if distro == "debian":
arrow("Debian specific", 1) arrow("Debian specific", 1)
# create a chroot header # create a chroot header
try: open(os.path.join(path, "etc", "debian_chroot"), "w").write("CHROOT") try: open(join(path, "etc", "debian_chroot"), "w").write("CHROOT")
except: pass except: pass
# fake policy-rc.d. It must exit 101, it's an expected exitcode. # fake policy-rc.d. It must exit 101, it's an expected exitcode.
policy_path = os.path.join(path, "usr", "sbin", "policy-rc.d") policy_path = join(path, "usr", "sbin", "policy-rc.d")
try: open(policy_path, "w").write("#!/bin/bash\nexit 101\n") try: open(policy_path, "w").write("#!/bin/bash\nexit 101\n")
except: pass except: pass
# policy-rc.d needs to be executable # policy-rc.d needs to be executable
...@@ -415,38 +426,68 @@ def unprepare_chroot(path, mount=True): ...@@ -415,38 +426,68 @@ def unprepare_chroot(path, mount=True):
''' '''
Rollback preparation of a chroot environment inside a directory Rollback preparation of a chroot environment inside a directory
''' '''
arrow("Uncheating") arrow("Untricks")
exists = os.path.exists
join = os.path.join
# check path is a kind of linux FHS # check path is a kind of linux FHS
if os.path.exists(os.path.join(path, "etc")) and os.path.exists(os.path.join(path, "usr")): if exists(os.path.join(path, "etc")) and exists(os.path.join(path, "usr")):
# untrick mtab # untrick mtab
mtab_path = os.path.join(path, "etc", "mtab") mtab_path = join(path, "etc", "mtab")
arrow("mtab", 1) mtab_backup_path = join(path, "etc", "mtab.isbackup")
if os.path.exists(mtab_path): mtab_trick_path = join(path, "etc", "mtab.istrick")
os.unlink(mtab_path) if exists(mtab_backup_path) or exists(mtab_trick_path):
if os.path.exists("%s.isbackup" % mtab_path): arrow("mtab", 1)
os.rename("%s.isbackup" % mtab_path, mtab_path) # order matter !
if exists(mtab_trick_path):
try: os.unlink(mtab_path)
except OSError: pass
try:
os.unlink(mtab_trick_path)
except OSError:
warn("Unable to remove %s" % mtab_trick_path)
if exists(mtab_backup_path):
try: os.unlink(mtab_path)
except OSError: pass
try:
os.rename(mtab_backup_path, mtab_path)
except OSError:
warn("Unable to restore %s" % mtab_backup_path)
# untrick resolv.conf # untrick resolv.conf
if os.path.exists("/etc/resolv.conf"): resolv_path = join(path, "etc", "resolv.conf")
resolv_backup_path = join(path, "etc", "resolv.conf.isbackup")
resolv_trick_path = join(path, "etc", "resolv.conf.istrick")
if exists(resolv_backup_path) or exists(resolv_trick_path):
arrow("resolv.conf", 1) arrow("resolv.conf", 1)
resolv_path = os.path.join(path, "etc", "resolv.conf") # order matter !
if os.path.exists(resolv_path): if exists(resolv_trick_path):
os.unlink(resolv_path) try: os.unlink(resolv_path)
if os.path.exists("%s.isbackup" % resolv_path): except OSError: pass
os.rename("%s.isbackup" % resolv_path, resolv_path) try:
os.unlink(resolv_trick_path)
except OSError:
warn("Unable to remove %s" % resolv_trick_path)
if exists(resolv_backup_path):
try: os.unlink(resolv_path)
except OSError: pass
try:
os.rename(resolv_backup_path, resolv_path)
except OSError:
warn("Unable to restore %s" % resolv_backup_path)
# try to guest distro # try to guest distro
distro = guess_distro(path) distro = guess_distro(path)
# cleaning debian stuff # cleaning debian stuff
if distro == "debian": if distro == "debian":
arrow("Debian specific", 1) arrow("Debian specific", 1)
for f in ("etc/debian_chroot", "usr/sbin/policy-rc.d"): for f in ("etc/debian_chroot", "usr/sbin/policy-rc.d"):
try: os.unlink(os.path.join(path, f)) try: os.unlink(join(path, f))
except: pass except: pass
# unmounting # unmounting
if mount: if mount:
mps = ("proc", "sys", "dev", "dev/pts", "dev/shm") mps = ("proc", "sys", "dev", "dev/pts", "dev/shm")
arrow("Unmouting filesystems") arrow("Unmouting filesystems")
for mp in reversed(mps): for mp in reversed(mps):
target = os.path.join(path, mp) target = join(path, mp)
if os.path.ismount(target): if os.path.ismount(target):
arrow(target, 1) arrow(target, 1)
call(["umount", target], close_fds=True) call(["umount", target], close_fds=True)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment