Navegador SNMP MIB em Perl e JavaScript

O que fazer no trabalho se não souber mais o que fazer? Claro, escreva para Habr!





Graças aos nossos valentes legisladores, o desenvolvimento de novos negócios por conta própria não é lucrativo e estamos saindo de um operador maior. Portanto, estou numa situação tal que não adianta modificar, reescrever e corrigir meus projetos antigos - não, o "grande homem" tem todos os seus serviços. Eu sento e fumo . E então penso, por que sentar, escreverei para Habr . O artigo foi moderado, "E então Ostap sofreu ...".





Então, do que trata este artigo. Qualquer pessoa que esteja envolvida em redes, mais cedo ou mais tarde se depara com o MIB . Para quem tem preguiça de seguir o link, trata-se de um banco de dados contendo informações sobre um objeto, no nosso caso, um dispositivo de rede. Vários artigos sobre Habré se dedicaram a trabalhar com o MIB e as questões daí decorrentes. Gostei do artigo SNMP MIBs e como prepará-los, onde o autor usou uma ferramenta do D-Link - o utilitário D-View para trabalhar com o MIB. Devo dizer desde já, conhecendo a qualidade do MIB deste fornecedor - não recomendo o uso do D-View em projetos reais. No entanto, dá uma ideia da interface típica de tal software. Curiosamente, não existem tantos programas para trabalhar diretamente com o MIB, semelhante em funcionalidade, pelo menos, ao D-View. Eu diria mesmo muito pouco . Não vou descrever todos os seus prós e contras. Aqui eu quero mostrar minha implementação, provavelmente não a melhor, mas ela foi escrita "para mim" e a funcionalidade foi adicionada conforme necessário.





Assim, o lado do servidor inteiro será baseado em Perl eo SNMP.pm biblioteca . Talvez eu divida o artigo em duas partes - a segunda será uma descrição do lado do cliente. Vamos começar carregando os MIBs de que precisamos:





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;
}
      
      



Várias explicações ao mesmo tempo: - primeiro, carregar apenas os módulos necessários, acelera significativamente o trabalho posterior com a árvore OID; - em segundo lugar, não é necessário especificar todos os módulos necessários, em um MIB devidamente "preparado" são usados ​​links para os módulos necessários, e eles serão carregados automaticamente, por exemplo:





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;
      
      



ou seja, especifica o que e para onde 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