[dns-operations] Diffing tools for zones?

Joe Abley jabley at hopcount.ca
Tue Aug 3 12:40:00 UTC 2010


On 2010-08-02, at 15:09, Paul Hoffman wrote:

> Greetings. I used to be able to do a reasonably sane check for changed between two versions of the root zone with 'diff'. Now that the root is signed, that all goes to hell.

For what it's worth, I run the following out of cron. The noise is all still there, but it's crudely classified, enough for me to be able to delete-based-on-preview for changes that only involve DNSSEC changes, and look harder if there are other changes (and I feel like it). It seems like a distant but non-zero possibility that works for me in e-mail might work for you in whatever you're trying to do.

The [:space:] regex atom below is a convenient GNU-ism which is not specified by POSIX (I think). The two nameservers xfr.lax.dns.icann.org and xfr.cjr.dns.icann.org serve whatever L-Root is serving, allow zone transfers indiscriminately, and you're welcome to use them.


Joe

#!/bin/sh

HOME=$(dirname $0)
NEW=${HOME}/root.new
OLD=${HOME}/root.current
TMP=${HOME}/root.$$

selectodiff() {
  rm -f "${TMP}"
  pattern="IN[[:space:]]+$3[[:space:]]"
  diff -c0 -u "$1" "$2" | egrep "${pattern}" >"${TMP}"
  if [ $(wc -l <"${TMP}") -gt 0 ]; then
    echo "========= $4 changes"
    echo ""
    egrep "${pattern}" "${TMP}"
    echo ""
  fi
  rm -f "${TMP}"
}

dig @xfr.lax.dns.icann.org . axfr | egrep -v '^;' >"${NEW}"

SOAS=$(egrep -i 'IN[[:space:]]+SOA[[:space:]]+' ${NEW} | wc -l)

if [ ${SOAS} -eq 2 ]; then
  touch "${OLD}"

  selectodiff "${OLD}" "${NEW}" "NS" "Delegation"
  selectodiff "${OLD}" "${NEW}" "DS" "Trust Anchor"
  selectodiff "${OLD}" "${NEW}" "(A|AAAA)" "Glue"
  selectodiff "${OLD}" "${NEW}" "(RRSIG|NSEC|DNSKEY)" "DNSSEC"

  selectodiff "${OLD}" "${NEW}" ".*" "Complete list of"

  mv "${NEW}" "${OLD}"
fi




More information about the dns-operations mailing list