apps-gitops/automation/cloudflared-sync.sh
2025-06-23 00:01:37 +03:00

128 lines
4.9 KiB
Bash
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
set -e
# 📦 Ensure apk installs: yq, jq, git, bash, curl
apk add --no-cache git bash curl yq jq
echo "🔍 Scanning for apps with cname.yaml..."
mkdir -p generated-values
rm -rf .tmp-repos
mkdir -p .tmp-repos
# === REPO CONFIG ===
SANDBOX_REPO_URL="https://git.dvirlabs.com/dvirlabs/sandbox.git"
INFRA_REPO_URL="https://${GIT_TOKEN}@git.dvirlabs.com/dvirlabs/infra.git"
SANDBOX_CLONE=".tmp-repos/sandbox"
INFRA_CLONE=".tmp-repos/infra"
GENERATED_FILE="$(pwd)/generated-values/cloudflared-values.yaml"
ORIGINAL_FILE="$INFRA_CLONE/manifests/cloudflared/values.yaml"
MERGED_FILE="$INFRA_CLONE/manifests/cloudflared/values.yaml"
# === STEP 1: Clone Repos ===
echo "📦 Cloning sandbox-apps..."
git clone --depth=1 "$SANDBOX_REPO_URL" "$SANDBOX_CLONE"
echo "📦 Cloning infra..."
git clone --depth=1 "$INFRA_REPO_URL" "$INFRA_CLONE"
# === STEP 2: Extract CNAMEs from sandbox ===
echo "⚙️ Generating ingress list..."
echo "ingress: []" > "$GENERATED_FILE"
find "$SANDBOX_CLONE/manifests" -name cname.yaml | while read -r cname_file; do
app_name=$(basename "$(dirname "$cname_file")")
enabled=$(yq '.enabled' "$cname_file")
if [[ "$enabled" == "true" ]]; then
hostname=$(yq '.hostname' "$cname_file")
section=$(yq '.section // "unspecified"' "$cname_file")
service="http://${app_name}.sandbox.svc.cluster.local:80"
echo "✅ Found $hostname ($section) → $service"
yq eval ".ingress += [{\"hostname\": \"$hostname\", \"service\": \"$service\", \"section\": \"$section\"}]" -i "$GENERATED_FILE"
fi
done
cat "$GENERATED_FILE"
# === STEP 3: Merge with existing cloudflared values ===
echo "🔁 Merging with: $ORIGINAL_FILE"
TEMP_FILE=$(mktemp)
cp "$ORIGINAL_FILE" "$TEMP_FILE"
# Loop through new entries and append if hostname not exists
yq eval '.ingress' "$GENERATED_FILE" | yq -o=json | jq -c '.[]' | while read -r new_entry; do
hostname=$(echo "$new_entry" | jq -r '.hostname')
service=$(echo "$new_entry" | jq -r '.service')
section=$(echo "$new_entry" | jq -r '.section')
exists=$(yq e ".cloudflare.ingress[] | select(.hostname == \"$hostname\")" "$TEMP_FILE")
if [ -z "$exists" ]; then
echo " Adding $hostname ($section)"
yq eval ".cloudflare.ingress += [{\"hostname\": \"$hostname\", \"service\": \"$service\", \"section\": \"$section\"}]" -i "$TEMP_FILE"
else
echo "⚠️ $hostname already exists, skipping"
fi
done
# === STEP 4: Group & Write Final values.yaml ===
echo "📝 Grouping by section and writing $MERGED_FILE"
echo "cloudflare:" > "$MERGED_FILE"
yq eval '.cloudflare | del(.ingress)' "$TEMP_FILE" | tail -n +2 >> "$MERGED_FILE"
echo " ingress:" >> "$MERGED_FILE"
yq eval '.cloudflare.ingress' "$TEMP_FILE" | yq -o=json | jq -s 'group_by(.section)[]' | while read -r group; do
section=$(echo "$group" | jq -r '.[0].section')
echo " # ##### $section #####" >> "$MERGED_FILE"
echo "$group" | jq -c '.[]' | while read -r item; do
hostname=$(echo "$item" | jq -r '.hostname')
service=$(echo "$item" | jq -r '.service')
echo " - hostname: $hostname" >> "$MERGED_FILE"
echo " service: $service" >> "$MERGED_FILE"
done
echo >> "$MERGED_FILE"
done
cat "$MERGED_FILE"
# === STEP 5: Git Commit & Push ===
cd "$INFRA_CLONE"
git config user.name "woodpecker-bot"
git config user.email "ci@dvirlabs.com"
git remote set-url origin "https://${GIT_TOKEN}@git.dvirlabs.com/dvirlabs/infra.git"
if ! git diff --quiet manifests/cloudflared/values.yaml; then
git add manifests/cloudflared/values.yaml
git commit -m "chore(cloudflared): auto-grouped ingress entries by section"
git push origin HEAD
echo "✅ Changes pushed successfully."
else
echo " No changes to commit."
fi
# === STEP 6: Create CNAMEs in Cloudflare ===
echo "🌐 Creating CNAME records in Cloudflare..."
CLOUDFLARE_API="https://api.cloudflare.com/client/v4"
TARGET="b50bbf48-0a2f-47ce-b73e-336b6718318b.cfargotunnel.com"
: "${CLOUDFLARE_API_TOKEN:?CLOUDFLARE_API_TOKEN not set}"
: "${CLOUDFLARE_ZONE_ID:?CLOUDFLARE_ZONE_ID not set}"
yq eval '.ingress' "$GENERATED_FILE" | yq eval -o=json '.' - | jq -c '.[]' | while read -r record; do
name=$(echo "$record" | jq -r '.hostname' | sed 's/\.dvirlabs\.com//')
exists=$(curl -s -X GET "$CLOUDFLARE_API/zones/$CLOUDFLARE_ZONE_ID/dns_records?type=CNAME&name=$name.dvirlabs.com" \
-H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" -H "Content-Type: application/json" | jq '.result | length')
if [ "$exists" -eq 0 ]; then
echo " Creating CNAME: $name.dvirlabs.com → $TARGET"
curl -s -X POST "$CLOUDFLARE_API/zones/$CLOUDFLARE_ZONE_ID/dns_records" \
-H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
-H "Content-Type: application/json" \
--data "{\n \"type\": \"CNAME\",\n \"name\": \"$name\",\n \"content\": \"$TARGET\",\n \"ttl\": 1,\n \"proxied\": true\n }" > /dev/null
else
echo "⚠️ CNAME for $name.dvirlabs.com already exists, skipping"
fi