# HG changeset patch # User Heiko Schlittermann # Date 1293546905 -3600 # Node ID d33fd3eee4691d3621b131badae94e0fdc2bfbe1 # Parent 6af96ec29ada91681ed0d7a111a07e5558c054d2 imported patch rollover diff -r 6af96ec29ada -r d33fd3eee469 update-serial.pl --- a/update-serial.pl Tue Dec 28 15:23:35 2010 +0100 +++ b/update-serial.pl Tue Dec 28 15:35:05 2010 +0100 @@ -17,14 +17,14 @@ sub changed_zones(); sub update_index($); sub sign_expired($); +sub need_rollover(); +sub done_rollover(); sub sign_zone; sub update_serial; sub mk_zone_conf; sub file_entry; sub server_reload; -sub to_begin_ro; -sub to_end_ro; sub begin_ro; sub key_to_zonefile; sub kill_useless_keys; @@ -54,23 +54,23 @@ ); our @new_serial; # DO NOT USE - our @begin_ro_list; # liste mit zonen deren key-rollover beginnt our @end_ro_list; # liste mit zonen deren key-rollover fertig ist our $bind_dir = $config{bind_dir}; our $conf_dir = $config{zone_conf_dir}; - our $key_counter_end = $config{key_counter_end}; - our $ablauf_zeit = $config{abl_zeit}; my @candidates = @ARGV ? zones(@ARGV) : changed_zones; push @candidates, update_index($config{indexzone}); push @candidates, sign_expired($config{sign_alert_time}); + + my @need_rollover = need_rollover; + my @done_rollover = done_rollover; ### @candidates + ### @need_rollover + ### @done_rollover exit; - to_begin_ro; # prueft nach beginnenden rollover-verfahren - to_end_ro; # prueft nach endenden rollover-verfahren - if (@begin_ro_list) { + if (@need_rollover) { begin_ro; # eine rollover-beginn-sequenz } @@ -374,72 +374,57 @@ if (`rndc reload`) { print "** reload dns-server \n" } } -sub to_begin_ro { +sub need_rollover() { - # gibt alle zonen mit abgelaufenen keycounter in die liste @begin_ro_list - our @begin_ro_list; - our $key_counter_end; - our @new_serial; - my $zone; + # gibt alle zonen mit abgelaufenen keycounter + my @r; - while (glob "$config{master_dir}/*") { - chomp($zone = $_); + while (my $kc = glob "$config{master_dir}/*/.keycounter") { + my $zone = basename dirname $kc; my $key; - unless (-f "$zone/.keycounter") { next; } - - open(KEY, "$zone/.keycounter") or die "$zone/.keycounter: $!\n"; - $key = ; - close(KEY); + { + open(my $fh, $kc) or die "$kc: $!\n"; + chomp($key = <$fh>); + } - # vergleicht den wert aus der keycount-datei mit dem wert aus der - #dnstools.conf (key_counter_end) - if ($key_counter_end <= $key) { - $zone =~ s#($config{master_dir}/)(.*)#$2#; - push @begin_ro_list, $zone; - } + push @r, $zone if $config{key_counter_end} <= $key; } + + return @r; } -sub to_end_ro { +sub done_rollover() { # funktion ueberprueft ob ein keyrollover fertig ist # die bedingung dafuer ist das: # - eine datei .index.zsk vorhanden ist - # - die datei .index.zsk vor mehr x stunden geaendert wurde - # - die datei .index.zsk ueber mehr als zwei zeilen gross ist - our @end_ro_list; - our $ablauf_zeit; - chomp(my $now_time = `date +%s`); + # - die datei .index.zsk älter ist, als die rollover-Zeit + # - die datei .index.zsk ueber mehr als eine zeile gross ist + # (also mehr als einen Schlüssel enthält) + my @r; + my $now = time; - while (glob "$config{master_dir}/*") { - my $zone = $_; - $zone =~ s#($config{master_dir}/)(.*)#$2#; + while (my $dir = glob "$config{master_dir}/*") { + my $zone = basename $dir; my @index = (); my $index_wc; - my @status; # prueft nach der ".index.zsk"-datei und erstellt den zeitpunkt - # an dem das key-rollover endet. - $status[9] - if (-e "$config{master_dir}/$zone/.index.zsk") { - @status = stat("$config{master_dir}/$zone/.index.zsk"); - $status[9] += (3600 * $ablauf_zeit); - } - else { next; } - - # $status[9] ist der zeitpunkt an dem der key-rollover endet - # prueft ob das key-rollover-ende erreicht ist - unless ($status[9] < $now_time) { next; } + # an dem das key-rollover endet. + # rollover is done when mtime of the .index.zsk + abl_zeit is + # in the past + next if not -e "$dir/.index.zsk"; + next if (stat _)[9] + 3600 * $config{abl_zeit} >= $now; # prueft die anzahl der schluessel in der .index.zsk - open(INDEX, "$config{master_dir}/$zone/.index.zsk") - or die "$config{master_dir}/$zone/.index.zsk: $!\n"; - @index = ; - $index_wc = @index; - close(INDEX); - if ($index_wc > 1) { push @end_ro_list, $zone; } + open(my $fh, "$dir/.index.zsk") or die "$dir/.index.zsk: $!\n"; + (<$fh>); + push @r, $zone if $. > 1; } + + return @r; } sub begin_ro {