52 read_conf("$FindBin::Bin/dnstools.conf", "/etc/dnstools.conf"), |
52 read_conf("$FindBin::Bin/dnstools.conf", "/etc/dnstools.conf"), |
53 map { $_ => $opt{$_} } grep { defined $opt{$_} } keys %opt |
53 map { $_ => $opt{$_} } grep { defined $opt{$_} } keys %opt |
54 ); |
54 ); |
55 |
55 |
56 our @new_serial; # DO NOT USE |
56 our @new_serial; # DO NOT USE |
57 our @begin_ro_list; # liste mit zonen deren key-rollover beginnt |
|
58 our @end_ro_list; # liste mit zonen deren key-rollover fertig ist |
57 our @end_ro_list; # liste mit zonen deren key-rollover fertig ist |
59 our $bind_dir = $config{bind_dir}; |
58 our $bind_dir = $config{bind_dir}; |
60 our $conf_dir = $config{zone_conf_dir}; |
59 our $conf_dir = $config{zone_conf_dir}; |
61 our $key_counter_end = $config{key_counter_end}; |
|
62 our $ablauf_zeit = $config{abl_zeit}; |
|
63 |
60 |
64 my @candidates = @ARGV ? zones(@ARGV) : changed_zones; |
61 my @candidates = @ARGV ? zones(@ARGV) : changed_zones; |
65 push @candidates, update_index($config{indexzone}); |
62 push @candidates, update_index($config{indexzone}); |
66 push @candidates, sign_expired($config{sign_alert_time}); |
63 push @candidates, sign_expired($config{sign_alert_time}); |
|
64 |
|
65 my @need_rollover = need_rollover; |
|
66 my @done_rollover = done_rollover; |
67 ### @candidates |
67 ### @candidates |
|
68 ### @need_rollover |
|
69 ### @done_rollover |
68 exit; |
70 exit; |
69 |
71 |
70 to_begin_ro; # prueft nach beginnenden rollover-verfahren |
72 |
71 to_end_ro; # prueft nach endenden rollover-verfahren |
73 if (@need_rollover) { |
72 |
|
73 if (@begin_ro_list) { |
|
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 |
372 |
372 |
373 sub server_reload { |
373 sub server_reload { |
374 if (`rndc reload`) { print "** reload dns-server \n" } |
374 if (`rndc reload`) { print "** reload dns-server \n" } |
375 } |
375 } |
376 |
376 |
377 sub to_begin_ro { |
377 sub need_rollover() { |
378 |
378 |
379 # gibt alle zonen mit abgelaufenen keycounter in die liste @begin_ro_list |
379 # gibt alle zonen mit abgelaufenen keycounter |
380 our @begin_ro_list; |
380 my @r; |
381 our $key_counter_end; |
381 |
382 our @new_serial; |
382 while (my $kc = glob "$config{master_dir}/*/.keycounter") { |
383 my $zone; |
383 my $zone = basename dirname $kc; |
384 |
|
385 while (glob "$config{master_dir}/*") { |
|
386 chomp($zone = $_); |
|
387 my $key; |
384 my $key; |
388 |
385 |
389 unless (-f "$zone/.keycounter") { next; } |
386 { |
390 |
387 open(my $fh, $kc) or die "$kc: $!\n"; |
391 open(KEY, "$zone/.keycounter") or die "$zone/.keycounter: $!\n"; |
388 chomp($key = <$fh>); |
392 $key = <KEY>; |
389 } |
393 close(KEY); |
390 |
394 |
391 push @r, $zone if $config{key_counter_end} <= $key; |
395 # vergleicht den wert aus der keycount-datei mit dem wert aus der |
392 } |
396 #dnstools.conf (key_counter_end) |
393 |
397 if ($key_counter_end <= $key) { |
394 return @r; |
398 $zone =~ s#($config{master_dir}/)(.*)#$2#; |
395 } |
399 push @begin_ro_list, $zone; |
396 |
400 } |
397 sub done_rollover() { |
401 } |
|
402 } |
|
403 |
|
404 sub to_end_ro { |
|
405 |
398 |
406 # funktion ueberprueft ob ein keyrollover fertig ist |
399 # funktion ueberprueft ob ein keyrollover fertig ist |
407 # die bedingung dafuer ist das: |
400 # die bedingung dafuer ist das: |
408 # - eine datei .index.zsk vorhanden ist |
401 # - eine datei .index.zsk vorhanden ist |
409 # - die datei .index.zsk vor mehr x stunden geaendert wurde |
402 # - die datei .index.zsk älter ist, als die rollover-Zeit |
410 # - die datei .index.zsk ueber mehr als zwei zeilen gross ist |
403 # - die datei .index.zsk ueber mehr als eine zeile gross ist |
411 our @end_ro_list; |
404 # (also mehr als einen Schlüssel enthält) |
412 our $ablauf_zeit; |
405 my @r; |
413 chomp(my $now_time = `date +%s`); |
406 my $now = time; |
414 |
407 |
415 while (glob "$config{master_dir}/*") { |
408 while (my $dir = glob "$config{master_dir}/*") { |
416 my $zone = $_; |
409 my $zone = basename $dir; |
417 $zone =~ s#($config{master_dir}/)(.*)#$2#; |
|
418 |
410 |
419 my @index = (); |
411 my @index = (); |
420 my $index_wc; |
412 my $index_wc; |
421 my @status; |
|
422 |
413 |
423 # prueft nach der ".index.zsk"-datei und erstellt den zeitpunkt |
414 # prueft nach der ".index.zsk"-datei und erstellt den zeitpunkt |
424 # an dem das key-rollover endet. - $status[9] |
415 # an dem das key-rollover endet. |
425 if (-e "$config{master_dir}/$zone/.index.zsk") { |
416 # rollover is done when mtime of the .index.zsk + abl_zeit is |
426 @status = stat("$config{master_dir}/$zone/.index.zsk"); |
417 # in the past |
427 $status[9] += (3600 * $ablauf_zeit); |
418 next if not -e "$dir/.index.zsk"; |
428 } |
419 next if (stat _)[9] + 3600 * $config{abl_zeit} >= $now; |
429 else { next; } |
|
430 |
|
431 # $status[9] ist der zeitpunkt an dem der key-rollover endet |
|
432 # prueft ob das key-rollover-ende erreicht ist |
|
433 unless ($status[9] < $now_time) { next; } |
|
434 |
420 |
435 # prueft die anzahl der schluessel in der .index.zsk |
421 # prueft die anzahl der schluessel in der .index.zsk |
436 open(INDEX, "$config{master_dir}/$zone/.index.zsk") |
422 open(my $fh, "$dir/.index.zsk") or die "$dir/.index.zsk: $!\n"; |
437 or die "$config{master_dir}/$zone/.index.zsk: $!\n"; |
423 (<$fh>); |
438 @index = <INDEX>; |
424 push @r, $zone if $. > 1; |
439 $index_wc = @index; |
425 } |
440 close(INDEX); |
426 |
441 if ($index_wc > 1) { push @end_ro_list, $zone; } |
427 return @r; |
442 } |
|
443 } |
428 } |
444 |
429 |
445 sub begin_ro { |
430 sub begin_ro { |
446 |
431 |
447 # anfang des key-rollovers |
432 # anfang des key-rollovers |