BIND-Zonen in tinydns-Zonen konvertieren

Hin und wieder haben wir Gelegenheit, einige Domains von anderen Providern zu übernehmen, und wenn jene kooperativ sind, bekommen wir die bestehenden DNS-Zonendateien bereitgestellt. Umgekehrt tun wir das genauso; das ist einfach ein Zeichen guten Stils. Wenn eine Domain wegziehen soll, dann ist die Entscheidung ja schon gefallen; da muss man dem Kunden und dem neuen Provider ja nicht absichtlich Knüppel zwischen die Beine werfen, in dem man ihm die Übernahme der DNS-Daten künstlich erschwert.

Bei den meisten Domainübernahmen zu uns bekommen wir BIND-Zonendateien. Wie vielleicht schon bekannt ist, setzen wir jedoch tinydns als DNS-Server ein. Besteht die Möglichkeit, Zonen per AXFR zu übernehmen, so bevorzugen wir dies, aber gängiger ist, dass wir ein Bündel BIND-Zonen einfach zugemailt bekommen.

Gut, dass Dan Erat das Tool bind-to-tinydns geschrieben hat, das BIND-Zonen interpretieren und ins tinydns-data-Format übertragen kann. Es erwartet seine Eingabe auf STDIN und schreibt das Ergebnis in eine Datei. Dabei werden entsprechend ein SOA-Record („Z“) und mehrere NS-Records („&“) angelegt, was nun entsprechend noch geändert werden muss: Wir bevorzugen, die NS-Records mit „.“-Syntax anzulegen, wobei tinydns dann automatisch einen SOA konstruiert. Und so machen wir’s:

for FILE in hosts.* ; do
  ZONE=`echo $FILE | sed 's/^hosts\.//'` ;
  cat $FILE | bind-to-tinydns $ZONE $ZONE.pre $ZONE.tmp ;
  rm -f tinydns/$ZONE ;
  for NS in 1 2 3 ;
    do echo ".$ZONE::ns$NS.jonaspasche.com" >> tinydns/$ZONE ;
  done ;
  grep -v -E "^(Z|&)$ZONE\.?:" $ZONE.pre >> tinydns/$ZONE ;
done

Sprich: Da die Dateien alle im Format hosts.domain.tld benannt sind, ziehen wir uns den Namen der Zone aus dem Dateinamen. Wir konvertieren die Zone mit bind-to-tinydns in eine $ZONE.pre (die noch die ursprünglichen SOA-/NS-Angaben trägt); anschließend legen wir in einer Schleife die drei neuen NS-Records an und fügen schließlich den Inhalt der konvertierten Zone ein, wobei wir den SOA und die bisherigen NS-Delegationen weglassen. Dabei achten wir darauf, nur die NS-Records der Zone selbst wegzulassen – andere „&“-Einträge, die sich auf Subdomains beziehen (die damit auf andere Nameserver delegiert werden), bleiben natürlich bestehen.

Schließlich haben wir im Verzeichnis tinydns fertige Zonendateien liegen, angepasst auf unsere DNS-Server. Das war’s auch schon!