#!/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"