diff options
Diffstat (limited to 'bin/svtree-generate')
| -rwxr-xr-x | bin/svtree-generate | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/bin/svtree-generate b/bin/svtree-generate new file mode 100755 index 0000000..f3f323f --- /dev/null +++ b/bin/svtree-generate @@ -0,0 +1,66 @@ +#!/bin/sh +set -eux + +STATE_DIR=${STATE_DIR:-/etc/s6-rc} +TEMPLATE_DIR=${TEMPLATE_DIR:-${STATE_DIR}/templates} +GENERATE_DIR=${GENERATE_DIR:-${STATE_DIR}/generate} + +dst_dir=${1:-/run/svtree-generated} + +doinstall() { + local sv_name=${1:?} + local dir=${2:?} + local dst + + # replace placeholder in destination name + dst="$(readlink -e "$dst_dir")"/"$(basename "$dir" | sed "s/+service/${sv_name}/")" + + # create destination + install -d $dst + + # copy everything over + cp -r ${dir}/* ${dst}/ + + # replace placeholders with service name + find $dst -type f -exec \ + sed \ + -e "s,+statedir,${STATE_DIR},g" \ + -e "s,+service,${sv_name},g" \ + -i {} \+ +} + +dogenerate() { + local sv_name=${1:?} + local sv_template=${2:?} + + printf "=> generating $sv_template : $sv_name\n" >&2 + + # iterate over files in $TEMPLATE_DIR/<template> and pass them to + # doinstall + for dir in "${TEMPLATE_DIR}/${sv_template}"/*; do + dir=$(readlink -e "$dir") + doinstall "$sv_name" "$dir" + done +} + +main() { + test -e "$GENERATE_DIR" || exit 1 + test -e "$TEMPLATE_DIR" || exit 1 + + # clear previous output (if any) + rm -rf "${dst_dir:?}"/* || true + + # create destination directory + mkdir -p "$dst_dir" + + # files in $GENERATE_DIR indicate which services we need to generate + # and what template to use: <template>.<service> + for gen in "$(readlink -e "$GENERATE_DIR")"/*; do + gen=$(basename "$gen") + sv_template=$(printf %s "$gen" | cut -d. -f1) + sv_name=$(printf %s "$gen" | cut -d. -f2) + dogenerate "$sv_name" "$sv_template" + done +} + +main |