zulip/tools/test-install/lxc-wait

73 lines
1.6 KiB
Bash
Executable File

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