49 lines
1.7 KiB
Bash
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"
|