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



         

Служба доменных имен (DNS) - часть 15


Shostname = $ARGV[0];

$defdomain = ".oog.org"; # домен по умолчанию

^servers = qw(nameserver1 nameserver2 nameserverS);

имена серверов имен

foreach Iserver (©servers) {

<Slookupaddress($nostname,$server);

# записываем значения в

%results

}

%inv = reverse ^results; # инвертируем полученный хэш

if (scalar(keys %inv) > 1) { # проверяем, сколько в нем элементов

print "Между DNS-серверами есть разногласия:\п";

use Data::Dumper;

print Data::Dumper->Dump([\%results],["results"]),"\n";

}

sub lookupaddress{

my($hostname,$server) = @_;

my($qname,$rna(tre,$header,$question,$lformat,@>labels,$count);

local($position,$buf);

Конструируем заголовок пакета

$header = pack("n C2 n4",

++$id, # идентификатор запроса

1, # поля qr, opcode, aa, tc, rd (установлено только rd)

0, # rd, ra

1,  один вопрос (qdcount)

0,  нет ответов (ancount)

О, п нет записей ns в разделе authority (nscount)

0); tf нет rr addtl (arcount)

 если в имени узла нет разделителей,

 дописываем домен по умолчанию

(index($hostname,'.') == -1) {

Shostname .= Sdefdomain;

} # конструируем раздел qname пакета (требуемое доменное имя)

for (split(/\./,$riostname)) {

$lformat .= "С а* ";

$labels[$count++]=length;

$labels[$count++]=$_;

}

да конструируем вопрос

да

Squestion = pack($lformat."С п2",

©labels,

0, # конец меток

1, # qtype A

1); # qclass IN

да

да посылаем пакет серверу и читаем ответ

$sock = new 10::Socket::INET(PeerAddr => Sserver,

PeerPort => "domain",

Proto => "udp");

$sock->send($header.$question);

 используется UDP, так что максимальный размер пакета известен

$sock->recv($buf,512);

close($sock);

 узнаем размер ответа, так как мы собираемся отслеживать

 позицию в пакете при его анализе (через Sposition)

Srespsize = length($buf);

распаковываем раздел заголовка

да

($id,

$qr_opcode_aa_tc_rd,

$rd_ra,

Sqdcount,




Содержание  Назад  Вперед