#!/bin/sh

# Copyright 2014 Google Inc.
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.


usage() {
    cat >&2 <<EOF
arm64_download - this script downloads the Linaro's ARMv8 Aarch64
toolchain and minimal embedded Linux system as well as ARM's
foundation model.  The required files are mirrored on Google Cloud.

If the files are already located in the working directory, the
download can be skipped if the checksums match.

The script then starts a emulated Arm64 Linux system in the
background.  After the boot is complete, you can SSH into the system
at port 8022 via user@localhost.  The SSH key will be downloaded into
the working directery as well.

Requires gsutil, xz, tar, and gunzip.

Usage:
  $0 WORKING_DIRECTORY
  ssh-add WORKING_DIRECTORY/key
  ...wait...
  ssh -p 8022 user@localhost
EOF
    return 1
}

try() {
    # print an error on nonzero return code
    "$@"
    local ret=$?
    if [ $ret != 0 ] ; then
        echo "'$@' failed and returned ${ret}." >&2
        return $ret
    fi
}

download_necessary_software_to_dir() (
    cd "$1"
    local location="chromium-skia-gm/arm64env"
    try gsutil cp "gs://${location}/md5sum.txt" . || return
    if md5sum -c --quiet "md5sum.txt"; then
        return 0
    fi
    try gsutil cp "gs://${location}/*" . || return
)

install_compiler() {
    local working_dir="$1"
    local toolchain="gcc-linaro-aarch64-linux-gnu-4.8-2013.12_linux"
    (
        try cd "$working_dir" || return
        try test -f "${toolchain}.tar.xz" || return
        try xz --decompress --stdout < "${toolchain}.tar.xz" | \
            try tar xf - || return
    )
    local dir="${working_dir}/${toolchain}"
    try test -d "$dir" || return
    try test -x "${dir}/bin/aarch64-linux-gnu-gcc" || return
    try test -x "${dir}/bin/aarch64-linux-gnu-g++" || return
}

install_runtime() {
    local working_dir="$1"

    local firmware='img-foundation.axf'
    local rootfs='vexpress64-openembedded_lamp-armv8-gcc-4.8_20131215-557'
    local compressed_rootfs="${rootfs}.img.CLEAN_AND_CONFIGURED.xz"
    local compressed_foundation_model='FM000-KT-00035-r0p8-52rel06.tgz'
    local keyfile='CLEAN_AND_CONFIGURED_key'

    try cp "${working_dir}/$firmware" "${working_dir}/firmware" || return

    try xz --decompress --stdout \
        < "${working_dir}/${compressed_rootfs}" \
        > "${working_dir}/rootfs" || return
    try test -f "${working_dir}/rootfs" || return

    (
        try cd "$working_dir" || return
        try test -f "$compressed_foundation_model" || return
        try gunzip -c "$compressed_foundation_model" | try tar xf - || return
        try test -d "Foundation_v8pkg" || return  #  Assert.
    )

    try cp "${working_dir}/${keyfile}" "${working_dir}/key" || return
    chmod 'go=' "${working_dir}/key"
}

start_arm64_image() {
    local working_dir="$1"
    local foundation_dir="${working_dir}/Foundation_v8pkg"
    local foundation="${foundation_dir}/models/Linux64_GCC-4.1/Foundation_v8"
    local firmware="${working_dir}/firmware"
    local rootfs="${working_dir}/rootfs"

    try test -d "$foundation_dir" || return
    try test -x "$foundation" || return
    try test -f "$firmware" || return
    try test -f "$rootfs" || return

    for PID in $(ps -o 'pid=' -C 'Foundation_v8') ; do
        kill $PID
    done

    DISPLAY='' nohup \
    "$foundation" \
        --image="${firmware}" \
        --cores=4 \
        --block-device="${rootfs}" \
        --network="nat" \
        --network-nat-subnet="192.168.31.0/24" \
        --network-nat-ports="8022=22" \
        > /dev/null 2>&1 &
    echo 'Waiting for foundation model to boot...'
    while ! ssh -i "${working_dir}/key" \
        -o NoHostAuthenticationForLocalhost=yes \
        -p 8022 user@localhost true 2> /dev/null; do
        sleep 5
    done
    echo 'Listening to SSH on port 8022.'
}

arm64_download() {
    local working_directory="$1"
    try mkdir -p "$working_directory" || return

    try download_necessary_software_to_dir "$working_directory" || return

    try install_compiler "$working_directory" || return

    try install_runtime "$working_directory" || return

    try start_arm64_image "$working_directory" || return
}

for command in gsutil xz tar md5sum gunzip; do
    try command -v "$command" > /dev/null || usage || exit
done

if [ -z "$1" ] ; then
    usage || exit
fi
try arm64_download "$1"
