Думаю многие ощутили пользу директивы include в apache, которая позволяет включать все файлы с нужным именем в определенной директории в конфигурационный файл. К сожалению таким же функционалом не может похвастяться директива include из DNS сервера BIND. Решением данной проблемы может быть использование другого DNS сервера, что в большинстве случаев не подходит, или разработка скрипта, который создает отдельный файл с включением определенных файлов в нужной директории и заставляет сервер перечитать конфиг при изменении этого файла. Вот скрипт, который позволяет осуществить задуманное:
#!/usr/bin/env perl
use strict;
use warnings;
# директория, в которой лежат конфигурационные файлы
my $bind_incdir = '/etc/namedb/includes';
# файл, в котором подключаются найденные конфиги
my $config_name = '/etc/namedb/includes.conf';
# рабочая диретория
my $work_dir = '/root/bind/tmp';
# команда для управления DNS сервером
my $rndc_bin = '/usr/sbin/rndc';
my @zones = ();
my $write_conf = 0;
# создаем список конфигурационных файлов
opendir(my $DH, $bind_incdir) || die "error: can't open directory $bind_incdir: $!\n";
while (readdir($DH)){
if (/^(.+)\.conf$/){ push(@zones, $1); }
}
closedir($DH);
# проверяем, были ли добавлены/удалены зоны
if (open(FIN, '<', "$work_dir/autoconf.txt")){
my @old_zones = ();
while (<FIN>){ chomp; push(@old_zones, $_); }
close(FIN);
if ($#zones != $#old_zones){
$write_conf = 1;
} else {
foreach my $zname (@zones){
if (!($zname ~~ @old_zones)) {
$write_conf = 1;
last;
}
}
}
@old_zones = undef;
} else {
$write_conf = 1;
}
# пишем новый конфигуарционый файл и
# перезапускаем DNS сервер
if ($write_conf){
my $rndc_args = "$rndc_bin reload > /dev/null 2>&1";
open(FOUT, '>', $config_name) || die "error: can't open file $config_name: $!\n";
open(FOUT_TMP, '>', "$work_dir/autoconf.txt") || die "error: can't open file $work_dir/autoconf.txt: $!\n";
for (@zones){
print(FOUT "include \"/etc/namedb/includes/$_.conf\";\n");
print(FOUT_TMP "$_\n");
}
close(FOUT_TMP);
close(FOUT);
system($rndc_args) == 0 || die "command - $rndc_args failed: $?\n";
}
exit(0);
Прикрепленные файлы
Последние комментарии
Может кто…