====== Convert bind9 zone configuration to a hosts file ====== During migration it's sometimes useful to test a server with many virtual hosts before directing them to their new IP. For this purpose it's necessary to have a proper hosts file on the testing station. The following bash/awk script reads and parses bind9 configuration from an [[http://www.openvz.org|OpenVZ]] virtualized ROOT directory (can be substituted as ''/'' for non-virtualized environments), then converts zone A records to a suitable hosts file format (IPADDR FQDN). The output can be then copied into ''/etc/hosts'' or ''C:\WINDOWS\SYSTEM32\DRIVERS\ETC\HOSTS'' files respectively. #!/bin/bash ROOT=/var/lib/vz/root/1000/ bindconf=$ROOT/etc/bind/named.conf OLDIP=1.2.3.4 NEWIP=5.6.7.8 dumpbindconf() { awk -v ROOT=$ROOT ' {rinclude($0)} function rinclude(line,x,a) { sub(/^#/,"",line); # strip leading comments split(line,a,/ /); if ( a[1] ~ /^[ ]*include/ ) { #looking for =include at start of line file=ROOT a[2] gsub(/[\";]/,"",file) print ";------ INCLUDE " file while ( ( getline x < file ) > 0) rinclude(x);. close(a[2])} else {print line} } ' } dumpzones() { awk -v ROOT=$ROOT ' /^[ ]*zone/ {. zone=$2 gsub(/[\";]/,"",zone) } /^[ \t]*file/ { file=$2 gsub(/[\";]/,"",file) file=ROOT file print "; zone file for " zone gethosts(file) } function gethosts(file) { while ( ( getline x < file ) > 0 ) print x; close(file) } ' } dumptohosts() { awk ' /^; zone file for/ {. zone=$5 gsub(/[\";]/,"",zone) #print zone } /^.*@.*IN.*A.*[0-9]+/ { print $4 " " zone } /^[^@]*IN.*A.*[0-9]+/ { print $4 " " $1 "." zone } ' } cat "$bindconf" | dumpbindconf | dumpzones | dumptohosts | grep "$OLDIP" | sed "s/$OLDIP/$NEWIP/g" {{tag>bash bind dns hosts util}} ~~LINKBACK~~