dnssec-sign
changeset 38 d50f6874b7ab
parent 37 d3158de72598
child 39 8b46e7c48995
child 43 7e472c559b36
child 45 5dc44dc86f61
equal deleted inserted replaced
37:d3158de72598 38:d50f6874b7ab
     1 #!/usr/bin/perl 
       
     2 
       
     3 use strict;
       
     4 use warnings;
       
     5 use FindBin;
       
     6 
       
     7 sub del_double {
       
     8     my %all;
       
     9     grep { $all{$_} = 0 } @_;
       
    10     return ( keys %all );
       
    11 }
       
    12 
       
    13 # liest die Konfiguration ein
       
    14 my @configs = ( "$FindBin::Bin/dnstools.conf", "/etc/dnstools.conf" );
       
    15 my %config;
       
    16 
       
    17 for ( grep {-f} @configs ) {
       
    18     open( CONFIG, $_ ) or die "Can't open $_: $!\n";
       
    19 }
       
    20 
       
    21 unless ( seek( CONFIG, 0, 0 ) ) {
       
    22     die "Can't open config (searched: @configs)\n";
       
    23 }
       
    24 
       
    25 while (<CONFIG>) {
       
    26     chomp;
       
    27     s/#.*//;
       
    28     s/\t//g;
       
    29     s/\s//g;
       
    30 
       
    31     next unless length;
       
    32     my ( $cname, $ccont ) = split( /\s*=\s*/, $_, 2 );
       
    33     $config{$cname} = $ccont;
       
    34 }
       
    35 close(CONFIG);
       
    36 
       
    37 my $master_dir      = $config{master_dir};
       
    38 my $sign_alert_time = $config{sign_alert_time};
       
    39 my $zone;
       
    40 my ( @manu, @auto );
       
    41 my @zone_sig_content;
       
    42 my $sig_date;
       
    43 my $kc;
       
    44 my $serial_up = 0;
       
    45 
       
    46 for (@ARGV) {
       
    47     if ( $_ eq "-s" ) {
       
    48         $serial_up = 1;
       
    49         shift @ARGV;
       
    50     }
       
    51 }
       
    52 
       
    53 # prueft zonen aus ARGV und fuegt sie in die liste @manu ein
       
    54 for (@ARGV) {
       
    55     chomp( my $zone = `idn --quiet "$_"` );
       
    56 
       
    57     if ( -e "$master_dir/$zone/.keycounter" ) {
       
    58         push @manu, $zone;
       
    59     }
       
    60 }
       
    61 
       
    62 chomp( my $unixtime = `date +%s` );
       
    63 $unixtime = $unixtime + ( 3600 * $sign_alert_time );
       
    64 my $time = `date -d \@$unixtime +%Y%m%d%H`;
       
    65 
       
    66 # vergleicht fuer alle zonen im ordner $master_dir mit einer
       
    67 # <zone>.signed-datei den zeitpunkt in $time mit dem ablaufdatum der
       
    68 # signatur, welcher aus der datei <zone>.signed ausgelesen wird.
       
    69 for (<$master_dir/*>) {
       
    70     s#($master_dir/)(.*)#$2#;
       
    71     $zone = $_;
       
    72 
       
    73     if ( -e "$master_dir/$zone/$zone.signed" ) {
       
    74 
       
    75         open( ZONE, "$master_dir/$zone/$zone.signed" );
       
    76         @zone_sig_content = <ZONE>;
       
    77         close(ZONE);
       
    78 
       
    79         for (@zone_sig_content) {
       
    80             if (m#SOA.*[0-9]{14}#) {
       
    81                 s#.*([0-9]{10})([0-9]{4}).*#$1#;
       
    82                 if ( $_ < $time ) {
       
    83                     push @auto, $zone;
       
    84                     `touch $master_dir/$zone/$zone`
       
    85                 }
       
    86             }
       
    87         }
       
    88     }
       
    89 }
       
    90 
       
    91 #gibt zonen mit schluessel aber ohne signatur in die liste @auto
       
    92 #for (<$master_dir/*>) {
       
    93 #    s#($master_dir/)(.*)#$2#;
       
    94 #    $zone = $_;
       
    95 #
       
    96 #    if ( -e "$master_dir/$zone/.keycounter" ) {
       
    97 #
       
    98 #        open( KC, "$master_dir/$zone/.keycounter" );
       
    99 #        $kc = <KC>;
       
   100 #        close(KC);
       
   101 #
       
   102 #        if ( $kc < 1 ) {
       
   103 #            push @auto, $zone;
       
   104 #        }
       
   105 #    }
       
   106 #}
       
   107 
       
   108 # signiert alle zonen in @auto und @manu und erhoeht den wert in
       
   109 # der keycounter-datei
       
   110 for ( &del_double( @auto, @manu ) ) {
       
   111     $zone = $_;
       
   112 
       
   113     chdir "$master_dir/$zone";
       
   114 
       
   115     if (`dnssec-signzone $zone 2>/dev/null`) {
       
   116         print "$zone neu signiert \n";
       
   117 
       
   118         open( KC, "$master_dir/$zone/.keycounter" );
       
   119         $kc = <KC>;
       
   120         close(KC);
       
   121         $kc += 1;
       
   122         open( KC, ">$master_dir/$zone/.keycounter" );
       
   123         print KC $kc;
       
   124         close(KC);
       
   125 
       
   126     }
       
   127     else {
       
   128         print "$zone konnte nicht signiert werden \n";
       
   129     }
       
   130 }
       
   131