Convert zonefile records into djbdns format
#!/usr/bin/perl -w
use strict;
use Net::DNS::RR;
# format a DNS record for DJBDNS
while (<STDIN>) {
my $loc = Net::DNS::RR->new($_);
print ":",$loc->name,":",Net::DNS::typesbyname($loc->type),":";
foreach (unpack "C*",$loc->rr_rdata) {
if (($_ > 47 && $_ < 58) ||
($_ > 64 && $_ < 91) ||
($_ > 96 && $_ < 123)) {
print chr($_);
} else {
printf "\\%03o", $_;
}
}
print ":",$loc->ttl,"\n";
}
It is possible to correct IPv4 dynamic entries based on DHCP entries. This uses IPv6 assignments to tell which names and MAC addresses belong tegether in the DNS and so needs no other configuration than locations of files.
#!/bin/bash
DHCP=/var/lib/dhcp3/dhcpd.leases
DBNDNS=/etc/sv/root/data
while inotifywait -e modify "${DHCP}"
do
while read
do
if test "${REPLY:0:5}" = "lease"
then
IP=$(cut -f2 -d" " <<<"${REPLY}")
MAC=
continue
elif test "${REPLY:0:20}" = " hardware ethernet "
then
MAC=${REPLY:20:2}${REPLY:23:2}${REPLY:26:2}${REPLY:29:2}${REPLY:32:2}${REPLY:35:2}
else
continue
fi
unset ALIAS
unset HOST
# echo IP is $IP MAC is $MAC
#MAC=$(tr -d : <<<"$1")
FLIP=$(( ${MAC:1:1} ^ 2 ))
if test "${FLIP}" = "10"; then FLIP="a"; fi
if test "${FLIP}" = "11"; then FLIP="b"; fi
if test "${FLIP}" = "12"; then FLIP="c"; fi
if test "${FLIP}" = "13"; then FLIP="d"; fi
if test "${FLIP}" = "14"; then FLIP="e"; fi
if test "${FLIP}" = "15"; then FLIP="f"; fi
while read
do
if test -z "${REPLY}"
then
continue
fi
if test "${REPLY:$((${#REPLY}-1)):1}" = "."
then
HOST[${#HOST[*]}]="${REPLY:0:$((${#REPLY}-1))}"
else
HOST[${#HOST[*]}]="${REPLY}"
fi
done <<<"$(egrep -i $'^\^'${MAC:11:1}$'\.'${MAC:10:1}$'\.'${MAC:9:1}$'\.'${MAC:8:1}$'\.'${MAC:7:1}$'\.'${MAC:6:1}$'\.e\.f\.f\.f\.'\
${MAC:5:1}$'\.'${MAC:4:1}$'\.'${MAC:3:1}$'\.'${MAC:2:1}$'\.'${FLIP}$'\.'${MAC:0:1}\
$'.{32}\.ip6\.arpa:' "${DBNDNS}"|cut -f2 -d":")"
while read
do
if test -z "${REPLY}"
then
continue
fi
for N in ${HOST[*]}
do
if test "${N}" = "${REPLY:1}"
then
continue 2
fi
done
ALIAS[${#ALIAS[*]}]="${REPLY:1}"
done <<<"$(egrep -i $'^3[^:]*:.{16}'${MAC:0:1}${FLIP}${MAC:2:4}$'fffe'${MAC:6:6}':' "${DBNDNS}"|cut -d":" -f1)"
# disable all lines - we lose which is the nodename but is obvious from ipv6 reverse DNS
sed -i $'s/^[=+-]\\([^:]*\\):\\('"${IP}"$'\\):\\([0-9]*\\)$/-\\1:\\2:\\3/' "${DBNDNS}"
for N in ${HOST[*]}
do
# echo host: $N
sed -i $'s/^[=-]'"${N}"$':.*$/='"${N}"$':'"${IP}"$':7200/' "${DBNDNS}"
done
echo
for N in ${ALIAS[*]}
do
# echo alias: $N
sed -i $'s/^[\+-]'"${N}"$':.*$/+'"${N}"$':'"${IP}"$':7200/' "${DBNDNS}"
done
done < "${DHCP}"
done