Perl および JavaScript の SNMP MIB ブラウザ

他に何をすべきかわからない場合、仕事で何をすべきですか? もちろん、Habrに手紙を書いてください!





勇敢な立法者のおかげで、これ以上の事業展開は私たち自身では採算が合わず、大規模な事業者の下に身を置いています。そのため、古いプロジェクトを変更、書き直し、修正しても意味がないという状況があります。いいえ、「大物」にはすべてのサービスがあります。私は座って喫煙します。そして、なぜ座るのだろう私は Habr に手紙を書こう思います記事はモデレートされ、「そしてオスタプは苦しんだ...」.





では、この記事の内容です。ネットワーキングに関わっている人なら誰でも、遅かれ早かれMIB に出会います。リンクをたどるのが面倒な人のために、これはオブジェクト (この場合はネットワーク デバイス) に関する情報を含むデータベースです。MIB の操作に専念するHabréに関するいくつかの記事と、そこから生じる質問がありました。SNMP MIB とその準備方法の記事が気に入りました。、作成者は D-Link のツール (MIB を操作するための D-View ユーティリティ) を使用しました。このベンダーからの MIB の品質を知っているので、すぐに言わなければなりません。実際のプロジェクトで D-View を使用することはお勧めしません。ただし、それはそのようなソフトウェアの典型的なインターフェースのアイデアを提供します。奇妙なことに、MIB を直接操作するためのプログラムはそれほど多くなく、機能的には少なくとも D-View と似ています。私はほとんど言いません。それらの長所と短所をすべて説明するつもりはありません。ここでは、おそらく最良ではない私の実装を示したいと思いますが、「自分のために」書かれており、必要に応じて機能が追加されています。





したがって、サーバー側全体が Perl とSNMP.pmライブラリに基づいていますおそらく、記事を 2 つの部分に分割することになるでしょう。2 番目の部分はクライアント側の説明になります。必要な MIB をロードすることから始めましょう。





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



一度にいくつかの説明: - 最初に、必要なモジュールのみをロードすると、OID ツリーでのその後の作業が大幅に高速化されます。- 次に、必要なモジュールをすべて指定する必要はありません。適切に「準備された」MIB では、必要なモジュールへのリンクが使用され、それらは自動的にロードされます。たとえば、次のようになります。





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;
      
      



つまり、何をどこにインポートするかを指定します。





, 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