diff -r d3158de72598 -r d50f6874b7ab dnssec-killkey --- a/dnssec-killkey Thu Dec 02 16:46:17 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,254 +0,0 @@ -#!/usr/bin/perl -w - -use strict; -use FindBin; - -sub del_double { - my %all; - grep { $all{$_} = 0 } @_; - return ( keys %all ); -} - -# 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 $ablauf_zeit = $config{abl_zeit}; -my $zone; -my @status; -my @auto; -my @manu; -my @old_zone_content; -my @new_zone_content; -chomp( my $now_time = `date +%s` ); # aktuelle unixzeit - -# prueft zonen aus ARGV und loescht das schluesselmaterial -for (@ARGV) { - chomp( $zone = `idn --quiet $_` ); - my $zdir = "$master_dir/$zone"; - my $ep = 0; - - unless ( -e "$master_dir/$zone" ) { - print "$zone ist keine verwaltete zone \n"; - } - else { - if ( -e "$zdir/$zone.signed" ) { - unlink "$zdir/$zone.signed" and $ep = 1 } - if ( -e "$zdir/.keycounter" ) { - unlink "$zdir/.keycounter" and $ep = 1 } - if ( -e "$zdir/.index.ksk" ) { - unlink "$zdir/.index.ksk" and $ep = 1 } - if ( -e "$zdir/.index.zsk" ) { - unlink "$zdir/.index.zsk" and $ep = 1 } - if ( -e "$zdir/dsset-$zone." ) { - unlink "$zdir/dsset-$zone." and $ep = 1 } - if ( -e "$zdir/keyset-$zone." ) { - unlink "$zdir/keyset-$zone." and $ep = 1 } - - for (`ls $master_dir/$zone/K*[key,private]`) { - unlink $_ and $ep = 1 - } - - if ($ep == 1) { - print "$zone: keys removed\n"; - } - - open( ZONE, "$master_dir/$zone/$zone" ) - or die "$master_dir/$zone/$zone: $!\n"; - @old_zone_content = ; - close(ZONE); - - for (@old_zone_content) { - unless (/dnssec-(ksk|zsk)/) { - push @new_zone_content, $_; - } - } - - open( ZONE, ">$master_dir/$zone/$zone" ) - or die "$master_dir/$zone/$zone: $!\n"; - print ZONE @new_zone_content; - close(ZONE); - - push @manu, $zone; - } -} - -# beendet den key-rollover -for (<$master_dir/*>) { - $zone = $_; - $zone =~ s#($master_dir/)(.*)#$2#; - - my @index = (); - my $index_wc; - - # prueft nach der ".index.zsk"-datei und erstellt den zeitpunkt - # an dem das key-rollover endet. - $status[9] - if ( -e "$master_dir/$zone/.index.zsk" ) { - @status = stat("$master_dir/$zone/.index.zsk"); - $status[9] += ( 3600 * $ablauf_zeit ); - } - else { - next; - } - - # prueft ob das key-rollover-ende erreicht ist - unless ( $status[9] < $now_time ) { - next; - } - - # prueft die anzahl der schluessel in der ".index.zsk" - # loescht alte schluessel - open( INDEX, "$master_dir/$zone/.index.zsk" ) - or die "$master_dir/$zone/.index.zsk: $!\n"; - @index = ; - $index_wc = @index; - close(INDEX); - if ( $index_wc > 1 ) { - open( INDEX, ">$master_dir/$zone/.index.zsk" ) - or die "$master_dir/$zone/.index.zsk: $!\n"; - print INDEX $index[1]; - close(INDEX); - push @auto, $zone; - } - - # prueft die anzahl der schluessel in der ".index.ksk" - # loescht alte schluessel - open( INDEX, "$master_dir/$zone/.index.ksk" ) - or die "$master_dir/$zone/.index.ksk: $!\n"; - @index = ; - $index_wc = @index; - close(INDEX); - if ( $index_wc > 1 ) { - open( INDEX, ">$master_dir/$zone/.index.ksk" ) - or die "$master_dir/$zone/.index.ksk: $!\n"; - print INDEX $index[1]; - close(INDEX); - push @auto, $zone; - } - -} - -# nach abgeschlossenem key-rollover werden fuer die entsprechende zone -# unbenoetigte schluessel entfernt und die vorhandenen schluessel in die -# zonedatei geschrieben. -for ( &del_double(@auto) ) { - my $zone = $_; - my @old_zone_content = (); - my @new_zone_content = (); - my @kkeylist = (); - my @zkeylist = (); - my $file; - - open( INDEX, "$master_dir/$zone/.index.zsk" ) - or die "$master_dir/$zone/.index.zsk: $!\n"; - @zkeylist = ; - close(INDEX); - - open( INDEX, "$master_dir/$zone/.index.ksk" ) - or die "$master_dir/$zone/.index.ksk: $!\n"; - @kkeylist = ; - close(INDEX); - - open( ZONE, "$master_dir/$zone/$zone" ) - or die "$master_dir/$zone/$zone: $!\n"; - @old_zone_content = ; - close(ZONE); - - # kuerzt die schluessel-bezeichnung aus der indexdatei auf die - # id um sie besser vergleichen zu koennen. - for ( @kkeylist, @zkeylist ) { - chomp; - s#K.*\+.*\+(.*)#$1#; - } - - # filtert alle schluessel aus der zonedatei - # old_zone_content ==> new_zone_content - for (@old_zone_content) { - unless (/dnssec-(ksk|zsk)/) { - push @new_zone_content, $_; - } - } - - # prueft alle schluesseldateien (ksk, zsk) ob sie in der jeweiligen - # indexdatei beschrieben sind. wenn nicht werden sie geloescht. - for (`ls $master_dir/$zone/K*[key,private]`) { - chomp; - $file = $_; - my $rm_count = 1; - - for (@zkeylist) { - - if ( $file =~ /$_/ ) { - $rm_count = 0; - - # schluessel die in der indexdatei standen, werden an die - # zonedatei angehangen. - if ( $file =~ /.*key/ ) { - - $file =~ s#/.*/(K.*)#$1#; - push @new_zone_content, - "\$INCLUDE \"$file\"\t\t; dnssec-zsk\n"; - - last; - } - } - } - for (@kkeylist) { - - if ( $file =~ /$_/ ) { - $rm_count = 0; - - # schluessel die in der indexdatei standen, werden an die - # zonedatei angehangen. - if ( $file =~ /.*key/ ) { - - $file =~ s#/.*/(K.*)#$1#; - push @new_zone_content, - "\$INCLUDE \"$file\"\t\t; dnssec-ksk\n"; - - last; - } - } - } - - #loescht alle unbenoetigten schluessel - if ( $rm_count == 1 ) { - print `rm -f $file`; - } - } - - open( ZONE, ">$master_dir/$zone/$zone" ) - or die "$master_dir/$zone/$zone: $!\n"; - print ZONE @new_zone_content; - close(ZONE); - - print "$master_dir/$zone/$zone wurde neu erstellt \n"; -} - -# "toucht" alle zonen damit der serial erhoht wird und die -# zone neu signiert wird -for ( &del_double( @auto, @manu ) ) { - system "touch $master_dir/$_/$_"; -} -