summaryrefslogtreecommitdiff
path: root/udev/cloud-init-wait
blob: b434005d0951c2389cfea4e28e4c409bf31f15a3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/bin/sh

CI_NET_READY="/run/cloud-init/network-config-ready"
LOG="/run/cloud-init/${0##*/}.log"
LOG_INIT=0
MAX_WAIT=60
DEBUG=0

block_until_ready() {
    local fname="$1" max="$2"
    [ -f "$fname" ] && return 0
    # udevadm settle below will exit at the first of 3 conditions
    #  1.) timeout 2.) file exists 3.) all in-flight udev events are processed
    # since this is being run from a udev event, the 3 wont happen.
    # thus, this is essentially a inotify wait or timeout on a file in /run
    # that is created by cloud-init-local.
    udevadm settle "--timeout=$max" "--exit-if-exists=$fname"
}

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

    if [ "${INTERFACE#lo}" != "$INTERFACE" ]; then
        return 0
    fi

    block_until_ready "$readyfile" "$MAX_WAIT" ||
       { log "failed waiting for ready on $INTERFACE"; return 1; }

    log "net config ready"
}

main "$@"
exit

# vi: ts=4 expandtab