#!/bin/bash############################### MACROSCHUNKLIGHTTUNA="\ masteringthechunkoflight.com \ masteringthechunkoflight.net \ masteringthechunkoflight.org \ masterthechunkoflight.com \ masterthechunkoflight.net \ masterthechunkoflight.org \ eatinganewchunk.com \ eatinganewchunk.net \ eatinganewchunk.org \ eatingreginald.com \ eatingreginald.net \ eatingreginald.org \ drinkingreginaldchunklighttuna.com \ drinkingreginaldchunklighttuna.net \ drinkingreginaldchunklighttuna.org \ drinkingthechunkoflight.com \ drinkingthechunkoflight.net \ drinkingthechunkoflight.org \ drinkingchunklighttuna.com \ drinkingchunklighttuna.net \ drinkingchunklighttuna.org"MISC="\ serverfiressuck.org"USAGE=' Usage: Change TTLs: ./dns.sh ttls <SITE> TTL TTL Should be 86400 (1D) for long-term, and 300 (10M) to prep for migration Switch IPs on a site (MAKE IT GO LIVE ON NEW IPS!) ./dns.sh ips <SITE> ++++++++NOTE++++++++: you will still need to reload named for it to pick up the zone changes. SITE is one of these, one at a time: CHUNKLIGHTTUNA - munge nom nom nom ';ALLSITES='CHUNKLIGHTTUNA MISC';LOGFILE='./ZONE_UPDATE_LOG';######################################## /MACROS# NOTE! This script relies on a csv file with info on the zones you are changging. format: domainname,old_ip,new_ip . it's referred to as 'zones_out.csv'# written by Don Dulyea, or @arthabaska on twitter.#this is how we make a backup#rm -rf external#cp -raf external.masters externalcsv() { site="$1"; if [ -z "$1" ]; then echo "csv function needs an argument--which site?"; exit 125; fi; B=$site; echo "$site" >> zones.csv; for thisone in ${!B}; do grep -H www external/$thisone|grep IN|awk '{print $1","$4}'|sed -e "s/:www//g" -e "s/external\///g" >> zones.csv; done}ips() { site="$1"; if [ -z "$1" ]; then echo "need an argument!"; exit 125; fi; B=$site; if [ $B == 'MAINSITE' ]; then echo "You're trusting the company's main zone file to a script? No. HAND EDIT. I am disabling myself now."; mv dns.sh dns.sh.THE_INTERNET_HAS_BEEN_SAVED; echo "#!/bin/bash" > dns.sh; echo "echo \"Oh no, I am disabled! D: help!\";" >> dns.sh; echo "exit;" >> dns.sh; cat dns.sh.THE_INTERNET_HAS_BEEN_SAVED >> dns.sh; exit 125; fi; echo "------------------STARTING DNS ZONE FILE (IP AND SERIAL) MODIFICATIONS FOR: $B" >> $LOGFILE; echo "------------------`date`" >> $LOGFILE; echo "------------------Data can be extracted with cut -f 4 -d \" \" ZONE_UPDATE_LOG | cut -f 1,2,3,4,5 -d \",\"" >> $LOGFILE; for target in ${!B}; do NEW_SERIAL="`date +%Y%m%d`01" OLD_SERIAL=`grep '; serial' external/$target|head -n 1|awk '{print $1}'` # allow for multiple zonefile changes in same yyyymmddXX period if [ "$OLD_SERIAL" -ge "$NEW_SERIAL" ]; then let "NEW_SERIAL = $OLD_SERIAL + 1"; fi OLD_IP=`grep $target zones_out.txt | cut -f 2 -d " " | sed -e 's/\./\\\./g'`; OLD_IP_CLEAN=`grep $target zones_out.txt | cut -f 2 -d " "`; NEW_IP=`grep $target zones_out.txt | cut -f 3 -d " "`; if [ ! -z "`grep tag_new_ip external/$target`" ]; then echo "Found my own tags inside $target -- skipping $target to prevent a mess"; continue; fi #echo "$target : Old IP: $OLD_IP New IP: $NEW_IP"; perl -pi -e "s/(^.*)([0-9]{10})(.*$)/\t\t\t\t\t$NEW_SERIAL \t\\; serial /g" external/$target; perl -pi -e "s/(^.*)($OLD_IP).*$/\\;\\1\\2 \; tag_old_ip \n\\1 $NEW_IP \; tag_new_ip/g" external/$target; echo "UPDATED ZONE: csv(zone/timestamp/serial/old_ip/new_ip): $target,`date +%s`,$NEW_SERIAL,$OLD_IP_CLEAN,$NEW_IP" >> $LOGFILE; done echo "------------------DONE WITH ZONE FILE (IP AND SERIAL) MODIFICATIONS FOR $B" >> $LOGFILE; echo "------------------====" >> $LOGFILE;}rollback() { site="$1"; if [ -z "$1" ]; then echo "need an argument!"; exit 125; fi; B=$site; if [ $B == 'MAINSITE' ]; then echo "You're trusting the company's main zone file to a script? No. HAND EDIT. I am disabling myself now."; mv dns.sh dns.sh.THE_INTERNET_HAS_BEEN_SAVED; echo "#!/bin/bash" > dns.sh; echo "echo \"Oh no, I am disabled! D: help!\";" >> dns.sh; echo "exit;" >> dns.sh; cat dns.sh.THE_INTERNET_HAS_BEEN_SAVED >> dns.sh; exit 125; fi echo "------------------STARTING DNS ZONE FILE (IP AND SERIAL) CHANGE ROLLBACK FOR: $B" >> $LOGFILE; echo "------------------`date`" >> $LOGFILE; echo "------------------Data can be extracted with cut -f 4 -d \" \" ZONE_UPDATE_LOG | cut -f 1,2,3,4,5 -d \",\"" >> $LOGFILE; for target in ${!B}; do NEW_SERIAL="`date +%Y%m%d`01" OLD_SERIAL=`grep '; serial' external/$target|head -n 1|awk '{print $1}'` # allow for multiple zonefile changes in same yyyymmddXX period if [ "$OLD_SERIAL" -ge "$NEW_SERIAL" ]; then let "NEW_SERIAL = $OLD_SERIAL + 1"; fi perl -pi -e "s/(^.*)([0-9]{10})(.*$)/\t\t\t\t\t$NEW_SERIAL \t\\; serial /g" external/$target; perl -pi -e "s/^;(.*tag_old_ip.*$)/\\1/g" external/$target; perl -pi -e "s/(.*tag_new_ip.*$)//g" external/$target; echo "UPDATED ZONE: csv(zone/timestamp/serial): $target,`date +%s`,$NEW_SERIAL" >> $LOGFILE; done echo "------------------DONE WITH ZONE FILE (IP AND SERIAL) CHANGE ROLLBACK FOR $B" >> $LOGFILE; echo "------------------====" >> $LOGFILE;}ttls() { site="$1"; NEW_TTL="$2"; if [ -z "$1" ]; then echo "need an argument!"; exit 125; fi; B=$site; echo "------------------STARTING DNS ZONE FILE (TTL ADJUST TO $NEW_TTL) MODIFICATIONS FOR: $B" >> $LOGFILE; echo "------------------`date`" >> $LOGFILE; echo "------------------Data can be extracted with cut -f 4 -d \" \" ZONE_UPDATE_LOG | cut -f 1,2,3,4 -d \",\"" >> $LOGFILE; for target in ${!B}; do NEW_SERIAL="`date +%Y%m%d`01" OLD_SERIAL=`grep '; serial' external/$target|head -n 1|awk '{print $1}'` # allow for multiple zonefile changes in same yyyymmddXX period if [ "$OLD_SERIAL" -ge "$NEW_SERIAL" ]; then let "NEW_SERIAL = $OLD_SERIAL + 1"; fi perl -pi -e "s/(^.*)([0-9]{10})(.*$)/\t\t\t\t\t$NEW_SERIAL \t\\; serial /g" external/$target; perl -pi -e "s/^.*($$TTL).*([0-9]+).*$/\\1\t $NEW_TTL /g" external/$target; echo "UPDATED ZONE_TTL: csv(zone/timestamp/serial/new_ttl): $target,`date +%s`,$NEW_SERIAL,$NEW_TTL" >> $LOGFILE; done echo "------------------DONE WITH ZONE FILE (TTL ADJUST TO $NEW_TTL) MODIFICATIONS FOR $B" >> $LOGFILE; echo "------------------====" >> $LOGFILE;}case "$1" in csv) echo > zones.csv; for i in $ALLSITES; do csv "$i"; done ;; rollback) rollback "$2" now="`date +%s`"; cp -raf external external.state_copy.$now && ln -s -f -T external.state_copy.$now last; ;; ips) ips "$2" now="`date +%s`"; cp -raf external external.state_copy.$now && ln -s -f -T external.state_copy.$now last; ;; ttls) ttls "$2" "$3" now="`date +%s`"; cp -raf external external.state_copy.$now && ln -s -f -T external.state_copy.$now last; ;; *) echo "$USAGE"; exit 1esac