#!/usr/bin/env bash
set -e

usage() {
    echo "usage: lxc-wait -n CONTAINER" >&2
    exit 1
}

args="$(getopt -o +n: --long help,name: -- "$@")"
eval "set -- $args"
while true; do
    case "$1" in
        --help) usage ;;
        -n | --name)
            CONTAINER_NAME="$2"
            shift
            shift
            ;;
        --)
            shift
            break
            ;;
        *) usage ;;
    esac
done

if [ -z "$CONTAINER_NAME" ] || [ "$#" -gt 0 ]; then
    usage
fi

if [ "$EUID" -ne 0 ]; then
    echo "error: this script must be run as root" >&2
    exit 1
fi

# We poll.
poll_runlevel() {
    for _ in {1..60}; do
        echo "lxc-wait: $CONTAINER_NAME: polling for boot..." >&2
        runlevel="$(lxc-attach --clear-env -n "$CONTAINER_NAME" -- runlevel 2>/dev/null)" \
            || {
                sleep 1
                continue
            }
        if [ "$runlevel" != "${0%[0-9]}" ]; then
            echo "lxc-wait: $CONTAINER_NAME: booted!" >&2
            poll_network
        fi
        sleep 1
    done
    echo "error: timeout waiting for container to boot" >&2
    exit 1
}

poll_network() {
    for _ in {1..60}; do
        echo "lxc-wait: $CONTAINER_NAME: polling for network..." >&2
        # New hosts don't have `host` or `nslookup`
        lxc-attach --clear-env -n "$CONTAINER_NAME" -- \
            ping -q -c 1 archive.ubuntu.com 2>/dev/null >/dev/null \
            || {
                sleep 1
                continue
            }
        echo "lxc-wait: $CONTAINER_NAME: network is up!" >&2
        exit 0
    done
    echo "error: timeout waiting for container to get network" >&2
    exit 1
}

poll_runlevel
