mirror of
https://gitlab.alpinelinux.org/alpine/cloud/tiny-cloud.git
synced 2025-12-18 12:52:42 +03:00
Compresssed User-Data / Initial NoCloud Support
Compressed User-Data * extends !23 to support more algorithms NoCloud * initial support for volume-based meta-data, user-data, and optional vendor-data * depends on 'yx' tool to extract data from yaml
This commit is contained in:
parent
ed8bdc8c8b
commit
ca264b7387
12
bin/imds
12
bin/imds
@ -35,6 +35,12 @@ unset -f \
|
|||||||
CLOUD="${CLOUD:-unknown}"
|
CLOUD="${CLOUD:-unknown}"
|
||||||
IMDS_ENDPOINT="169.254.169.254"
|
IMDS_ENDPOINT="169.254.169.254"
|
||||||
|
|
||||||
|
_imds() {
|
||||||
|
wget --quiet --timeout 1 --output-document - \
|
||||||
|
--header "$(_imds_header)" \
|
||||||
|
"http://$IMDS_ENDPOINT/$IMDS_URI/$1$IMDS_QUERY"
|
||||||
|
}
|
||||||
|
|
||||||
_imds_ssh_keys() { _imds "$IMDS_SSH_KEYS"; }
|
_imds_ssh_keys() { _imds "$IMDS_SSH_KEYS"; }
|
||||||
_imds_userdata() { _imds "$IMDS_USERDATA"; }
|
_imds_userdata() { _imds "$IMDS_USERDATA"; }
|
||||||
|
|
||||||
@ -48,12 +54,6 @@ source /lib/tiny-cloud/"$CLOUD"/imds
|
|||||||
|
|
||||||
### non-overrideable functions
|
### non-overrideable functions
|
||||||
|
|
||||||
_imds() {
|
|
||||||
wget --quiet --timeout 1 --output-document - \
|
|
||||||
--header "$(_imds_header)" \
|
|
||||||
"http://$IMDS_ENDPOINT/$IMDS_URI/$1$IMDS_QUERY"
|
|
||||||
}
|
|
||||||
|
|
||||||
imds() {
|
imds() {
|
||||||
local cmd args key rv err=1
|
local cmd args key rv err=1
|
||||||
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
|
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
|
||||||
|
|||||||
@ -3,10 +3,40 @@
|
|||||||
|
|
||||||
source /lib/tiny-cloud/init-common
|
source /lib/tiny-cloud/init-common
|
||||||
|
|
||||||
|
|
||||||
|
match_header() {
|
||||||
|
local bytes=$(echo -en "$1")
|
||||||
|
[ "$bytes" = $(dd bs=1 count=${#bytes} if="$2" 2>/dev/null) ]
|
||||||
|
}
|
||||||
|
|
||||||
|
# TODO: also do this for nocloud meta-data and vendor-data?
|
||||||
save_userdata() {
|
save_userdata() {
|
||||||
skip_action save_userdata && return
|
skip_action save_userdata && return
|
||||||
|
|
||||||
imds -e @userdata > "$TINY_CLOUD_VAR/$CLOUD_USERDATA"
|
local userdata="$TINY_CLOUD_VAR/$CLOUD_USERDATA"
|
||||||
|
local tmpfile=$(mktemp "$userdata.XXXXXX")
|
||||||
|
local cmd
|
||||||
|
|
||||||
|
imds -e @userdata > "$tmpfile"
|
||||||
|
if match_header '\037\213\010' "$tmpfile"; then
|
||||||
|
cmd='gzip -dc'
|
||||||
|
elif match_header 'BZh' "$tmpfile"; then
|
||||||
|
cmd='bzip2 -dc'
|
||||||
|
elif match_header '\3757zXZ\000' "$tmpfile"; then
|
||||||
|
cmd='xz -dc'
|
||||||
|
elif match_header '\135\0\0\0' "$tmpfile"; then
|
||||||
|
cmd='lzma -dc'
|
||||||
|
elif match_header '\211\114\132' "$tmpfile"; then
|
||||||
|
cmd='lzop -dc'
|
||||||
|
elif match_header '\002!L\030' "$tmpfile"; then
|
||||||
|
cmd='lz4 -dc'
|
||||||
|
elif match_header '(\265/\375' "$tmpfile"; then
|
||||||
|
cmd='zstd -dc'
|
||||||
|
else
|
||||||
|
cmd='cat'
|
||||||
|
fi
|
||||||
|
$cmd "$tmpfile" > "$userdata"
|
||||||
|
rm "$tmpfile"
|
||||||
}
|
}
|
||||||
|
|
||||||
is_userdata_script() {
|
is_userdata_script() {
|
||||||
|
|||||||
59
lib/tiny-cloud/nocloud/imds
Normal file
59
lib/tiny-cloud/nocloud/imds
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
# NoCloud Instance Metadata
|
||||||
|
# vim: ts=4 et ft=sh:
|
||||||
|
|
||||||
|
IMDS_HOSTNAME=meta-data/hostname
|
||||||
|
IMDS_SSH_KEYS=meta-data/ssh-keys
|
||||||
|
IMDS_USERDATA=user-data
|
||||||
|
|
||||||
|
# have we loaded the nocloud meta/user/vendor data?
|
||||||
|
is_nocloud_loaded() { [ -f "$TINY_CLOUD_VAR/.nocloud_loaded" ]; }
|
||||||
|
|
||||||
|
# from location specified in kernel cmdline
|
||||||
|
_load_nocloud_cmdline() {
|
||||||
|
# TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
# from volume labeled cidata|CIDATA
|
||||||
|
_load_nocloud_volume() {
|
||||||
|
local mntdir='/mnt/cidata'
|
||||||
|
|
||||||
|
mkdir "$mntdir"
|
||||||
|
mount -L cidata "$mntdir" || mount -L CIDATA "$mntdir" || return 1
|
||||||
|
for data in meta user vendor; do
|
||||||
|
if ! cp "$mntdir/$data-data" "$TINY_CLOUD_VAR/$data-data"; then
|
||||||
|
[ "$data" = vendor ] && continue
|
||||||
|
echo "ERROR: Required $data-data not found on CIDATA volume"
|
||||||
|
umount "$mntdir"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
umount "$mntdir"
|
||||||
|
}
|
||||||
|
|
||||||
|
load_nocloud() {
|
||||||
|
is_nocloud_loaded && return
|
||||||
|
if grep -qE ' ds=nocloud(-net)?[; ]' /proc/cmdline; then
|
||||||
|
if ! _load_nocloud_cmdline; then
|
||||||
|
echo 'ERROR: Unable to load nocloud data specified in kernel cmdline' >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
elif ! _load_nocloud_volume; then
|
||||||
|
echo 'ERROR: Unable to load nocloud data from CIDATA volume' >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
touch "$TINY_CLOUD_VAR/.nocloud_loaded"
|
||||||
|
}
|
||||||
|
|
||||||
|
_imds() {
|
||||||
|
local file="$TINY_CLOUD_VAR"/$(echo "$1" | cut -d/ -f1)
|
||||||
|
local key=$(echo "$1" | cut -d/ -f2-)
|
||||||
|
local data value
|
||||||
|
|
||||||
|
is_nocloud_loaded || load_nocloud || return 1
|
||||||
|
|
||||||
|
# does file exist?
|
||||||
|
[ -f "$file" ] || return 1
|
||||||
|
|
||||||
|
# use 'file/' to get top-level keys
|
||||||
|
[ "$1" = "$file" ] && cat "$file" || yx -f "$file" "$key"
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user