From d202c072b658388761ba9040a11635371358aab8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jake=20Buchholz=20G=C3=B6kt=C3=BCrk?= Date: Sun, 17 Jul 2022 18:29:57 -0700 Subject: [PATCH] imds * source /lib/tiny-cloud/common for config & defaults * _imds_ssh_keys calls _imds instead of imds /lib/tiny-cloud/common * load config, set defaults * add PID to log() tag /lib/tiny-cloud/init-common * source /lib/tiny-cloud/common for config/defaults nocloud/imds * many datasource loading fixes * fix _imds keypath & file dump --- bin/imds | 11 ++++---- lib/tiny-cloud/common | 9 ++++++- lib/tiny-cloud/init-common | 6 +---- lib/tiny-cloud/nocloud/imds | 50 +++++++++++++++++++++---------------- 4 files changed, 43 insertions(+), 33 deletions(-) diff --git a/bin/imds b/bin/imds index 146d806..725506b 100755 --- a/bin/imds +++ b/bin/imds @@ -3,9 +3,9 @@ # Tiny Cloud - Instance MetaData Service client -### configuration +### configuration, common functions -[ -f /etc/conf.d/tiny-cloud ] && source /etc/conf.d/tiny-cloud +source /lib/tiny-cloud/common ### cloud-specific variables/functions @@ -21,7 +21,7 @@ unset -f \ ### default variables/functions -CLOUD="${CLOUD:-unknown}" +# Common to many clouds IMDS_ENDPOINT="169.254.169.254" # Common to AWS and NoCloud(ish) @@ -47,8 +47,9 @@ _imds_userdata() { _imds "$IMDS_USERDATA"; } _imds_ssh_keys() { local key - for key in $(imds "$IMDS_SSH_KEYS"); do - imds "$IMDS_SSH_KEYS/${key%=*}/openssh-key" + for key in $(_imds "$IMDS_SSH_KEYS"); do + _imds "$IMDS_SSH_KEYS/${key%=*}/openssh-key" + echo done | sort -u } diff --git a/lib/tiny-cloud/common b/lib/tiny-cloud/common index 206b39a..6848209 100644 --- a/lib/tiny-cloud/common +++ b/lib/tiny-cloud/common @@ -1,6 +1,13 @@ # Tiny Cloud - common script functions # vim: ts=4 et ft=sh: +# set defaults +[ -f /etc/conf.d/tiny-cloud ] && source /etc/conf.d/tiny-cloud +CLOUD="${CLOUD:-unknown}" +CLOUD_USER=${CLOUD_USER:-alpine} +TINY_CLOUD_LOGS=${TINY_CLOUD_LOGS:-/var/log} +TINY_CLOUD_VAR=${TINY_CLOUD_VAR:-/var/lib/cloud} + log() { local facility="kern" local stderr @@ -17,7 +24,7 @@ log() { [ -z "$DEBUG" ] && [ "$level" = debug ] && return shift - logger $stderr -p "$facility.$level" -t "$tag" "$@" + logger $stderr -p "$facility.$level" -t "$tag[$$]" "$@" case "$level" in crit|alert|emerg) exit 1 ;; esac diff --git a/lib/tiny-cloud/init-common b/lib/tiny-cloud/init-common index 2632c78..e412eb4 100644 --- a/lib/tiny-cloud/init-common +++ b/lib/tiny-cloud/init-common @@ -1,12 +1,8 @@ # Tiny Cloud - Common Initialization # vim:set ts=4 et ft=sh: -[ -f /etc/conf.d/tiny-cloud ] && source /etc/conf.d/tiny-cloud - # set defaults -CLOUD_USER=${CLOUD_USER:-alpine} -TINY_CLOUD_LOGS=${TINY_CLOUD_LOGS:-/var/log} -TINY_CLOUD_VAR=${TINY_CLOUD_VAR:-/var/lib/cloud} +source /lib/tiny-cloud/common SKIP_INIT_ACTIONS=${SKIP_INIT_ACTIONS:-} # is initial bootstrap already done? diff --git a/lib/tiny-cloud/nocloud/imds b/lib/tiny-cloud/nocloud/imds index 65b8b1c..cf1ed13 100644 --- a/lib/tiny-cloud/nocloud/imds +++ b/lib/tiny-cloud/nocloud/imds @@ -13,7 +13,7 @@ _load_nocloud_cmdline() { for kopt in $(cat /proc/cmdline); do echo "$kopt" | grep -qE '(^|=)ds=nocloud(-net)?(;|$)' || continue - for kv in $(echo "$kopt" | cut -d\; -f2-); do + for kv in $(echo "$kopt" | sed -Ee 's/.*ds=nocloud(-net)?(;|$)//' | tr \; ' '); do k=$(echo "$kv" | cut -d= -f1) v=$(echo "$kv" | cut -d= -f2- | sed -Ee s'|^file://|/|') case "$k" in @@ -27,68 +27,74 @@ _load_nocloud_cmdline() { for data in $NOCLOUD_FILES; do case "$v" in /*) - cat "$v" >> "$TINY_CLOUD_VAR/$data" || continue + cat "$v/$data" >> "$TINY_CLOUD_VAR/$data" || continue echo >> "$TINY_CLOUD_VAR/$data" ;; http://*|https://*) - wget -qO - "$v" >> "$TINY_CLOUD_VAR/$data" || continue + wget -qO - "$v/$data" >> "$TINY_CLOUD_VAR/$data" || continue echo >> "$TINY_CLOUD_VAR/$data" ;; - *) echo "WARNING: Ignoring unknown seedfrom value '$v'" >&2 + *) log -s warning "Unknown NoCloud seedfrom value '$v'" ;; esac done ;; - *) echo "WARNING: Ignoring unknown nocloud kernel cmdline key '$k'" >&2 + *) log -s warning "Unknown NoCloud kernel cmdline key '$k'" ;; esac done return done + return 1 } _load_nocloud_volume() { - local mntdir=$(mktmemp /mnt/cidata-XXXXXX) + local mntdir=$(mktemp /mnt/cidata-XXXXXX) local data mkdir -p "$mntdir" # TODO: are lables case insensitive? - mount LABEL=cidata "$mntdir" || mount LABEL=CIDATA "$mntdir" || return 1 - for data in $NOCLOUD_FILES; do - cp "$mntdir/$data" "$TINY_CLOUD_VAR/$data" 2>/dev/null - done - umount "$mntdir" + if mount LABEL=cidata "$mntdir" || mount LABEL=CIDATA "$mntdir"; then + for data in $NOCLOUD_FILES; do + # lack of source results in empty target + cat "$mntdir/$data" > "$TINY_CLOUD_VAR/$data" + done + umount "$mntdir" + else + return 1 + fi rmdir "$mntdir" } load_nocloud() { - is_nocloud_loaded && return - # start with a clean slate - rm -f $NOCLOUD_FILES + (cd "$TINY_CLOUD_VAR" && rm -f $NOCLOUD_FILES) - if ! _load_nocloud_cmdline || _load_nocloud_volume; then - echo "ERROR: Unable to load NoCloud data" >&2 + if _load_nocloud_cmdline || _load_nocloud_volume; then + touch "$TINY_CLOUD_VAR/.nocloud_loaded" + else + log -s err "Unable to load NoCloud datasource" return 1 fi - # at the very minimum, we expect something in meta-data - touch "$TINY_CLOUD_VAR/.nocloud_loaded" + # minimally, we expect some content in meta-data + [ -s "$TINY_CLOUD_VAR/meta-data" ] || + log -s warning "NoCloud 'meta-data' is empty" } _imds() { local file="$TINY_CLOUD_VAR"/$(echo "$1" | cut -d/ -f1) - local key=$(echo "$1" | cut -d/ -f2-) + local keypath=$(echo "$1" | cut -d/ -f2- | tr / ' ') - is_nocloud_loaded || load_nocloud || return 1 + is_nocloud_loaded || load_nocloud # does file exist? [ -f "$file" ] || return 1 # use 'file/' to get top-level keys - if [ "$1" = "$file" ]; then + if [ $(basename "$file") = "keypath" ]; then cat "$file" else - yx -f "$file" "$key" + yx -f "$file" $keypath fi } \ No newline at end of file