new default temporary path; new option fastmode -f if you want to skip updates and only install new distributions; new option -l to limit execution to only one distribution; possibility to build for foreign architecture using qemu, e.g. build armhf with qemu-arm-static with archs="armhf"
This commit is contained in:
@@ -12,21 +12,31 @@ if test -f /etc/setup-debootstrap.conf; then
|
|||||||
. /etc/setup-debootstrap.conf
|
. /etc/setup-debootstrap.conf
|
||||||
fi
|
fi
|
||||||
|
|
||||||
tmpdir=${tmpdir:-"/var/tmp"}
|
tmpdir=${tmpdir:-"/var/tmp/chroots"}
|
||||||
|
test -d "${tmpdir}" || mkdir -p "${tmpdir}"
|
||||||
docker_user=${docker_user:-${USER}}
|
docker_user=${docker_user:-${USER}}
|
||||||
|
if test -z "${ports[@]}"; then
|
||||||
|
ports=( armhf powerpc ppc64el s390x arm64 )
|
||||||
|
qemus=( arm ppc ppc64 s390x armb )
|
||||||
|
fi
|
||||||
|
numports=${#ports[@]}
|
||||||
if test -z "$archs"; then
|
if test -z "$archs"; then
|
||||||
case "$(dpkg --print-architecture)" in
|
case "$(dpkg --print-architecture)" in
|
||||||
(amd64) archs="i386 amd64";;
|
(amd64) archs="amd64 i386";;
|
||||||
(*) archs=$(dpkg --print-architecture);;
|
(*) archs=$(dpkg --print-architecture);;
|
||||||
esac
|
esac
|
||||||
|
for ((i=0; i<${num}; ++i)); do
|
||||||
|
if test -x /usr/bin/qemu-${qemus[$i]}-static; then
|
||||||
|
archs+=" ${ports[$i]}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
fi
|
fi
|
||||||
ubuntu_qt5="yakkety xenial wily vivid trusty"
|
ubuntu_qt5="yakkety xenial wily vivid trusty"
|
||||||
ubuntu_qt4="precise"
|
debian_qt5="jessie sid"
|
||||||
debian_qt5="stretch jessie sid"
|
debian_qt4=""
|
||||||
debian_qt4="wheezy"
|
# not yet successfully installable: debian stretch and buster
|
||||||
debian_unsupported="buster" # not in /usr/share/debootstrap/scripts
|
|
||||||
|
|
||||||
ubuntu=("${ubuntu_qt5}" "${ubuntu_qt4}")
|
ubuntu=("${ubuntu_qt5}")
|
||||||
debian=("${debian_qt5}" "${debian_qt4}")
|
debian=("${debian_qt5}" "${debian_qt4}")
|
||||||
distros=(${distros:-"${ubuntu[@]}" "${debian[@]}"})
|
distros=(${distros:-"${ubuntu[@]}" "${debian[@]}"})
|
||||||
|
|
||||||
@@ -38,8 +48,9 @@ packages_base="software-properties-common apt-transport-https dpkg-dev lsb-relea
|
|||||||
package_not_in_xenial=""
|
package_not_in_xenial=""
|
||||||
package_not_in_xenial_qt5=""
|
package_not_in_xenial_qt5=""
|
||||||
|
|
||||||
packages=(${packages:-"${packages_base} ${packages_qt5}" "${packages_base} ${packages_qt4}" "${packages_base} ${packages_qt5}" "${packages_base} ${packages_qt4}"})
|
if test -z "${packages[@]}"; then
|
||||||
|
packages=("${packages_base} ${packages_qt5}" "${packages_base} ${packages_qt5}" "${packages_base} ${packages_qt4}")
|
||||||
|
fi
|
||||||
if test -z "${index}" -a "${#distros[@]}" -ne "${#packages[@]}"; then
|
if test -z "${index}" -a "${#distros[@]}" -ne "${#packages[@]}"; then
|
||||||
echo "**** ERROR: number of distribution lists doesn't match package lists" 1>&2
|
echo "**** ERROR: number of distribution lists doesn't match package lists" 1>&2
|
||||||
echo " distribution lists: ${#distros[@]}" 1>&2
|
echo " distribution lists: ${#distros[@]}" 1>&2
|
||||||
@@ -47,9 +58,40 @@ if test -z "${index}" -a "${#distros[@]}" -ne "${#packages[@]}"; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
fastmode=0;
|
||||||
|
limit=
|
||||||
|
while [ $# -gt 0 ]; do
|
||||||
|
case "$1" in
|
||||||
|
(-f|--fastmode) fastmode=1;;
|
||||||
|
(-l|--limit) shift; limit=$1;;
|
||||||
|
(*)
|
||||||
|
echo "**** ERROR: unknown option $1" 1>&2
|
||||||
|
exit 1;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
error() {
|
||||||
|
tmpdir=$2
|
||||||
|
disto=$3
|
||||||
|
arch=$4
|
||||||
|
echo "**** ERROR at ${0}:${1}" 1>&2
|
||||||
|
echo ".... on $(eval echo \"${BASH_COMMAND}\")" 1>&2
|
||||||
|
echo ".... tmpdir=$tmpdir arch=$arch distro=$distro" 1>&2
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
for ((i=0; i<${#distros[@]}; ++i)); do
|
for ((i=0; i<${#distros[@]}; ++i)); do
|
||||||
package="${packages[${index:-$i}]}"
|
package="${packages[${index:-$i}]}"
|
||||||
for distro in ${distros[$i]}; do
|
for distro in ${distros[$i]}; do
|
||||||
|
if test -n "$limit" -a "$distro" != "$limit"; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if ! test -e /usr/share/debootstrap/scripts/${distro}; then
|
||||||
|
echo "**** WARNING: skipping unsupported ${distro}" 1>&2
|
||||||
|
continue;
|
||||||
|
fi
|
||||||
ubuntus="${ubuntu[@]}"
|
ubuntus="${ubuntu[@]}"
|
||||||
if test "${ubuntus//${distro}/}" != "${ubuntus}"; then
|
if test "${ubuntus//${distro}/}" != "${ubuntus}"; then
|
||||||
type="ubuntu"
|
type="ubuntu"
|
||||||
@@ -57,12 +99,37 @@ for ((i=0; i<${#distros[@]}; ++i)); do
|
|||||||
type="debian"
|
type="debian"
|
||||||
fi
|
fi
|
||||||
for arch in ${archs}; do
|
for arch in ${archs}; do
|
||||||
|
trap 'error "${LINENO}" "${tmpdir}" "${disto}" "${arch}"' ERR SIGINT
|
||||||
echo "******** process $type $distro $arch ********" 1>&2
|
echo "******** process $type $distro $arch ********" 1>&2
|
||||||
if test -d "${tmpdir}/${distro}-${arch}"; then
|
if test -d "${tmpdir}/${distro}-${arch}"; then
|
||||||
echo " ++++ already exists ${tmpdir}/${distro}-${arch}" 1>&2
|
echo " ++++ already exists ${tmpdir}/${distro}-${arch}" 1>&2
|
||||||
|
if test $fastmode -eq 1; then
|
||||||
|
continue;
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
echo " ---- install ${tmpdir}/${distro}-${arch}" 1>&2
|
if test "$(dpkg --print-architecture)" = "$arch" -o \( "$(dpkg --print-architecture)" = amd64 -a "$arch" = i386 \) ; then
|
||||||
sudo debootstrap --arch="$arch" "$distro" "${tmpdir}/${distro}-${arch}"
|
echo " ---- install ${tmpdir}/${distro}-${arch}" 1>&2
|
||||||
|
sudo debootstrap --arch="$arch" "$distro" "${tmpdir}/${distro}-${arch}"
|
||||||
|
else
|
||||||
|
for ((i=0; $i<$numports; ++i)); do
|
||||||
|
if test "${ports[$i]}" = "${arch}"; then
|
||||||
|
break;
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
qemu="${qemus[$i]}"
|
||||||
|
if ! test -e /usr/bin/qemu-${qemu}-static; then
|
||||||
|
echo "**** WARNING: no emulator ${qemu} found, skipping ${arch}" 1>&2
|
||||||
|
continue;
|
||||||
|
fi
|
||||||
|
arch=${arch#*-}
|
||||||
|
echo " ---- install on $qemu ${tmpdir}/${distro}-${arch}" 1>&2
|
||||||
|
sudo debootstrap --foreign --arch="$arch" "$distro" "${tmpdir}/${distro}-${arch}"
|
||||||
|
sudo cp /usr/bin/qemu-${qemu}-static "${tmpdir}/${distro}-${arch}/usr/bin/qemu-${qemu}-static"
|
||||||
|
sudo DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true LC_ALL=C LANGUAGE=C LANG=C chroot "${tmpdir}/${distro}-${arch}" /debootstrap/debootstrap --second-stage || \
|
||||||
|
sudo chroot "${tmpdir}/${distro}-${arch}" apt-get -o Acquire::ForceIPv4=true -y -f install && \
|
||||||
|
sudo DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true LC_ALL=C LANGUAGE=C LANG=C chroot "${tmpdir}/${distro}-${arch}" /debootstrap/debootstrap --second-stage
|
||||||
|
sudo DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true LC_ALL=C LANGUAGE=C LANG=C chroot "${tmpdir}/${distro}-${arch}" dpkg --configure -a
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
echo " ---- prevent packages in ${tmpdir}/${distro}-${arch}" 1>&2
|
echo " ---- prevent packages in ${tmpdir}/${distro}-${arch}" 1>&2
|
||||||
for f in "dbus" "libpam-systemd*" "packagekit*" "policykit*" "colord"; do
|
for f in "dbus" "libpam-systemd*" "packagekit*" "policykit*" "colord"; do
|
||||||
@@ -78,18 +145,20 @@ fi
|
|||||||
EOF1
|
EOF1
|
||||||
done
|
done
|
||||||
echo " ---- upgrade ${tmpdir}/${distro}-${arch}" 1>&2
|
echo " ---- upgrade ${tmpdir}/${distro}-${arch}" 1>&2
|
||||||
sudo chroot "${tmpdir}/${distro}-${arch}" apt-get update
|
sudo chroot "${tmpdir}/${distro}-${arch}" apt-get -o Acquire::ForceIPv4=true update
|
||||||
sudo chroot "${tmpdir}/${distro}-${arch}" apt-get -y upgrade
|
sudo chroot "${tmpdir}/${distro}-${arch}" apt-get -o Acquire::ForceIPv4=true -y -f install
|
||||||
sudo chroot "${tmpdir}/${distro}-${arch}" apt-get install -y python-software-properties software-properties-common || \
|
sudo chroot "${tmpdir}/${distro}-${arch}" apt-get -o Acquire::ForceIPv4=true -y upgrade
|
||||||
sudo chroot "${tmpdir}/${distro}-${arch}" apt-get install -y software-properties-common
|
sudo chroot "${tmpdir}/${distro}-${arch}" apt-get -o Acquire::ForceIPv4=true install -y python-software-properties software-properties-common || \
|
||||||
|
sudo chroot "${tmpdir}/${distro}-${arch}" apt-get -o Acquire::ForceIPv4=true install -y software-properties-common
|
||||||
if test "${distro}" != "jessie" -a "${distro}" != "sid"; then
|
if test "${distro}" != "jessie" -a "${distro}" != "sid"; then
|
||||||
sudo chroot "${tmpdir}/${distro}-${arch}" add-apt-repository universe || \
|
sudo chroot "${tmpdir}/${distro}-${arch}" add-apt-repository universe || \
|
||||||
sudo chroot "${tmpdir}/${distro}-${arch}" add-apt-repository "deb http://archive.ubuntu.com/ubuntu ${distro} universe"
|
( test "$type" != "debian" && \
|
||||||
|
sudo chroot "${tmpdir}/${distro}-${arch}" add-apt-repository "deb http://archive.ubuntu.com/ubuntu ${distro} universe" )
|
||||||
fi
|
fi
|
||||||
sudo chroot "${tmpdir}/${distro}-${arch}" apt-get update
|
sudo chroot "${tmpdir}/${distro}-${arch}" apt-get -o Acquire::ForceIPv4=true update
|
||||||
sudo chroot "${tmpdir}/${distro}-${arch}" apt-get -y dist-upgrade
|
sudo chroot "${tmpdir}/${distro}-${arch}" apt-get -o Acquire::ForceIPv4=true -y dist-upgrade
|
||||||
echo " ---- install ${package} to ${tmpdir}/${distro}-${arch}" 1>&2
|
echo " ---- install ${package} to ${tmpdir}/${distro}-${arch}" 1>&2
|
||||||
sudo chroot "${tmpdir}/${distro}-${arch}" apt-get install -y ${package}
|
sudo chroot "${tmpdir}/${distro}-${arch}" apt-get -o Acquire::ForceIPv4=true install -y ${package}
|
||||||
echo " ---- import ${tmpdir}/${distro}-${arch} to ${docker_user}/${type}:${distro}-${arch}" 1>&2
|
echo " ---- import ${tmpdir}/${distro}-${arch} to ${docker_user}/${type}:${distro}-${arch}" 1>&2
|
||||||
cd "${tmpdir}/${distro}-${arch}"
|
cd "${tmpdir}/${distro}-${arch}"
|
||||||
sudo tar c . | docker import - "${docker_user}/${type}:${distro}-${arch}"
|
sudo tar c . | docker import - "${docker_user}/${type}:${distro}-${arch}"
|
||||||
|
Reference in New Issue
Block a user