11 # Es wird ein Verzeichnis geben, in diesem Verzeichnis liegt für |
11 # Es wird ein Verzeichnis geben, in diesem Verzeichnis liegt für |
12 # *jede* Zone eine eigene Konfigurations-Datei. |
12 # *jede* Zone eine eigene Konfigurations-Datei. |
13 # Diese ganzen Konfigurationsdateien werden dann zusammengefaßt |
13 # Diese ganzen Konfigurationsdateien werden dann zusammengefaßt |
14 # und diese zusammengefaßte wird dem bind per "include" mitgeteilt. |
14 # und diese zusammengefaßte wird dem bind per "include" mitgeteilt. |
15 |
15 |
16 use strict; |
16 #use strict; |
17 use File::Basename; |
17 use File::Basename; |
18 use IO::Handle; |
18 use IO::Handle; |
19 use File::Path; |
19 use File::Path; |
20 use Getopt::Long; |
20 use Getopt::Long; |
21 use Unix::Syslog qw/:macros :subs/; |
21 use Unix::Syslog qw/:macros :subs/; |
59 |
59 |
60 GetOptions( |
60 GetOptions( |
61 "help" => \$opt_help, |
61 "help" => \$opt_help, |
62 "logfile=s" => \$opt_logfile, |
62 "logfile=s" => \$opt_logfile, |
63 "follow!" => \$opt_follow, |
63 "follow!" => \$opt_follow, |
|
64 "update!" => \$opt_update, |
|
65 "create!" => \$opt_create, |
64 "dir=s" => \$opt_zonesdir) |
66 "dir=s" => \$opt_zonesdir) |
65 or die "$ME: Bad Usage\n"; |
67 or die "$ME: Bad Usage\n"; |
66 |
68 |
67 if ($opt_help) { |
69 if ($opt_help) { |
68 print eval "\"$USAGE\""; |
70 print eval "\"$USAGE\""; |
119 |
121 |
120 sub updateFile($@) |
122 sub updateFile($@) |
121 { |
123 { |
122 local $_; |
124 local $_; |
123 my $domain = shift; |
125 my $domain = shift; |
124 my $masters = join "; ", @_; |
126 my %masters = map { $_, 1 } @_; |
125 my $file = "$opt_zonesdir/$domain"; |
127 my $file = "$opt_zonesdir/$domain"; |
126 |
128 |
127 syslog(LOG_NOTICE, "Updating/Creating $file ($masters)\n"); |
129 if (-f $file) { |
128 return; |
130 return if not $opt_update; |
|
131 syslog(LOG_NOTICE, "Updating $file for $domain"); |
|
132 open (F, $_ = "+<$file") or die "Can't open $_: $!\n"; |
|
133 # ein etwas anderer Versuch - noch nicht fertig |
|
134 $_ = join "", <F>; |
129 |
135 |
130 if (-f $file) { |
136 # Liste der Master raussuchen |
131 open (IN, $_ = "<$file") or die "Can't open $_: $!\n"; |
137 /^(\s*masters\s*{\s*)(.*?);(\s*}\s*;)/ims; |
132 # ein etwas anderer Versuch - noch nicht fertig |
138 |
133 $_ = join "", <IN>; |
139 foreach (split /\s*;\s*/, $2) { |
134 close(IN); open(OUT, ">&STDOUT"); # Wenn's geht, dann in's File |
140 $masters{$_} = 1; |
135 s/(masters\s*{)(.*?)(};)/$1$2; $masters; $3/; |
141 } |
136 print OUT; |
142 $masters = join "; ", keys %masters; |
137 } |
143 s/^(\s*masters\s*{\s*)(.*?);(\s*}\s*;)/$1$masters;$3/ims; |
138 |
144 |
139 else { |
145 truncate(F, 0); |
140 open(OUT, $_ = ">$file") or die "Can't open $_: $!\n"; |
146 seek(F, 0, 0); |
141 |
147 print F; |
142 print OUT <<_EOF_; |
148 close F; |
143 // Autogenerated |
149 |
|
150 return; |
|
151 } |
|
152 |
|
153 return if not $opt_create; |
|
154 |
|
155 my $date = localtime(); |
|
156 my $masters = join "; ", keys %masters; |
|
157 |
|
158 -d $opt_zonesdir or mkpath($opt_zonesdir, 0, 0755); |
|
159 |
|
160 syslog(LOG_NOTICE, "Creating $file for $domain"); |
|
161 open(OUT, $_ = ">$file") or die "Can't open $_: $!\n"; |
|
162 |
|
163 print OUT <<_EOF_; |
|
164 // Autogenerated by $ME: $date |
144 zone "$domain" { |
165 zone "$domain" { |
145 type slave; |
166 type slave; |
146 masters { $masters; }; |
167 masters { $masters; }; // $date |
147 file "/etc/bind/slave/$domain"; |
168 file "/etc/bind/slave/$domain"; |
148 allow-query { any; }; |
169 allow-query { any; }; |
149 allow-transfer { none; }; |
170 allow-transfer { none; }; |
150 allow-update { none; }; |
171 allow-update { none; }; |
151 }; |
172 }; |
|
173 |
152 _EOF_ |
174 _EOF_ |
153 close OUT; |
175 close OUT; |
154 } |
176 |
155 |
|
156 return; |
177 return; |
157 } |
178 } |
158 |
179 |
159 |
180 |
160 # vim:sts=4 sw=4 aw ai sm: |
181 # vim:sts=4 sw=4 aw ai sm: |