about summary refs log tree commit diff
path: root/bin/svtree-generate
diff options
context:
space:
mode:
authorRobert Günzler <r@gnzler.io>2025-09-22 20:12:34 +0200
committerRobert Günzler <r@gnzler.io>2025-09-22 20:14:59 +0200
commit44d92a826a8789060fc08a8b60ccff77f42941f5 (patch)
treef26b2529a2a757caae2d669e0a185755e5eec205 /bin/svtree-generate
parentded78d4e64f8aedc88ad1cad26ee7a1bcf531cb7 (diff)
support generating services at runtime
Signed-off-by: Robert Günzler <r@gnzler.io>
Diffstat (limited to '')
-rwxr-xr-xbin/svtree-generate66
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