about summary refs log tree commit diff
path: root/bin/svtree-generate
blob: ca96d847de04b94bfaa36681ecb05edf582cb0c1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#!/bin/sh
# shellcheck disable=SC3043
set -eu

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