From 65beabf220516ebb66550d2293b447491ae7c9eb Mon Sep 17 00:00:00 2001 From: Florian Loeffler Date: Wed, 6 May 2020 23:49:56 +0200 Subject: [PATCH] getting close - UD script is working --- ddns.sh | 22 +++++++ unitedDomainsCtrl.sh | 152 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 174 insertions(+) create mode 100755 ddns.sh create mode 100755 unitedDomainsCtrl.sh diff --git a/ddns.sh b/ddns.sh new file mode 100755 index 0000000..c5106f7 --- /dev/null +++ b/ddns.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +DOMAIN="geek-blog.de" + + + +SCRIPTPATH="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" + +WAN_IP=$(${SCRIPTPATH}/easyBoxCtrl.sh wan ip 2>/dev/null) +echo "Current WAN-IP -----------> ${WAN_IP}" + +DNS_IP=$(dig +short ${DOMAIN}) +echo "Current DNS entry for ----> ${DNS_IP}" + +if [ "${WAN_IP}" == "${DNS_IP}" ]; then + echo "IPs match - nothing to do." + exit 0 +else + echo "IP mismatch - trying to update A-record(s)..." + USERNAME="TODO" PASSWORD="TODO" $SCRIPTPATH/unitedDomainsCtrl.sh geek-blog.de ${WAN_IP} + USERNAME="TODO" PASSWORD="TODO" $SCRIPTPATH/unitedDomainsCtrl.sh *.geek-blog.de ${WAN_IP} +fi diff --git a/unitedDomainsCtrl.sh b/unitedDomainsCtrl.sh new file mode 100755 index 0000000..90f5da6 --- /dev/null +++ b/unitedDomainsCtrl.sh @@ -0,0 +1,152 @@ +#!/bin/bash +# requires: wget, ca-certificates, grep, jq +#rm -f /tmp/cookies.txt + +COOKIEFILE="/tmp/cookies.txt" + +#USERNAME="" +#PASSWORD="" + + + + +# fake user agent +UA="Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0" + +# * * * NO MORE CHANGES DOWN HERE * * * + + +# 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}" + +IPV4=$2 + +################################################# + +# GET LOGIN PAGE +#csrf tokens for login + language xmlhttprequest required to login (nice try blocking my API access, UD) +OUT=$(wget -U "$UA" \ + --save-cookies $COOKIEFILE \ + --keep-session-cookies \ + -qO- "https://www.united-domains.de/login/") + +CSRF=$(echo "$OUT" | /bin/grep -oP -m 2 "(?<=)" | tail -1) +echo "CSRF=${CSRF}" +CSRFMETA=$(echo "$OUT" | /bin/grep -oP -m 1 "(?<=)") +echo "CSRFMETA=${CSRFMETA}" +CSRFSCRIPT=$(echo "$OUT" | /bin/grep -oP -m 1 "(?<=\"CSRF_TOKEN\":\")[^\"]*(?=\")") +echo "CSRFSCRIPT=${CSRFSCRIPT}" + +wget -U "$UA" \ + --load-cookies $COOKIEFILE \ + --save-cookies $COOKIEFILE \ + --keep-session-cookies \ + --delete-after \ + --post-data "language=en-US" \ + --header="HTTP-X-CSRF-TOKEN: $CSRFMETA" \ + --header="X-Csrf-Token: $CSRFSCRIPT" \ + --header="X-Requested-With: XMLHttpRequest" \ + -qO- "https://www.united-domains.de/set-user-language" + + +# DO THE LOGIN +echo 'login' +OUT=$(wget -U "$UA" \ + --load-cookies $COOKIEFILE \ + --save-cookies $COOKIEFILE \ + --keep-session-cookies \ + --post-data "csrf=$CSRF&email=$USERNAME&pwd=$PASSWORD&selector=login&loginBtn=Login" \ + -qO- "https://www.united-domains.de/login/") + +#################################################################################################### +# WE'RE IN + +# get domain list in order to determine the DOMAIN_ID for the given DOMAIN +echo 'get domain list' +OUT=$(wget -U "$UA" \ + --load-cookies $COOKIEFILE \ + --save-cookies $COOKIEFILE \ + --keep-session-cookies \ + -qO- 'https://www.united-domains.de/pfapi/dns/domain-list') +if [ "$OUT" = "" ] ; then + echo "Login not successful" + exit 1 +else + # parse output for the DOMAIN_ID + DOMAIN_ID=$(echo "$OUT" | jq -cM --arg v "${DOMAIN}" '.data[] | select(.domain == $v) | .id') + echo "DOMAIN_ID=${DOMAIN_ID}" +fi + + +#get current dns record json object & modify ip +echo "get current dns record json object" +current=$(wget -U " $UA" \ + --load-cookies $COOKIEFILE \ + --save-cookies $COOKIEFILE \ + --keep-session-cookies \ + -qO- "https://www.united-domains.de/pfapi/dns/domain/$DOMAIN_ID/records") +echo "CURRENT: $current" + +#record=$(echo $current | +# jq -cM ".data.A | map(select(.id == $RECORD_ID)) | .[0]" | \ +# sed "s/ //g" | \ +# sed "s/\"address\":\"[0-9.]\+\"/\"address\":\"$ipv4\",\"formId\":${RECORD_ID}/g") + + +RECORD_ID=$(echo $current | \ + jq -cM --arg v "${SUBDOMAIN}" '.data.A | map(select(.sub_domain == $v)) | .[0].id') + +record=$(echo $current | + jq -cM --arg v "${SUBDOMAIN}" '.data.A | map(select(.sub_domain == $v)) | .[0]' | \ + sed "s/ //g" | \ + sed "s/\"address\":\"[0-9.]\+\"/\"address\":\"${IPV4}\",\"formId\":${RECORD_ID}/g") +echo "NEW: $record" + + + +# load the DNS page for the given DOMAIN_ID to get the latest csrf code +#dnspage=$(wget -U " $UA" \ +# --load-cookies $COOKIEFILE \ +# --save-cookies $COOKIEFILE \ +# --keep-session-cookies \ +# -qO- "https://www.united-domains.de/portfolio/a/domain-admin/dns/$DOMAIN_ID") + +#csrfscript=$(echo "$loginpage" | /bin/grep -oP -m 1 "(?<=\"CSRF_TOKEN\":\")[^\"]*(?=\")") +#echo "csrfscript=${csrfscript}" + + +#send changes +echo "send changes" +#echo -ne "PUT ${url}\n${payload}\n" + +PAYLOAD="{\"record\":$record,\"domain_lock_state\":{\"domain_locked\":false,\"email_locked\":false}}" +OUT=$(wget -U " $UA" \ + --load-cookies $COOKIEFILE \ + --save-cookies $COOKIEFILE \ + --keep-session-cookies \ + --method=PUT \ + --header="Accept: application/json" \ + --header="Accept-Encoding: gzip, deflate, br" \ + --header="Accept-Language: de-DE,de;q=0.8,en-US;q=0.5,en;q=0.3" \ + --header="Content-Type: application/json;charset=utf-8" \ + --header="Referer: https://www.united-DOMAINs.de/portfolio/a/DOMAIN-admin/dns/$DOMAIN_ID" \ + --header="Origin: https://www.united-DOMAINs.de" \ + --header="Http-X-Csrf-Token: $CSRFSCRIPT" \ + --body-data=$PAYLOAD \ + -O- "https://www.united-domains.de/pfapi/dns/domain/$DOMAIN_ID/records" 2>&1) +echo "UD answered: $OUT" + +echo $OUT | /bin/grep "$IPV4" >/dev/null 2>&1 + +SUCCESS=$? +echo "Retval: $SUCCESS" + +exit $SUCCESS