update-zone
changeset 31 1cea07056124
parent 27 d5337081ed02
child 32 d1addc2ec712
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/update-zone	Thu Aug 12 10:18:58 2010 +0200
@@ -0,0 +1,124 @@
+#!/usr/bin/perl
+
+use strict;
+use FindBin;
+
+# liest die Konfiguration ein
+my @configs = ( "$FindBin::Bin/dnstools.conf", "/etc/dnstools.conf" );
+my @dnssec_signs
+    = ( "$FindBin::Bin/dnssec-sign", "/usr/bin/dnstools/dnssec-sign" );
+my %config;
+my $dnssec_sign;
+
+for ( grep {-f} @configs ) {
+    open( CONFIG, $_ ) or die "Can't open $_: $!\n";
+}
+unless ( seek( CONFIG, 0, 0 ) ) {
+    die "Can't open config (searched: @configs)\n";
+}
+
+for ( grep {-f} @dnssec_signs ) {
+    if ( -x $_ ) {
+        $dnssec_sign = $_;
+    }
+    else {
+        die "Can't run $_\n";
+    }
+}
+
+while (<CONFIG>) {
+    chomp;
+    s/#.*//;
+    s/\t//g;
+    s/\s//g;
+    next unless length;
+    my ( $cname, $ccont ) = split( /\s*=\s*/, $_, 2 );
+    $config{$cname} = $ccont;
+}
+close(CONFIG);
+
+my $bind_dir   = $config{bind_dir};
+my $conf_dir   = $config{zone_conf_dir};
+my $master_dir = $config{master_dir};
+
+unless ( -d $master_dir and -r $master_dir ) {
+    die "$master_dir: $!\n";
+}
+
+unless ( -d $bind_dir and -r $bind_dir ) {
+    die "$bind_dir: $!\n";
+}
+
+# dnssec - new sign
+system "$dnssec_sign";
+die "$dnssec_sign not found ($!)" if $? == -1;
+exit 1 if $?;
+
+
+# prueft jede domain, die ein verzeichnis in $master_dir hat, ob es eine
+# datei $zone_file.signed gibt und ob diese datei in $config_file eingetragen
+# ist.
+# passt die eintraege in $config_file falls noetig an.
+while (<$master_dir/*>) {
+    s#($master_dir/)(.*)#$2#;
+    my $zone = $_;
+
+    my $zone_file = "$master_dir/$zone/$zone";
+    my $conf_file = "$conf_dir/$zone";
+    my @c_content;
+
+    unless ( -f "$conf_file" ) {
+        die "$conf_file: $! \n";
+    }
+
+    if ( -f "$zone_file.signed" ) {
+
+        open( FILE, "<$conf_file" ) or die "$conf_file: $!\n";
+        @c_content = <FILE>;
+        close(FILE);
+
+        for (@c_content) {
+            if (m{(.*)($zone_file)(";)}) {
+                print "$2 ==> $2.signed\n";
+                $_ = "$1$2.signed$3\n";
+            }
+
+            open( FILE, ">$conf_file" ) or die "$conf_file: $!\n";
+            print FILE @c_content;
+            close(FILE);
+
+        }
+    }
+    else {
+
+        open( FILE, "<$conf_file" ) or die "$conf_file: $!\n";
+        @c_content = <FILE>;
+        close(FILE);
+
+        for (@c_content) {
+            if (m{(.*)($zone_file)\.signed(.*)}) {
+                print "$2.signed ==> $2\n";
+                $_ = "$1$2$3\n";
+            }
+        }
+
+        open( FILE, ">$conf_file" ) or die "$conf_file: $!\n";
+        print FILE @c_content;
+        close(FILE);
+    }
+}
+
+# erzeugt eine named.conf-datei aus den entsprechenden vorlagen.
+open( TO, ">$bind_dir/named.conf.zones" )
+    or die "$bind_dir/named.conf.zones: $!\n";
+while (<$conf_dir/*>) {
+    open( FROM, "$_" ) or die "$_: $! \n";
+    print TO <FROM>;
+    close(FROM);
+}
+close(TO);
+
+
+system "named-checkconf";
+system "named-checkconf -z";
+system "rndc reload";