Compare commits

5 Commits
ipv4 ... master

5 changed files with 110 additions and 20 deletions

View File

@@ -1,4 +1,4 @@
# ddns (for IPv4)
# ddns
Dynamic DNS updates for UnitedDomains and Vodafone EasyBox

76
cloudflareCtrl.sh Executable file
View File

@@ -0,0 +1,76 @@
#!/bin/bash
# Partly adapted from: https://github.com/ddries/d2c.sh/blob/master/d2c.sh
#
# requires: wget, ca-certificates, grep, jq
#rm -f /tmp/cookies.txt
COOKIEFILE="/tmp/cookies-cloudflareCtrl.txt"
source ~/.cloudflare
#ZONE_ID=
#API_KEY=
URL="https://api.cloudflare.com/client/v4"
# * * * NO MORE CHANGES DOWN HERE * * *
COMMANDS="sed grep curl jq"
for COMMAND in $COMMANDS; do
if ! command -v $COMMAND &> /dev/null
then
echo "$COMMAND could not be found!"
exit 1
fi
done
# parse parameters
DOMAIN=$(echo $1 | sed -r 's/^.*\.(.+\..+)$/\1/')
SUBDOMAIN=$(echo $1 | sed -r 's/^(.+)\..+\..+$/\1/')
if [ "$DOMAIN" == "$SUBDOMAIN" ]; then
SUBDOMAIN=""
fi
echo "DOMAIN=${DOMAIN}"
echo "SUBDOMAIN=${SUBDOMAIN}"
UPDATE_IP=$2
#################################################
# get records from Cloudflare
RRAW=$(curl --silent --request GET \
--url ${URL}/zones/${ZONE_ID}/dns_records \
--header 'Content-Type: application/json' \
--header "Authorization: Bearer ${API_KEY}" \
| jq '.result[] | select(.type == "AAAA" and .name == "'${DOMAIN}'") | [.id, .name, .ttl, .content, .type]'
)
#echo $RRAW
id=$(jq -r '.[0]' <<< "${RRAW}")
content=$(jq -r '.[3]' <<< "${RRAW}")
#echo "old ip: ${content}"
#if [ "$UPDATE_IP" != "$content" ]; then
# update DNS
curl --silent --request PATCH \
--url "${URL}/zones/${ZONE_ID}/dns_records/${id}" \
--header 'Content-Type: application/json' \
--header "Authorization: Bearer ${API_KEY}" \
--data '{
"content": "'${UPDATE_IP}'",
"comment": "Updated by ffx at '$(date -Is)'"
}'
echo "OK: ${name}"
#else
# echo "${name} did not change"
#fi
SUCCESS=$?
echo "Retval: $SUCCESS"
exit $SUCCESS

31
ddns.sh
View File

@@ -3,7 +3,11 @@
# The DNS-server IP to use for checking the domain->IP mapping
# If the local system has it's own DNS server which maps IPs differently
# this should point to an external DNS like 1.1.1.1
NAMESERVER="1.1.1.1"
#NAMESERVER="1.1.1.1"
NAMESERVER="2606:4700:4700::1111"
IPV6_INTERFACE_ID="c03c:17ff:feeb:21e7"
IPV6_SUBNET_ID="01"
# ----- END CONFIG -------------------------------
@@ -32,31 +36,38 @@ if [ -f "${LAST_IP_FILE}" ]; then
fi
echo "Last UPDATE-IP -----------> ${LAST_IP}"
WAN_IP=$(${SCRIPTPATH}/easyBoxCtrl.sh wan ip 2>/dev/null)
echo "Current WAN-IP -----------> ${WAN_IP}"
#WAN_IP=$(${SCRIPTPATH}/easyBoxCtrl.sh wan ip 2>/dev/null)
#echo "Current WAN-IP -----------> ${WAN_IP}"
IPV6_PREFIX=$(${SCRIPTPATH}/easyBoxCtrl.sh wan ipv6prefix 2>/dev/null)
echo "Current IPv6-Prefix ------> ${IPV6_PREFIX}"
IPV6_IP="$(sed -r 's/(.*)00::.*/\1/' <<< ${IPV6_PREFIX})${IPV6_SUBNET_ID}:${IPV6_INTERFACE_ID}"
echo "Current IPv6-IP ----------> ${IPV6_IP}"
PROBE_DOMAIN="${DOMAIN}"
if [[ "${PROBE_DOMAIN}" == \*.* ]]; then
PROBE_DOMAIN="probe.${PROBE_DOMAIN:2}"
echo "Probe domain is ----------> ${PROBE_DOMAIN}"
fi
DNS_IP=$(dig @${NAMESERVER} +short ${PROBE_DOMAIN})
DNS_IP=$(dig @${NAMESERVER} +short ${PROBE_DOMAIN} AAAA)
echo "Current DNS-IP -----------> ${DNS_IP}"
if [ "${WAN_IP}" == "${DNS_IP}" ]; then
if [ "${IPV6_IP}" == "${DNS_IP}" ]; then
echo "IPs match - nothing to do."
exit 0
else
if [ "${LAST_IP}" == "${WAN_IP}" ]; then
echo "Last update IP matches WAN-IP - waiting for DNS to propagate changes."
if [ "${LAST_IP}" == "${IPV6_IP}" ]; then
echo "Last update IP matches current IP - waiting for DNS to propagate changes."
else
echo "IP mismatch - trying to update A-record(s)..."
$SCRIPTPATH/unitedDomainsCtrl.sh ${DOMAIN} ${WAN_IP}
echo "IP mismatch - trying to update AAAA-record(s)..."
#$SCRIPTPATH/unitedDomainsCtrl.sh ${DOMAIN} ${IPV6_IP}
$SCRIPTPATH/cloudflareCtrl.sh ${DOMAIN} ${IPV6_IP}
if [ "$?" == "0" ]; then
echo "Save UPDATE_IP."
echo "${WAN_IP}" > ${LAST_IP_FILE}
echo "${IPV6_IP}" > ${LAST_IP_FILE}
fi
fi
fi

View File

@@ -44,14 +44,14 @@ done
RETVAL=""
touch $COOKIEFILE
echo "request: http://${HOST}/main.cgi?page=login.html" 1>&2
#echo "request: http://${HOST}/main.cgi?page=login.html" 1>&2
OUT=$($WGET "http://${HOST}/main.cgi?page=login.html" )
DM_COOKIE=$(echo $OUT | grep dm_cookie | awk -F"dm_cookie='" '{ print $2 }' | awk -F"'" '{ print $1 }')
echo "DM_COOKIE = "${DM_COOKIE} 1>&2
#echo "DM_COOKIE = "${DM_COOKIE} 1>&2
WBM_COOKIE=$(cat $COOKIEFILE | grep "wbm_cookie_session_id" | awk -F"\t" '{ print $7 }')
echo "WBM_COOKIE = "${WBM_COOKIE} 1>&2
#echo "WBM_COOKIE = "${WBM_COOKIE} 1>&2
# Create a 'special' cookie file without HOST and PATH (important):
# cat step1_cookie.txt | sed "s/${HOST}//g" | sed 's/\t\/\t/\t\t/g' > step1_cookie_special.txt
@@ -71,7 +71,8 @@ fi
if [[ "$1" == "wan" && "$2" == "ipv6prefix" ]]; then
echo "request: http://${HOST}/data_model.cgi" 1>&2
POST_DATA="<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"><soapenv:Header><DMCookie>${DM_COOKIE}</DMCookie><SessionNotRefresh>1</SessionNotRefresh></soapenv:Header><soapenv:Body><cwmp:GetParameterValues xmlns=\"\"><ParameterNames><string>InternetGatewayDevice.X_JUNGO_COM_TR_181.Device.IP.Interface.33948673.IPv6Prefix.2049.Prefix</string></ParameterNames></cwmp:GetParameterValues></soapenv:Body></soapenv:Envelope>"
#POST_DATA="<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"><soapenv:Header><DMCookie>${DM_COOKIE}</DMCookie><SessionNotRefresh>1</SessionNotRefresh></soapenv:Header><soapenv:Body><cwmp:GetParameterValues xmlns=\"\"><ParameterNames><string>InternetGatewayDevice.X_JUNGO_COM_TR_181.Device.IP.Interface.33948673.IPv6Prefix.2049.Prefix</string></ParameterNames></cwmp:GetParameterValues></soapenv:Body></soapenv:Envelope>"
POST_DATA="<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"><soapenv:Header><DMCookie>${DM_COOKIE}</DMCookie><SessionNotRefresh>1</SessionNotRefresh></soapenv:Header><soapenv:Body><cwmp:GetParameterValues xmlns=\"\"><ParameterNames><string>InternetGatewayDevice.X_JUNGO_COM_TR_181.Device.IP.Interface.33948673.IPv6Prefix.5121.Prefix</string></ParameterNames></cwmp:GetParameterValues></soapenv:Body></soapenv:Envelope>"
OUT=$($WGET \
--post-data="${POST_DATA}" \

View File

@@ -4,6 +4,7 @@
COOKIEFILE="/tmp/cookies.txt"
source ~/.unitedDomains
#USERNAME=""
#PASSWORD=""
@@ -36,7 +37,7 @@ fi
echo "DOMAIN=${DOMAIN}"
echo "SUBDOMAIN=${SUBDOMAIN}"
IPV4=$2
UPDATE_IP=$2
#################################################
@@ -111,12 +112,13 @@ current=$(wget -U " $UA" \
RECORD_ID=$(echo $current | \
jq -cM --arg v "${SUBDOMAIN}" '.data.A | map(select(.sub_domain == $v)) | .[0].id')
jq -cM --arg v "${SUBDOMAIN}" '.data.AAAA | map(select(.sub_domain == $v)) | .[0].id')
echo "RECORD_ID=${RECORD_ID}"
record=$(echo $current |
jq -cM --arg v "${SUBDOMAIN}" '.data.A | map(select(.sub_domain == $v)) | .[0]' | \
jq -cM --arg v "${SUBDOMAIN}" '.data.AAAA | map(select(.sub_domain == $v)) | .[0]' | \
sed "s/ //g" | \
sed "s/\"address\":\"[0-9.]\+\"/\"address\":\"${IPV4}\",\"formId\":${RECORD_ID}/g")
sed "s/\"address\":\"[0-9a-z:.]\+\"/\"address\":\"${UPDATE_IP}\",\"formId\":${RECORD_ID}/g")
echo "NEW: $record"
@@ -153,7 +155,7 @@ OUT=$(wget -U " $UA" \
-O- "https://www.united-domains.de/pfapi/dns/domain/$DOMAIN_ID/records" 2>&1)
#echo "UD answered: $OUT"
#echo $OUT | grep "$IPV4" >/dev/null 2>&1
#echo $OUT | grep "$UPDATE_IP" >/dev/null 2>&1
SUCCESS=$?
echo "Retval: $SUCCESS"