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 |