Estoy trabajando en una secuencia de comandos de Perl para ayudar con la automatización del escaneo de máquinas en nuestra red. No soy un programador de oficio, pero a pesar de todo este proyecto me ha sido asignado, y estoy bastante perplejo. Antes de explicar la naturaleza de lo que me está afectando, permítanme explicar el esquema de lo que estoy haciendo.Perl ¿cambia el valor dentro de un condicional antes de ingresar el condicional?
Básicamente, este script se ejecutará cada n horas. Cuando se ejecuta, comprobará un archivo que contenga un registro de direcciones IP activas y las comparará con un registro DHCP para seleccionar solo aquellas que son estáticas. Estos se colocan en un hash (uno nuevo si está marcado para inicializar, cargado utilizando Storable de lo contrario), con la clave siendo el IP y dentro de un array su MAC [0] y una fecha "último escaneado" [1] inicialmente configurada para 19700101. La siguiente parte del script compara la fecha entre la fecha de hoy y la fecha de "último escaneado" y, si está por debajo de un cierto umbral, envía una consulta a nuestro escáner.
El problema que me tiene tan perdido es que cuando se está verificando la fecha, me parece que el valor de fecha (la última actualización "escaneada") se está configurando antes de ingresar el condicional. Si bien esto no me parece probable, es la única posibilidad que se me ocurre. Aquí es los trozos relevantes de código:
El código que añade IP/MAC con el hash
if(init == 1){
%SCAN =();
@data =();
foreach $key (keys %IPS){
$unsavedDB = 1;
$data[0] = $IPS{$key};
$data[1] = 19700101;
print $data[1];
$SCAN{$key} = \@data;
}
}else{
#repeat of the above code, but with a if(exists...) to prevent duplicates from being added to the hash that is loaded via storables.
}
El código que comprueba la fecha (que se ha establecido previamente, y sería 20.120.726 por hoy). Entre el código anterior y la siguiente hay nada más que comentarios
$scanned = 0;
foreach $key (keys %SCAN){
$lastScanned = $SCAN{$key}[1];
if(($date - $lastScanned) > $threshold){
$unsavedDB = 1;
$toScan = ${$key}[0];
#omitted data for security reasons, just basically forms a string to send to a scanner
$SCAN{$key}[1] = $date;
$scanned++;
}
}
print "finished. $scanned hosts queued\n";
Ahora, la razón por la que creo que el valor se cambia antes de entrar en el bucle es cuando agrego comunicado una 'impresión $ lastScanned' justo antes de la 'if (($ date ...) {' la fecha imprimió lo que está asignado a $ date before - pero si quiero comentar la declaración '$ SCAN {$ key} [1] = $ date;', la impresión las declaraciones imprimirán la fecha '19700101' y todo funciona como debería. ¿Qué está sucediendo? $ SCAN {$ key} [1] nunca se toca excepto en los dos lugares mostrados arriba.
Disculpe si esto es muy grave expresado, o no tiene sentido. Hice mi mejor esfuerzo para explicar algo que ha sido acosándome por horas.
¡Gracias!
¡Gracias! ¡Esto fue muy útil! ¡Leeré todo lo que vinculó y revisaré esa sección de código tan inquietante! –