diff options
Diffstat (limited to 'udev')
-rw-r--r-- | udev/66-azure-ephemeral.rules | 18 | ||||
-rw-r--r-- | udev/79-cloud-init-net-wait.rules | 10 | ||||
-rwxr-xr-x | udev/cloud-init-wait | 70 |
3 files changed, 98 insertions, 0 deletions
diff --git a/udev/66-azure-ephemeral.rules b/udev/66-azure-ephemeral.rules new file mode 100644 index 00000000..b9c5c3ef --- /dev/null +++ b/udev/66-azure-ephemeral.rules @@ -0,0 +1,18 @@ +# Azure specific rules +ACTION!="add|change", GOTO="cloud_init_end" +SUBSYSTEM!="block", GOTO="cloud_init_end" +ATTRS{ID_VENDOR}!="Msft", GOTO="cloud_init_end" +ATTRS{ID_MODEL}!="Virtual_Disk", GOTO="cloud_init_end" + +# Root has a GUID of 0000 as the second value +# The resource/resource has GUID of 0001 as the second value +ATTRS{device_id}=="?00000000-0000-*", ENV{fabric_name}="azure_root", GOTO="ci_azure_names" +ATTRS{device_id}=="?00000000-0001-*", ENV{fabric_name}="azure_resource", GOTO="ci_azure_names" +GOTO="cloud_init_end" + +# Create the symlinks +LABEL="ci_azure_names" +ENV{DEVTYPE}=="disk", SYMLINK+="disk/cloud/$env{fabric_name}" +ENV{DEVTYPE}=="partition", SYMLINK+="disk/cloud/$env{fabric_name}-part%n" + +LABEL="cloud_init_end" diff --git a/udev/79-cloud-init-net-wait.rules b/udev/79-cloud-init-net-wait.rules new file mode 100644 index 00000000..8344222a --- /dev/null +++ b/udev/79-cloud-init-net-wait.rules @@ -0,0 +1,10 @@ +# cloud-init cold/hot-plug blocking mechanism +# this file blocks further processing of network events +# until cloud-init local has had a chance to read and apply network +SUBSYSTEM!="net", GOTO="cloudinit_naming_end" +ACTION!="add", GOTO="cloudinit_naming_end" + +IMPORT{program}="/lib/udev/cloud-init-wait" + +LABEL="cloudinit_naming_end" +# vi: ts=4 expandtab syntax=udevrules diff --git a/udev/cloud-init-wait b/udev/cloud-init-wait new file mode 100755 index 00000000..b434005d --- /dev/null +++ b/udev/cloud-init-wait @@ -0,0 +1,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 |