#!/bin/sh
# adt-setup-vm is part of autopkgtest
# autopkgtest is a tool for testing Debian binary packages
#
# autopkgtest is Copyright (C) 2006-2014 Canonical Ltd.
#
# Setup script for e. g. vmdebootstrap or generic Debian/Ubuntu VM images to
# start a root serial console on ttyS1, set up networking for eth0, configure
# apt sources, install/clean up packages, etc.
# See adt-virt-qemu(1) for details.
#
# You can set $ADT_APT_PROXY; if set, it will be configured in apt in
# /etc/apt/apt.conf.d/01proxy. If apt-cacher-ng is running on localhost, this
# will be used automatically, unless $ADT_APT_PROXY is set.

set -eu

if [ "${1:-}" = "--help" ]; then
    echo "Usage: $0 [chroot dir]"
    echo "if chroot dir is not given, run on the main system (for running in VMs)"
    exit 0
fi

root=${1:-/}

# set up init script for root shell on ttyS1; necessary for adt-virt-qemu local
# images
cat <<EOF > "$root/etc/init.d/autopkgtest"
#!/bin/sh
### BEGIN INIT INFO
# Provides:          autopkgtest
# Required-Start:    mountkernfs \$local_fs
# Required-Stop:
# X-Start-Before:    \$network
# Default-Start:     2 3 4 5
# Default-Stop:
### END INIT INFO

if [ "\$1" = start ]; then
    echo "Starting root shell on ttyS1 for autopkgtest"
    (setsid sh </dev/ttyS1 >/dev/ttyS1 2>&1) &
fi
EOF

chmod 755 "$root/etc/init.d/autopkgtest"
chroot "$root" update-rc.d autopkgtest defaults

# set up serial console on upstart systems
if [ -e "$root/etc/init/tty2.conf" -a ! -e "$root/etc/init/ttyS0.conf" ]; then
    sed 's/tty2/ttyS0/g; s! *exec.*$!exec /sbin/getty -L ttyS0 115200 vt102!' \
        "$root/etc/init/tty2.conf" > "$root/etc/init/ttyS0.conf"
fi

# set up apt sources
mirror_rel=`awk '/^deb .*(debian|ubuntu)/ { print $2,$3; exit }' "$root/etc/apt/sources.list"`
if [ "${mirror_rel%ubuntu*}" != "$mirror_rel" ]; then
    cat << EOF > "$root/etc/apt/sources.list"
deb     $mirror_rel main restricted universe multiverse
deb     ${mirror_rel}-updates main restricted universe multiverse
deb-src $mirror_rel main restricted universe multiverse
deb-src ${mirror_rel}-updates main restricted universe multiverse
EOF
else
    cat << EOF > "$root/etc/apt/sources.list"
deb $mirror_rel main contrib non-free
deb-src $mirror_rel main contrib non-free
EOF
fi

# set up networking
if ! grep -qr eth0 "$root/etc/network/interfaces" "$root/etc/network/interfaces.d/"; then
    /bin/echo -e '\nauto eth0\niface eth0 inet dhcp' >> "$root"/etc/network/interfaces
fi

# go-faster apt/dpkg
echo "Acquire::Languages \"none\";" > "$root"/etc/apt/apt.conf.d/90nolanguages
echo 'force-unsafe-io' > "$root"/etc/dpkg/dpkg.cfg.d/autopkgtest

# auto-detect apt-cacher-ng
if [ -z "${ADT_APT_PROXY:-}" ]; then
    RES=`apt-config shell proxy Acquire::http::Proxy`
    eval $RES
    if echo "$proxy" | egrep -q '(localhost|127\.0\.0\.[0-9]*):3142'; then
        ADT_APT_PROXY="http://10.0.2.2:3142"
        # set http_proxy for the initial apt-get update
        export http_proxy="$proxy"
    fi
fi

# upgrade, install some necessary packages
chroot "$root" apt-get update
[ "${ADT_SETUP_VM_UPGRADE:-}" = false ] || chroot "$root" apt-get -y dist-upgrade

if [ "${mirror_rel%ubuntu*}" != "$mirror_rel" ]; then
    # provides kmods like scsi_debug or mac80211_hwsim
    chroot "$root" apt-get install -y linux-generic
fi
# some tests use a lot of /dev/random, avoid hangs
chroot "$root" apt-get install -y haveged

# clean up some unnecessary packages
for p in accountsservice apt-xapian-index cryptsetup landscape-client \
    landscape-common open-vm-tools w3m vim-runtime aptitude-common \
    command-not-found-data man-db manpages ntfs-3g sosreport \
    ubuntu-release-upgrader-core; do
    chroot "$root" apt-get --auto-remove -y purge $p || true
done
chroot "$root" apt-get clean

# set up apt proxy, if given (this might be an IP which only works in the VM,
# so don't run the previous apt-get with that already)
if [ -n "${ADT_APT_PROXY:-}" ]; then
    echo "Acquire::http { Proxy \"$ADT_APT_PROXY\"; };" > "$root"/etc/apt/apt.conf.d/01proxy
fi

# bump vmalloc on i386, necessary for tests like udisks2
if [ "$(chroot "$root" dpkg --print-architecture)" = "i386" ]; then
    echo 'GRUB_CMDLINE_LINUX_DEFAULT="console=ttyS0 vmalloc=512M"' > \
        "$root/etc/default/grub.d/90-adt-vmalloc.cfg"
    chroot "$root" update-grub
fi
