Scripts/dynpowerup: Difference between revisions

From fakedWiki
Jump to: navigation, search
(Created page with "#!/bin/bash RECORDS=("example.com" "ns1.example.com" "ns2.example.com" "example.org" "example.net") DBUSER="your-powerdns-user" DBPASS="your-powerdns-password" DBNAME="your-pow…")
 
m (6 revisions imported)
 
(7 intermediate revisions by the same user not shown)
Line 1: Line 1:
This script will update the A records for zones you host on your local PowerDNS nameserver to your (external) dynamic IP.
I'm running this script after every reconnect of my VDSL link through ppp's ip-up scripts by putting it here:
<pre>
/etc/ppp/ip-up.d/dynpowerup
</pre>
This is the original version of the script, which requires you to add you records manually:
<pre>
#!/bin/bash
#!/bin/bash


RECORDS=("example.com" "ns1.example.com" "ns2.example.com" "example.org" "example.net")
RECORDS=("example.com" "ns1.example.com" "ns2.example.com" "example.org" "example.net")
SOA="ns1.example.com. hostmaster.example.com. `date +%Y%m%d%H` 10800 3600 604800 3600"


DBUSER="your-powerdns-user"
DBUSER="your-powerdns-user"
Line 16: Line 25:


if [ "$IP" != "$OLD_IP" ]; then
if [ "$IP" != "$OLD_IP" ]; then
   echo "IP address changed from $OLD_IP to $IP"
   echo "IP address changed from $OLD_IP to $IP" | logger -t DynPowerUp
   for RECORD in ${RECORDS[@]}; do
   for RECORD in ${RECORDS[@]}; do
     echo "updating record: $RECORD"
     echo "updating record: $RECORD" | logger -t DynPowerUp
     COMMAND="$COMMAND UPDATE ${DBNAME}.records SET content = \"$IP\" WHERE name = \"$RECORD\";"
     COMMAND="$COMMAND UPDATE ${DBNAME}.records SET content = \"$IP\" WHERE name = \"$RECORD\" AND type = 'A';"
    COMMAND="$COMMAND UPDATE ${DBNAME}.records SET content = \"$SOA\" WHERE name = \"$RECORD\" AND type = 'SOA';"
   done
   done
   mysql -u${DBUSER} -p${DBPASS} ${DBNAME} -e "$COMMAND"
   mysql -u${DBUSER} -p${DBPASS} ${DBNAME} -e "$COMMAND"
   echo "$IP" > /tmp/nsup.IP
   echo "$IP" > /tmp/nsup.IP
   echo "IP updates done"
   echo "IP updates done" | logger -t DynPowerUp
fi
</pre>
 
And this is a version which looks for a specific NS record and updates all A records with a TTL of 60:
<pre>
#!/bin/bash
 
NS="ns1.example.com"
TTL="60"
SOA="ns1.example.com. hostmaster.example.com. `date +%Y%m%d%H` 10800 3600 604800 3600"
 
DBUSER="your-powerdns-user"
DBPASS="your-powerdns-password"
DBNAME="your-powerdns-database"
 
RECORDS="SELECT name FROM records WHERE type = 'A' AND ttl = '"${TTL}"' AND domain_id IN
        (SELECT domain_id FROM records WHERE type = 'NS' AND content = '"${NS}"');"
 
IP=`lynx -dump http://checkip.dyndns.org | awk '{print $4}'`
 
if [ -e "/tmp/nsup.IP" ]; then
  read OLD_IP < "/tmp/nsup.IP"
else
  OLD_IP="0.0.0.0"
fi
 
if [ "${IP}" != "${OLD_IP}" ]; then
  echo "IP address changed from ${OLD_IP} to ${IP}" | logger -t nsup
  for RECORD in `mysql -u${DBUSER} -p${DBPASS} ${DBNAME} -NB -e "${RECORDS}"`; do
    echo "updating record: ${RECORD}" | logger -t nsup
    COMMAND="${COMMAND} UPDATE ${DBNAME}.records SET content = \"$IP\" WHERE name = \"${RECORD}\" AND type = 'A';"
    COMMAND="${COMMAND} UPDATE ${DBNAME}.records SET content = \"$SOA\" WHERE name = \"${RECORD}\" AND type = 'SOA';"
  done
  mysql -u${DBUSER} -p${DBPASS} ${DBNAME} -e "$COMMAND"
  echo "${IP}" > /tmp/nsup.IP
  echo "IP updates done" | logger -t nsup
fi
fi
</pre>

Latest revision as of 21:10, 26 August 2016

This script will update the A records for zones you host on your local PowerDNS nameserver to your (external) dynamic IP.

I'm running this script after every reconnect of my VDSL link through ppp's ip-up scripts by putting it here:

/etc/ppp/ip-up.d/dynpowerup

This is the original version of the script, which requires you to add you records manually:

#!/bin/bash

RECORDS=("example.com" "ns1.example.com" "ns2.example.com" "example.org" "example.net")
SOA="ns1.example.com. hostmaster.example.com. `date +%Y%m%d%H` 10800 3600 604800 3600"

DBUSER="your-powerdns-user"
DBPASS="your-powerdns-password"
DBNAME="your-powerdns-database"

IP=`lynx -dump http://checkip.dyndns.org | awk '{print $4}'`

if [ -e "/tmp/nsup.IP" ]; then
  read OLD_IP < "/tmp/nsup.IP"
else
  OLD_IP="0.0.0.0"
fi

if [ "$IP" != "$OLD_IP" ]; then
  echo "IP address changed from $OLD_IP to $IP" | logger -t DynPowerUp
  for RECORD in ${RECORDS[@]}; do
    echo "updating record: $RECORD" | logger -t DynPowerUp
    COMMAND="$COMMAND UPDATE ${DBNAME}.records SET content = \"$IP\" WHERE name = \"$RECORD\" AND type = 'A';"
    COMMAND="$COMMAND UPDATE ${DBNAME}.records SET content = \"$SOA\" WHERE name = \"$RECORD\" AND type = 'SOA';"
  done
  mysql -u${DBUSER} -p${DBPASS} ${DBNAME} -e "$COMMAND"
  echo "$IP" > /tmp/nsup.IP
  echo "IP updates done" | logger -t DynPowerUp
fi

And this is a version which looks for a specific NS record and updates all A records with a TTL of 60:

#!/bin/bash

NS="ns1.example.com"
TTL="60"
SOA="ns1.example.com. hostmaster.example.com. `date +%Y%m%d%H` 10800 3600 604800 3600"

DBUSER="your-powerdns-user"
DBPASS="your-powerdns-password"
DBNAME="your-powerdns-database"

RECORDS="SELECT name FROM records WHERE type = 'A' AND ttl = '"${TTL}"' AND domain_id IN
        (SELECT domain_id FROM records WHERE type = 'NS' AND content = '"${NS}"');"

IP=`lynx -dump http://checkip.dyndns.org | awk '{print $4}'`

if [ -e "/tmp/nsup.IP" ]; then
  read OLD_IP < "/tmp/nsup.IP"
else
  OLD_IP="0.0.0.0"
fi

if [ "${IP}" != "${OLD_IP}" ]; then
  echo "IP address changed from ${OLD_IP} to ${IP}" | logger -t nsup
  for RECORD in `mysql -u${DBUSER} -p${DBPASS} ${DBNAME} -NB -e "${RECORDS}"`; do
    echo "updating record: ${RECORD}" | logger -t nsup
    COMMAND="${COMMAND} UPDATE ${DBNAME}.records SET content = \"$IP\" WHERE name = \"${RECORD}\" AND type = 'A';"
    COMMAND="${COMMAND} UPDATE ${DBNAME}.records SET content = \"$SOA\" WHERE name = \"${RECORD}\" AND type = 'SOA';"
  done
  mysql -u${DBUSER} -p${DBPASS} ${DBNAME} -e "$COMMAND"
  echo "${IP}" > /tmp/nsup.IP
  echo "IP updates done" | logger -t nsup
fi