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