Sondeo SNMP rápido de dispositivos de red

Pertenezco a la generación de "redes salvajes" que a principios de siglo comenzaron a construir redes de diversos tamaños en el espacio postsoviético. No había suficiente de todo: dinero, educación, especialistas, equipo ... Pero el entusiasmo y la confianza en uno mismo eran inconmensurables. Esculpieron redes de casi cualquier cosa, o de cualquier cosa para la que hubiera suficiente dinero. Todavía recuerdo el día en que compré mi primer conmutador L2: el famoso DES-3526 .





Naturalmente, en algún momento hay un crecimiento cualitativo, y se hace necesario monitorear toda esta red zoológica. Hay tantos métodos y software para monitorear que incluso solo enumerarlos y características breves tomará más de un artículo.





Hace unos 5 años me comprometí a reescribir un módulo NMS escrito por mí mismo en ABillS . La facturación estaba escrita en Perl, y en ese momento yo era "ágil" en ella. La documentación de la API de facturación fue suficiente para transferir la cámara web de PHP a Perl. Al principio, para el sondeo periódico de piezas de hierro, utilicé un análogo de fping en Perl y tomé estadísticas SNMP por separado. Lo más molesto cuando se trabaja con SNMP son los terribles retrasos y, a medida que aumenta la cantidad de dispositivos que se sondean, también aumentan. Están luchando con esto con diferentes métodos: paralelización, aumento de los tiempos de espera, etc.





En realidad, aquí me gustaría compartir mi implementación de sondeo SNMP para equipos de red. Se utiliza la biblioteca SNMP , que forma parte del proyecto Net-SNMP . Para ser honesto, el código funciona según el principio "los novatos tienen suerte" (la versión tolerante es "los tontos tienen suerte"). Copié el código en una especie de hoja de jabón (no daré un enlace, no lo encontré), lo terminé un poco para mis necesidades, lo lancé y en el primer momento ni siquiera creí mis ojos. El Observium que estaba usando en ese momento sondeó mi cuadrícula, no tan grande (menos de 300 interruptores), durante más de un minuto, y en cuatro secuencias (noté de inmediato que se usó un mínimo de sensores al sondear, de lo contrario, la encuesta podría tardar 5 minutos). Y mi guión hizo lo mismo en 8-10 segundos.





Bueno, y luego el código en sí con comentarios:





use SNMP;

#       ,   @obj_list.
my @obj_list = ('10.0.0.100', '10.0.0.101', '10.0.0.102');

# ,     .
my %snmpparms;
$snmpparms{Version}        = 2;
$snmpparms{Retries}        = 1;
$snmpparms{UseSprintValue} = 0;
$snmpparms{Community}      = 'public';#      :)

#      OID.
my @mibs;
        push @mibs, SNMP::Varbind->new( [ 'sysObjectID', 0 ] );
        push @mibs, SNMP::Varbind->new( [ 'sysName',     0 ] );
        push @mibs, SNMP::Varbind->new( [ 'sysLocation', 0 ] );

#   
my $vb = SNMP::VarList->new(@mibs);

sub nms_poll {
    
    foreach my $obj (@obj_list) {
        my $sess = SNMP::Session->new(
            %snmpparms,
            DestHost  => $obj,
        );
        $sess->get( $vb, [ \&nms_clb, $obj ] );

        &SNMP::MainLoop(2);
    }
    return 1 if $status;
    return undef;
}

#   ,      
sub nms_clb {
    my ( $obj, $vl ) = @_;
    # ,   
    if ( defined $vl->[0] ) {
        &SNMP::finish();
    }
    else {
        
    }

    return ();
}
      
      



, . SNMP::MainLoop:





to be used with async SNMP::Session calls. MainLoop must be called after initial async calls so return packets from the agent will not be processed. If no args suplied this function enters an infinite loop so program must be exited in a callback or externally interupted.





5.04. "" SNMP, . .





Lo que está escrito con claridad no atrae un artículo, sino una nota. Lo escribí porque siento pena por los desarrollos que faltan, que ahora se están volviendo innecesarios. Pasa el tiempo, el mundo está cambiando. Los pequeños proveedores quebran, son absorbidos por grandes actores y cambian a modelos de agencia. Como resultado, mucha experiencia acumulada simplemente se vuelve superflua. Creo que esto no es correcto :)








All Articles