update-serial.pl
branchhs12
changeset 58 3d3e09a0c028
parent 57 d33fd3eee469
child 59 35a116258422
equal deleted inserted replaced
57:d33fd3eee469 58:3d3e09a0c028
     1 #!/usr/bin/perl 
     1 #!/usr/bin/perl 
     2 
     2 
     3 use v5.10;
     3 use v5.10;
     4 use strict;
     4 use strict;
     5 use warnings;
     5 use warnings;
       
     6 
     6 use FindBin;
     7 use FindBin;
     7 use File::Basename;
     8 use File::Basename;
     8 use Pod::Usage;
     9 use Pod::Usage;
     9 use Getopt::Long;
    10 use Getopt::Long;
    10 use Smart::Comments;
    11 use Smart::Comments;
    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