#!/bin/bash # Improve debug logs PRGNAME=`basename $0` PS4='+ $PRGNAME: ${FUNCNAME+"$FUNCNAME : "}$LINENO: ' set -e arch="native" dist="default" schroot_master="$(dirname "$0")" gen_schroot=false target_ssh_opts="" profile="tcwg-test" while getopts "a:d:go:P:qv" OPTION; do case $OPTION in a) arch=$OPTARG ;; d) dist=$OPTARG ;; g) gen_schroot=true ;; o) target_ssh_opts="$OPTARG" ;; P) profile="$OPTARG" ;; q) exec > /dev/null ;; v) set -x ;; esac done shift $((OPTIND-1)) target="${1%:*}" port="${1#*:}" triplet_to_deb_arch() { set -e case "$1" in aarch64-*linux-gnu) echo arm64 ;; arm-*linux-gnueabi*) echo armhf ;; i686-*linux-gnu) echo i386 ;; x86_64-*linux-gnu) echo amd64 ;; *) return 1 ;; esac } triplet_to_deb_dist() { set -e case "$arch" in aarch64-*linux-gnu) echo trusty ;; arm-*linux-gnueabi*) echo trusty ;; i686-*linux-gnu) echo trusty ;; x86_64-*linux-gnu) echo trusty ;; *) return 1 ;; esac } print_apt_sources() { set -e local deb_arch="$1" local deb_dist="$2" case "$deb_dist" in "precise"|"trusty") local deb_mirror case "$deb_arch" in amd64|i386) deb_mirror="http://archive.ubuntu.com/ubuntu/" ;; *) deb_mirror="http://ports.ubuntu.com/ubuntu-ports/" ;; esac cat </dev/null 2>&1 || true ssh $target_ssh_opts $target \ sudo rm -rf $chroot ssh $target_ssh_opts $target \ sudo debootstrap \ --arch=$deb_arch \ --variant=minbase \ --include=iptables,openssh-server,rsync,sshfs \ $deb_dist $chroot # Configure APT sources. print_apt_sources "$deb_arch" "$deb_dist" \ | ssh $target_ssh_opts $target sudo chroot $chroot bash -c "\"cat > /etc/apt/sources.list\"" case "$deb_arch" in amd64|i386) ssh $target_ssh_opts $target \ sudo chroot $chroot bash -c "\"echo deb http://ftp.linuxfoundation.org/pub/lsb/repositories/debian lsb-4.1 main >> /etc/apt/sources.list\"" esac extra_packages="" force_packages="" case "$deb_arch" in amd64) extra_packages="$extra_packages qemu-user" ;; esac case "$profile" in "tcwg-build") extra_packages="$extra_packages autoconf autogen automake bash bison build-essential ccache ccrypt dejagnu flex gawk gdb gdbserver git g++ gcc libncurses5-dev libtool lsb-release make texinfo wget xz-utils" case "$deb_arch" in amd64) extra_packages="$extra_packages gcc-multilib g++-multilib" ;; esac case "$deb_arch" in amd64|i386) force_packages="$force_packages lsb-build-cc" ;; esac extra_packages="$extra_packages emacs vim" # Install arp and nc for ssh's ProxyCommand extra_packages="$extra_packages net-tools netcat" # Install sudo to simplify root access extra_packages="$extra_packages sudo" ;; esac if [ x"$extra_packages" != x"" -o x"$force_packages" != x"" ]; then ssh $target_ssh_opts $target \ sudo chroot $chroot apt-get update if [ x"$extra_packages" != x"" ]; then ssh $target_ssh_opts $target \ sudo chroot $chroot apt-get install -y "$extra_packages" fi if [ x"$force_packages" != x"" ]; then ssh $target_ssh_opts $target \ sudo chroot $chroot apt-get install -y --force-yes "$force_packages" fi fi ssh $target_ssh_opts $target \ sudo chroot $chroot rm -rf /var/cache/apt /var/lib/apt/lists if echo "$extra_packages" | grep -q "git"; then ssh $target_ssh_opts $target \ sudo ln -s /usr/share/doc/git/contrib/workdir/git-new-workdir $chroot/usr/local/bin/ ssh $target_ssh_opts $target \ sudo chmod a+x $chroot/usr/share/doc/git/contrib/workdir/git-new-workdir fi # Install the Foundation Model on x86_64 build hosts if [ x"$profile" = xtcwg-build -a x"$deb_arch" = xamd64 ]; then if ! [ -e $schroot_master/FM000-KT-00035-r9p5-41rel0.tgz ]; then echo "ERROR: cannot find Foundation Model tarball: $schroot_master/FM000-KT-00035-r9p5-41rel0.tgz" exit 1 fi ssh $target_ssh_opts $target \ sudo mkdir $chroot/linaro cat $schroot_master/FM000-KT-00035-r9p5-41rel0.tgz | ssh $target_ssh_opts $target \ sudo tar xzf - -C $chroot/linaro fi half_ram="$(ssh $target_ssh_opts $target free | grep "Mem:" | sed -e "s/Mem: *\([0-9]*\).*/\1/")" if [ x"$half_ram" = x"" -o "$half_ram" -lt "$((1024*1024))" ]; then # Don't limit RAM on starved boards (<1GB RAM). half_ram="" else half_ram="$(($half_ram / 2))" fi # Limit users to 5000 processes and half of RAM to avoid fork-bombs and # OOMs. for group in tcwg tcwg-infra; do ssh $target_ssh_opts $target \ sudo sh -c "\"echo @$group - nproc 5000 > $chroot/etc/security/limits.d/$group.conf\"" if [ x"$half_ram" != x"" ]; then ssh $target_ssh_opts $target \ sudo sh -c "\"echo @$group - data $half_ram >> $chroot/etc/security/limits.d/$group.conf\"" fi done # Tweak /etc/init.d/ssh to workaround upstart ssh $target_ssh_opts $target \ sudo sed -i -e "'/check_for_upstart [0-9]/d'" $chroot/etc/init.d/ssh # Debian (but not Ubuntu) has wrong permissions on /bin/fusermount. ssh $target_ssh_opts $target \ sudo chmod +x $chroot/bin/fusermount || true ssh $target_ssh_opts $target \ sudo mkdir -p /var/chroots/ ssh $target_ssh_opts $target \ sudo bash -c "\"cd $chroot && tar --one-file-system -czf /var/chroots/$schroot_id.tgz .\"" ssh $target_ssh_opts $target \ sudo rm -rf $chroot case "$deb_arch" in armhf|i386) personality=" personality=linux32" ;; *) personality="" ;; esac case "$profile" in # Allow root access in test schroots (to install new system libs, etc) "tcwg-test") root_groups=" root-groups=users" ;; *) root_groups="" ;; esac ssh $target_ssh_opts $target \ sudo bash -c "\"cat > /etc/schroot/chroot.d/$schroot_id\"" </dev/null 2>&1 || true ssh $target_ssh_opts $target \ sudo mkdir -p /var/chroots/ cat $schroot_master/$schroot_id.tgz | ssh $target_ssh_opts $target \ sudo bash -c "\"cat > /var/chroots/$schroot_id.tgz\"" cat $schroot_master/chroot.d/$schroot_id | ssh $target_ssh_opts $target \ sudo bash -c "\"cat > /etc/schroot/chroot.d/$schroot_id\"" (cd $schroot_master && tar -ch $profile/ setup.d/ | ssh $target_ssh_opts $target \ sudo flock -x /etc/schroot -c "\"cd /etc/schroot && rm -rf $profile && tar -x && chown -R root:root $profile/ setup.d/\"") fi