Files
smom-dbis-138/scripts/deployment/merge-env-fragment.sh
2026-07-05 17:31:33 -07:00

49 lines
1.7 KiB
Bash

#!/usr/bin/env bash
# Merge KEY=VALUE lines from a fragment file into target .env.
# Default strategy replaces managed keys from the fragment and preserves all others.
set -euo pipefail
TARGET="${1:?target .env path}"
FRAGMENT="${2:?fragment file path}"
MERGE_STRATEGY="${OMNL_MERGE_STRATEGY:-overwrite}"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROXMOX_MERGE_PY="${PROXMOX_MERGE_DOTENV_PY:-$(cd "$SCRIPT_DIR/../../.." && pwd)/scripts/lib/merge-dotenv.py}"
touch "$TARGET"
if [[ -f "$PROXMOX_MERGE_PY" ]]; then
python3 "$PROXMOX_MERGE_PY" --strategy "$MERGE_STRATEGY" "$TARGET" "$FRAGMENT" >/dev/null
else
tmp="$(mktemp)"
trap 'rm -f "$tmp" "${tmp}.new"' EXIT
cp "$TARGET" "$tmp"
while IFS= read -r line || [[ -n "$line" ]]; do
line="${line//$'\r'/}"
[[ -z "$line" || "$line" =~ ^[[:space:]]*# ]] && continue
key="${line%%=*}"
[[ "$key" =~ ^[A-Za-z_][A-Za-z0-9_]*$ ]] || continue
if [[ "$MERGE_STRATEGY" == "preserve" ]] && grep -q "^${key}=" "$tmp"; then
continue
fi
if [[ "$MERGE_STRATEGY" == "fill-empty" ]] && grep -q "^${key}=" "$tmp"; then
current="$(grep "^${key}=" "$tmp" | tail -n 1 | cut -d= -f2-)"
[[ -n "$current" ]] && continue
fi
grep -v "^${key}=" "$tmp" > "${tmp}.new" || true
mv "${tmp}.new" "$tmp"
printf '%s\n' "$line" >> "$tmp"
done < "$FRAGMENT"
mv "$tmp" "$TARGET"
trap - EXIT
fi
if grep -q '^OMNL_FINERACT_USER=' "$TARGET" && ! grep -q '^OMNL_FINERACT_USERNAME=' "$TARGET"; then
u="$(grep '^OMNL_FINERACT_USER=' "$TARGET" | tail -n 1 | cut -d= -f2-)"
printf 'OMNL_FINERACT_USERNAME=%s\n' "$u" >> "$TARGET"
fi
tr -d '\r' <"$TARGET" >"${TARGET}.lf" && mv "${TARGET}.lf" "$TARGET"
chmod 600 "$TARGET"