#!/bin/bash set -o errexit -o pipefail -o noclobber -o nounset -o errtrace -o functrace shopt -s dotglob quadlet_template=" - path: /home/__USER__/.config/containers/systemd/user/__FILE__ mode: 0644 contents: local: quadlets/__USER__/__FILE__ user: name: __USER__ group: name: __USER__" home_template=" - path: /var/home/__USER__/__FILE__ mode: 0755 contents: local: home/__USER__/__FILE__ user: name: __USER__ group: name: __USER__" service_template=" - path: /var/home/__USER__/.config/systemd/user/__FILE__ mode: 0755 contents: local: services/__USER__/__FILE__ user: name: __USER__ group: name: __USER__" directory_template=" - path: /var/mnt/nas/containers/__USER__/storage/__VOLUME__ mode: 0755 user: name: __USER__ group: name: __USER__" files_template=" files: - path: /var/lib/systemd/linger/__USER__ mode: 0644" users=('arr' 'gitea' 'homeassistant' 'immich' 'jdownloader' 'kiwix' 'komga' 'navidrome' 'nextcloud' 'nginx' 'pairdrop' 'paperless' 'pihole' 'qbittorrent' 'synapse' 'tga' 'wallabag') mkdir -p users for user in "${users[@]}"; do user_butane="users/${user}.bu" sed "s/__USER__/${user}/g" user-template.bu >| "${user_butane}" if [[ -d "quadlets/${user}" ]]; then directory_template_user="${directory_template//__USER__/${user}}" for file in "quadlets/${user}/"*.volume; do if [[ -f "${file}" ]]; then content="$(grep "Device" "${file}")" if [[ "${content}" =~ ^Device=/var/mnt/nas/containers/${user}/storage/(.+)$ ]]; then volume="${BASH_REMATCH[1]}" printf '%s' "${directory_template_user//__VOLUME__/${volume}}" >> "${user_butane}" else echo "Not found! ${content}" fi fi done fi printf '%s' "${files_template//__USER__/${user}}" >> "${user_butane}" if [[ -d "quadlets/${user}" ]]; then quadlet_template_user="${quadlet_template//__USER__/${user}}" for file in "quadlets/${user}/"*; do filename="$(basename "${file}")" printf '%s' "${quadlet_template_user//__FILE__/${filename}}" >> "${user_butane}" done fi if [[ -d "home/${user}" ]]; then home_template_user="${home_template//__USER__/${user}}" for file in "home/${user}/"*; do filename="$(basename "${file}")" printf '%s' "${home_template_user//__FILE__/${filename}}" >> "${user_butane}" done fi if [[ -d "services/${user}" ]]; then service_template_user="${service_template//__USER__/${user}}" for file in "services/${user}/"*; do filename="$(basename "${file}")" printf '%s' "${service_template_user//__FILE__/${filename}}" >> "${user_butane}" done fi podman run --rm --interactive --security-opt label=disable --volume "${PWD}:/pwd" --workdir /pwd quay.io/coreos/butane:release --pretty --strict -d /pwd "${user_butane}" >| "users/${user}.ign" done podman run --rm --interactive --security-opt label=disable --volume "${PWD}:/pwd" --workdir /pwd quay.io/coreos/butane:release --pretty --strict -d /pwd pi4.bu >| pi4.ign