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

Думаю многие ощутили пользу директивы include в apache, которая позволяет включать все файлы с нужным именем в определенной директории в конфигурационный файл. К сожалению таким же функционалом не может похвастяться директива include из DNS сервера BIND. Решением данной проблемы может быть использование другого DNS сервера, что в большинстве случаев не подходит, или разработка скрипта, который создает отдельный файл с включением определенных файлов в нужной директории и заставляет сервер перечитать конфиг при изменении этого файла. Вот скрипт, который позволяет осуществить задуманное:
  1. #!/usr/bin/env perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. # директория, в которой лежат конфигурационные файлы
  7. my $bind_incdir = '/etc/namedb/includes';
  8. # файл, в котором подключаются найденные конфиги
  9. my $config_name = '/etc/namedb/includes.conf';
  10. # рабочая диретория
  11. my $work_dir = '/root/bind/tmp';
  12. # команда для управления DNS сервером
  13. my $rndc_bin = '/usr/sbin/rndc';
  14.  
  15. my @zones = ();
  16. my $write_conf = 0;
  17.  
  18. # создаем список конфигурационных файлов
  19. opendir(my $DH, $bind_incdir) || die "error: can't open directory $bind_incdir: $!\n";
  20. while (readdir($DH)){
  21.          if (/^(.+)\.conf$/){ push(@zones, $1); }
  22. }
  23. closedir($DH);
  24.  
  25. # проверяем, были ли добавлены/удалены зоны
  26. if (open(FIN, '<', "$work_dir/autoconf.txt")){
  27.          my @old_zones = ();
  28.  
  29.          while (<FIN>){ chomp; push(@old_zones, $_); }
  30.          close(FIN);
  31.  
  32.          if ($#zones != $#old_zones){
  33.                  $write_conf = 1;
  34.          } else {
  35.                  foreach my $zname (@zones){
  36.                          if (!($zname ~~ @old_zones)) {
  37.                                  $write_conf = 1;
  38.                                  last;
  39.                          }
  40.                  }
  41.          }
  42.  
  43.          @old_zones = undef;
  44. } else {
  45.          $write_conf = 1;
  46. }
  47.  
  48. # пишем новый конфигуарционый файл и
  49. # перезапускаем DNS сервер
  50. if ($write_conf){
  51.          my $rndc_args = "$rndc_bin reload > /dev/null 2>&1";
  52.  
  53.          open(FOUT, '>', $config_name) || die "error: can't open file $config_name: $!\n";
  54.          open(FOUT_TMP, '>', "$work_dir/autoconf.txt") || die "error: can't open file $work_dir/autoconf.txt: $!\n";
  55.  
  56.          for (@zones){
  57.                  print(FOUT "include \"/etc/namedb/includes/$_.conf\";\n");
  58.                  print(FOUT_TMP "$_\n");
  59.          }
  60.          close(FOUT_TMP);
  61.          close(FOUT);
  62.  
  63.          system($rndc_args) == 0 || die "command - $rndc_args failed: $?\n";
  64. }
  65.  
  66. exit(0);
ВложениеРазмер
Двоичные данные bind_autoconf.tar.bz21.04 КБ