26. June 2011 · Comments Off on Perform DNSSEC update on a DD-WRT router. · Categories: Linux Scripts, Networking · Tags: , ,
#!/bin/sh
## Created by: deaves
### Perform DNSSEC update on a DD-WRT router. ###
# This script will install bind-client and bind-tools if not already installed.
# Under normal use this script will create an additional nvram variable "wan_ipaddr_old",
# this variable is used to prevent updating the bind server if the WAN IP has not changed.
#
# CRON: */15 * * * * root DNSupdate.sh
#
## Requires: DD-WRT v24-sp2 (mega) with 3M /jffs
 
## Log last run - Debug.
#date > "/jffs/tmp/nsupdate.run"
 
SERVER=""
DOMAIN=""
KEYFILE="/jffs/"
 
### Run nsupdate ###
if [ -s "/jffs/usr/bin/nsupdate" ]; then
 
 # Getting required nvram vars.
 router_name="$(nvram get router_name)"
 wan_ipaddr="$(nvram get wan_ipaddr)"
 wan_ipaddr_old="$(nvram get wan_ipaddr_old)"
 
 # Only perform nsupdate if ip has changed and wan_ipaddr is valid.
 if [ "${wan_ipaddr}" != "${wan_ipaddr_old}" ] && [ "${wan_ipaddr}" != "0.0.0.0" ]; then
 
/jffs/usr/bin/nsupdate << _EOF_
  server ${SERVER}
  key `awk '{print $1,$NF}' ${KEYFILE}`
  update delete ${router_name}.${DOMAIN} A
  update add ${router_name}.${DOMAIN} 3600 A ${wan_ipaddr}
  send
_EOF_
 
  nvram set wan_ipaddr_old="${wan_ipaddr}"
 fi
 
### Install requiured tools if needed. Requires 3M available. ###
elif [ ! -s "/jffs/usr/bin/nsupdate" ] && [ "$(df | grep "jffs"$ | awk '{print $4}')" -ge "3000" ]; then
 
 cd /jffs; mkdir -p /jffs/tmp/ipkg
 
 # Fetch and install each required package.
 for PKG in libgcc_4.1.2-14.3_mipsel.ipk uclibc_0.9.29-14.3_mipsel.ipk libopenssl_0.9.8i-3.2_mipsel.ipk bind-libs_9.5.0-P1-1.1_mipsel.ipk bind-client_9.5.0-P1-1.1_mipsel.ipk bind-tools_9.5.0-P1-1.1_mipsel.ipk; do
 
  printf "\rDownloading: ${PKG}     "
  [ ! -e "/jffs/${PKG}" ] && { wget "http://downloads.openwrt.org/kamikaze/8.09.2/brcm47xx/packages/${PKG}" &> /dev/null || printf " [ERROR]\n" ;}
 
  printf "\rInstalling: ${PKG}     "
  [ -e "/jffs/${PKG}" ] && { ipkg install "/jffs/${PKG}" &> /dev/null && rm "/jffs/${PKG}" || printf " [ERROR]\n" ;}
 
 done
 
 printf "\rFinished installing bind-client and bind-tools.          \n"
 
### Notify user if at a loss ###
else
 printf "Not enough free space to install bind-client and bind tools.\n"
fi
 
### Done ###