José Urzúa Reinoso
    Tesis Magister

Código de Funciones Principales

Dentro del código fuente que compone la herramienta, existen ciertas partes que son claves en el funcionamiento de la herramienta, como las consultas DNS realizadas. Por ejemplo, para obtener todos los registros NS asociados a un nombre de dominio, se utiliza el siguiente código:

my $res = Net::DNS::Resolver->new;
$res->nameservers($ser);
res->udp_timeout(3);
my $answer = $res->query($dom, 'NS');

if ($answer){
  foreach my $rr ($answer->answer) {
    push (@servidoresNS, lc($rr->nsdname).".") if ($rr->type eq "NS");
  }
}
else {
  $glosa[1] .= "<br>Error al consultar $ser: ". $res->errorstring ."<br>";
}

El código fuente anterior corresponde a parte de la evaluación de la primera característica (completitud de servidores de nombres), para lo cual, en primer lugar se declara un objeto 'resolver', identificado por la variable $res. A este resolver, se indica a que servidor de nombres se desea consultar, mediante el método 'nameservers', en donde la variable $ser tiene el nombre de servidor de nombres correspondiente. Luego, se asigna el tiempo de espera para esta consulta, mediante el método 'udp_timeout', para este caso se utiliza 3 segundos. Teniendo asignado el tiempo de espera y el servidor que se desea consultar, se realiza la consulta por los registros NS para el dominio identificado por la variable $dom, mediante la llamada del método 'query' del objeto resolver. La respuesta que retorna este método puede ser vacia en caso de algún error, en caso de no ser vacia se analiza para obtener los registros de tipo NS, los cuales se almacenan en un arreglo para su posterior análisis. En caso de que la respuesta sea vacía, se obtiene el mensaje de error desde el objeto 'resolver', mensaje que se almacena en la variable correspondiente (el elemento 1 del arreglo @glosa).

A continuación, se tiene un extracto del código fuente necesario para extraer los encabezados de las respuestas DNS, para poder determinar la autoridad y recursividad de las respuestas:

my $header = $answer->header;
if ($header->aa){
  $evaluacion[5] = 1 if ($evaluacion[5] != 0);
  $glosa[5] .= "<p>El servidor $ser responde con autoridad</p>";
} else {
  $evaluacion[5] = 0;
  $glosa[5] .= "<p>El servidor $ser responde SIN autoridad</p>";
}

if (!$header->ra){
  $evaluacion[6] = 1 if ($evaluacion[6] != 0);
  $glosa[6] .= "<p>El servidor $ser responde sin recursividad</p>";
} else {
  $evaluacion[6] = 0;
  $glosa[6] .= "<p>El servidor $ser responde con recursividad</p>";
}

Al llamar el método 'header' se obtienen los encabezados de la respuesta, los cuales son almacenados en la variable $header. Luego, se utilizan los métodos 'aa' y 'ra' para obtener la autoridad y recursividad de la respuesta, para finalmente asignar los mensajes y valores correspondientes de la evaluación de estas características.

Para saber si un registro está definido como CNAME, se realiza una consulta DNS para obtener el registro 'A' asociado al registro. Por ejemplo, para saber si el 'www' está definido como CNAME, se utiliza el siguiente código:

my $answerwww = $res->query("www.".$dom, "A");
if ($answerwww){
  foreach my $rr ($answerwww->answer) {
    if ($rr->type eq "CNAME"){
      $evaluacion[18] = 0;
      $glosa[18] .= "<p>Error, el registro WWW para $dom en $ser, ".
                    "est definido como CNAME:<br><pre>".
                    $rr->string ."</pre></p>";
    }
  }
} else {
  $evaluacion[18] = 0;
  $glosa[18] .= "<p>Error, no pude determinar si el registro WWW est ".
                "definido en $ser como CNAME: ". $res->errorstring. "</p>";
}

En este código, primero se realiza la consulta DNS por el registro de tipo 'A' para el host 'www.dominio.cl.", si se obtiene respuesta, se pasa a revisar el tipo del registro que viene en la respuesta, en caso de ser de tipo 'CNAME' se marca la evaluación y el mensaje correspondiente. En caso de no obtener respuesta se asigna el mensaje de error correspondiente.

 


Estudios
Curriculum
Tesis Magister
Paper
Memoria
DTEs
CADCC 2002

Personal
Blog
Rugby
Xblast!
Parcela 31
Contacto


Inicio
Valid HTML 4.01! View Jose Urzua's profile on LinkedIn