dnssec-killkey
changeset 27 d5337081ed02
parent 26 0342c09abf97
child 29 ef4b45dd7618
equal deleted inserted replaced
26:0342c09abf97 27:d5337081ed02
     1 #!/usr/bin/perl -w
     1 #!/usr/bin/perl -w
     2 
     2 
     3 use strict;
     3 use strict;
     4 use FindBin;
     4 use FindBin;
     5 
     5 
     6 
       
     7 # liest die Konfiguration ein
     6 # liest die Konfiguration ein
     8 my @configs = ("$FindBin::Bin/dnstools.conf", "/etc/dnstools.conf");
     7 my @configs = ( "$FindBin::Bin/dnstools.conf", "/etc/dnstools.conf" );
     9 my %config;
     8 my %config;
    10 
     9 
    11 for (grep {-f} @configs) {
    10 for ( grep {-f} @configs ) {
    12         open(CONFIG, $_) or die "Can't open $_: $!\n";
    11     open( CONFIG, $_ ) or die "Can't open $_: $!\n";
    13 }
    12 }
    14 
    13 
    15 unless (seek(CONFIG,0 ,0 )) {
    14 unless ( seek( CONFIG, 0, 0 ) ) {
    16         die "Can't open config (searched: @configs)\n"
    15     die "Can't open config (searched: @configs)\n";
    17 }
    16 }
    18 
    17 
    19 while (<CONFIG>) {
    18 while (<CONFIG>) {
    20         chomp;
    19     chomp;
    21         s/#.*//;
    20     s/#.*//;
    22         s/\t//g;
    21     s/\t//g;
    23         s/\s//g;
    22     s/\s//g;
    24 
    23 
    25         next unless length;
    24     next unless length;
    26         my ($cname, $ccont) = split (/\s*=\s*/, $_,2);
    25     my ( $cname, $ccont ) = split( /\s*=\s*/, $_, 2 );
    27         $config{$cname} = $ccont;
    26     $config{$cname} = $ccont;
    28 }
    27 }
    29 close (CONFIG);
    28 close(CONFIG);
    30 
    29 
    31 my $master_dir = $config{master_dir};
    30 my $master_dir  = $config{master_dir};
    32 my $ablauf_zeit = $config{abl_zeit};
    31 my $ablauf_zeit = $config{abl_zeit};
    33 my $zone;
    32 my $zone;
    34 my @status;
    33 my @status;
    35 my @auto;
    34 my @auto;
    36 chomp (my $now_time=`date +%s`);	# aktuelle unixzeit
    35 chomp( my $now_time = `date +%s` );    # aktuelle unixzeit
    37 
       
    38 
    36 
    39 # prueft zonen aus ARGV und loescht das schluesselmaterial
    37 # prueft zonen aus ARGV und loescht das schluesselmaterial
    40 for (@ARGV) {
    38 for (@ARGV) {
    41         chomp ($zone = `idn --quiet $_`);
    39     chomp( $zone = `idn --quiet $_` );
    42 	my $zdir = "$master_dir/$zone";
    40     my $zdir = "$master_dir/$zone";
    43 	unless (-e "$master_dir/$zone") {
    41     unless ( -e "$master_dir/$zone" ) {
    44                 print "$zone ist keine verwaltete zone \n";
    42         print "$zone ist keine verwaltete zone \n";
    45         } else {
    43     }
    46 		if (-e "$zdir/$zone.signed") { unlink "$zdir/$zone.signed"}
    44     else {
    47 		if (-e "$zdir/.keycounter") { unlink "$zdir/.keycounter"}
    45         if ( -e "$zdir/$zone.signed" )  { unlink "$zdir/$zone.signed" }
    48 		if (-e "$zdir/.index.ksk") { unlink "$zdir/.index.ksk"}
    46         if ( -e "$zdir/.keycounter" )   { unlink "$zdir/.keycounter" }
    49 		if (-e "$zdir/.index.zsk") { unlink "$zdir/.index.zsk"}
    47         if ( -e "$zdir/.index.ksk" )    { unlink "$zdir/.index.ksk" }
    50 		if (-e "$zdir/dsset-$zone.") { unlink "$zdir/dsset-$zone."}
    48         if ( -e "$zdir/.index.zsk" )    { unlink "$zdir/.index.zsk" }
    51 		if (-e "$zdir/keyset-$zone.") { unlink "$zdir/keyset-$zone."}
    49         if ( -e "$zdir/dsset-$zone." )  { unlink "$zdir/dsset-$zone." }
    52 		for (`ls $master_dir/$zone/K*[key,private]`){ unlink $_}
    50         if ( -e "$zdir/keyset-$zone." ) { unlink "$zdir/keyset-$zone." }
    53         }
    51         for (`ls $master_dir/$zone/K*[key,private]`) { unlink $_ }
       
    52     }
    54 }
    53 }
    55 
    54 
    56 # beendet den key-rollover
    55 # beendet den key-rollover
    57 for (<$master_dir/*>) {
    56 for (<$master_dir/*>) {
    58 	$zone = $_;
    57     $zone = $_;
    59 	$zone =~ s#($master_dir/)(.*)#$2#;
    58     $zone =~ s#($master_dir/)(.*)#$2#;
    60 
    59 
    61 	my @index = ();
    60     my @index = ();
    62 	my $index_wc;
    61     my $index_wc;
    63 
    62 
    64 	# prueft nach der ".index.zsk"-datei und erstellt den zeitpunkt
    63     # prueft nach der ".index.zsk"-datei und erstellt den zeitpunkt
    65 	# an dem das key-rollover endet. - $status[9]
    64     # an dem das key-rollover endet. - $status[9]
    66 	if (-e "$master_dir/$zone/.index.zsk") {
    65     if ( -e "$master_dir/$zone/.index.zsk" ) {
    67 		@status = stat("$master_dir/$zone/.index.zsk");
    66         @status = stat("$master_dir/$zone/.index.zsk");
    68 		$status[9] += (3600 * $ablauf_zeit);
    67         $status[9] += ( 3600 * $ablauf_zeit );
    69 	}
    68     }
    70 	else {
    69     else {
    71 		next;
    70         next;
    72 	}
    71     }
    73 
    72 
    74 	# prueft ob das key-rollover-ende erreicht ist
    73     # prueft ob das key-rollover-ende erreicht ist
    75 	unless ($status[9] < $now_time ) {
    74     unless ( $status[9] < $now_time ) {
    76 		next;
    75         next;
    77 	}
    76     }
    78 
    77 
    79 	# prueft die anzahl der schluessel in der ".index.zsk"
    78     # prueft die anzahl der schluessel in der ".index.zsk"
    80 	# loescht alte schluessel
    79     # loescht alte schluessel
    81 	open (INDEX, "$master_dir/$zone/.index.zsk") or die "$master_dir/$zone/.index.zsk: $!\n";
    80     open( INDEX, "$master_dir/$zone/.index.zsk" )
    82 	@index = <INDEX>;
    81         or die "$master_dir/$zone/.index.zsk: $!\n";
    83 	$index_wc = @index;
    82     @index    = <INDEX>;
    84 	close (INDEX);
    83     $index_wc = @index;
    85 	if ($index_wc > 1) {
    84     close(INDEX);
    86 		open (INDEX, ">$master_dir/$zone/.index.zsk")or die "$master_dir/$zone/.index.zsk: $!\n";
    85     if ( $index_wc > 1 ) {
    87 		print INDEX $index[1];
    86         open( INDEX, ">$master_dir/$zone/.index.zsk" )
    88 		close (INDEX);
    87             or die "$master_dir/$zone/.index.zsk: $!\n";
    89 		push @auto, $zone;
    88         print INDEX $index[1];
    90 	}
    89         close(INDEX);
       
    90         push @auto, $zone;
       
    91     }
    91 
    92 
    92 	# prueft die anzahl der schluessel in der ".index.ksk"
    93     # prueft die anzahl der schluessel in der ".index.ksk"
    93 	# loescht alte schluessel
    94     # loescht alte schluessel
    94 	open (INDEX, "$master_dir/$zone/.index.ksk") or die "$master_dir/$zone/.index.ksk: $!\n";
    95     open( INDEX, "$master_dir/$zone/.index.ksk" )
    95 	@index = <INDEX>;
    96         or die "$master_dir/$zone/.index.ksk: $!\n";
    96 	$index_wc = @index;
    97     @index    = <INDEX>;
    97 	close (INDEX);
    98     $index_wc = @index;
    98 	if ($index_wc > 1) {
    99     close(INDEX);
    99 		open (INDEX, ">$master_dir/$zone/.index.ksk") or die "$master_dir/$zone/.index.ksk: $!\n";
   100     if ( $index_wc > 1 ) {
   100 		print INDEX $index[1];
   101         open( INDEX, ">$master_dir/$zone/.index.ksk" )
   101 		close (INDEX);
   102             or die "$master_dir/$zone/.index.ksk: $!\n";
   102 		push @auto, $zone;
   103         print INDEX $index[1];
   103 	}
   104         close(INDEX);
       
   105         push @auto, $zone;
       
   106     }
   104 
   107 
   105 }
   108 }
   106 
   109 
   107 # nach abgeschlossenem key-rollover werden fuer die entsprechende zone
   110 # nach abgeschlossenem key-rollover werden fuer die entsprechende zone
   108 # unbenoetigte schluessel entfernt und die vorhandenen schluessel in die
   111 # unbenoetigte schluessel entfernt und die vorhandenen schluessel in die
   109 # zonedatei geschrieben.
   112 # zonedatei geschrieben.
   110 for (@auto) {
   113 for (@auto) {
   111 	my $zone = $_;
   114     my $zone             = $_;
   112 	my @old_zone_content = ();
   115     my @old_zone_content = ();
   113 	my @new_zone_content = ();
   116     my @new_zone_content = ();
   114 	my @keylist = ();
   117     my @keylist          = ();
   115 	my $file;
   118     my $file;
   116 
   119 
   117 	open (INDEX, "$master_dir/$zone/.index.zsk") or die "$master_dir/$zone/.index.zsk: $!\n";
   120     open( INDEX, "$master_dir/$zone/.index.zsk" )
   118 	@keylist = <INDEX>;
   121         or die "$master_dir/$zone/.index.zsk: $!\n";
   119 	close (INDEX);
   122     @keylist = <INDEX>;
       
   123     close(INDEX);
   120 
   124 
   121 	open (INDEX, "$master_dir/$zone/.index.ksk") or die "$master_dir/$zone/.index.ksk: $!\n";
   125     open( INDEX, "$master_dir/$zone/.index.ksk" )
   122 	push @keylist, <INDEX>;
   126         or die "$master_dir/$zone/.index.ksk: $!\n";
   123 	close (INDEX);
   127     push @keylist, <INDEX>;
       
   128     close(INDEX);
   124 
   129 
   125 	open (ZONE, "$master_dir/$zone/$zone") or die "$master_dir/$zone/$zone: $!\n";
   130     open( ZONE, "$master_dir/$zone/$zone" )
   126 	@old_zone_content = <ZONE>;
   131         or die "$master_dir/$zone/$zone: $!\n";
   127 	close (ZONE);
   132     @old_zone_content = <ZONE>;
       
   133     close(ZONE);
   128 
   134 
   129 	# kuerzt die schluessel-bezeichnung aus der indexdatei auf die
   135     # kuerzt die schluessel-bezeichnung aus der indexdatei auf die
   130 	# id um sie besser vergleichen zu koennen.
   136     # id um sie besser vergleichen zu koennen.
   131 	for (@keylist) {
   137     for (@keylist) {
   132 		chomp;
   138         chomp;
   133 		s#K.*\+.*\+(.*)#$1#;
   139         s#K.*\+.*\+(.*)#$1#;
   134 	}
   140     }
   135 
   141 
   136 	# filtert alle schluessel aus der zonedatei
   142     # filtert alle schluessel aus der zonedatei
   137 	# old_zone_content ==> new_zone_content
   143     # old_zone_content ==> new_zone_content
   138 	for (@old_zone_content) {
   144     for (@old_zone_content) {
   139 		unless (/IN\sDNSKEY/) {
   145         unless (/IN\sDNSKEY/) {
   140 			push @new_zone_content, $_;
   146             push @new_zone_content, $_;
   141 		}
   147         }
   142 	}
   148     }
   143 
   149 
   144 	# prueft alle schluesseldateien (ksk, zsk) ob sie in der jeweiligen
   150     # prueft alle schluesseldateien (ksk, zsk) ob sie in der jeweiligen
   145 	# indexdatei beschrieben sind. wenn nicht werden sie geloescht.
   151     # indexdatei beschrieben sind. wenn nicht werden sie geloescht.
   146 	for (`ls $master_dir/$zone/K*[key,private]`){
   152     for (`ls $master_dir/$zone/K*[key,private]`) {
   147 		chomp;
   153         chomp;
   148 		$file = $_;
   154         $file = $_;
   149 		my $rm_count = 1;
   155         my $rm_count = 1;
   150 
   156 
   151 		for (@keylist) {
   157         for (@keylist) {
   152 
   158 
   153 			if ($file =~ /$_/) {
   159             if ( $file =~ /$_/ ) {
   154 				$rm_count = 0;
   160                 $rm_count = 0;
   155 
   161 
   156 				# schluessel die in der indexdatei standen, werden an die
   162                 # schluessel die in der indexdatei standen, werden an die
   157 				# zonedatei angehangen.
   163                 # zonedatei angehangen.
   158 				if ($file =~ /.*key/) {
   164                 if ( $file =~ /.*key/ ) {
   159 					open (KEYFILE, "$file") or die "$file: $!\n";
   165                     open( KEYFILE, "$file" ) or die "$file: $!\n";
   160 					push @new_zone_content, <KEYFILE>;
   166                     push @new_zone_content, <KEYFILE>;
   161 					close (KEYFILE);
   167                     close(KEYFILE);
   162 					
       
   163 					last;
       
   164 				}
       
   165 			}
       
   166 		}
       
   167 
   168 
   168 		#loescht alle unbenoetigten schluessel
   169                     last;
   169 		if ($rm_count == 1) {
   170                 }
   170 			print `rm -f $file`;
   171             }
   171 		}
   172         }
   172 	}
       
   173 
   173 
   174 	open (ZONE, ">$master_dir/$zone/$zone") or die "$master_dir/$zone/$zone: $!\n";
   174         #loescht alle unbenoetigten schluessel
   175 	print ZONE @new_zone_content;
   175         if ( $rm_count == 1 ) {
   176 	close (ZONE);
   176             print `rm -f $file`;
   177 	
   177         }
   178 	print "$master_dir/$zone/$zone wurde neu erstellt \n";
   178     }
       
   179 
       
   180     open( ZONE, ">$master_dir/$zone/$zone" )
       
   181         or die "$master_dir/$zone/$zone: $!\n";
       
   182     print ZONE @new_zone_content;
       
   183     close(ZONE);
       
   184 
       
   185     print "$master_dir/$zone/$zone wurde neu erstellt \n";
   179 }
   186 }