Namecheap and BIG-IP Integration via API
The script below will be attached to an EAV monitor, which is linked to a dummy pool. The script is designed to monitor F5XC DNSaaS (which is the current Authoritative DNS) and check if it can resolve DNS queries. If it cannot, the script will trigger an API call to Namecheap (our domain registrar) to change the nameservers back to Primary BIG-IP DNS. Simultaneously, the script will update the domain's NS records from F5XC to BIG-IP.
#!/bin/sh
# Define variables
pidfile="/var/run/$MONITOR_NAME.$1.$2.pid"
statusfile="/var/run/dns_status"
check_string="RESPONSE-OK"
# NAMECHEAP API USER
API_USER="sampleapiuser"
# NAMECHEAP APIKEY
API_KEY="<apikey>"
# NAMECHEAP ACCOUNT USERNAME
USERNAME="namecheapuser1"
# NAMECHEAP COMMAND TO CHANGE THE NAMESERVER
COMMAND="namecheap.domains.dns.setCustom"
# NAMECHEAP ALLOWED API CLIENT IP, WE SET IT TO BIG-IP IP
CLIENT_IP="13.213.88.106"
# SECOND LEVEL DOMAIN
SLD="f5sg"
# TOP LEVEL DOMAIN
TLD="com"
F5XC_NAMESERVERS="ns1.f5clouddns.com,ns2.f5clouddns.com"
BIGIP_NAMESERVERS="gtm1.f5sg.com,gtm2.f5sg.com"
# BIGIP ADMIN PASSWORD
ADMIN_PASS="XXXXXXX"
# Function to update DNS to F5XC nameservers
sendapi_xc() {
#tmsh modify ltm virtual VS_APP2 enabled
F5XC_API_URL="https://api.namecheap.com/xml.response?ApiUser=$API_USER&ApiKey=$API_KEY&UserName=$USERNAME&Command=$COMMAND&ClientIp=$CLIENT_IP&SLD=$SLD&TLD=$TLD&NameServers=$F5XC_NAMESERVERS"
curl -X GET "$F5XC_API_URL" >/dev/null 2>&1
}
# Function to update DNS to BIGIP nameservers
sendapi_bigip() {
#tmsh modify ltm virtual VS_APP2 disabled
BIGIP_API_URL="https://api.namecheap.com/xml.response?ApiUser=$API_USER&ApiKey=$API_KEY&UserName=$USERNAME&Command=$COMMAND&ClientIp=$CLIENT_IP&SLD=$SLD&TLD=$TLD&NameServers=$BIGIP_NAMESERVERS"
curl -X GET "$BIGIP_API_URL" >/dev/null 2>&1
}
# Functions to manage zone records using F5 iControl REST API
addzr_xc() {
curl -sku admin:$ADMIN_PASS "https://127.0.0.1:8443/mgmt/tm/util/bash" -X POST -H "Content-Type: application/json" -d "{\"command\":\"run\",\"utilCmdArgs\":\"-c 'echo arr external f5sg.com. f5sg.com. 50 NS ns1.f5clouddns.com. | zrsh'\"}" >/dev/null 2>&1
curl -sku admin:$ADMIN_PASS "https://127.0.0.1:8443/mgmt/tm/util/bash" -X POST -H "Content-Type: application/json" -d "{\"command\":\"run\",\"utilCmdArgs\":\"-c 'echo arr external f5sg.com. f5sg.com. 50 NS ns2.f5clouddns.com. | zrsh'\"}" >/dev/null 2>&1
}
delzr_bip() {
curl -sku admin:$ADMIN_PASS "https://127.0.0.1:8443/mgmt/tm/util/bash" -X POST -H "Content-Type: application/json" -d "{\"command\":\"run\",\"utilCmdArgs\":\"-c 'echo drr external f5sg.com. f5sg.com. 50 NS gtm1.f5sg.com. | zrsh'\"}" >/dev/null 2>&1
curl -sku admin:$ADMIN_PASS "https://127.0.0.1:8443/mgmt/tm/util/bash" -X POST -H "Content-Type: application/json" -d "{\"command\":\"run\",\"utilCmdArgs\":\"-c 'echo drr external f5sg.com. f5sg.com. 50 NS gtm2.f5sg.com. | zrsh'\"}" >/dev/null 2>&1
}
addzr_bip() {
curl -sku admin:$ADMIN_PASS "https://127.0.0.1:8443/mgmt/tm/util/bash" -X POST -H "Content-Type: application/json" -d "{\"command\":\"run\",\"utilCmdArgs\":\"-c 'echo arr external f5sg.com. f5sg.com. 50 NS gtm1.f5sg.com. | zrsh'\"}" >/dev/null 2>&1
curl -sku admin:$ADMIN_PASS "https://127.0.0.1:8443/mgmt/tm/util/bash" -X POST -H "Content-Type: application/json" -d "{\"command\":\"run\",\"utilCmdArgs\":\"-c 'echo arr external f5sg.com. f5sg.com. 50 NS gtm2.f5sg.com. | zrsh'\"}" >/dev/null 2>&1
}
delzr_xc() {
curl -sku admin:$ADMIN_PASS "https://127.0.0.1:8443/mgmt/tm/util/bash" -X POST -H "Content-Type: application/json" -d "{\"command\":\"run\",\"utilCmdArgs\":\"-c 'echo drr external f5sg.com. f5sg.com. 50 NS ns1.f5clouddns.com. | zrsh'\"}" >/dev/null 2>&1
curl -sku admin:$ADMIN_PASS "https://127.0.0.1:8443/mgmt/tm/util/bash" -X POST -H "Content-Type: application/json" -d "{\"command\":\"run\",\"utilCmdArgs\":\"-c 'echo drr external f5sg.com. f5sg.com. 50 NS ns2.f5clouddns.com. | zrsh'\"}" >/dev/null 2>&1
}
# Manage the PID file to ensure only one instance of the script runs
if [ -f $pidfile ]; then
kill -9 -`cat $pidfile` > /dev/null 2>&1
fi
echo "$$" > $pidfile
# Run dig command and store the output in a variable
response=$(dig @ns1.f5clouddns.com f5sg.com TXT +short)
# Compare response and take action
if echo "$response" | grep -q "$check_string"; then
previous_status=$(cat "$statusfile" 2>/dev/null)
if [ "$response" != "$previous_status" ]; then
sendapi_xc
addzr_xc
delzr_bip
fi
echo "up"
echo "$response" > "$statusfile"
else
previous_status=$(cat "$statusfile" 2>/dev/null)
if [ "$response" != "$previous_status" ]; then
sendapi_bigip
addzr_bip
delzr_xc
fi
echo "$response" > "$statusfile"
fi
rm -f "$pidfile"
Published May 30, 2024
Version 1.0michelangelodorado
Employee
Joined December 02, 2019
No CommentsBe the first to comment