#!/bin/sh # @(#) gendns 1.15 92/08/31 @(#) # generate the DNS database files from generic database files # # files used # hosts.main # hosts.aliases # hosts.mx # hosts.ns # hosts.wks # # this script assumes that a subdomain is always delegated to # another nameserver and hosts for the subdomain except for the # glue records do not exist in the base host database files # Copyright (c) 1992 by Texas Internet Consulting # This code may be freely copied and used so long as this # copyright notice is attached. This code may not be sold # without the express written permission of Texas Internet Consulting. # Texas Internet Consulting makes no warranty as to the correctness # nor the applicability of this code for any purpose. # make the forward database files makeforw() { # extract host name and IP address from hosts.main # and make A records out of it, # but only for hosts within this domain # add NS and A records for the servers # add HINFO from hardware and os ( readinfo host ip hard os <hosts.main | awk -F' ' ' BEGIN { nservers = split("'"$servers"'", servers, " ") for (i=1; i<=nservers; i++) { printf("'$domain'. IN NS %s.\n", servers[i]) } } { for (i=1; i<=nservers; i++) { if ($1 == servers[i]) { printf("%s. IN A %s\n", $1, $2) if ($3 != "X") { printf("%s. IN HINFO %s %s\n", $1, $3, $4) } next } } if ($1 ~ /'$escape_domain'$/) { printf("%s. IN A %s\n", $1, $2) if ($3 != "X") { printf("%s. IN HINFO %s %s\n", $1, $3, $4) } } }' # make cname records out of the aliases # again only for this domain readinfo alias host <hosts.cname | awk -F' ' '{ if ($1 ~ /'$escape_domain'$/) printf("%s. IN CNAME %s.\n", $1, $2) }' # and the MX records the same way readinfo domain priority host <hosts.mx | awk -F' ' '{ if ($1 ~ /'$escape_domain'$/) printf("%s. IN MX %s %s.\n", $1, $2, $3) }' # and WKS records # sort them and concatenate the application protocol mnemonics readinfo host ip proto wks <hosts.wks | sort | awk -F' ' '{ if ($1 ~ /'$escape_domain'$/) { if ($1 != host || $2 != ip || $3 != proto) { if (host != "") { printf("%s. IN WKS %s %s %s\n", host, ip, proto, wks) wks = "" } } host = $1 ip = $2 proto = $3 wks = wks " " $4 } } END { printf("%s. IN WKS %s %s %s\n", host, ip, proto, wks) }' ) } makerev() { # extract host name and IP address from hosts.main # and make inverse PTR records out of it # but only for IP addresses which match the IP addresses in this domain readinfo host ip <hosts.main | awk -F' ' ' BEGIN { nrev = split("'$unreverse'", unreverse, ".") nservers = split("'"$servers"'", servers, " ") for (i=1; i<=nservers; i++) { printf("'$domain'. IN NS %s.\n", servers[i]) } } { # check for servers and output glue A records for (i=1; i<=nservers; i++) { if ($1 == servers[i]) { printf("%s. IN A %s\n", $1, $2) } } n = split($2, ipparts, ".") for (i=1; i<=nrev; i++) { if (ipparts[i] != unreverse[i]) break } if (i <= nrev) next for(; i<=n; i++) printf("%s.", ipparts[i]) printf("%s. IN PTR %s.\n", "'$domain'", $1) }' } SERIAL=serial serial=`cat $SERIAL` dateserial=`date +%y%m%d` # read SOA info for each domain readinfo domain server contact refresh retry expire min <hosts.soa |\ while read domain server contact refresh retry expire min; do # get the domain name with escaped "." escape_domain=`echo $domain | awk -F. '{ for (i=1; i<NF; i++) { printf("%s", $i) printf("\\.") } printf("%s", $NF) }'` # get servers for this domain servers=`readinfo domain server <hosts.ns | awk -F' ' '{ if ($1 ~ /'$escape_domain'$/) printf("%s ", $2) }'` case $domain in *.in-addr.arpa) rev=true # get the filename fo reverse domains # unreverse the domain name for matching IP addresses unreverse=`echo $domain | awk -F. '{ for (i=NF-2; i>1; i--) printf("%s.", $i) printf("%s", $1) }'` filename=f.$unreverse ;; *) rev= filename=$domain ;; esac # print the header and SOA record ( echo "; $serial" echo '$ORIGIN'" ${domain}." echo "@ SOA ${server}. ${contact}. ( $dateserial $refresh $retry $expire $min )" # scan the input file and extract info depending on whether this # is a forward or reverse domain file if [ $rev ]; then makerev else makeforw fi |\ # get rid of extraneous domain info sed -e 's/\(.*\)\(\.'${escape_domain}'\.\)/\1/g' \ -e 's/\(.*\)\(\.'${escape_domain}'\. \)/\1 /g' \ -e 's/^'${escape_domain}'\./@/g' ) >$filename done