diff -r d50f6874b7ab -r 8b46e7c48995 zone-ls.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zone-ls.pl Tue Dec 21 13:53:39 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 () { + 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"; + () = ; + $info_zsk = $.; + + # prueft wie viele ksks genutzt werden + close(FILE); + open( FILE, $_ = "<$dir/.index.ksk" ) or die "Can't open $_: $!\n"; + () = ; + $info_ksk = $.; + + # prueft wie oft die schluessel zum signieren genutzt wurden + open( FILE, $_ = "<$dir/.keycounter" ) or die "Can't open $_: $!\n"; + chomp( $info_kc = ); + + # prueft das ablaufdatum + if ( !-f "$dir/$zone.signed" ) { + $info_end = "-"; + next; + } + + open( FILE, $_ = "<$dir/$zone.signed" ) or die "Can't open $_: $!\n"; + while () { + $info_end = "$+{day}.$+{mon}.$+{year} $+{hour}:$+{min}" + if /RSIG.*SOA.*\s + (?\d\d\d\d) + (?\d\d) + (?\d\d) + (?\d\d) + (?\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; +} +