PowerDNS docker container, based on Debian Buster.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

47 lines
1.7 KiB

#!/bin/bash
APISERVER="http://localhost:8081"
INVALIDARG=0
while getopts "d:" opt; do
case "$opt" in
d) ZONES="$OPTARG."
;;
*) INVALIDARG=1
;;
esac
done
if [ $INVALIDARG == 1 ]; then
echo "EXITING: Invalid argument!"
exit 1
fi
if [ -z "$ZONES" ]; then
ZONES=`curl -s -X GET -H "X-API-Key: $PDNSCONF_API_KEY" $APISERVER/api/v1/servers/localhost/zones | jq -c '.[] | .id' | sed -e 's/"//g'`
fi
while read -r d; do
IFS='. ' read -r -a dcs <<< "$d"
NODCS="${#dcs[@]}"
if [ $NODCS -gt 3 ]; then
# $d is not a top domain
TOPDOM="${dcs[-3]}.${dcs[-2]}.${dcs[-1]}."
# get current DNS for $d
CURRDSRAW=`curl -s -f -X GET --data '{"rrsets": [ { "name": "'"$TOPDOM"'." } ] }' -H "X-API-Key: $PDNSCONF_API_KEY" $APISERVER/api/v1/servers/localhost/zones/$TOPDOM`
if [ $? -ne 0 ]; then
echo "Domain $TOPDOM does not exist in this server. Skipping $d.."
continue
fi
CURRDS=`echo $CURRDSRAW | jq -c '[ .rrsets[] | select( .type == "DS" ) | select ( .name == "'$d'"
) ][0]["records"][0]["content"]'`
# get DS that should have been configured
CORRDS=`curl -s -X GET -H "X-API-Key: $PDNSCONF_API_KEY" $APISERVER/api/v1/servers/localhost/zones/$d/cryptokeys | jq -c '.[] | select( .keytype == "csk") ["ds"][0] '`
if [ "$CURRDS" != "$CORRDS" ]; then
echo -n "INFO: Fixing $d DS records..."
curl -s -X PATCH --data '{"rrsets": [ {"name": "'$d'", "type": "DS", "changetype": "REPLACE", "ttl": "86400", "records": [ {"content": '"$CORRDS"', "disabled": false, "name": "'$d'", "ttl": 86400, "type": "DS", "priority": 0 } ] } ] }' -H "X-API-Key: $PDNSCONF_API_KEY" $APISERVER/api/v1/servers/localhost/zones/$TOPDOM | jq . && echo " OK."
fi
fi
done <<< "$ZONES"