51 %config = ( |
52 %config = ( |
52 read_conf("$FindBin::Bin/dnstools.conf", "/etc/dnstools.conf"), |
53 read_conf("$FindBin::Bin/dnstools.conf", "/etc/dnstools.conf"), |
53 map { $_ => $opt{$_} } grep { defined $opt{$_} } keys %opt |
54 map { $_ => $opt{$_} } grep { defined $opt{$_} } keys %opt |
54 ); |
55 ); |
55 |
56 |
56 our @new_serial; # DO NOT USE |
57 our @new_serial; # DO NOT USE |
57 our @end_ro_list; # liste mit zonen deren key-rollover fertig ist |
58 our @end_ro_list; # liste mit zonen deren key-rollover fertig ist |
58 our $bind_dir = $config{bind_dir}; |
59 our $bind_dir = $config{bind_dir}; |
59 our $conf_dir = $config{zone_conf_dir}; |
60 our $conf_dir = $config{zone_conf_dir}; |
60 |
61 |
61 my @candidates = @ARGV ? zones(@ARGV) : changed_zones; |
62 my @candidates = @ARGV ? zones(@ARGV) : changed_zones; |
62 push @candidates, update_index($config{indexzone}); |
63 push @candidates, update_index($config{indexzone}); |
63 push @candidates, sign_expired($config{sign_alert_time}); |
64 push @candidates, sign_expired($config{sign_alert_time}); |
64 |
65 |
67 ### @candidates |
68 ### @candidates |
68 ### @need_rollover |
69 ### @need_rollover |
69 ### @done_rollover |
70 ### @done_rollover |
70 exit; |
71 exit; |
71 |
72 |
72 |
|
73 if (@need_rollover) { |
73 if (@need_rollover) { |
74 begin_ro; # eine rollover-beginn-sequenz |
74 begin_ro; # eine rollover-beginn-sequenz |
75 } |
75 } |
76 |
76 |
77 if (@end_ro_list) { |
77 if (@end_ro_list) { |
78 end_ro; # eine rollover-end-squenz |
78 end_ro; # eine rollover-end-squenz |
79 } |
79 } |
80 |
80 |
81 if (@new_serial) { |
81 if (@new_serial) { |
82 |
82 |
83 #--update_index; # index zone aktuallisieren |
83 #--update_index; # index zone aktuallisieren |
84 update_serial; # serial aktuallisieren |
84 update_serial; # serial aktuallisieren |
85 sign_zone; # zone signieren |
85 sign_zone; # zone signieren |
86 } |
86 } |
87 |
87 |
88 file_entry; # bearbeitet die file-eintraege der konfigurations-datei |
88 file_entry; # bearbeitet die file-eintraege der konfigurations-datei |
89 mk_zone_conf; # konfiguration zusammenfuegen |
89 mk_zone_conf; # konfiguration zusammenfuegen |
90 server_reload; # server neu laden |
90 server_reload; # server neu laden |
164 sub sign_expired($) { |
164 sub sign_expired($) { |
165 my $sign_alert_time = shift; # the time between the end and the new signing |
165 my $sign_alert_time = shift; # the time between the end and the new signing |
166 # (see external configuration) |
166 # (see external configuration) |
167 my @r; |
167 my @r; |
168 |
168 |
169 # erzeugt $time (die zeit ab der neu signiert werden soll) |
169 # erzeugt $time (die zeit ab der neu signiert werden soll) |
170 # ... warum eigentlich nur bis zu den Stunden und nicht auch Minuten und Sekunden? |
170 # ... warum eigentlich nur bis zu den Stunden und nicht auch Minuten und Sekunden? |
171 my $time = strftime("%Y%m%d%H" => localtime time + 3600 * $sign_alert_time); |
171 my $time = strftime("%Y%m%d%H" => localtime time + 3600 * $sign_alert_time); |
172 |
172 |
173 ## vergleicht fuer alle zonen im ordner $config{master_dir} mit einer |
173 ## vergleicht fuer alle zonen im ordner $config{master_dir} mit einer |
174 ## <zone>.signed-datei den zeitpunkt in $time mit dem ablaufdatum der |
174 ## <zone>.signed-datei den zeitpunkt in $time mit dem ablaufdatum der |
175 ## signatur, welcher aus der datei <zone>.signed ausgelesen wird. |
175 ## signatur, welcher aus der datei <zone>.signed ausgelesen wird. |
176 ZONE: while (my $dir = glob "$config{master_dir}/*") { |
176 ZONE: while (my $dir = glob "$config{master_dir}/*") { |
177 my $zone = basename $dir; |
177 my $zone = basename $dir; |
178 |
178 |
179 next if not -e "$dir/$zone.signed"; |
179 next if not -e "$dir/$zone.signed"; |
180 |
180 |
181 open(my $fh, "$dir/$zone.signed") or die "Can't open $dir/$zone.signed: $!\n"; |
181 open(my $fh, "$dir/$zone.signed") |
182 push @r, $zone if |
182 or die "Can't open $dir/$zone.signed: $!\n"; |
183 /RRSIG\s+SOA[\d ]+(\d{10})\d{4}\s+\(/ ~~ [<$fh>] |
183 push @r, $zone |
184 and $1 < $time; |
184 if /RRSIG\s+SOA[\d ]+(\d{10})\d{4}\s+\(/ ~~ [<$fh>] |
|
185 and $1 < $time; |
185 } |
186 } |
186 |
187 |
187 return @r; |
188 return @r; |
188 } |
189 } |
189 |
190 |
381 |
382 |
382 while (my $kc = glob "$config{master_dir}/*/.keycounter") { |
383 while (my $kc = glob "$config{master_dir}/*/.keycounter") { |
383 my $zone = basename dirname $kc; |
384 my $zone = basename dirname $kc; |
384 my $key; |
385 my $key; |
385 |
386 |
386 { |
387 { |
387 open(my $fh, $kc) or die "$kc: $!\n"; |
388 open(my $fh, $kc) or die "$kc: $!\n"; |
388 chomp($key = <$fh>); |
389 chomp($key = <$fh>); |
389 } |
390 } |
390 |
391 |
391 push @r, $zone if $config{key_counter_end} <= $key; |
392 push @r, $zone if $config{key_counter_end} <= $key; |
392 } |
393 } |
393 |
394 |
394 return @r; |
395 return @r; |
395 } |
396 } |
396 |
397 |
399 # funktion ueberprueft ob ein keyrollover fertig ist |
400 # funktion ueberprueft ob ein keyrollover fertig ist |
400 # die bedingung dafuer ist das: |
401 # die bedingung dafuer ist das: |
401 # - eine datei .index.zsk vorhanden ist |
402 # - eine datei .index.zsk vorhanden ist |
402 # - die datei .index.zsk älter ist, als die rollover-Zeit |
403 # - die datei .index.zsk älter ist, als die rollover-Zeit |
403 # - die datei .index.zsk ueber mehr als eine zeile gross ist |
404 # - die datei .index.zsk ueber mehr als eine zeile gross ist |
404 # (also mehr als einen Schlüssel enthält) |
405 # (also mehr als einen Schlüssel enthält) |
405 my @r; |
406 my @r; |
406 my $now = time; |
407 my $now = time; |
407 |
408 |
408 while (my $dir = glob "$config{master_dir}/*") { |
409 while (my $dir = glob "$config{master_dir}/*") { |
409 my $zone = basename $dir; |
410 my $zone = basename $dir; |
410 |
411 |
411 my @index = (); |
412 my @index = (); |
412 my $index_wc; |
413 my $index_wc; |
413 |
414 |
414 # prueft nach der ".index.zsk"-datei und erstellt den zeitpunkt |
415 # prueft nach der ".index.zsk"-datei und erstellt den zeitpunkt |
415 # an dem das key-rollover endet. |
416 # an dem das key-rollover endet. |
416 # rollover is done when mtime of the .index.zsk + abl_zeit is |
417 # rollover is done when mtime of the .index.zsk + abl_zeit is |
417 # in the past |
418 # in the past |
418 next if not -e "$dir/.index.zsk"; |
419 next if not -e "$dir/.index.zsk"; |
419 next if (stat _)[9] + 3600 * $config{abl_zeit} >= $now; |
420 next if (stat _)[9] + 3600 * $config{abl_zeit} >= $now; |
420 |
421 |
421 # prueft die anzahl der schluessel in der .index.zsk |
422 # prueft die anzahl der schluessel in der .index.zsk |
422 open(my $fh, "$dir/.index.zsk") or die "$dir/.index.zsk: $!\n"; |
423 open(my $fh, "$dir/.index.zsk") or die "$dir/.index.zsk: $!\n"; |
423 (<$fh>); |
424 (<$fh>); |
424 push @r, $zone if $. > 1; |
425 push @r, $zone if $. > 1; |
425 } |
426 } |
426 |
427 |
427 return @r; |
428 return @r; |
428 } |
429 } |
429 |
430 |