summaryrefslogtreecommitdiff
path: root/udev
diff options
context:
space:
mode:
authorScott Moser <smoser@ubuntu.com>2016-03-18 20:40:54 -0400
committerScott Moser <smoser@ubuntu.com>2016-03-18 20:40:54 -0400
commit519c0936e3e80fc14225e500fbb61d0d12d28c35 (patch)
treec3aaf80acaf6f9208b529d84978f23de1210c071 /udev
parent72b56d0f59f321519f25b039937a24b0ce338295 (diff)
downloadvyos-cloud-init-519c0936e3e80fc14225e500fbb61d0d12d28c35.tar.gz
vyos-cloud-init-519c0936e3e80fc14225e500fbb61d0d12d28c35.zip
commit the systemd waiting mechanism
Note, still broken as cloud-init local is not going to ever touch the CI_NET_READY file (/run/cloud-init/network-config-ready). So as this is , it will actually just block for 60 seconds and go on.
Diffstat (limited to 'udev')
-rw-r--r--udev/79-cloud-init-net-setup-link.rules18
-rw-r--r--udev/79-cloud-init-net-wait.rules10
-rwxr-xr-xudev/cloud-init-wait82
3 files changed, 92 insertions, 18 deletions
diff --git a/udev/79-cloud-init-net-setup-link.rules b/udev/79-cloud-init-net-setup-link.rules
deleted file mode 100644
index 03dba382..00000000
--- a/udev/79-cloud-init-net-setup-link.rules
+++ /dev/null
@@ -1,18 +0,0 @@
-# cloud-init rules to apply
-
-SUBSYSTEM!="net", GOTO="cloudinit_naming_end"
-
-IMPORT{builtin}="path_id"
-
-ACTION!="add", GOTO="cloudinit_naming_end"
-
-# net_setup_link provides us with systemd names for reference
-IMPORT{builtin}="net_setup_link"
-ATTR{address}!="", ENV{MAC_ADDRESS}="$attr{address}"
-IMPORT{program}="/lib/udev/cloud-init-name-device"
-
-ENV{CLOUDINIT_NET_NAME}!="", NAME="$env{CLOUDINIT_NET_NAME}"
-
-LABEL="cloudinit_naming_end"
-
-# vi: ts=4 expandtab syntax=udevrules
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..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