89 lines
2.5 KiB
Bash
89 lines
2.5 KiB
Bash
#!/usr/bin/env bash
|
|
# Idempotently register an HTTP resource + target in Pangolin
|
|
set -euo pipefail
|
|
|
|
SUBDOMAIN=""
|
|
PORT=""
|
|
RESOURCE_NAME=""
|
|
TARGET_IP=""
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--subdomain) SUBDOMAIN="$2"; shift 2 ;;
|
|
--port) PORT="$2"; shift 2 ;;
|
|
--resource-name) RESOURCE_NAME="$2"; shift 2 ;;
|
|
--target-ip) TARGET_IP="$2"; shift 2 ;;
|
|
*) echo "Unknown arg: $1"; exit 1 ;;
|
|
esac
|
|
done
|
|
|
|
API="${PANGOLIN_API_URL}/v1"
|
|
AUTH="Authorization: Bearer ${PANGOLIN_API_KEY}"
|
|
|
|
echo "→ Pangolin upsert: ${RESOURCE_NAME} → ${SUBDOMAIN} on port ${PORT}"
|
|
|
|
# Check if resource already exists
|
|
EXISTING=$(curl -sf \
|
|
-H "${AUTH}" \
|
|
"${API}/org/${PANGOLIN_ORG_ID}/resources?limit=1000" \
|
|
| jq -r --arg name "${RESOURCE_NAME}" \
|
|
'.data.resources[] | select(.name == $name) | .resourceId' \
|
|
|| echo "")
|
|
|
|
if [[ -n "${EXISTING}" ]]; then
|
|
echo " Resource already exists (id=${EXISTING}), updating…"
|
|
RESOURCE_ID="${EXISTING}"
|
|
|
|
curl -sf -X POST \
|
|
-H "${AUTH}" \
|
|
-H "Content-Type: application/json" \
|
|
-d "{\"subdomain\": \"${SUBDOMAIN}\"}" \
|
|
"${API}/resource/${RESOURCE_ID}" \
|
|
> /dev/null
|
|
|
|
# Remove existing targets so we can re-register with potentially new port
|
|
TARGETS=$(curl -sf \
|
|
-H "${AUTH}" \
|
|
"${API}/resource/${RESOURCE_ID}/targets" \
|
|
| jq -r '.data.targets[].targetId' || echo "")
|
|
|
|
for TID in ${TARGETS}; do
|
|
curl -sf -X DELETE \
|
|
-H "${AUTH}" \
|
|
"${API}/target/${TID}" > /dev/null
|
|
echo " Removed old target ${TID}"
|
|
done
|
|
else
|
|
echo " Creating new resource…"
|
|
CREATE_RESP=$(curl -sf -X PUT \
|
|
-H "${AUTH}" \
|
|
-H "Content-Type: application/json" \
|
|
-d "{
|
|
\"name\": \"${RESOURCE_NAME}\",
|
|
\"http\": true,
|
|
\"subdomain\": \"${SUBDOMAIN}\",
|
|
\"domainId\": \"${PANGOLIN_DOMAIN_ID}\",
|
|
\"protocol\": \"tcp\"
|
|
}" \
|
|
"${API}/org/${PANGOLIN_ORG_ID}/resource")
|
|
|
|
RESOURCE_ID=$(echo "${CREATE_RESP}" | jq -r '.data.resourceId')
|
|
FULL_DOMAIN=$(echo "${CREATE_RESP}" | jq -r '.data.fullDomain')
|
|
echo " Created resource ${RESOURCE_ID} → ${FULL_DOMAIN}"
|
|
fi
|
|
|
|
# Add target
|
|
echo " Adding target localhost:${PORT} on site ${PANGOLIN_SITE_ID}…"
|
|
TARGET_RESP=$(curl -sf -X PUT \
|
|
-H "${AUTH}" \
|
|
-H "Content-Type: application/json" \
|
|
-d "{
|
|
\"ip\": \"${TARGET_IP}\",
|
|
\"port\": ${PORT},
|
|
\"method\": \"http\",
|
|
\"siteId\": ${PANGOLIN_SITE_ID}
|
|
}" \
|
|
"${API}/resource/${RESOURCE_ID}/target")
|
|
|
|
TARGET_ID=$(echo "${TARGET_RESP}" | jq -r '.data.targetId')
|
|
echo "✓ Target ${TARGET_ID} registered for resource ${RESOURCE_ID}" |