update-serial.pl
branchhs12
changeset 57 d33fd3eee469
parent 56 6af96ec29ada
child 58 3d3e09a0c028
--- 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 = <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>;
-        $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 {