update-serial.pl
branchhs12
changeset 57 d33fd3eee469
parent 56 6af96ec29ada
child 58 3d3e09a0c028
equal deleted inserted replaced
56:6af96ec29ada 57:d33fd3eee469
    15 sub read_conf(@);
    15 sub read_conf(@);
    16 sub zones(@);
    16 sub zones(@);
    17 sub changed_zones();
    17 sub changed_zones();
    18 sub update_index($);
    18 sub update_index($);
    19 sub sign_expired($);
    19 sub sign_expired($);
       
    20 sub need_rollover();
       
    21 sub done_rollover();
    20 
    22 
    21 sub sign_zone;
    23 sub sign_zone;
    22 sub update_serial;
    24 sub update_serial;
    23 sub mk_zone_conf;
    25 sub mk_zone_conf;
    24 sub file_entry;
    26 sub file_entry;
    25 sub server_reload;
    27 sub server_reload;
    26 sub to_begin_ro;
       
    27 sub to_end_ro;
       
    28 sub begin_ro;
    28 sub begin_ro;
    29 sub key_to_zonefile;
    29 sub key_to_zonefile;
    30 sub kill_useless_keys;
    30 sub kill_useless_keys;
    31 sub end_ro;
    31 sub end_ro;
    32 
    32 
    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