Navegador SNMP MIB en Perl y JavaScript

¿Qué hacer en el trabajo si no sabe qué más hacer? ¡Por supuesto, escribe a Habr!





Gracias a nuestros valientes legisladores, un mayor desarrollo comercial por nuestra cuenta no es rentable y nos estamos yendo bajo un operador más grande. Así que tengo una situación tal que no tiene sentido modificar, reescribir y corregir mis viejos proyectos - no, el "gran hombre" tiene todos sus servicios. Me siento y fumo . Y luego pienso, para qué sentarme, le escribiré a Habr . El artículo fue moderado, "Y luego Ostap sufrió ...".





Entonces, de qué trata este artículo. Cualquiera que esté involucrado en la creación de redes, tarde o temprano se encontrará con el MIB . Para aquellos que son demasiado perezosos para seguir el enlace, esta es una base de datos que contiene información sobre un objeto, en nuestro caso, un dispositivo de red. Hubo varios artículos sobre Habré dedicados a trabajar con el MIB y las preguntas que surgen de esto. Me gustó el artículo SNMP MIB y cómo prepararlos, donde el autor utilizó una herramienta de D-Link, la utilidad D-View para trabajar con la MIB. Debo decir de inmediato, conociendo la calidad de la MIB de este proveedor, no recomiendo usar D-View en proyectos reales. Sin embargo, da una idea de la interfaz típica de dicho software. Curiosamente, no hay tantos programas para trabajar directamente con la MIB, similar en funcionalidad a al menos D-View. Incluso diría muy poco . No voy a describir todos sus pros y contras. Aquí quiero mostrar mi implementación, probablemente no la mejor, pero fue escrita "para mí" y la funcionalidad se agregó según sea necesario.





Por lo tanto, todo el lado del servidor se basa en Perl y el SNMP.pm biblioteca . Quizás dividiré el artículo en dos partes: la segunda será una descripción del lado del cliente. Comencemos cargando los MIB que necesitamos:





sub load_mibs {
    my ($attr, $Nms) = @_;
    # MIB     ,  
    #(    -   ),   
    my $MIB_search_path = '../modules/Nms/mibs';
    
    #      
    SNMP::addMibDirs($MIB_search_path);
    SNMP::addMibDirs($MIB_search_path . '/private');
    
    #     ,      -
    #    .
    if ( $attr->{ALL} ) {
        SNMP::addMibFiles( glob( $MIB_search_path . '/private' . '/*' ) );
        SNMP::initMib();
    }
    #   DES3200-28
    elsif ( $attr->{SYS_ID} ) {
        my @mods = ('EQUIPMENT-MIB', 'DES3200-28-L3MGMT-MIB', 'CABLE-DIAG-MIB');
        #,     ,    MIB
        SNMP::loadModules(@mods);
        SNMP::initMib();
    }
    
    return 1;
}
      
      



Varias explicaciones a la vez: - primero, cargar solo los módulos necesarios, acelera significativamente el trabajo adicional con el árbol OID; - en segundo lugar, no es necesario especificar todos los módulos necesarios, en una MIB debidamente "preparada" se utilizan enlaces a los módulos necesarios, que se cargarán automáticamente, por ejemplo:





IMPORTS
    MODULE-IDENTITY, OBJECT-TYPE, NOTIFICATION-TYPE,
    OBJECT-IDENTITY, Counter32, Gauge32, Integer32, mib-2
        FROM SNMPv2-SMI
    DisplayString, TimeStamp, TimeInterval, TestAndIncr,
      AutonomousType, TEXTUAL-CONVENTION
        FROM SNMPv2-TC
    MODULE-COMPLIANCE, OBJECT-GROUP
        FROM SNMPv2-CONF;
      
      



es decir, especifica qué y dónde importar.





, OID %SNMP::MIB. , , - JS . , - . jsTree, :





sub mibs_tree {

    my ($attr) = @_;

    my %labels;
    my @tree_arr;
    
    foreach my $oid ( sort keys(%SNMP::MIB) ) {
    		#  ,  .
        my $prev_id =
              ( $SNMP::MIB{$oid}{parent} )
              ? $SNMP::MIB{$oid}{parent}{objectID}
              : '#';
        
        #      OID     jsTree
        my $icon = '';        
        my %type;
        if ( $SNMP::MIB{$oid}{children}[0]{indexes}[0] ) {
        	$type{type} = 'table';
        }
        elsif ($SNMP::MIB{$oid}{parent} && $SNMP::MIB{$oid}{parent}{indexes}[0]){
        		$type{type} = 'row';
        }
        elsif ( $SNMP::MIB{$oid}{type} ) {
        		$type{type} = 'scalar';
        }
        elsif ( $SNMP::MIB{$oid}{indexes}[0] ) {
        		$type{type} = 'indexes';
        }
        else {
        		$type{type} = 'folder';
        }
        push @tree_arr,
              (
                {
                    id     => $SNMP::MIB{$oid}{objectID},
                    text   => $SNMP::MIB{$oid}{label},
                    parent => $prev_id,
                    %type
                }
              );
        }
    }

    my %types = (
        table   => { icon => 'fa fa-table' },
        row     => { icon => 'fa fa-columns' },
        scalar  => { icon => 'fa fa-paragraph' },
        indexes => { icon => 'fa fa-list-ul' },
        folder  => { icon => 'fa fa-folder-o' },
    );
    
    return make_tree(
        {
            plugins => [ 'types', 'search', 'contextmenu' ],
            contextmenu => { items => '*customMenu*' },
            types       => \%types,
            core        => { data  => \@tree_arr }
        }
    );
}
      
      



, JS HTML. , :





, , . github. , , Perl, .












All Articles