1 #!/usr/bin/perl -w |
1 #!/usr/bin/perl -w |
2 |
2 |
3 use strict; |
3 use strict; |
4 use FindBin; |
4 use FindBin; |
5 |
5 |
6 |
|
7 # liest die Konfiguration ein |
6 # liest die Konfiguration ein |
8 my @configs = ("$FindBin::Bin/dnstools.conf", "/etc/dnstools.conf"); |
7 my @configs = ( "$FindBin::Bin/dnstools.conf", "/etc/dnstools.conf" ); |
9 my %config; |
8 my %config; |
10 |
9 |
11 for (grep {-f} @configs) { |
10 for ( grep {-f} @configs ) { |
12 open(CONFIG, $_) or die "Can't open $_: $!\n"; |
11 open( CONFIG, $_ ) or die "Can't open $_: $!\n"; |
13 } |
12 } |
14 |
13 |
15 unless (seek(CONFIG,0 ,0 )) { |
14 unless ( seek( CONFIG, 0, 0 ) ) { |
16 die "Can't open config (searched: @configs)\n" |
15 die "Can't open config (searched: @configs)\n"; |
17 } |
16 } |
18 |
17 |
19 while (<CONFIG>) { |
18 while (<CONFIG>) { |
20 chomp; |
19 chomp; |
21 s/#.*//; |
20 s/#.*//; |
22 s/\t//g; |
21 s/\t//g; |
23 s/\s//g; |
22 s/\s//g; |
24 |
23 |
25 next unless length; |
24 next unless length; |
26 my ($cname, $ccont) = split (/\s*=\s*/, $_,2); |
25 my ( $cname, $ccont ) = split( /\s*=\s*/, $_, 2 ); |
27 $config{$cname} = $ccont; |
26 $config{$cname} = $ccont; |
28 } |
27 } |
29 close (CONFIG); |
28 close(CONFIG); |
30 |
29 |
31 my $master_dir = $config{master_dir}; |
30 my $master_dir = $config{master_dir}; |
32 my $ablauf_zeit = $config{abl_zeit}; |
31 my $ablauf_zeit = $config{abl_zeit}; |
33 my $zone; |
32 my $zone; |
34 my @status; |
33 my @status; |
35 my @auto; |
34 my @auto; |
36 chomp (my $now_time=`date +%s`); # aktuelle unixzeit |
35 chomp( my $now_time = `date +%s` ); # aktuelle unixzeit |
37 |
|
38 |
36 |
39 # prueft zonen aus ARGV und loescht das schluesselmaterial |
37 # prueft zonen aus ARGV und loescht das schluesselmaterial |
40 for (@ARGV) { |
38 for (@ARGV) { |
41 chomp ($zone = `idn --quiet $_`); |
39 chomp( $zone = `idn --quiet $_` ); |
42 my $zdir = "$master_dir/$zone"; |
40 my $zdir = "$master_dir/$zone"; |
43 unless (-e "$master_dir/$zone") { |
41 unless ( -e "$master_dir/$zone" ) { |
44 print "$zone ist keine verwaltete zone \n"; |
42 print "$zone ist keine verwaltete zone \n"; |
45 } else { |
43 } |
46 if (-e "$zdir/$zone.signed") { unlink "$zdir/$zone.signed"} |
44 else { |
47 if (-e "$zdir/.keycounter") { unlink "$zdir/.keycounter"} |
45 if ( -e "$zdir/$zone.signed" ) { unlink "$zdir/$zone.signed" } |
48 if (-e "$zdir/.index.ksk") { unlink "$zdir/.index.ksk"} |
46 if ( -e "$zdir/.keycounter" ) { unlink "$zdir/.keycounter" } |
49 if (-e "$zdir/.index.zsk") { unlink "$zdir/.index.zsk"} |
47 if ( -e "$zdir/.index.ksk" ) { unlink "$zdir/.index.ksk" } |
50 if (-e "$zdir/dsset-$zone.") { unlink "$zdir/dsset-$zone."} |
48 if ( -e "$zdir/.index.zsk" ) { unlink "$zdir/.index.zsk" } |
51 if (-e "$zdir/keyset-$zone.") { unlink "$zdir/keyset-$zone."} |
49 if ( -e "$zdir/dsset-$zone." ) { unlink "$zdir/dsset-$zone." } |
52 for (`ls $master_dir/$zone/K*[key,private]`){ unlink $_} |
50 if ( -e "$zdir/keyset-$zone." ) { unlink "$zdir/keyset-$zone." } |
53 } |
51 for (`ls $master_dir/$zone/K*[key,private]`) { unlink $_ } |
|
52 } |
54 } |
53 } |
55 |
54 |
56 # beendet den key-rollover |
55 # beendet den key-rollover |
57 for (<$master_dir/*>) { |
56 for (<$master_dir/*>) { |
58 $zone = $_; |
57 $zone = $_; |
59 $zone =~ s#($master_dir/)(.*)#$2#; |
58 $zone =~ s#($master_dir/)(.*)#$2#; |
60 |
59 |
61 my @index = (); |
60 my @index = (); |
62 my $index_wc; |
61 my $index_wc; |
63 |
62 |
64 # prueft nach der ".index.zsk"-datei und erstellt den zeitpunkt |
63 # prueft nach der ".index.zsk"-datei und erstellt den zeitpunkt |
65 # an dem das key-rollover endet. - $status[9] |
64 # an dem das key-rollover endet. - $status[9] |
66 if (-e "$master_dir/$zone/.index.zsk") { |
65 if ( -e "$master_dir/$zone/.index.zsk" ) { |
67 @status = stat("$master_dir/$zone/.index.zsk"); |
66 @status = stat("$master_dir/$zone/.index.zsk"); |
68 $status[9] += (3600 * $ablauf_zeit); |
67 $status[9] += ( 3600 * $ablauf_zeit ); |
69 } |
68 } |
70 else { |
69 else { |
71 next; |
70 next; |
72 } |
71 } |
73 |
72 |
74 # prueft ob das key-rollover-ende erreicht ist |
73 # prueft ob das key-rollover-ende erreicht ist |
75 unless ($status[9] < $now_time ) { |
74 unless ( $status[9] < $now_time ) { |
76 next; |
75 next; |
77 } |
76 } |
78 |
77 |
79 # prueft die anzahl der schluessel in der ".index.zsk" |
78 # prueft die anzahl der schluessel in der ".index.zsk" |
80 # loescht alte schluessel |
79 # loescht alte schluessel |
81 open (INDEX, "$master_dir/$zone/.index.zsk") or die "$master_dir/$zone/.index.zsk: $!\n"; |
80 open( INDEX, "$master_dir/$zone/.index.zsk" ) |
82 @index = <INDEX>; |
81 or die "$master_dir/$zone/.index.zsk: $!\n"; |
83 $index_wc = @index; |
82 @index = <INDEX>; |
84 close (INDEX); |
83 $index_wc = @index; |
85 if ($index_wc > 1) { |
84 close(INDEX); |
86 open (INDEX, ">$master_dir/$zone/.index.zsk")or die "$master_dir/$zone/.index.zsk: $!\n"; |
85 if ( $index_wc > 1 ) { |
87 print INDEX $index[1]; |
86 open( INDEX, ">$master_dir/$zone/.index.zsk" ) |
88 close (INDEX); |
87 or die "$master_dir/$zone/.index.zsk: $!\n"; |
89 push @auto, $zone; |
88 print INDEX $index[1]; |
90 } |
89 close(INDEX); |
|
90 push @auto, $zone; |
|
91 } |
91 |
92 |
92 # prueft die anzahl der schluessel in der ".index.ksk" |
93 # prueft die anzahl der schluessel in der ".index.ksk" |
93 # loescht alte schluessel |
94 # loescht alte schluessel |
94 open (INDEX, "$master_dir/$zone/.index.ksk") or die "$master_dir/$zone/.index.ksk: $!\n"; |
95 open( INDEX, "$master_dir/$zone/.index.ksk" ) |
95 @index = <INDEX>; |
96 or die "$master_dir/$zone/.index.ksk: $!\n"; |
96 $index_wc = @index; |
97 @index = <INDEX>; |
97 close (INDEX); |
98 $index_wc = @index; |
98 if ($index_wc > 1) { |
99 close(INDEX); |
99 open (INDEX, ">$master_dir/$zone/.index.ksk") or die "$master_dir/$zone/.index.ksk: $!\n"; |
100 if ( $index_wc > 1 ) { |
100 print INDEX $index[1]; |
101 open( INDEX, ">$master_dir/$zone/.index.ksk" ) |
101 close (INDEX); |
102 or die "$master_dir/$zone/.index.ksk: $!\n"; |
102 push @auto, $zone; |
103 print INDEX $index[1]; |
103 } |
104 close(INDEX); |
|
105 push @auto, $zone; |
|
106 } |
104 |
107 |
105 } |
108 } |
106 |
109 |
107 # nach abgeschlossenem key-rollover werden fuer die entsprechende zone |
110 # nach abgeschlossenem key-rollover werden fuer die entsprechende zone |
108 # unbenoetigte schluessel entfernt und die vorhandenen schluessel in die |
111 # unbenoetigte schluessel entfernt und die vorhandenen schluessel in die |
109 # zonedatei geschrieben. |
112 # zonedatei geschrieben. |
110 for (@auto) { |
113 for (@auto) { |
111 my $zone = $_; |
114 my $zone = $_; |
112 my @old_zone_content = (); |
115 my @old_zone_content = (); |
113 my @new_zone_content = (); |
116 my @new_zone_content = (); |
114 my @keylist = (); |
117 my @keylist = (); |
115 my $file; |
118 my $file; |
116 |
119 |
117 open (INDEX, "$master_dir/$zone/.index.zsk") or die "$master_dir/$zone/.index.zsk: $!\n"; |
120 open( INDEX, "$master_dir/$zone/.index.zsk" ) |
118 @keylist = <INDEX>; |
121 or die "$master_dir/$zone/.index.zsk: $!\n"; |
119 close (INDEX); |
122 @keylist = <INDEX>; |
|
123 close(INDEX); |
120 |
124 |
121 open (INDEX, "$master_dir/$zone/.index.ksk") or die "$master_dir/$zone/.index.ksk: $!\n"; |
125 open( INDEX, "$master_dir/$zone/.index.ksk" ) |
122 push @keylist, <INDEX>; |
126 or die "$master_dir/$zone/.index.ksk: $!\n"; |
123 close (INDEX); |
127 push @keylist, <INDEX>; |
|
128 close(INDEX); |
124 |
129 |
125 open (ZONE, "$master_dir/$zone/$zone") or die "$master_dir/$zone/$zone: $!\n"; |
130 open( ZONE, "$master_dir/$zone/$zone" ) |
126 @old_zone_content = <ZONE>; |
131 or die "$master_dir/$zone/$zone: $!\n"; |
127 close (ZONE); |
132 @old_zone_content = <ZONE>; |
|
133 close(ZONE); |
128 |
134 |
129 # kuerzt die schluessel-bezeichnung aus der indexdatei auf die |
135 # kuerzt die schluessel-bezeichnung aus der indexdatei auf die |
130 # id um sie besser vergleichen zu koennen. |
136 # id um sie besser vergleichen zu koennen. |
131 for (@keylist) { |
137 for (@keylist) { |
132 chomp; |
138 chomp; |
133 s#K.*\+.*\+(.*)#$1#; |
139 s#K.*\+.*\+(.*)#$1#; |
134 } |
140 } |
135 |
141 |
136 # filtert alle schluessel aus der zonedatei |
142 # filtert alle schluessel aus der zonedatei |
137 # old_zone_content ==> new_zone_content |
143 # old_zone_content ==> new_zone_content |
138 for (@old_zone_content) { |
144 for (@old_zone_content) { |
139 unless (/IN\sDNSKEY/) { |
145 unless (/IN\sDNSKEY/) { |
140 push @new_zone_content, $_; |
146 push @new_zone_content, $_; |
141 } |
147 } |
142 } |
148 } |
143 |
149 |
144 # prueft alle schluesseldateien (ksk, zsk) ob sie in der jeweiligen |
150 # prueft alle schluesseldateien (ksk, zsk) ob sie in der jeweiligen |
145 # indexdatei beschrieben sind. wenn nicht werden sie geloescht. |
151 # indexdatei beschrieben sind. wenn nicht werden sie geloescht. |
146 for (`ls $master_dir/$zone/K*[key,private]`){ |
152 for (`ls $master_dir/$zone/K*[key,private]`) { |
147 chomp; |
153 chomp; |
148 $file = $_; |
154 $file = $_; |
149 my $rm_count = 1; |
155 my $rm_count = 1; |
150 |
156 |
151 for (@keylist) { |
157 for (@keylist) { |
152 |
158 |
153 if ($file =~ /$_/) { |
159 if ( $file =~ /$_/ ) { |
154 $rm_count = 0; |
160 $rm_count = 0; |
155 |
161 |
156 # schluessel die in der indexdatei standen, werden an die |
162 # schluessel die in der indexdatei standen, werden an die |
157 # zonedatei angehangen. |
163 # zonedatei angehangen. |
158 if ($file =~ /.*key/) { |
164 if ( $file =~ /.*key/ ) { |
159 open (KEYFILE, "$file") or die "$file: $!\n"; |
165 open( KEYFILE, "$file" ) or die "$file: $!\n"; |
160 push @new_zone_content, <KEYFILE>; |
166 push @new_zone_content, <KEYFILE>; |
161 close (KEYFILE); |
167 close(KEYFILE); |
162 |
|
163 last; |
|
164 } |
|
165 } |
|
166 } |
|
167 |
168 |
168 #loescht alle unbenoetigten schluessel |
169 last; |
169 if ($rm_count == 1) { |
170 } |
170 print `rm -f $file`; |
171 } |
171 } |
172 } |
172 } |
|
173 |
173 |
174 open (ZONE, ">$master_dir/$zone/$zone") or die "$master_dir/$zone/$zone: $!\n"; |
174 #loescht alle unbenoetigten schluessel |
175 print ZONE @new_zone_content; |
175 if ( $rm_count == 1 ) { |
176 close (ZONE); |
176 print `rm -f $file`; |
177 |
177 } |
178 print "$master_dir/$zone/$zone wurde neu erstellt \n"; |
178 } |
|
179 |
|
180 open( ZONE, ">$master_dir/$zone/$zone" ) |
|
181 or die "$master_dir/$zone/$zone: $!\n"; |
|
182 print ZONE @new_zone_content; |
|
183 close(ZONE); |
|
184 |
|
185 print "$master_dir/$zone/$zone wurde neu erstellt \n"; |
179 } |
186 } |