#!/bin/bash # requires: wget, ca-certificates, grep, jq #rm -f /tmp/cookies.txt COOKIEFILE="/tmp/cookies.txt" source ~/.unitedDomains #USERNAME="" #PASSWORD="" # fake user agent UA="Mozilla/5.0 (X11; Ubuntu; Linux x86_64) Gecko/20100101 Firefox" #UA="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:104.0) Gecko/20100101 Firefox/104.0" # * * * NO MORE CHANGES DOWN HERE * * * COMMANDS="sed wget grep 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 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" | grep -oP -m 2 "(?<=)" | tail -1) echo "CSRF=${CSRF}" CSRFMETA=$(echo "$OUT" | grep -oP -m 1 "(?<=)") echo "CSRFMETA=${CSRFMETA}" CSRFSCRIPT=$(echo "$OUT" | 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.AAAA | map(select(.sub_domain == $v)) | .[0].id') echo "RECORD_ID=${RECORD_ID}" record=$(echo $current | jq -cM --arg v "${SUBDOMAIN}" '.data.AAAA | map(select(.sub_domain == $v)) | .[0]' | \ sed "s/ //g" | \ sed "s/\"address\":\"[0-9a-z:.]\+\"/\"address\":\"${UPDATE_IP}\",\"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" | 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 | grep "$UPDATE_IP" >/dev/null 2>&1 SUCCESS=$? echo "Retval: $SUCCESS" exit $SUCCESS