chiark / gitweb /
add d.o-pkg-master.d.o package
[dsa-metapackages.git] / apt-in-chroot
index f1c720199c6ee674ff1798bf926e5ff07a5215b1..7126202770fc3cda2771196e4708aa57a31cb4c6 100755 (executable)
@@ -1,8 +1,9 @@
-#!/bin/sh
+#!/bin/bash
 # 
 #  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/sbin:/usr/bin:/sbin:/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"
+       echo "          + upgrade"
+       echo "          + dist-upgrade"
+       echo "          + clean"
 }
 
 
-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)"
+       allowed_filter='.'
+elif [ -x /usr/bin/schroot ] ; then
+       chroots=$(schroot -l | awk -F":" '{print $2}' | grep -- '-dchroot$' )
+       method=schroot
+       suffix[${#suffix[*]}]=""
+       suffix[${#suffix[*]}]="-dchroot"
+       suffix[${#suffix[*]}]="-$(dpkg --print-architecture)-dchroot"
+       allowed_filter='-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
+elif ! [[ "$requested_chroot" =~ $allowed_filter ]]; then  # do not quote the regex
+       echo >&2 "$CHROOT is not a valid dchroot.  While it exists, this script may not touch it.  Chroot names must match $allowed_filter."
+       exit 1
+fi
 
 
 case "$APTCMD" in
-install|remove|purge|build-dep)
+install|remove|purge|build-dep|update|upgrade|dist-upgrade|clean)
        # those are the allowed apt sub-commands
        ;;
 *)
@@ -57,17 +98,14 @@ install|remove|purge|build-dep)
        ;;
 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
-
-