function printUsage
{
cat <<EOT
-Usage: "$PROG_NAME_" <chroot target>
+Usage: "$PROG_NAME_" NEWROOT [COMMAND....]
-$PROG_NAME__ is a chroot wrapper with proc/sys/pts/dev fs handling
+$PROG_NAME_ is a chroot wrapper with proc/sys/pts/dev filesystem handling
EOT
}
function umount_all
{
- for i in $MOUNTED_; do
+ local reverse=$(echo $MOUNTED_ | awk '{ for (i=NF; i>1; i--) printf("%s ",$i); print $1; }')
+ for i in $reverse; do
umount "${DEST_}/$i"
done
}
shift $(($OPTIND - 1))
if (( $# < 1 )); then
+ printUsage
die "Wrong number of arguments."
fi
-DEST_="$1"
+if ! which awk >/dev/null 2>&1 ; then
+ die "No awk binary found, required for execution."
+fi
+
+DEST_="$1"; shift
if [ ! -d "$DEST_" ]; then
die "Target chroot does not exist: $DEST_"
fi
-mountit "proc" "proc"
-mountit "sysfs" "sys"
-mountit "/dev" "dev" "--bind"
-chroot "$DEST_" /bin/bash
+
+if [ -f "$DEST_"/proc/cmdline ] ; then
+ echo "Looks like $DEST_ already has filesystems mounted, skipping."
+else
+ mountit "proc" "proc"
+ mountit "sysfs" "sys"
+ mountit "/dev" "dev" "--bind"
+ mountit "devpts" "dev/pts"
+ if [ -d "$DEST_"/run/udev ] && [ -d /run/udev ] ; then
+ mountit "/run/udev" "/run/udev" "--bind"
+ fi
+fi
+
+WROTE_DEBIAN_CHROOT=""
+if [ ! -f "$DEST_"/etc/debian_chroot ]; then
+ WROTE_DEBIAN_CHROOT="yes"
+ echo "Writing /etc/debian_chroot ..."
+ cat "$DEST_"/etc/hostname > "$DEST_"/etc/debian_chroot
+fi
+
+if (( $# < 1 )); then
+ chroot "$DEST_"
+ RC=$?
+else
+ chroot "$DEST_" "$@"
+ RC=$?
+fi
umount_all
+
+if [ ! -z "$WROTE_DEBIAN_CHROOT" ]; then
+ rm "$DEST_"/etc/debian_chroot
+fi
+
+exit $RC