Navigateur SNMP MIB en Perl et JavaScript

Que faire au travail si vous ne savez pas quoi faire d'autre ? Bien sûr, écrivez à Habr !





Grâce à nos vaillants législateurs, le développement de notre entreprise par nous-mêmes n'est pas rentable et nous laissons sous le contrôle d'un opérateur plus important. J'ai donc une situation telle qu'il ne sert à rien de modifier, de réécrire et de corriger mes anciens projets - non, le "grand homme" a tous ses services. Je m'assois et fume . Et puis je pense, pourquoi s'asseoir, je vais écrire à Habr . L'article était modéré, "Et puis Ostap a souffert...".





Alors de quoi parle cet article. Toute personne impliquée dans le réseautage rencontre tôt ou tard le MIB . Pour ceux qui sont trop paresseux pour suivre le lien, il s'agit d'une base de données contenant des informations sur un objet, dans notre cas, un périphérique réseau. Plusieurs articles sur Habré ont été consacrés au travail avec le MIB et aux questions qui en découlent. J'ai aimé l'article MIB SNMP et comment les préparer, où l'auteur a utilisé un outil de D-Link - l'utilitaire D-View pour travailler avec le MIB. Je dois dire tout de suite, connaissant la qualité de la MIB de ce fournisseur - je ne recommande pas d'utiliser D-View dans de vrais projets. Cependant, cela donne une idée de l'interface typique d'un tel logiciel. Curieusement, il n'y a pas tellement de programmes pour travailler directement avec la MIB, similaires en fonctionnalités à au moins D-View. Je dirais même très peu . Je ne vais pas décrire tous leurs avantages et inconvénients. Ici, je veux montrer mon implémentation, probablement pas la meilleure, mais elle a été écrite "pour moi-même" et la fonctionnalité a été ajoutée au besoin.





Ainsi, tout le côté du serveur sera basé sur Perl et la SNMP.pm bibliothèque . Peut-être que je diviserai l'article en deux parties - la seconde sera une description du côté client. Commençons par charger les MIB dont nous avons besoin :





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



Plusieurs explications à la fois : - premièrement, charger uniquement les modules nécessaires, accélère considérablement le travail ultérieur avec l'arbre OID ; - deuxièmement, il n'est pas nécessaire de spécifier tous les modules nécessaires, dans une MIB correctement "préparée", des liens vers les modules nécessaires sont utilisés, et ils seront chargés automatiquement, par exemple :





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;
      
      



c'est-à-dire qu'il spécifie quoi et où importer.





, 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