#!/usr/bin/env bash # Build config/cloudflare-ddns.env for timothyjmiller/cloudflare-ddns from secrets/.env set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" STACK_DIR="${STACK_DIR:-$(cd "$SCRIPT_DIR/.." && pwd)}" SECRETS="${SECRETS_FILE:-$STACK_DIR/secrets/.env}" OUT_DIR="${CONFIG_DIR:-$STACK_DIR/config}/cloudflare-ddns" OUT="$OUT_DIR/ddns.env" [[ -f "$SECRETS" ]] || { echo "missing $SECRETS"; exit 1; } set -a # shellcheck disable=SC1090 source "$SECRETS" set +a TOKEN="${CLOUDFLARE_API_TOKEN:-${CLOUDFLAREAPIKEY:-}}" ZONE="${CLOUDFLARE_ZONE_ID:-${CLOUDFLAREZONEID:-}}" DOMAIN="${CLOUDFLARE_DOMAIN:-${CLOUDFLAREDOMAIN:-devopshomelab.com}}" SUBS="${CLOUDFLARE_SUBDOMAINS:-${CLOUDFLARESUBDOMAINS:-}}" PROXIED="${CLOUDFLARE_PROXIED:-${CLOUDFLAREPROXIED:-false}}" CRON="${CLOUDFLARE_UPDATE_CRON:-@every 5m}" [[ -n "$TOKEN" ]] || { echo "CLOUDFLAREAPIKEY / CLOUDFLARE_API_TOKEN missing"; exit 1; } [[ -n "$DOMAIN" ]] || { echo "CLOUDFLAREDOMAIN missing"; exit 1; } # apex + each subdomain → full FQDNs DOMAINS=("$DOMAIN") IFS=',' read -ra parts <<<"$SUBS" for s in "${parts[@]}"; do s="$(echo "$s" | tr -d '[:space:]')" [[ -z "$s" ]] && continue if [[ "$s" == "$DOMAIN" || "$s" == "@" || "$s" == "." ]]; then continue elif [[ "$s" == *.* ]]; then DOMAINS+=("$s") else DOMAINS+=("${s}.${DOMAIN}") fi done # unique join IP4_LIST="$(printf '%s\n' "${DOMAINS[@]}" | awk 'NF && !seen[$0]++' | paste -sd, -)" mkdir -p "$OUT_DIR" umask 077 cat >"$OUT" <>"$OUT" fi chmod 600 "$OUT" echo "Wrote $OUT" echo "IP4_DOMAINS=${IP4_LIST}"