2015-12-02 15:58:18 +00:00
|
|
|
#!/bin/bash -e
|
|
|
|
|
|
|
|
# pass your docker hub login name as $1, defaults to your user name
|
|
|
|
# you should have a repositories named ubuntu and debian
|
|
|
|
# if you have your own repository, you can also prepend it:
|
|
|
|
# my.repo.url:5000/myname the script will then append ubuntu or debian
|
|
|
|
# e.g. to my.repo.url:5000/myname/ubuntu:trusty-amd64
|
|
|
|
# please login to docker before you start this script
|
|
|
|
docker_user=${1:-${docker_user:-$(id -un)}}
|
|
|
|
|
|
|
|
if test -f /etc/setup-debootstrap.conf; then
|
|
|
|
. /etc/setup-debootstrap.conf
|
|
|
|
fi
|
2016-09-30 14:26:41 +00:00
|
|
|
if test -f ~/setup-debootstrap.conf; then
|
|
|
|
. ~/setup-debootstrap.conf
|
|
|
|
fi
|
2015-12-02 15:58:18 +00:00
|
|
|
|
2016-09-25 11:22:18 +00:00
|
|
|
tmpdir=${tmpdir:-"/var/tmp/chroots"}
|
|
|
|
test -d "${tmpdir}" || mkdir -p "${tmpdir}"
|
2016-05-31 13:26:52 +00:00
|
|
|
docker_user=${docker_user:-${USER}}
|
2016-09-25 11:22:18 +00:00
|
|
|
if test -z "${ports[@]}"; then
|
2016-09-29 22:20:26 +00:00
|
|
|
#ports=( armhf powerpc ppc64el s390x arm64 )
|
|
|
|
#qemus=( arm ppc ppc64 s390x aarch64 )
|
|
|
|
ports=( armhf )
|
|
|
|
qemus=( arm )
|
2016-09-25 11:22:18 +00:00
|
|
|
fi
|
|
|
|
numports=${#ports[@]}
|
2016-09-23 18:23:58 +00:00
|
|
|
if test -z "$archs"; then
|
2016-09-23 18:24:23 +00:00
|
|
|
case "$(dpkg --print-architecture)" in
|
2016-09-25 11:22:18 +00:00
|
|
|
(amd64) archs="amd64 i386";;
|
2016-09-23 18:24:55 +00:00
|
|
|
(*) archs=$(dpkg --print-architecture);;
|
2016-09-23 18:23:58 +00:00
|
|
|
esac
|
2016-09-29 22:20:26 +00:00
|
|
|
for ((i=0; i<$numports; ++i)); do
|
2016-09-25 11:22:18 +00:00
|
|
|
if test -x /usr/bin/qemu-${qemus[$i]}-static; then
|
|
|
|
archs+=" ${ports[$i]}"
|
|
|
|
fi
|
|
|
|
done
|
2016-09-23 18:23:58 +00:00
|
|
|
fi
|
2016-09-29 22:20:26 +00:00
|
|
|
|
2016-09-23 18:23:58 +00:00
|
|
|
ubuntu_qt5="yakkety xenial wily vivid trusty"
|
2016-09-25 11:22:18 +00:00
|
|
|
debian_qt5="jessie sid"
|
|
|
|
debian_qt4=""
|
|
|
|
# not yet successfully installable: debian stretch and buster
|
2016-05-31 13:26:52 +00:00
|
|
|
|
2016-09-25 11:22:18 +00:00
|
|
|
ubuntu=("${ubuntu_qt5}")
|
2016-05-31 13:26:52 +00:00
|
|
|
debian=("${debian_qt5}" "${debian_qt4}")
|
|
|
|
distros=(${distros:-"${ubuntu[@]}" "${debian[@]}"})
|
|
|
|
|
2016-09-29 22:20:26 +00:00
|
|
|
packages_qt5="libpoppler-qt5-dev libpodofo-dev libqt5designer5 libqt5svg5-dev libqt5webkit5-dev qt5-default qt5-qmake qtbase5-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools"
|
|
|
|
packages_qt4="libqt4-core libqt4-designer libqt4-dev libqt4-webkit qt4-dev-tools qt4-qmake"
|
|
|
|
# |libqtcore4 |libqtwebkit-dev |libp11-kit-dev|libgnutls-dev
|
|
|
|
packages_base="apt-transport-https automake autotools-dev binutils-dev debhelper default-jdk-headless doxygen dpkg-dev g++ git graphviz libboost-thread-dev libcppunit-dev liblog4cxx-dev libpcsclite-dev libpkcs11-helper1-dev libproxy-dev libssl-dev libtool libz-dev lsb-release mscgen nodejs pandoc pkg-config software-properties-common subversion subversion-tools texinfo xvfb"
|
|
|
|
#package_not_in_yakkety="default-jdk-headless"
|
2016-09-30 06:21:09 +00:00
|
|
|
package_not_in_wily="default-jdk-headless"
|
2016-05-31 13:26:52 +00:00
|
|
|
|
2016-09-25 11:22:18 +00:00
|
|
|
if test -z "${packages[@]}"; then
|
|
|
|
packages=("${packages_base} ${packages_qt5}" "${packages_base} ${packages_qt5}" "${packages_base} ${packages_qt4}")
|
|
|
|
fi
|
2016-05-31 13:26:52 +00:00
|
|
|
if test -z "${index}" -a "${#distros[@]}" -ne "${#packages[@]}"; then
|
|
|
|
echo "**** ERROR: number of distribution lists doesn't match package lists" 1>&2
|
|
|
|
echo " distribution lists: ${#distros[@]}" 1>&2
|
|
|
|
echo " package lists: ${#packages[@]}" 1>&2
|
|
|
|
exit 1
|
|
|
|
fi
|
2015-12-02 15:58:18 +00:00
|
|
|
|
2016-09-25 11:22:18 +00:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2016-05-31 13:26:52 +00:00
|
|
|
for ((i=0; i<${#distros[@]}; ++i)); do
|
|
|
|
package="${packages[${index:-$i}]}"
|
|
|
|
for distro in ${distros[$i]}; do
|
2016-09-29 22:20:26 +00:00
|
|
|
prevent=package_not_in_${distro};
|
|
|
|
instpkgs=${package}
|
|
|
|
for pkg in ${!prevent}; do
|
|
|
|
instpkgs=${instpkgs//${pkg}/}
|
|
|
|
done
|
2016-09-25 11:22:18 +00:00
|
|
|
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
|
2016-05-31 13:26:52 +00:00
|
|
|
ubuntus="${ubuntu[@]}"
|
|
|
|
if test "${ubuntus//${distro}/}" != "${ubuntus}"; then
|
2015-12-02 15:58:18 +00:00
|
|
|
type="ubuntu"
|
|
|
|
else
|
|
|
|
type="debian"
|
|
|
|
fi
|
2016-05-31 13:26:52 +00:00
|
|
|
for arch in ${archs}; do
|
2016-09-25 11:22:18 +00:00
|
|
|
trap 'error "${LINENO}" "${tmpdir}" "${disto}" "${arch}"' ERR SIGINT
|
2016-05-31 13:26:52 +00:00
|
|
|
echo "******** process $type $distro $arch ********" 1>&2
|
|
|
|
if test -d "${tmpdir}/${distro}-${arch}"; then
|
|
|
|
echo " ++++ already exists ${tmpdir}/${distro}-${arch}" 1>&2
|
2016-09-25 11:22:18 +00:00
|
|
|
if test $fastmode -eq 1; then
|
|
|
|
continue;
|
|
|
|
fi
|
2016-05-31 13:26:52 +00:00
|
|
|
else
|
2016-09-25 11:22:18 +00:00
|
|
|
if test "$(dpkg --print-architecture)" = "$arch" -o \( "$(dpkg --print-architecture)" = amd64 -a "$arch" = i386 \) ; then
|
|
|
|
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
|
2016-05-31 13:26:52 +00:00
|
|
|
fi
|
2016-09-29 22:20:26 +00:00
|
|
|
echo " ---- mount filesystems in ${tmpdir}/${distro}-${arch}" 1>&2
|
2016-09-30 14:26:41 +00:00
|
|
|
for x in proc sys dev; do
|
2016-09-30 15:02:06 +00:00
|
|
|
if mount | grep -q "${tmpdir}/${distro}-${arch}"/$x; then
|
|
|
|
sudo umount -flr "${tmpdir}/${distro}-${arch}"/$x
|
2016-09-30 14:26:41 +00:00
|
|
|
fi
|
|
|
|
done
|
2016-09-30 15:02:06 +00:00
|
|
|
sudo mount -t proc proc "${tmpdir}/${distro}-${arch}"/proc
|
|
|
|
sudo mount -t sysfs sys "${tmpdir}/${distro}-${arch}"/sys
|
|
|
|
sudo mount -o bind /dev "${tmpdir}/${distro}-${arch}"/dev
|
2016-09-29 22:20:26 +00:00
|
|
|
echo " ---- preconfigure debian packages in ${tmpdir}/${distro}-${arch}" 1>&2
|
|
|
|
sudo chroot "${tmpdir}/${distro}-${arch}" debconf-set-selections <<EOF
|
|
|
|
console-setup console-setup/fontsize-fb47 select 8x16
|
|
|
|
console-setup console-setup/fontface47 select Fixed
|
|
|
|
console-setup console-setup/charmap47 select UTF-8
|
|
|
|
console-setup console-setup/store_defaults_in_debconf_db boolean true
|
|
|
|
keyboard-configuration console-setup/ask_detect boolean false
|
|
|
|
keyboard-configuration console-setup/detected note
|
|
|
|
console-setup console-setup/fontsize string 8x16
|
|
|
|
console-setup console-setup/fontsize-text47 select 8x16
|
|
|
|
console-setup console-setup/codesetcode string Uni2
|
|
|
|
keyboard-configuration console-setup/detect detect-keyboard
|
|
|
|
console-setup console-setup/codeset47 select . Combined - Latin; Slavic Cyrillic; Greek
|
|
|
|
EOF
|
2016-05-31 13:26:52 +00:00
|
|
|
echo " ---- prevent packages in ${tmpdir}/${distro}-${arch}" 1>&2
|
|
|
|
for f in "dbus" "libpam-systemd*" "packagekit*" "policykit*" "colord"; do
|
|
|
|
sudo chroot "${tmpdir}/${distro}-${arch}" <<EOF1
|
|
|
|
if ! grep -q "Package: $f" /etc/apt/preferences; then
|
|
|
|
cat >> /etc/apt/preferences <<EOF2
|
|
|
|
|
2016-04-04 14:56:17 +00:00
|
|
|
Package: $f
|
|
|
|
Pin-Priority: -100
|
|
|
|
|
2016-05-31 13:26:52 +00:00
|
|
|
EOF2
|
|
|
|
fi
|
|
|
|
EOF1
|
2015-12-02 15:58:18 +00:00
|
|
|
done
|
2016-05-31 13:26:52 +00:00
|
|
|
echo " ---- upgrade ${tmpdir}/${distro}-${arch}" 1>&2
|
2016-09-25 11:22:18 +00:00
|
|
|
sudo chroot "${tmpdir}/${distro}-${arch}" apt-get -o Acquire::ForceIPv4=true update
|
|
|
|
sudo chroot "${tmpdir}/${distro}-${arch}" apt-get -o Acquire::ForceIPv4=true -y -f install
|
|
|
|
sudo chroot "${tmpdir}/${distro}-${arch}" apt-get -o Acquire::ForceIPv4=true -y upgrade
|
|
|
|
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
|
2016-05-31 13:26:52 +00:00
|
|
|
if test "${distro}" != "jessie" -a "${distro}" != "sid"; then
|
|
|
|
sudo chroot "${tmpdir}/${distro}-${arch}" add-apt-repository universe || \
|
2016-09-25 11:22:18 +00:00
|
|
|
( test "$type" != "debian" && \
|
|
|
|
sudo chroot "${tmpdir}/${distro}-${arch}" add-apt-repository "deb http://archive.ubuntu.com/ubuntu ${distro} universe" )
|
2016-05-31 13:26:52 +00:00
|
|
|
fi
|
2016-09-25 11:22:18 +00:00
|
|
|
sudo chroot "${tmpdir}/${distro}-${arch}" apt-get -o Acquire::ForceIPv4=true update
|
|
|
|
sudo chroot "${tmpdir}/${distro}-${arch}" apt-get -o Acquire::ForceIPv4=true -y dist-upgrade
|
2016-09-29 22:20:26 +00:00
|
|
|
echo " ---- cleanup ${instpkgs} to ${tmpdir}/${distro}-${arch}" 1>&2
|
|
|
|
sudo chroot "${tmpdir}/${distro}-${arch}" apt-get -o Acquire::ForceIPv4=true autoremove --purge -y
|
|
|
|
echo " ---- install ${instpkgs} to ${tmpdir}/${distro}-${arch}" 1>&2
|
|
|
|
sudo chroot "${tmpdir}/${distro}-${arch}" apt-get -o Acquire::ForceIPv4=true install -y ${instpkgs}
|
|
|
|
echo " ---- unmount filesystems in ${tmpdir}/${distro}-${arch}" 1>&2
|
2016-09-30 14:26:41 +00:00
|
|
|
for x in proc sys dev; do
|
2016-09-30 15:02:06 +00:00
|
|
|
if mount | grep -q "${tmpdir}/${distro}-${arch}"/$x; then
|
|
|
|
sudo umount -flr "${tmpdir}/${distro}-${arch}"/$x
|
2016-09-30 14:26:41 +00:00
|
|
|
fi
|
|
|
|
done
|
2016-05-31 13:26:52 +00:00
|
|
|
echo " ---- import ${tmpdir}/${distro}-${arch} to ${docker_user}/${type}:${distro}-${arch}" 1>&2
|
|
|
|
cd "${tmpdir}/${distro}-${arch}"
|
|
|
|
sudo tar c . | docker import - "${docker_user}/${type}:${distro}-${arch}"
|
|
|
|
echo " ---- push ${tmpdir}/${distro}-${arch} to ${docker_user}/${type}:${distro}-${arch}" 1>&2
|
|
|
|
docker push "${docker_user}/${type}:${distro}-${arch}"
|
2015-12-02 15:58:18 +00:00
|
|
|
done
|
|
|
|
done
|
|
|
|
done
|