BIND и включение всех файлов в папке (include wildcard)

Думаю многие ощутили пользу директивы 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);
Прикрепленные файлы
Яндекс.Метрика