#!/bin/rc
# zonefresh server domain - AXFR zone transfer of domain from server
rfork en
fn reformat {
awk '
BEGIN {
printf("#\n# Generated file, no not edit\n#\n\n")
ndoms = 1
}
/cname=/ {
cnames[$1] = $2 # dom=fakename cname=realname
next
}
/ip=/ { # ip=quad dom=domain
if (doms[$2] == "")
doms[$2] = $1
else
doms[$2] = doms[$2] "\n\t" $1
domidx[ndoms++] = $2
if ($2 ~ ":")
next # IPv6
# cannot do much for CIDR or subnetting
split($2, addr, "[=.]")
if (addr[2] <= 127) {
tail = addr[2]
net = "ip=" tail ".0.0.0"
mask = "mask=255.0.0.0"
} else
if (addr[2] > 127 && addr[2] <= 191) {
tail = addr[2] "." addr[3]
net = "ip=" tail ".0.0"
mask = "mask=255.255.0.0"
} else
if (addr[2] > 191) {
tail = addr[2] "." addr[3] "." addr[4]
net = "ip=" tail ".0"
mask = "mask=255.255.255.0"
}
nets[net] = mask
netnames[net] = sprintf("ipnet=net-%s", tail)
next
}
/srv=/ {
for (i = 2; i <= NF; i++){
srvs[$1]++
sdata[$1, nsdata[$1]] = sdata[$1, nsdata[$1]] " " $i
}
nsdata[$1]++
next
}
{
for (i = 2; i <= NF; i++){
soas[$1]++
data[$1, ndata[$1]++] = $i
}
}
END {
for (dom in soas) {
printf("%s\n", dom)
for (i = 0; i < ndata[dom]; i++)
if (data[dom, i] ~ "^mx=.*")
printf("\t%s", data[dom, i])
else
if (data[dom, i] ~ "^[a-z]+=\".*") {
printf("\t")
for (; i < ndata[dom] &&
data[dom, i] !~ ".*\"$"; i++)
printf("%s ", data[dom, i])
printf("%s\n", data[dom, i])
} else
printf("\t%s\n", data[dom, i])
printf("\n")
}
printf("\n")
for (net in nets)
printf("%s %s %s\n", netnames[net], net, nets[net])
printf("\n")
for (dom in cnames)
printf("%s %s\n", dom, cnames[dom])
printf("\n")
qsort(domidx, 1, ndoms-1)
for (i = 1; i < ndoms; i++)
if (i == 1 || doms[domidx[i-1]] != doms[domidx[i]] ||
domidx[i-1] != domidx[i])
printf("%s %s\n", domidx[i], doms[domidx[i]])
printf("\n")
for (srv in srvs){
printf("%s\n", srv)
for (i = 1; i < nsdata[srv]; i++)
printf("\t%s\n", sdata[srv, i])
printf("\n")
}
}
function qsort(A, left, right, i, last){
if (left >= right)
return
swap(A, left, left + int((right-left+1)*rand()))
last = left
for (i = left+1; i <= right; i++)
if (A[i] < A[left])
swap(A, ++last, i)
swap(A, left, last)
qsort(A, left, last-1)
qsort(A, last+1, right)
}
function swap(A, i, j, t){
t = A[i]; A[i] = A[j]; A[j] = t
}
' $*
}
if (! ~ $#* 2 && ! ~ $#* 3) {
echo usage: zonefresh [-s] nameserver domainname
exit usage
}
if (~ $1 -s ){
ramfs
if (ndb/axfr $2 $3 > /tmp/sec.$3.raw){
reformat /tmp/sec.$3.raw > /tmp/sec.$3.fmt
if (! cmp -s /tmp/sec.$3.fmt /lib/ndb/sec.$3)
cp /tmp/sec.$3.fmt /lib/ndb/sec.$3
}
}
if not {
ndb/axfr $1 $2 | reformat
}
|