diff --git a/lib/tiny-cloud/cloud/alpine/init b/lib/tiny-cloud/cloud/alpine/init index 8052c08..48b8380 100644 --- a/lib/tiny-cloud/cloud/alpine/init +++ b/lib/tiny-cloud/cloud/alpine/init @@ -13,6 +13,36 @@ set_resolv_conf() { done } +has_ipv4_address() { + $MOCK ip -4 -o addr show | awk '$2 != "lo" {print $4}' \ + | grep -q -E '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' +} + +want_ephemeral_network() { + if has_ipv4_address; then + return 1 + fi + for i in $(cat "$ROOT"/proc/cmdline 2>/dev/null) \ + $(cat "$ROOT"/sys/class/dmi/id/product_serial 2>/dev/null); do + case "$i" in + "ds=nocloud;"*) + for kv in $(echo "${i#*;}" | tr \; ' '); do + k="${kv%%=*}" + v="${kv#*=}" + case "$k" in + s|seedfrom) + case "$v" in + http://*|https://*) return 0;; + esac + ;; + esac + done + ;; + esac + done + return 1 +} + init__set_network_interfaces() { local interfaces="$(imds meta-data/network-interfaces)" mkdir -p "$ROOT"/etc/network diff --git a/lib/tiny-cloud/init b/lib/tiny-cloud/init index 90770dc..0e004d5 100644 --- a/lib/tiny-cloud/init +++ b/lib/tiny-cloud/init @@ -14,6 +14,7 @@ DEFAULT_ACTIONS_BOOT=" expand_root install_hotplugs + set_ephemeral_network set_default_interfaces enable_sshd " @@ -143,6 +144,22 @@ auto_detect_ethernet_interface() { echo "$iface" } +# may be overridded by provider +want_ephemeral_network() { + false +} + +init__set_ephemeral_network() { + if ! want_ephemeral_network; then + return + fi + local iface="$(auto_detect_ethernet_interface)" + if [ -z "$iface" ]; then + return + fi + $MOCK udhcpc -i "$iface" -f +} + init__set_default_interfaces() { if [ -f "$ROOT"/etc/network/interfaces ]; then log -i -t "$phase" info "$ACTION: already set up" diff --git a/tests/tiny-cloud-alpine.test b/tests/tiny-cloud-alpine.test index 1bf2339..e0a1866 100755 --- a/tests/tiny-cloud-alpine.test +++ b/tests/tiny-cloud-alpine.test @@ -10,6 +10,7 @@ export CLOUD=alpine lib="$srcdir"/lib/tiny-cloud/cloud/alpine/init init_tests \ + set_ephemeral_network_cmdline \ set_network_config_network_interfaces \ set_network_config_auto \ userdata_user_name \ @@ -30,6 +31,16 @@ init_tests \ userdata_packages \ userdata_runcmd +set_ephemeral_network_cmdline_body() { + fake_interfaces eth0 eth1 eth2 + echo up > sys/class/net/eth1/operstate + mkdir -p proc + echo "ds=nocloud;h=foo;seedfrom=https://example.tld" > proc/cmdline + atf_check \ + -o match:"udhcpc.*eth1" \ + -e match:"set_ephemeral_network: done" \ + tiny-cloud boot +} set_network_config_network_interfaces_body() { fake_metadata_nocloud <<-EOF