zone-ls.pl
changeset 43 7e472c559b36
parent 41 3c10c45c6a59
child 44 8b487ebf8d99
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/zone-ls.pl	Tue Dec 21 14:03:18 2010 +0100
@@ -0,0 +1,100 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+use File::Basename;
+use FindBin;
+
+# liest die Konfiguration ein
+my @configs = ("$FindBin::Bin/dnstools.conf", "/etc/dnstools.conf");
+my %config;
+
+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";
+}
+
+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 $master_dir = $config{master_dir};
+my $zone;
+my ($info_zsk, $info_ksk, $info_kc, $info_end, $info_status);
+
+unless (-d $master_dir and -r $master_dir) {
+    die "$master_dir: $!\n";
+}
+
+printf "%-35s %-8s %1s/%1s %3s %7s\n", "Domain", "Status", "ZSK", "KSK",
+  "Used", "Sig-end";
+
+for my $dir (glob "$master_dir/*") {
+
+    $zone = basename($dir);
+
+    # prueft mit dig nach der zone
+    $info_status = "OK";
+    for (`dig \@localhost $zone`) {
+        if (/root-servers/) {
+            $info_status = "FAILED";
+            last;
+        }
+    }
+
+    if (not -f "$dir/.index.zsk") {
+        $info_zsk = $info_ksk = $info_kc = 0;
+        $info_end = "-";
+        next;
+    }
+
+    # prueft wie viele zsks genutzt werden
+    close(FILE);
+    open(FILE, $_ = "<$dir/.index.zsk") or die "Can't open $_: $!\n";
+    () = <FILE>;
+    $info_zsk = $.;
+
+    # prueft wie viele ksks genutzt werden
+    close(FILE);
+    open(FILE, $_ = "<$dir/.index.ksk") or die "Can't open $_: $!\n";
+    () = <FILE>;
+    $info_ksk = $.;
+
+    # prueft wie oft die schluessel zum signieren genutzt wurden
+    open(FILE, $_ = "<$dir/.keycounter") or die "Can't open $_: $!\n";
+    chomp($info_kc = <FILE>);
+
+    # prueft das ablaufdatum
+    if (!-f "$dir/$zone.signed") {
+        $info_end = "-";
+        next;
+    }
+
+    open(FILE, $_ = "<$dir/$zone.signed") or die "Can't open $_: $!\n";
+    while (<FILE>) {
+        $info_end = "$+{day}.$+{mon}.$+{year} $+{hour}:$+{min}"
+          if /RSIG.*SOA.*\s
+			(?<year>\d\d\d\d)
+			(?<mon>\d\d)
+			(?<day>\d\d)
+			(?<hour>\d\d)
+			(?<min>\d\d)\d+\s\(/ix;
+    }
+
+}
+continue {
+    printf "%-35s %-8s %1d/%1d %5d %19s\n", $zone, $info_status, $info_zsk,
+      $info_ksk, $info_kc,
+      $info_end;
+}
+