#!/bin/sh VERBOSITY=0 CONFIG=/etc/cirros-init/configdrive NAME="${0##*/}" LABEL="config-2" LABEL_ALT="CONFIG-2" SEED_PRE_D="/var/lib/cloud/seed/configdrive-pre" SEED_POST_D="/var/lib/cloud/seed/configdrive" . ${CIRROS_SHLIB:=/lib/cirros/shlib} || { echo "failed to read ${CIRROS_SHLIB}" 1>&2; exit 1; } Usage() { cat < public-keys || rm public-keys set -f fi for fix in uuid:instance-id hostname:local-hostname user_data:user-data \ availability_zone:availability-zone launch_index:launch-index; do f="${fix%:*}" t="${fix#*:}" [ -f "$f" -a ! -f "$t" ] || continue ln -sf "$f" "$t" || fail "failed to link $f to $t" done # now create files/ tree cd "${start_d}" cd "${out_d}" local d path content_path omask omask=$(umask) umask 0226 if [ -f processed/files/0 ]; then # processed/files/0 is the length set +f for d in processed/files/*; do [ "${d##*/}" = "0" ] && continue set -f [ -f "$d/path" -a -f "$d/content_path" ] || { debug 1 "$d unexpected file dir"; continue; } { read path < "$d/path" || [ -n "$path" ] ; } && { read content_path < "$d/content_path" || [ -n "$content_path" ]; } || { debug 1 "skipping $d, failed reads"; continue; } mkdir -p "files/${path%/*}" && cp "raw/openstack/${content_path}" "files/${path}" || { fail "failed to create ${path} in files"; return 1; } done set -f fi umask $omask cd "$start_d" echo 0 > "$out_d/result" } apply() { local mode="$1" data_d="$2" if [ -d "$data_d/files" ]; then local omask="" f="" path="" tpath="" omask=$(umask) umask 0226 for f in $(find "$data_d/files/" -type f); do path="${f#${data_d}/files/}" tpath="${TARGET_ROOT}/${path}" mkdir -p "${tpath%/*}" && cp "${f}" "${tpath}" || { error "failed to create ${tpath}"; return 1; } done umask "$omask" fi } short_opts="hv" long_opts="help,verbose" getopt_out=$(getopt --name "${0##*/}" \ --options "${short_opts}" --long "${long_opts}" -- "$@") && eval set -- "${getopt_out}" || bad_Usage while [ $# -ne 0 ]; do cur=${1}; next=${2}; case "$cur" in -h|--help) Usage ; exit 0;; -v|--verbose) VERBOSITY=$((${VERBOSITY}+1));; --) shift; break;; esac shift; done [ $# -eq 2 ] || bad_Usage "must provide mode and output dir" mode="$1" out_d="$2" [ "$mode" = "local" -o "$mode" = "apply-local" ] || { debug 2 "only supported in mode 'local'"; exit 0; } [ ! -e "$CONFIG" ] || . "$CONFIG" || fail "failed to read $CONFIG" if [ "$mode" = "local" ]; then search_local "$out_d" elif [ "$mode" = "apply-local" ]; then apply "$mode" "$out_d" else fail "error, unexpected input" fi exit # vi: ts=4 noexpandtab