From 11789c272f4af59586f344b051c8159e80b755e3 Mon Sep 17 00:00:00 2001 From: Natanael Copa Date: Thu, 13 Jun 2024 21:56:37 +0200 Subject: [PATCH] Autodetect nocloud if CLOUD is unset Set default CLOUD to 'auto', which will try autodetect the cloud provider. Each cloud can have an autodetect script which should print: if cloud was detected. --- lib/tiny-cloud/cloud/nocloud/autodetect | 11 +++++++ lib/tiny-cloud/common | 2 +- lib/tiny-cloud/init | 14 ++++++++ tests/init.test | 43 ++++++++++++++++++++++++- 4 files changed, 68 insertions(+), 2 deletions(-) create mode 100755 lib/tiny-cloud/cloud/nocloud/autodetect diff --git a/lib/tiny-cloud/cloud/nocloud/autodetect b/lib/tiny-cloud/cloud/nocloud/autodetect new file mode 100755 index 0000000..7f04819 --- /dev/null +++ b/lib/tiny-cloud/cloud/nocloud/autodetect @@ -0,0 +1,11 @@ +#!/bin/sh + +# Tiny Cloud - Autodetect +# vim:set filetype=sh: +# shellcheck shell=sh + +grep -w 'ds=nocloud' "$ROOT"/proc/cmdline 2>/dev/null \ + || grep -w "^ds=nocloud" "$ROOT"/sys/class/dmi/id/product_serial 2>/dev/null \ + || findfs LABEL=cidata >/dev/null 2>&1 \ + || findfs LABEL=CIDATA >/dev/null 2>&1 \ + && echo "10 nocloud" diff --git a/lib/tiny-cloud/common b/lib/tiny-cloud/common index c8ebd8d..960ae3a 100644 --- a/lib/tiny-cloud/common +++ b/lib/tiny-cloud/common @@ -4,7 +4,7 @@ # set defaults [ -f "$ROOT/etc/tiny-cloud.conf" ] && . "$ROOT/etc/tiny-cloud.conf" -: "${CLOUD:=unknown}" +: "${CLOUD:=auto}" : "${CLOUD_USER:=alpine}" : "${TINY_CLOUD_LOGS:=$ROOT/var/log}" : "${TINY_CLOUD_VAR:=$ROOT/var/lib/cloud}" diff --git a/lib/tiny-cloud/init b/lib/tiny-cloud/init index b874497..bdc0a89 100644 --- a/lib/tiny-cloud/init +++ b/lib/tiny-cloud/init @@ -37,6 +37,20 @@ DEFAULT_ACTIONS_FINAL="" [ ! -d "$TINY_CLOUD_LOGS" ] && mkdir -p "$TINY_CLOUD_LOGS" || true [ ! -d "$TINY_CLOUD_VAR" ] && mkdir -p "$TINY_CLOUD_VAR" || true +# autodetect cloud +if [ "$CLOUD" = "auto" ]; then + CLOUD=$(cat "$TINY_CLOUD_VAR"/.autodetect 2>/dev/null) || { + CLOUD=$( + for i in "$LIBDIR"/tiny-cloud/cloud/*/autodetect; do + if [ -f "$i" ]; then + "$i" + fi + done | sort -n | cut -d' ' -f2 | head -n 1 + ) + : ${CLOUD:=unknown} + printf "%s\n" "$CLOUD" > "$TINY_CLOUD_VAR"/.autodetect + } +fi ### standard boot phase functions... diff --git a/tests/init.test b/tests/init.test index 5ebfa8e..0a00008 100755 --- a/tests/init.test +++ b/tests/init.test @@ -23,7 +23,11 @@ init_tests \ set_hostname \ set_ssh_keys \ userdata_type \ - run_userdata + run_userdata \ + autodetect_unknown \ + autodetect_nocloud_cmdline \ + autodetect_nocloud_dmi \ + autodetect_nocloud_volume PROVIDERS="aws azure gcp nocloud oci scaleway hetzner" @@ -225,3 +229,40 @@ run_userdata_body() { grep "hello from user-data" var/log/user-data.log || atf_fail "user-data.log failed" grep -w "0" var/log/user-data.exit || atf_fail "user-data.exit failed" } + +autodetect_unknown_body() { + atf_check \ + -o match:"unknown" \ + sh -c ". \"$lib\"; echo \$CLOUD" +} + +autodetect_nocloud_cmdline_body() { + mkdir -p proc + echo "quiet ds=nocloud;s=https://10.42.42.42/ console=ttyS0" > proc/cmdline + atf_check \ + -o match:"nocloud" \ + sh -c ". \"$lib\"; echo \$CLOUD" +} + +autodetect_nocloud_dmi_body() { + mkdir -p sys/class/dmi/id + echo "ds=nocloud;s=https://10.42.42.42/" > sys/class/dmi/id/product_serial + atf_check \ + -o match:"nocloud" \ + sh -c ". \"$lib\"; echo \$CLOUD" +} + +autodetect_nocloud_volume_body() { + fake_bin findfs <<-EOF + #!/bin/sh + case "\$1" in + LABEL=cidata) echo "/dev/sda1";; + LABEL=CIDATA) echo "/dev/sda2";; + *) exit 1;; + esac + EOF + + atf_check \ + -o match:"nocloud" \ + sh -c ". \"$lib\"; echo \$CLOUD" +}