diff --git a/etc/init.d/tiny-cloud b/etc/init.d/tiny-cloud old mode 100644 new mode 100755 diff --git a/etc/init.d/tiny-cloud-early b/etc/init.d/tiny-cloud-early old mode 100644 new mode 100755 diff --git a/etc/init.d/tiny-cloud-final b/etc/init.d/tiny-cloud-final old mode 100644 new mode 100755 index 0a6291e..01dd43c --- a/etc/init.d/tiny-cloud-final +++ b/etc/init.d/tiny-cloud-final @@ -22,4 +22,8 @@ start() { run_userdata eend $? fi + + ebegin "Marking Instance Bootstrap Complete" + bootstrap_complete + eend $? } \ No newline at end of file diff --git a/lib/tiny-cloud/aws/imds b/lib/tiny-cloud/aws/imds index 3e474e8..b1ab4b9 100644 --- a/lib/tiny-cloud/aws/imds +++ b/lib/tiny-cloud/aws/imds @@ -11,9 +11,9 @@ IMDS_SSH_KEYS="meta-data/public-keys" IMDS_USERDATA="user-data" _imds_token() { - echo -ne "PUT /latest/api/token HTTP/1.0\r\n"\ - "$IMDS_TOKEN_TTL_HEADER: $IMDS_TOKEN_TTL\r\n\r\n" | - nc 169.254.169.254 80 | tail -n 1 + echo -ne "PUT /latest/api/token" \ + "HTTP/1.0\r\n$IMDS_TOKEN_TTL_HEADER: $IMDS_TOKEN_TTL\r\n\r\n" | + nc 169.254.169.254 80 | tail -n 1 } _imds_header() { @@ -26,3 +26,8 @@ imds_ssh_keys() { imds "$IMDS_SSH_KEYS/${key%=*}/openssh-key" done | sort -u } + +# ignore 404s from IMDS, if no user-data is set +imds_userdata() { + _imds "$IMDS_USERDATA" || true +} diff --git a/lib/tiny-cloud/azure/imds b/lib/tiny-cloud/azure/imds index 08a34fb..3acd55f 100644 --- a/lib/tiny-cloud/azure/imds +++ b/lib/tiny-cloud/azure/imds @@ -22,5 +22,5 @@ imds_ssh_keys() { # decode userdata value imds_userdata() { - imds "$IMDS_USERDATA" | base64 -d | _enforce_ending_newline + imds "$IMDS_USERDATA" | base64 -d } \ No newline at end of file diff --git a/lib/tiny-cloud/gcp/imds b/lib/tiny-cloud/gcp/imds index 0770337..e5362f4 100644 --- a/lib/tiny-cloud/gcp/imds +++ b/lib/tiny-cloud/gcp/imds @@ -19,6 +19,6 @@ _imds_header() { imds_ssh_keys() { for ssh_keys in $IMDS_SSH_KEYS; do # ignore errors and strip leading ':' - _imds "$ssh_keys" | cut -d: -f2- | _enforce_ending_newline + _imds "$ssh_keys" | cut -d: -f2- done | sort -u } \ No newline at end of file diff --git a/lib/tiny-cloud/imds b/lib/tiny-cloud/imds index 03708c1..405ae1b 100644 --- a/lib/tiny-cloud/imds +++ b/lib/tiny-cloud/imds @@ -4,9 +4,9 @@ ### configuration if [ -z "$TINY_CLOUD_LIBS" ]; then - TINY_CLOUD_CONF=${TINY_CLOUD_CONF:-/etc/conf.d/tiny-cloud} - [ -f "$TINY_CLOUD_CONF" ] && source "$TINY_CLOUD_CONF" - TINY_CLOUD_LIBS=${TINY_CLOUD_LIBS:-/lib/tiny-cloud} + TINY_CLOUD_CONF=${TINY_CLOUD_CONF:-/etc/conf.d/tiny-cloud} + [ -f "$TINY_CLOUD_CONF" ] && source "$TINY_CLOUD_CONF" + TINY_CLOUD_LIBS=${TINY_CLOUD_LIBS:-/lib/tiny-cloud} fi # defaults @@ -15,7 +15,7 @@ CLOUD="${CLOUD:-unknown}" # these are always cloud-specific unset \ - IMDS_HEADER \ + IMDS_HEADER \ IMDS_QUERY \ IMDS_URL \ IMDS_HOSTNAME \ @@ -27,19 +27,15 @@ unset -f \ _imds_header \ 2>/dev/null || true -# without error reporting or ending newline enforcement +# without error reporting _imds() { wget --quiet --header "$(_imds_header)" --output-document - \ - "$IMDS_URL/$1/$IMDS_QUERY" + "$IMDS_URL/$1$IMDS_QUERY" } -_enforce_ending_newline() { sed '$a\'; } - imds() { - set -o pipefail - _imds "$1" | _enforce_ending_newline + _imds "$1" RV=$? - set +o pipefail [ $RV != 0 ] && echo "ERROR: $RV" >&2 return $RV } @@ -48,14 +44,14 @@ imds_hostname() { imds "$IMDS_HOSTNAME" } -imds_userdata() { - imds "$IMDS_USERDATA" -} - imds_ssh_keys() { imds "$IMDS_SSH_KEYS" } +imds_userdata() { + imds "$IMDS_USERDATA" +} + ### load cloud-specific things if [ ! -d "$TINY_CLOUD_LIBS/$CLOUD" ]; then diff --git a/lib/tiny-cloud/init-common b/lib/tiny-cloud/init-common index 31529ed..be9f7ca 100644 --- a/lib/tiny-cloud/init-common +++ b/lib/tiny-cloud/init-common @@ -7,9 +7,8 @@ CLOUD_USERDATA=${CLOUD_USERDATA:-user-data} TINY_CLOUD_LOGS=${TINY_CLOUD_LOGS:-/var/log} TINY_CLOUD_VAR=${TINY_CLOUD_VAR:-/var/lib/cloud} -# ensure existence of output directories -[ ! -d "$TINY_CLOUD_VAR" ] && mkdir -p "$TINY_CLOUD_VAR" -[ ! -d "$TINY_CLOUD_LOGS" ] && mkdir -p "$TINY_CLOUD_LOGS" - # is initial bootstrap already done? -is_bootstrapped() { [ -f "$TINY_CLOUD_VAR"/.bootstrap-complete ]; } \ No newline at end of file +is_bootstrapped() { [ -f "$TINY_CLOUD_VAR"/.bootstrap-complete ]; } + +# indicate bootstrap is done +bootstrap_complete() { touch "$TINY_CLOUD_VAR"/.bootstrap-complete ]; } \ No newline at end of file diff --git a/lib/tiny-cloud/init-early b/lib/tiny-cloud/init-early index 68c8bd9..fe99869 100644 --- a/lib/tiny-cloud/init-early +++ b/lib/tiny-cloud/init-early @@ -2,27 +2,25 @@ # vim:set ft=sh ts=4 noet: if [ -z "$TINY_CLOUD_LIBS" ]; then - TINY_CLOUD_CONF=${TINY_CLOUD_CONF:-/etc/conf.d/tiny-cloud} - [ -f "$TINY_CLOUD_CONF" ] && source "$TINY_CLOUD_CONF" - TINY_CLOUD_LIBS=${TINY_CLOUD_LIBS:-/lib/tiny-cloud} + TINY_CLOUD_CONF=${TINY_CLOUD_CONF:-/etc/conf.d/tiny-cloud} + [ -f "$TINY_CLOUD_CONF" ] && source "$TINY_CLOUD_CONF" + TINY_CLOUD_LIBS=${TINY_CLOUD_LIBS:-/lib/tiny-cloud} fi source "$TINY_CLOUD_LIBS"/init-common expand_root() { - # explicitly use busybox, in case util-linux is also installed + # explicitly use busybox, in case util-linux is also installed local mountpoint=$(busybox mountpoint -n / | cut -d' ' -f1) local volume=$(echo "$mountpoint" | sed -Ee "s/(nvme\d+n\d|(xv|s)d[a-z])p?\d?$/\1/" ) if [ "$mountpoint" != "$volume" ]; then - partition=$(echo "$volume" | sed -Ee "s/.*(\d+)$/\2/") - einfo "Expanding root partition to volume size..." + partition=$(echo "$mountpoint" | sed -Ee "s/.*(\d+)$/\1/") echo ", +" | sfdisk -q --no-reread -N "$partition" "$volume" - einfo "Updating kernel with new partition table..." partx -u "$volume" fi - einfo "Resizing root filesystem..." + mount -orw,remount / resize2fs "$mountpoint" } \ No newline at end of file diff --git a/lib/tiny-cloud/init-final b/lib/tiny-cloud/init-final index 107d949..32351ab 100644 --- a/lib/tiny-cloud/init-final +++ b/lib/tiny-cloud/init-final @@ -2,26 +2,26 @@ # vim:set ft=sh ts=4 noet: if [ -z "$TINY_CLOUD_LIBS" ]; then - TINY_CLOUD_CONF=${TINY_CLOUD_CONF:-/etc/conf.d/tiny-cloud} - [ -f "$TINY_CLOUD_CONF" ] && source "$TINY_CLOUD_CONF" - TINY_CLOUD_LIBS=${TINY_CLOUD_LIBS:-/lib/tiny-cloud} + TINY_CLOUD_CONF=${TINY_CLOUD_CONF:-/etc/conf.d/tiny-cloud} + [ -f "$TINY_CLOUD_CONF" ] && source "$TINY_CLOUD_CONF" + TINY_CLOUD_LIBS=${TINY_CLOUD_LIBS:-/lib/tiny-cloud} fi source "$TINY_CLOUD_LIBS"/init-common source "$TINY_CLOUD_LIBS"/imds save_userdata() { - imds_userdata > "$USERDATA" + imds_userdata > "$TINY_CLOUD_VAR/$CLOUD_USERDATA" } is_userdata_script() { - head -n1 "$TINY_CLOUD_VAR/$CLOUD_USERSDATA" | grep -q '%#!/' + head -n1 "$TINY_CLOUD_VAR/$CLOUD_USERDATA" | grep -q '#!/' } run_userdata() { local log="$TINY_CLOUD_LOGS/$CLOUD_USERDATA.log" local exit="$TINY_CLOUD_LOGS/$CLOUD_USERDATA.exit" - local userdata="$TINY_CLOUD_VAR/$CLOUD_USERDATA" + local userdata="$TINY_CLOUD_VAR/$CLOUD_USERDATA" chmod +x "$userdata" { "$userdata" 2>& 1; echo $? > "$exit"; } | tee "$log" diff --git a/lib/tiny-cloud/init-main b/lib/tiny-cloud/init-main index 9ff1ebe..972ce62 100644 --- a/lib/tiny-cloud/init-main +++ b/lib/tiny-cloud/init-main @@ -2,14 +2,18 @@ # vim:set ft=sh ts=4 noet: if [ -z "$TINY_CLOUD_LIBS" ]; then - TINY_CLOUD_CONF=${TINY_CLOUD_CONF:-/etc/conf.d/tiny-cloud} - [ -f "$TINY_CLOUD_CONF" ] && source "$TINY_CLOUD_CONF" - TINY_CLOUD_LIBS=${TINY_CLOUD_LIBS:-/lib/tiny-cloud} + TINY_CLOUD_CONF=${TINY_CLOUD_CONF:-/etc/conf.d/tiny-cloud} + [ -f "$TINY_CLOUD_CONF" ] && source "$TINY_CLOUD_CONF" + TINY_CLOUD_LIBS=${TINY_CLOUD_LIBS:-/lib/tiny-cloud} fi source "$TINY_CLOUD_LIBS"/init-common source "$TINY_CLOUD_LIBS"/imds +# ensure existence of output directories +[ ! -d "$TINY_CLOUD_LOGS" ] && mkdir -p "$TINY_CLOUD_LOGS" +[ ! -d "$TINY_CLOUD_VAR" ] && mkdir -p "$TINY_CLOUD_VAR" + set_hostname() { local fqdn=$(imds_hostname) local host="${fqdn%%\.*}"