Perl для системного администрирования

       

Создание административного заголовка



Создание административного заголовка

Конфигурационные файлы DNS начинаются с административного заголовка, в нем представлена информация о сервере и данных, которые он обслуживает. Самая важная часть этого заголовка - запись о ресурсах SOA (Start of Authority). Запись SOA содержит:

  • Имя административного домена, обслуживаемого данным DNS-cep-вером.
  • Имя первичного DNS-сервера этого домена.
  • Контактную информацию об администраторе (администраторах) DNS-сервера.
  • Порядковый номер конфигурационного файла (подробнее об этом рассказывается чуть ниже).
  • Значения тайм-аутов регенерации (refresh) и повторного обращения (retry) для вспомогательных серверов (т. е. информация о том, когда необходимо синхронизировать данные с первичным сервером).
  • Время жизни (TTL) для данных (т. е. в течение какого времени можно безопасно кэшировать информацию).

Вот как может выглядеть этот заголовок:

@ IN SOA dns.oog.org. hostmaster.oog.org. (

1998052900 ; serial

10800 ; refresh 3



600 ; retry

604800 ; expire

43200) ; TTL

@ IN NS dns.oog.org.

Булыпая часть информации добавляется в начало конфигурационного файла каждый раз при его создании. Единственное, о чем нужно побеспокоиться, - это о порядковом номере. Один раз в X секунд (X определяется из значения регенерации) вторичные серверы имен сверяются с первичными серверами, чтобы узнать, нужно ли обновить данные. Современные вторичные DNS-серверы (подобные BIND v8+ или Microsoft DNS) могут быть сконфигурированы так, что будут сверяться с основным сервером в то время, когда на последнем меняются данные. В обоих случаях вторичный сервер запрашивает на первичном запись SOA. Если порядковый номер записи SOA первичного сервера больше порядкового номера, хранимого на вторичном сервере, то произойдет перенос информации о зоне (вторичный сервер загрузит новые данные), В итоге, важно увеличивать порядковый номер каждый раз при создании нового конфигурационного файла. Многие из проблем с DNS вызваны неполадками при обновлении порядкового номера. Существует по крайней мере два способа сделать так, чтобы порядковый номер всегда увеличивался:

  1. Считывать предыдущий конфигурационный файл и увеличивать найденное там значение.
  2. Вычислять новое значение, основываясь на внешних данных, которые «гарантированно» увеличиваются (это могут быть, например, системные часы или номера версий файла в RCS).

Ниже приведен пример программы, где применяется комбинация этих двух методов для создания допустимого заголовка файла зоны DNS. Порядковый номер будет представлен в виде, который рекомендуют использовать Альбиц и Лью в своей книге (YYYYMMDDXX, где Y=rofl, М=месяц, В=день и ХХ=двузначный счетчик, позволяющий вносить более одного изменения за день):

ft получаем текущую дату в формате YYYYMMDD

@localtime = localtime;

Stoday = sprintf("%04d%02d%02d",$localtime[5]+1900,

$localtime[4]+1,

$localtime[3]);

# имя пользователя как в NT/2000, так и в Unix

$user = ($"0 eq "MSWin32")? $ENV{USERNAME} :

(getpwuid($<))[6]." (".(getpwuid($<))[0].")";

sub GenerateHeader{ my($header);

открываем старый файл, если это возможно, и считываем

# порядковый номер, принимая во внимание формат старого файла

if (open (OLDZONE,$target)){ while (<OLDZONE>) {

next unless (/(\d{8}).«serial/); Soldserial = $1; last; }

close (OLDZONE); } else {

Soldserial = "00000000";

иначе начинаем с О >

К если предыдущий порядковый номер соответствует

# сегодняшнему дню, то увеличиваем последние 2 цифры, в

# противном случае используем новый номер для сегодняшнего дня

Solddate = substr($oldserial,0,8);

Scount = ((Solddate == $today) ? substr($oldserial,8,2)+1 : 0);

Sserial = sprintf("%8d%02d",$today,Scount);

П начало заголовка

$header .= "; Файл зоны dns - СОЗДАН

$0\л": Sheader .= ";

НЕ РЕДАКТИРУЙТЕ ВРУЧНУЮ1\п:\п"; Sheader .= ";

преобразован пользователем $user в ".scalar((localtime)). "\n;\n";

# пересчитать число записей для каждого отдела и сообщить

foreach my Sentry (keys %entries){

$depts{$entries{$entry}->{department}}++;

}

foreach my $dept (keys %depts) {

Sheader .= "; число узлов в отделе Sdept:

$depts{$dept}.\n"; } Sheader .= ";

всего узлов: ",scalar(keys %entries)."\n;\n\n";

Sheader .= «"EOH";

@ IN SOA dns.oog.org. hostmaster.oog.org. (

Sserial ; serial 10800 ; refresh 3600 ; retry 604800 ; expire 43200) ; TTL

@ IN NS dns.oog.org.

EOH

return Sheader;

}

В примере осуществляется попытка прочитать предыдущий конфигурационный файл для определения последнего порядкового номера. Затем это значение разбивается на поля даты и счетчика. Если прочитанная дата совпадает с текущей, необходимо увеличить значение счетчика. Если нет, то в новом порядковом номере поле даты совпадает с текущей датой, а значение счетчика равно 00. Теперь, когда порядковый номер проверен, можно вывести заголовок в правильном виде.



Содержание раздела