Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 901033dec8 | |||
| 040a16b821 | |||
| 7f3ea34aa3 | |||
| fa2795cdb2 | |||
| d26eeb9f63 |
@@ -4,7 +4,7 @@ Dynamic DNS updates for UnitedDomains and Vodafone EasyBox
|
|||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
```
|
```
|
||||||
apk add bash bind-tools wget curl libxml2-utils jq
|
apk add bash grep bind-tools wget curl libxml2-utils jq
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
76
cloudflareCtrl.sh
Executable file
76
cloudflareCtrl.sh
Executable 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
31
ddns.sh
@@ -3,7 +3,11 @@
|
|||||||
# The DNS-server IP to use for checking the domain->IP mapping
|
# 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
|
# 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
|
# 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 -------------------------------
|
# ----- END CONFIG -------------------------------
|
||||||
|
|
||||||
@@ -32,31 +36,38 @@ if [ -f "${LAST_IP_FILE}" ]; then
|
|||||||
fi
|
fi
|
||||||
echo "Last UPDATE-IP -----------> ${LAST_IP}"
|
echo "Last UPDATE-IP -----------> ${LAST_IP}"
|
||||||
|
|
||||||
WAN_IP=$(${SCRIPTPATH}/easyBoxCtrl.sh wan ip 2>/dev/null)
|
#WAN_IP=$(${SCRIPTPATH}/easyBoxCtrl.sh wan ip 2>/dev/null)
|
||||||
echo "Current WAN-IP -----------> ${WAN_IP}"
|
#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}"
|
PROBE_DOMAIN="${DOMAIN}"
|
||||||
if [[ "${PROBE_DOMAIN}" == \*.* ]]; then
|
if [[ "${PROBE_DOMAIN}" == \*.* ]]; then
|
||||||
PROBE_DOMAIN="probe.${PROBE_DOMAIN:2}"
|
PROBE_DOMAIN="probe.${PROBE_DOMAIN:2}"
|
||||||
echo "Probe domain is ----------> ${PROBE_DOMAIN}"
|
echo "Probe domain is ----------> ${PROBE_DOMAIN}"
|
||||||
fi
|
fi
|
||||||
DNS_IP=$(dig @${NAMESERVER} +short ${PROBE_DOMAIN})
|
DNS_IP=$(dig @${NAMESERVER} +short ${PROBE_DOMAIN} AAAA)
|
||||||
echo "Current DNS-IP -----------> ${DNS_IP}"
|
echo "Current DNS-IP -----------> ${DNS_IP}"
|
||||||
|
|
||||||
|
|
||||||
if [ "${WAN_IP}" == "${DNS_IP}" ]; then
|
if [ "${IPV6_IP}" == "${DNS_IP}" ]; then
|
||||||
echo "IPs match - nothing to do."
|
echo "IPs match - nothing to do."
|
||||||
exit 0
|
exit 0
|
||||||
else
|
else
|
||||||
if [ "${LAST_IP}" == "${WAN_IP}" ]; then
|
if [ "${LAST_IP}" == "${IPV6_IP}" ]; then
|
||||||
echo "Last update IP matches WAN-IP - waiting for DNS to propagate changes."
|
echo "Last update IP matches current IP - waiting for DNS to propagate changes."
|
||||||
else
|
else
|
||||||
echo "IP mismatch - trying to update A-record(s)..."
|
echo "IP mismatch - trying to update AAAA-record(s)..."
|
||||||
$SCRIPTPATH/unitedDomainsCtrl.sh ${DOMAIN} ${WAN_IP}
|
#$SCRIPTPATH/unitedDomainsCtrl.sh ${DOMAIN} ${IPV6_IP}
|
||||||
|
$SCRIPTPATH/cloudflareCtrl.sh ${DOMAIN} ${IPV6_IP}
|
||||||
|
|
||||||
if [ "$?" == "0" ]; then
|
if [ "$?" == "0" ]; then
|
||||||
echo "Save UPDATE_IP."
|
echo "Save UPDATE_IP."
|
||||||
echo "${WAN_IP}" > ${LAST_IP_FILE}
|
echo "${IPV6_IP}" > ${LAST_IP_FILE}
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -44,14 +44,14 @@ done
|
|||||||
RETVAL=""
|
RETVAL=""
|
||||||
touch $COOKIEFILE
|
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" )
|
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 }')
|
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 }')
|
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):
|
# 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
|
# 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
|
if [[ "$1" == "wan" && "$2" == "ipv6prefix" ]]; then
|
||||||
echo "request: http://${HOST}/data_model.cgi" 1>&2
|
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 \
|
OUT=$($WGET \
|
||||||
--post-data="${POST_DATA}" \
|
--post-data="${POST_DATA}" \
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
COOKIEFILE="/tmp/cookies.txt"
|
COOKIEFILE="/tmp/cookies.txt"
|
||||||
|
|
||||||
|
source ~/.unitedDomains
|
||||||
#USERNAME=""
|
#USERNAME=""
|
||||||
#PASSWORD=""
|
#PASSWORD=""
|
||||||
|
|
||||||
@@ -36,7 +37,7 @@ fi
|
|||||||
echo "DOMAIN=${DOMAIN}"
|
echo "DOMAIN=${DOMAIN}"
|
||||||
echo "SUBDOMAIN=${SUBDOMAIN}"
|
echo "SUBDOMAIN=${SUBDOMAIN}"
|
||||||
|
|
||||||
IPV4=$2
|
UPDATE_IP=$2
|
||||||
|
|
||||||
#################################################
|
#################################################
|
||||||
|
|
||||||
@@ -111,12 +112,13 @@ current=$(wget -U " $UA" \
|
|||||||
|
|
||||||
|
|
||||||
RECORD_ID=$(echo $current | \
|
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 |
|
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/ //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"
|
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)
|
-O- "https://www.united-domains.de/pfapi/dns/domain/$DOMAIN_ID/records" 2>&1)
|
||||||
#echo "UD answered: $OUT"
|
#echo "UD answered: $OUT"
|
||||||
|
|
||||||
#echo $OUT | grep "$IPV4" >/dev/null 2>&1
|
#echo $OUT | grep "$UPDATE_IP" >/dev/null 2>&1
|
||||||
|
|
||||||
SUCCESS=$?
|
SUCCESS=$?
|
||||||
echo "Retval: $SUCCESS"
|
echo "Retval: $SUCCESS"
|
||||||
|
|||||||
Reference in New Issue
Block a user