27 $config{$cname} = $ccont; |
27 $config{$cname} = $ccont; |
28 } |
28 } |
29 close (CONFIG); |
29 close (CONFIG); |
30 |
30 |
31 |
31 |
32 my $master_dir= $config{master_dir}; |
32 my $master_dir = $config{master_dir}; |
33 my $key_counter_end=$config{key_counter_end}; |
33 my $key_counter_end = $config{key_counter_end}; |
34 my @change; |
34 my @change; |
35 my @manu; |
35 my @manu; |
36 my @index; |
36 my @index; |
37 my $zone; |
37 my $zone; |
38 my $keyname; |
38 my $keyname; |
39 |
39 |
40 # prueft ob eingaben in ARGV domains sind und gibt sie in die liste @manu |
40 # prueft ob eingaben in ARGV domains sind und gibt sie in die liste @manu |
41 for (@ARGV) { |
41 for (@ARGV) { |
42 chomp (my $zone = `idn --quiet "$_"`); |
42 chomp (my $zone = `idn --quiet "$_"`); |
43 |
43 |
44 if (-e "$master_dir/$zone") { |
44 if (-d "$master_dir/$zone") { |
45 push (@manu, $zone); |
45 push (@manu, $zone); |
46 } else { |
46 } |
47 print " $zone ist keine verwaltete zone \n "; |
47 else { |
|
48 print " $zone not exist\n "; |
48 } |
49 } |
49 } |
50 } |
50 |
51 |
51 # gibt alle zonen mit abgelaufenen keycounter in die liste @change |
52 # gibt alle zonen mit abgelaufenen keycounter in die liste @change |
52 for (<$master_dir/*>) { |
53 while (<$master_dir/*>) { |
53 chomp ($zone = $_); |
54 chomp ($zone = $_); |
54 my $key; |
55 my $key; |
55 |
56 |
56 if (-e "$zone/.keycounter") { |
57 unless (-f "$zone/.keycounter") { |
57 |
58 next |
58 open (KEY, "$zone/.keycounter"); |
59 } |
59 $key = <KEY>; |
60 |
60 close (KEY); |
61 open (KEY, "$zone/.keycounter") or die "$zone/.keycounter: $!\n"; |
61 |
62 $key = <KEY>; |
62 if ($key_counter_end < $key) { |
63 close (KEY); |
63 $zone =~ s#($master_dir/)(.*)#$2#; |
64 |
64 push (@change, $zone); |
65 if ($key_counter_end <= $key) { |
65 } |
66 $zone =~ s#($master_dir/)(.*)#$2#; |
|
67 push (@change, $zone); |
66 } |
68 } |
67 } |
69 } |
68 |
70 |
69 #erzeugt zsks |
71 #erzeugt zsks |
70 for (@change, @manu) { |
72 for (@change, @manu) { |
71 $zone = $_; |
73 $zone = $_; |
72 |
74 |
73 chdir "$master_dir/$zone" or die "chdir nach / nicht moeglich: $1"; |
75 chdir "$master_dir/$zone" or die "$master_dir/$zone: $!\n"; |
74 $keyname = `dnssec-keygen -a RSASHA1 -b 512 -n ZONE $zone`; |
76 $keyname = `dnssec-keygen -a RSASHA1 -b 512 -n ZONE $zone`; |
75 |
77 |
76 if (-e ".index.zsk") { |
78 unless (-f ".index.zsk") { |
77 open (INDEX, ".index.zsk"); |
79 @index = (); |
|
80 } |
|
81 else { |
|
82 open (INDEX, ".index.zsk") or die "$master_dir/$zone/.index.zsk: $!\n"; |
78 @index = <INDEX>; |
83 @index = <INDEX>; |
79 close (INDEX); |
84 close (INDEX); |
80 } else { |
|
81 @index = (); |
|
82 } |
85 } |
83 |
86 |
84 push @index, $keyname; |
87 push @index, $keyname; |
85 if (@index > 2){ |
88 if (@index > 2){ |
86 shift (@index); |
89 shift (@index); |
87 } |
90 } |
88 |
91 |
89 open (INDEX, ">.index.zsk"); |
92 open (INDEX, ">.index.zsk") or die "$master_dir/$zone/.index.zsk: $!\n"; |
90 print INDEX @index; |
93 print INDEX @index; |
91 close (INDEX); |
94 close (INDEX); |
92 |
95 |
93 chomp ($keyname); |
96 chomp ($keyname); |
94 print "$keyname (ZSK) erzeugt fuer $zone \n"; |
97 print "$keyname (ZSK) erzeugt fuer $zone \n"; |
95 |
98 |
96 open (KC, ">.keycounter"); |
99 open (KC, ">.keycounter") or die "$master_dir/$zone/keycounter: $!\n"; |
97 print KC "0"; |
100 print KC "0"; |
98 close (KC); |
101 close (KC); |
99 } |
102 } |
100 |
103 |
101 #erzeugt ksks |
104 #erzeugt ksks |
102 for (@manu) { |
105 for (@manu) { |
103 $zone = $_; |
106 $zone = $_; |
104 |
107 |
105 chdir "$master_dir/$zone" or die "chdir nach / nicht moeglich: $1"; |
108 chdir "$master_dir/$zone" or die "$master_dir/$zone: $!\n"; |
106 $keyname = `dnssec-keygen -a RSASHA1 -b 2048 -f KSK -n ZONE $zone`; |
109 $keyname = `dnssec-keygen -a RSASHA1 -b 2048 -f KSK -n ZONE $zone`; |
107 |
110 |
108 if (-e ".index.ksk") { |
111 unless (-f ".index.ksk") { |
109 open (INDEX, ".index.ksk"); |
112 @index = (); |
|
113 } else { |
|
114 open (INDEX, ".index.ksk") or die "$master_dir/$zone/.index.ksk: $!\n"; |
110 @index = <INDEX>; |
115 @index = <INDEX>; |
111 close (INDEX); |
116 close (INDEX); |
112 } else { |
|
113 @index = (); |
|
114 } |
117 } |
115 |
118 |
116 push @index, $keyname; |
119 push @index, $keyname; |
117 if (@index > 2){ |
120 if (@index > 2){ |
118 shift (@index); |
121 shift (@index); |
119 } |
122 } |
120 |
123 |
121 open (INDEX, ">.index.ksk"); |
124 open (INDEX, ">.index.ksk") or die "$master_dir/$zone/.index.ksk: $!\n"; |
122 print INDEX @index; |
125 print INDEX @index; |
123 close (INDEX); |
126 close (INDEX); |
124 |
127 |
125 chomp ($keyname); |
128 chomp ($keyname); |
126 print "$keyname (KSK) erzeugt fuer $zone \n"; |
129 print "$keyname (KSK) erzeugt fuer $zone \n"; |
134 my @old_zone_content = (); |
137 my @old_zone_content = (); |
135 my @new_zone_content = (); |
138 my @new_zone_content = (); |
136 my @keylist = (); |
139 my @keylist = (); |
137 my $file = (); |
140 my $file = (); |
138 |
141 |
139 open (INDEX, "$master_dir/$zone/.index.zsk"); |
142 |
|
143 open (INDEX, "<$master_dir/$zone/.index.zsk") or die "$master_dir/$zone/.index.zsk: $!\n"; |
140 @keylist = <INDEX>; |
144 @keylist = <INDEX>; |
141 close (INDEX); |
145 close (INDEX); |
142 |
146 |
143 open (INDEX, "$master_dir/$zone/.index.ksk"); |
147 open (INDEX, "<$master_dir/$zone/.index.ksk") or die "$master_dir/$zone/.index.ksk: $!\n"; |
144 push @keylist, <INDEX>; |
148 push @keylist, <INDEX>; |
145 close (INDEX); |
149 close (INDEX); |
146 |
150 |
147 open (ZONE, "$master_dir/$zone/$zone"); |
151 open (ZONE, "<$master_dir/$zone/$zone") or die "$master_dir/$zone/$zone: $!\n"; |
148 @old_zone_content = <ZONE>; |
152 @old_zone_content = <ZONE>; |
149 close (ZONE); |
153 close (ZONE); |
150 |
154 |
151 # kuerzt die schluessel-bezeichnung aus der indexdatei auf die id um sie |
155 # kuerzt die schluessel-bezeichnung aus der indexdatei auf die id um sie |
152 # besser vergleichen zu koennen. |
156 # besser vergleichen zu koennen. |
153 foreach (@keylist) { |
157 for (@keylist) { |
154 chomp; |
158 chomp; |
155 s#K.*\+.*\+(.*)#$1#; |
159 s#K.*\+.*\+(.*)#$1#; |
156 } |
160 } |
157 |
161 |
158 # filtert alle schluessel aus der zonedatei |
162 # filtert alle schluessel aus der zonedatei |
159 # old_zone_content ==> new_zone_content |
163 # old_zone_content ==> new_zone_content |
160 foreach (@old_zone_content) { |
164 for (@old_zone_content) { |
161 unless (/IN\sDNSKEY/) { |
165 unless (/IN\sDNSKEY/) { |
162 push @new_zone_content, $_; |
166 push @new_zone_content, $_; |
163 } |
167 } |
164 } |
168 } |
165 |
169 |
166 # prueft alle schluesseldateien (ksk, zsk) ob sie in der jeweiligen |
170 # prueft alle schluesseldateien (ksk, zsk) ob sie in der jeweiligen |
167 # indexdatei beschrieben sind. wenn nicht werden sie geloescht. |
171 # indexdatei beschrieben sind. wenn nicht werden sie geloescht. |
168 foreach (`ls $master_dir/$zone/K*[key,private]`){ |
172 for (`ls $master_dir/$zone/K*[key,private]`){ |
169 chomp; |
173 chomp; |
170 $file = $_; |
174 $file = $_; |
171 my $rm_count = 1; |
175 my $rm_count = 1; |
172 |
176 |
173 foreach (@keylist) { |
177 for (@keylist) { |
174 |
178 |
175 if ($file =~ /$_/) { |
179 if ($file =~ /$_/) { |
176 $rm_count = 0; |
180 $rm_count = 0; |
177 |
181 |
178 # schluessel die in der indexdatei standen, werden an die |
182 # schluessel die in der indexdatei standen, werden an die |
179 # zonedatei angehangen. |
183 # zonedatei angehangen. |
180 if ($file =~ /.*key/) { |
184 if ($file =~ /.*key/) { |
181 open (KEYFILE, "$file"); |
185 open (KEYFILE, "<$file") or next "$file: $!\n"; |
182 push @new_zone_content, <KEYFILE>; |
186 push @new_zone_content, <KEYFILE>; |
183 close (KEYFILE); |
187 close (KEYFILE); |
184 |
188 |
185 last; |
189 last; |
186 } |
190 } |
187 } |
191 } |
188 } |
192 } |
189 |
193 |
190 #loescht alle unbenoetigten schluessel |
194 #loescht alle unbenoetigten schluessel |
191 if ($rm_count == 1) { |
195 if ($rm_count == 1) { |
192 print `rm -f $file`; |
196 unlink "$file"; |
193 } |
197 } |
194 } |
198 } |
195 |
199 |
196 open (ZONE, ">$master_dir/$zone/$zone"); |
200 |
|
201 open (ZONE, ">$master_dir/$zone/$zone") or die "$master_dir/$zone/$zone: $!\n"; |
197 print ZONE @new_zone_content; |
202 print ZONE @new_zone_content; |
198 close (ZONE); |
203 close (ZONE); |
199 |
204 |
200 print "$master_dir/$zone/$zone wurde neu erstellt \n"; |
205 print "$master_dir/$zone/$zone wurde neu erstellt \n"; |
201 } |
206 } |