📄 gendns
字号:
#!/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 filesmakeforw() { # 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=serialserial=`cat $SERIAL`dateserial=`date +%y%m%d`# read SOA info for each domainreadinfo 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' ) >$filenamedone
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -