All pastes #1387505 Raw Edit

dns_zone_mass_update.sh

public shellscript v1 · immutable
#1387505 ·published 2009-04-09 22:03 UTC
rendered paste body
#!/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