#!/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