12 |
12 |
13 MAIN: { |
13 MAIN: { |
14 my @zone; |
14 my @zone; |
15 my $do; |
15 my $do; |
16 |
16 |
17 my %conf = read_conf(); |
17 my %conf = read_conf(); |
18 ($do, @zone) = read_argv($conf{master_dir}); |
18 ($do, @zone) = read_argv($conf{master_dir}); |
19 |
19 |
20 # completed the program, if not a valid zones was handed over |
20 # completed the program, if not a valid zones was handed over |
21 unless (@zone) { exit; } |
21 unless (@zone) { exit; } |
22 |
22 |
23 if ($do eq "rm") { rm_keys($conf{master_dir}, @zone); exit; } |
23 if ($do eq "rm") { rm_keys($conf{master_dir}, @zone); exit; } |
24 # if ($do eq "ck") { &ck_zone; } |
24 if ($do eq "ck") { ck_zone($conf{master_dir}, @zone); } |
25 if ($do eq "ksk") { creat_ksk($conf{master_dir}, @zone); } |
25 if ($do eq "ksk") { creat_ksk($conf{master_dir}, @zone); } |
26 |
26 |
27 creat_zsk($conf{master_dir}, @zone); |
27 creat_zsk($conf{master_dir}, @zone); |
28 # &post_creat; |
28 post_creat($conf{master_dir}, @zone); |
29 } |
29 } |
30 |
30 |
31 sub read_conf { |
31 sub read_conf { |
32 |
32 |
33 # read configuration |
33 # read configuration |
141 for (@old_zone_content) { |
142 for (@old_zone_content) { |
142 unless (m#\$INCLUDE.*\"K$zone.*\.key\"#) { |
143 unless (m#\$INCLUDE.*\"K$zone.*\.key\"#) { |
143 push @new_zone_content, $_; |
144 push @new_zone_content, $_; |
144 } |
145 } |
145 } |
146 } |
146 |
147 |
147 my $fh = File::Temp->new(DIR => "$zpf") |
148 { |
148 or die "Can't create tmpdir: $!\n"; |
149 my $fh = File::Temp->new(DIR => "$zpf") |
149 print $fh join "" => @new_zone_content, ""; |
150 or die "Can't create tmpdir: $!\n"; |
150 rename($fh->filename => "$zpf/$zone") |
151 print $fh join "" => @new_zone_content, ""; |
151 or die "Can't rename " . $fh->filename . " to $zpf/$zone: $!\n"; |
152 rename($fh->filename => "$zpf/$zone") |
|
153 or die "Can't rename " . $fh->filename . " to $zpf/$zone: $!\n"; |
|
154 } |
|
155 |
152 } |
156 } |
153 } |
157 } |
154 |
158 |
155 sub creat_ksk { |
159 sub creat_ksk { |
156 my ($master_dir, @zone) = @_; |
160 my ($master_dir, @zone) = @_; |
159 |
163 |
160 for (@zone) { |
164 for (@zone) { |
161 my $zone = $_; |
165 my $zone = $_; |
162 my $zpf = "$master_dir/$zone"; |
166 my $zpf = "$master_dir/$zone"; |
163 |
167 |
164 $keyname = `cd $zpf && dnssec-keygen -a RSASHA1 -b 2048 -f KSK -n ZONE $zone`; |
168 $keyname = |
165 |
169 `cd $zpf && dnssec-keygen -a RSASHA1 -b 2048 -f KSK -n ZONE $zone`; |
166 unless (-f ".index.ksk") { @index = (); } |
170 |
|
171 unless (-f "$zpf/.index.ksk") { @index = (); } |
167 else { |
172 else { |
168 open(INDEX, ".index.ksk") or die "$zpf/.index.ksk: $!\n"; |
173 open(INDEX, "$zpf/.index.ksk") or die "$zpf/.index.ksk: $!\n"; |
169 @index = <INDEX>; |
174 @index = <INDEX>; |
170 close(INDEX); |
175 close(INDEX); |
171 } |
176 } |
172 |
177 |
173 push @index, $keyname; |
178 push @index, $keyname; |
174 if (@index > 2) { shift(@index); } |
179 if (@index > 2) { shift(@index); } |
175 |
180 |
176 open(INDEX, ">.index.ksk") or die "$zpf/.index.ksk: $!\n"; |
181 { |
177 print INDEX @index; |
182 my $fh = File::Temp->new(DIR => "$zpf") |
178 close(INDEX); |
183 or die "Can't create tmpdir: $!\n"; |
|
184 print $fh join "" => @index, ""; |
|
185 rename($fh->filename => "$zpf/.index.ksk") |
|
186 or die "Can't rename " |
|
187 . $fh->filename |
|
188 . " to $zpf/.index.ksk: $!\n"; |
|
189 } |
179 |
190 |
180 chomp($keyname); |
191 chomp($keyname); |
181 print " * $zone: new KSK $keyname\n"; |
192 print " * $zone: new KSK $keyname\n"; |
182 |
|
183 print "!! THE KSK must be published !! \n"; |
193 print "!! THE KSK must be published !! \n"; |
184 |
194 |
185 } |
195 } |
186 } |
196 } |
187 |
197 |
194 my $zone = $_; |
204 my $zone = $_; |
195 my $zpf = "$master_dir/$zone"; |
205 my $zpf = "$master_dir/$zone"; |
196 |
206 |
197 $keyname = `cd $zpf && dnssec-keygen -a RSASHA1 -b 512 -n ZONE $zone`; |
207 $keyname = `cd $zpf && dnssec-keygen -a RSASHA1 -b 512 -n ZONE $zone`; |
198 |
208 |
199 unless (-f ".index.zsk") { @index = (); } |
209 unless (-f "$zpf/.index.zsk") { |
|
210 @index = (); |
|
211 } |
200 else { |
212 else { |
201 open(INDEX, ".index.zsk") or die "$zpf/.index.zsk: $!\n"; |
213 open(INDEX, "$zpf/.index.zsk") or die "$zpf/.index.zsk: $!\n"; |
202 @index = <INDEX>; |
214 @index = <INDEX>; |
203 close(INDEX); |
215 close(INDEX); |
204 } |
216 } |
205 |
217 |
206 push @index, $keyname; |
218 push @index, $keyname; |
207 if (@index > 2) { shift(@index); } |
219 if (@index > 2) { shift(@index); } |
208 |
220 |
209 open(INDEX, ">.index.zsk") or die "$zpf/.index.zsk: $!\n"; |
221 { |
210 print INDEX @index; |
222 my $fh = File::Temp->new(DIR => "$zpf") |
211 close(INDEX); |
223 or die "Can't create tmpdir: $!\n"; |
212 |
224 print $fh join "" => @index, ""; |
|
225 rename($fh->filename => "$zpf/.index.zsk") |
|
226 or die "Can't rename " |
|
227 . $fh->filename |
|
228 . " to $zpf/.index.zsk: $!\n"; |
|
229 } |
213 chomp($keyname); |
230 chomp($keyname); |
214 print " * $zone: new ZSK $keyname\n"; |
231 print " * $zone: new ZSK $keyname\n"; |
215 |
232 |
216 open(KC, ">.keycounter") or die "$zpf/keycounter: $!\n"; |
233 open(KC, ">$zpf/.keycounter") or die "$zpf/keycounter: $!\n"; |
217 print KC "0"; |
234 print KC "0"; |
218 close(KC); |
235 close(KC); |
219 |
|
220 } |
236 } |
221 } |
237 } |
222 |
238 |
223 sub ck_zone { |
239 sub ck_zone { |
224 our @zones; |
240 my ($master_dir, @zone) = @_; |
225 our $master_dir; |
241 |
226 my $zone; |
242 for (@zone) { |
227 |
243 my $zone = $_; |
228 for (@zones) { |
244 my $zpf = "$master_dir/$zone"; |
229 $zone = $_; |
|
230 my $zpf = "$master_dir/$zone"; |
|
231 my $keyfile; |
245 my $keyfile; |
232 my @content; |
246 my @content; |
233 my @keylist; |
247 my @keylist; |
234 |
248 |
235 for (<$zpf/*>) { |
249 for (<$zpf/*>) { |
236 if (m#(K$zone.*\.key)#) { |
250 if (m#(K$zone.*\.key)#) { |
237 $keyfile = $1; |
251 $keyfile = $1; |
238 open(KEYFILE, "<$zpf/$keyfile"); |
252 open(KEYFILE, "<", "$zpf/$keyfile") |
|
253 or die "$zpf/$keyfile: $!\n"; |
239 @content = <KEYFILE>; |
254 @content = <KEYFILE>; |
240 close(KEYFILE); |
255 close(KEYFILE); |
241 for (@content) { |
256 for (@content) { |
242 if (m#DNSKEY.257#) { |
257 if (m#DNSKEY.257#) { |
243 push @keylist, $keyfile; |
258 push @keylist, $keyfile; |
244 } |
259 } |
245 } |
260 } |
246 } |
261 } |
247 } |
262 } |
248 |
263 |
249 open(INDEX, ">.index.ksk") or die "$zpf/.index.ksk: $!\n"; |
264 open(INDEX, ">$zpf/.index.ksk") or die "$zpf/.index.ksk: $!\n"; |
250 for (@keylist) { |
265 for (@keylist) { |
251 s#\.key##; |
266 s#\.key##; |
252 print INDEX "$_\n"; |
267 print INDEX "$_\n"; |
253 } |
268 } |
254 close(INDEX); |
269 close(INDEX); |
255 |
270 |
256 print " * $zone: new .index.ksk created\n"; |
271 print " * $zone: new .index.ksk created\n"; |
257 |
|
258 if (-f "$zpf/.index.zsk") { |
272 if (-f "$zpf/.index.zsk") { |
259 unlink("$zpf/.index.zsk") or die "$zpf/.index.zsk: $!\n"; |
273 unlink("$zpf/.index.zsk") or die "$zpf/.index.zsk: $!\n"; |
260 } |
274 } |
261 } |
275 } |
262 } |
276 } |
263 |
277 |
264 sub post_creat { |
278 sub post_creat { |
265 our @zones; |
279 my ($master_dir, @zone) = @_; |
266 our $master_dir; |
280 for (@zone) { |
267 |
|
268 for (@zones) { |
|
269 my $zone = $_; |
281 my $zone = $_; |
270 `touch $master_dir/$zone/$zone`; |
282 `touch $master_dir/$zone/$zone`; |
271 |
283 &kill_useless_keys($zone, $master_dir); |
272 &kill_useless_keys($zone); |
284 &key_to_zonefile($zone, $master_dir); |
273 &key_to_zonefile($zone); |
285 } |
274 } |
|
275 |
|
276 } |
286 } |
277 |
287 |
278 sub kill_useless_keys { |
288 sub kill_useless_keys { |
279 |
289 |
280 # the function deletes all keys that are not available in the zone |
290 # the function deletes all keys that are not available in the zone |
281 # of index.zsk |
291 |
282 our $master_dir; |
292 my $zone = $_[0]; |
283 my $zone = $_[0]; |
293 my $master_dir = $_[1]; |
284 my @keylist = (); |
294 my @keylist = (); |
285 my $zpf = "$master_dir/$zone"; |
295 my $zpf = "$master_dir/$zone"; |
286 |
296 |
287 open(INDEX, "<$zpf/.index.zsk") or die "$zpf/.index.zsk: $!\n"; |
297 open(INDEX, "<$zpf/.index.zsk") or die "$zpf/.index.zsk: $!\n"; |
288 @keylist = <INDEX>; |
298 @keylist = <INDEX>; |
289 close(INDEX); |
299 close(INDEX); |
290 open(INDEX, "<$zpf/.index.ksk") or die "$zpf/.index.ksk: $!\n"; |
300 open(INDEX, "<$zpf/.index.ksk") or die "$zpf/.index.ksk: $!\n"; |
297 s#K.*\+.*\+(.*)#$1#; |
307 s#K.*\+.*\+(.*)#$1#; |
298 } |
308 } |
299 |
309 |
300 # reviewed every key file (KSK, ZSK), whether they are described in |
310 # reviewed every key file (KSK, ZSK), whether they are described in |
301 # the respective index file. if not they will be deleted. |
311 # the respective index file. if not they will be deleted. |
302 for ( glob("$master_dir/$zone/K*")) { |
312 for (glob("$master_dir/$zone/K*")) { |
303 chomp; |
313 chomp; |
304 my $file = $_; |
314 my $file = $_; |
305 my $rm_count = 1; |
315 my $rm_count = 1; |
306 my $keyname; |
316 my $keyname; |
307 for (@keylist) { |
317 for (@keylist) { |
308 if ($file =~ /$_/) { $rm_count = 0; } |
318 if ($file =~ /$_/) { $rm_count = 0; } |
309 } |
319 } |
310 if ($rm_count == 1) { |
320 if ($rm_count == 1) { |
311 unlink "$file"; |
321 unlink "$file"; |
312 if ($file =~ /$zpf\/(.*\.key)/) { |
322 if ($file =~ /$zpf\/(.*\.key)/) { |
313 print " * $zone: Schluessel $1 entfernt \n"; |
323 print " * $zone: Key $1 removed \n"; |
314 } |
324 } |
315 } |
325 } |
316 } |
326 } |
317 } |
327 } |
318 |
328 |
319 sub key_to_zonefile { |
329 sub key_to_zonefile { |
320 |
330 |
321 # the function added all keys to the indexfile |
331 # the function added all keys to the indexfile |
322 our $master_dir; |
332 my $zone = $_[0]; |
323 my $zone = $_[0]; |
333 my $master_dir = $_[1]; |
324 my $zpf = "$master_dir/$zone"; |
334 my $zpf = "$master_dir/$zone"; |
325 my @old_content; |
335 my @old_content; |
326 my @new_content = (); |
336 my @new_content = (); |
327 |
337 |
328 open(ZONEFILE, "<$zpf/$zone"); |
338 open(ZONEFILE, "<$zpf/$zone"); |
329 @old_content = <ZONEFILE>; |
339 @old_content = <ZONEFILE>; |