37 "rm" => sub { push @$cmd => "rm" }, |
37 "rm" => sub { push @$cmd => "rm" }, |
38 "check" => sub { $cmd = "check" }, |
38 "check" => sub { $cmd = "check" }, |
39 "h|help" => sub { pod2usage(-exit => 0, -verbose => 1) }, |
39 "h|help" => sub { pod2usage(-exit => 0, -verbose => 1) }, |
40 "m|man" => sub { |
40 "m|man" => sub { |
41 pod2usage( |
41 pod2usage( |
42 -exit => 0, |
42 -exit => 0, |
43 # "system('perldoc -V &>/dev/null')" appears shorter, but may not |
43 |
44 # do what you expect ( it still returns 0 on debian squeeze with |
44 # "system('perldoc -V &>/dev/null')" appears shorter, but may not |
45 # dash as system shell even if cannot find the command in $PATH) |
45 # do what you expect ( it still returns 0 on debian squeeze with |
|
46 # dash as system shell even if cannot find the command in $PATH) |
46 -noperldoc => system('perldoc -V >/dev/null 2>&1'), |
47 -noperldoc => system('perldoc -V >/dev/null 2>&1'), |
47 -verbose => 2 |
48 -verbose => 2 |
48 ); |
49 ); |
49 }, |
50 }, |
50 ) |
51 ) |
63 |
64 |
64 push @zones, $zone; |
65 push @zones, $zone; |
65 } |
66 } |
66 |
67 |
67 given ($cmd) { |
68 given ($cmd) { |
68 when ("zsk") { exit create_zsk(@zones) }; |
69 when ("zsk") { exit create_zsk(@zones) }; |
69 when ("ksk") { exit create_ksk(@zones) }; |
70 when ("ksk") { exit create_ksk(@zones) }; |
|
71 |
70 #when ("check") { exit check_zone(@zones) }; |
72 #when ("check") { exit check_zone(@zones) }; |
71 when ("rm") { exit rm_keys(@zones) }; |
73 when ("rm") { exit rm_keys(@zones) }; |
72 default { die "not implemented\n" }; |
74 default { die "not implemented\n" }; |
73 }; |
75 }; |
74 |
76 |
75 } |
77 } |
76 |
78 |
77 sub rm_keys (@) { |
79 sub rm_keys (@) { |
78 |
80 |
79 my @zones = @_; |
81 my @zones = @_; |
80 my $master_dir = "$cf{master_dir}"; |
82 my $master_dir = "$cf{master_dir}"; |
81 |
83 |
82 for my $zone (@zones) { |
84 for my $zone (@zones) { |
83 |
85 |
84 my $dir = "$master_dir/$zone"; |
86 my $dir = "$master_dir/$zone"; |
85 my $ep = 0; |
87 my $ep = 0; |
86 |
88 |
87 my @files = map "$dir/$_", ("$zone.signed", |
89 my @files = map "$dir/$_", |
88 ".keycounter", |
90 ( |
89 ".index.ksk", |
91 "$zone.signed", ".keycounter", ".index.ksk", ".index.zsk", |
90 ".index.zsk", |
92 "dsset-$zone.", "keyset-$zone." |
91 "dsset-$zone.", |
93 ); |
92 "keyset-$zone."); |
|
93 push @files, glob "$dir/K$zone*"; |
94 push @files, glob "$dir/K$zone*"; |
94 |
95 |
95 for my $f (@files) { |
96 for my $f (@files) { |
96 if (-e $f) { |
97 if (-e $f) { |
97 unlink $f or die "Can't unlink '$f': $!\n"; |
98 unlink $f or die "Can't unlink '$f': $!\n"; |
102 say " * $zone: removed key-set" if $ep; |
103 say " * $zone: removed key-set" if $ep; |
103 |
104 |
104 open my $old, "$dir/$zone" or die "Can't open '$dir/$zone': $!\n"; |
105 open my $old, "$dir/$zone" or die "Can't open '$dir/$zone': $!\n"; |
105 my @old = <$old>; |
106 my @old = <$old>; |
106 close $old; |
107 close $old; |
107 my @new = grep { not /^\s*\$include\s+("?)K\Q$zone\E.*\.key\1\s*$/i } @old; |
108 my @new = |
|
109 grep { not /^\s*\$include\s+("?)K\Q$zone\E.*\.key\1\s*$/i } @old; |
108 return if @new ~~ @old; |
110 return if @new ~~ @old; |
109 |
111 |
110 my $new = File::Temp->new(UNLINK => 0) |
112 my $new = File::Temp->new(UNLINK => 0) |
111 or die "Can't create tmpfile\n"; |
113 or die "Can't create tmpfile\n"; |
112 print $new @new; |
114 print $new @new; |
140 my (@index, $keyname, $idx); |
140 my (@index, $keyname, $idx); |
141 my $dir = "$master_dir/$zone"; |
141 my $dir = "$master_dir/$zone"; |
142 my $cmd = sprintf $args->{$type}->{cmd}, $dir, $zone; |
142 my $cmd = sprintf $args->{$type}->{cmd}, $dir, $zone; |
143 |
143 |
144 chomp($keyname = qx/$cmd/); |
144 chomp($keyname = qx/$cmd/); |
145 die "Key generation failed! (output was: '$keyname')" unless $keyname =~ /^K\Q$zone\E\.?\+\d{3}\+\d{5}$/; |
145 die "Key generation failed! (output was: '$keyname')" |
146 |
146 unless $keyname =~ /^K\Q$zone\E\.?\+\d{3}\+\d{5}$/; |
147 open $idx, '+>>', "$dir/.index.$type" or die "Can't open $dir/.index.$type: $!\n"; |
147 |
148 seek $idx, 0 ,0 or die "Cant' seek: $!"; |
148 open $idx, '+>>', "$dir/.index.$type" |
149 chomp (@index = <$idx>); |
149 or die "Can't open $dir/.index.$type: $!\n"; |
|
150 seek $idx, 0, 0 or die "Cant' seek: $!"; |
|
151 chomp(@index = <$idx>); |
150 |
152 |
151 push @index, $keyname; |
153 push @index, $keyname; |
|
154 |
152 # TODO: this should be part of the key removal procedure, no? |
155 # TODO: this should be part of the key removal procedure, no? |
153 # shift @index if @index > 2; |
156 # shift @index if @index > 2; |
154 |
157 |
155 seek $idx, 0 ,0 or die "Cant' seek: $!"; |
158 seek $idx, 0, 0 or die "Cant' seek: $!"; |
156 truncate $idx, 0 or die "Can't truncate: $!"; |
159 truncate $idx, 0 or die "Can't truncate: $!"; |
157 print $idx join "\n" => @index, ''; |
160 print $idx join "\n" => @index, ''; |
158 close $idx; |
161 close $idx; |
159 |
162 |
160 say "$zone: new ", uc $type, " $keyname"; |
163 say "$zone: new ", uc $type, " $keyname"; |
161 |
164 |
162 key_to_zonefile($keyname); |
165 key_to_zonefile($keyname); |
163 |
166 |
164 if (lc $type eq 'zsk') { |
167 if (lc $type eq 'zsk') { |
165 open my $kc, '>', "$dir/.keycounter" or die "Can't open $dir/.keycounter: $!\n"; |
168 open my $kc, '>', "$dir/.keycounter" |
|
169 or die "Can't open $dir/.keycounter: $!\n"; |
166 print $kc "0\n"; |
170 print $kc "0\n"; |
167 close $kc; |
171 close $kc; |
168 } |
172 } |
169 |
173 |
170 } |
174 } |
271 my $zone = $1 or die "Can't determine zone from key name '$keyname'\n"; |
275 my $zone = $1 or die "Can't determine zone from key name '$keyname'\n"; |
272 my $zf = "$cf{master_dir}/$zone/$zone"; |
276 my $zf = "$cf{master_dir}/$zone/$zone"; |
273 my (@lines, $tmp); |
277 my (@lines, $tmp); |
274 |
278 |
275 open OLD, '<', $zf or die "Can't open $zf: $!\n"; |
279 open OLD, '<', $zf or die "Can't open $zf: $!\n"; |
276 chomp (@lines = <OLD>); |
280 chomp(@lines = <OLD>); |
277 close OLD; |
281 close OLD; |
278 |
282 |
279 return if grep /^\s*\$include\s+("?)\Q$keyname\E\.key\1\s*$/i, @lines; |
283 return if grep /^\s*\$include\s+("?)\Q$keyname\E\.key\1\s*$/i, @lines; |
280 |
284 |
281 $tmp = File::Temp->new(UNLINK => 0) or die "Can't create temporary file\n"; |
285 $tmp = File::Temp->new(UNLINK => 0) or die "Can't create temporary file\n"; |