diff options
Diffstat (limited to 'udev/cloud-init-wait')
-rwxr-xr-x | udev/cloud-init-wait | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/udev/cloud-init-wait b/udev/cloud-init-wait new file mode 100755 index 00000000..345333f9 --- /dev/null +++ b/udev/cloud-init-wait @@ -0,0 +1,82 @@ +#!/bin/sh + +CI_NET_READY="/run/cloud-init/network-config-ready" +LOG="/run/cloud-init/${0##*/}.log" +LOG_INIT=0 +DEBUG=0 + +find_name() { + local match="" name="" none="_UNSET" pound="#" + while read match name; do + [ "${match#${pound}}" = "$match" ] || continue + case "$match" in + ID_NET_NAME=${ID_NET_NAME:-$none}) _RET="$name"; return 0;; + ID_NET_NAME_PATH=${ID_NET_NAME_PATH:-$none}) _RET="$name"; return 0;; + MAC_ADDRESS=${MAC_ADDRESS:-$none}) _RET="$name"; return 0;; + INTERFACE=${INTERFACE:-$none}) _RET="$name"; return 0;; + esac + done + return 0 +} + +block_until_ready() { + local fname="$1" + local naplen="$2" max="$3" n=0 + while ! [ -f "$fname" ]; do + n=$(($n+1)) + [ "$n" -ge "$max" ] && return 1 + sleep $naplen + done +} + +log() { + [ -n "${LOG}" ] || return + [ "${DEBUG:-0}" = "0" ] && return + + if [ $LOG_INIT = 0 ]; then + if [ -d "${LOG%/*}" ] || mkdir -p "${LOG%/*}"; then + LOG_INIT=1 + else + echo "${0##*/}: WARN: log init to ${LOG%/*}" 1>&2 + return + fi + elif [ "$LOG_INIT" = "-1" ]; then + return + fi + local info="$$ $INTERFACE" + if [ "$DEBUG" -gt 1 ]; then + local up idle + read up idle < /proc/uptime + info="$$ $INTERFACE $up" + fi + echo "[$info]" "$@" >> "$LOG" +} + +main() { + local name="" readyfile="$CI_NET_READY" + local info="INTERFACE=${INTERFACE} ID_NET_NAME=${ID_NET_NAME}" + info="$info ID_NET_NAME_PATH=${ID_NET_NAME_PATH}" + info="$info MAC_ADDRESS=${MAC_ADDRESS}" + log "$info" + + ## Check to see if cloud-init.target is set. If cloud-init is + ## disabled we do not want to do anything. + if [ ! -f "/run/cloud-init/enabled" ]; then + log "cloud-init disabled" + return 0 + fi + + block_until_ready "$readyfile" .1 600 || + { log "failed waiting for ready on $INTERFACE"; return 1; } + + #find_name < "$CI_NET_RULES" && name="$_RET" || + # { log "failed to find match for $INTERFACE"; return 0; } + + log "net config ready" + #[ -z "$name" ] || echo "CLOUDINIT_NET_NAME=$name" +} + +main "$@" +exit + +# vi: ts=4 expandtab |