# apt-in-chroot - runs apt in a specified chroot
#
# Copyright (C) 2010 Martin Zobel-Helas <zobel@debian.org>
+# Copyright (C) 2012 Peter Palfrader <peter@palfrader.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
-VALID_CHROOTS="$(/usr/bin/dchroot -l 2>&1 | /usr/bin/awk -F": " '{print $2}' | /usr/bin/tr ' ' '\n')"
-VALID_CHROOTS_PARSE="$(/usr/bin/dchroot -l 2>&1 | /usr/bin/awk -F": " '{print $2}' | /bin/sed -e 's/ /|/g')"
+PATH="/usr/bin:/bin"
+export PATH
usage() {
bn="`basename "$0"`"
- echo "Usage: $bn <chroot> <apt sub-command> <package>"
- echo ""
- echo " allowed chroots are ($VALID_CHROOTS_PARSE)"
+ echo "Usage: $bn <chroot> <apt sub-command> [<package>]"
echo ""
echo " allowed apt sub-commands are:"
echo " + install"
echo " + remove"
echo " + purge"
echo " + build-dep"
+ echo " + update"
}
-if [ "$#" -lt "3" ]; then
+if [ "$#" -lt "2" ]; then
usage >&2
exit 1
fi
CHROOT_DIR="/chroot"
-CHROOT=$1; shift
-APTCMD=$1; shift
-PACKAGES=$*
+CHROOT="$1"; shift
+APTCMD="$1"; shift
+PACKAGES="$*"
+declare -a suffix
+suffix[0]=""
+
+if [ -x /usr/bin/dchroot ] ; then
+ chroots=$(dchroot -l 2>&1 | awk -F": " '{print $2}' | tr ' ' '\n')
+ method=dchroot
+ suffix[${#suffix[*]}]="_$(dpkg --print-architecture)"
+elif [ -x /usr/bin/schroot ] ; then
+ chroots=$(schroot -l | awk -F":" '{print $2}' | grep -- '-dchroot$' )
+ method=schroot
+ suffix="-dchroot"
+ suffix[${#suffix[*]}]="-dchroot"
+ suffix[${#suffix[*]}]="-$(dpkg --print-architecture)-dchroot"
+else
+ echo >&2 "Cannot find chroot wrapper."
+ exit 1
+fi
+
+requested_chroot=""
+while read c; do
+ for (( i = 0 ; i < ${#suffix[*]} ; i++ )); do
+ if [ "$c" == "$CHROOT${suffix[$i]}" ]; then
+ requested_chroot="$c"
+ fi
+ done
+done <<< "$chroots"
+
+if ! [ -n "$requested_chroot" ]; then
+ echo >&2 "$CHROOT is not a valid dchroot. Available chroots are:"
+ echo "$chroots"
+ exit 1
+fi
case "$APTCMD" in
-install|remove|purge|build-dep)
+install|remove|purge|build-dep|update)
# those are the allowed apt sub-commands
;;
*)
;;
esac
-grep -qFx $CHROOT <<< "$VALID_CHROOTS"
-
-RET=$?
-
-if [ "$RET" == "0" ]; then
- # valid chroot
- echo "Will run '/usr/sbin/chroot $CHROOT_DIR/$CHROOT apt-get $APTCMD $PACKAGES'"
- /usr/sbin/chroot $CHROOT_DIR/$CHROOT apt-get $APTCMD $PACKAGES
+# valid chroot
+if [ "$method" = "dchroot" ]; then
+ echo "Will run '/usr/sbin/chroot $CHROOT_DIR/$requested_chroot apt-get $APTCMD $PACKAGES'"
+ /usr/sbin/chroot $CHROOT_DIR/"$requested_chroot" apt-get "$APTCMD" $PACKAGES
+elif [ "$method" = "schroot" ]; then
+ echo "Will run 'schroot -c $requested_chroot apt-get $APTCMD $PACKAGES'"
+ schroot -c "$requested_chroot" apt-get "$APTCMD" $PACKAGES
else
- echo "$CHROOT not in $VALID_CHROOTS_PARSE"
+ echo >&2 "Invalid method."
exit 1
fi
-
-