SNMP MIB ブラウザ (続き)

まず、少し前に戻りたいと思います。では最初の部分、私は書いていない理由をMIBブラウザと多くは何とかこのすべてずに管理し、かなり自分のために自社のネットワークを監視するため、自身が一般的に、必要とされているMIBモジュール。原則として、「. 1.3.6.1.4.1.171.11.113.1.3.2.2.3」という形式のデジタル OID がこれに使用され、テーマ別フォーラムは「~するために OID を教えてください」というリクエストでいっぱいです。必要に応じて、プライベートブランチの近くまで歩いて、必要な OID を自分で見つけることができます





MIB ブラウザは、機器の操作を簡素化するためのツールです。これは、高速で便利な検索、インデックス、データ型を備えたデータベースに階層構造を持つことと実際には同じです。機器のすべてのセンサーとトリガーにすばやくアクセスして、それらを作成/編集できます。これにより、ネットワークの管理、エラーの特定、障害への迅速な対応が容易になります。これは、これまで知らなかった新しいモデルを扱う場合に特に重要です。





もちろん、ここでの多くはベンダーに依存するか、むしろベンダーが提供する MIB の品質とハードウェアでの snmp の実装に依存します。モジュールには、必要なインデックスの説明が欠けていることがよくあります。インデックスは、返された実際の値に対応していません。一般に、論理の範囲を超えた状況があります - 私は、企業の支店に2つの異なるベンダーを持っているある中国のメーカーからのgepon機器を持っています!そのため、必要な OID をブルート フォースで見つけようとします。そして、「あなたはすべて牛であり、tsiskiだけを購入する」と書く必要はありません。もちろん大げさに言っていますが、こういうコメントがよく耳にします。そして、私はどういうわけか osrについてtsiska を判断します。 MIB モジュールの操作に関するトピックが興味深い場合は、将来的にそのトピックに戻る可能性があります。





このようなもの。では最初の部分、我々は使用してツリーを形成するためにデータを準備jsTreeをデータをロードしましょう (精神的な組織が整っている場合は、画面から離れることをお勧めします)。





#  perl, js, html ...
# ?  .
sub make_tree {
    my $self = shift;
    my ( $attr, $id ) = @_;
    my $result = '';
    
    #      ,  
    #    JS 
    my %all;
    $all{core}{themes} = ( { variant => 'medium', responsive => 'true' } )
      if !$attr->{core}->{themes};
    $all{plugins} = ( $attr->{plugins} ) ? $attr->{plugins} : 'search';
    $all{search} =
      ( $attr->{search} )
      ? $attr->{search}
      : ( { case_insensitive => 'true', show_only_matches => 'false' } );
    
    #      
    %all = ( %all, %$attr );
    #  JSON
    my $DATA = JSON->new->indent->encode( \%all );
    # ,    
    #    json     
    $DATA =~ s/"false"/false/g;
    $DATA =~ s/"true"/true/g;
    $DATA =~ s/\"\*|\*\"/ /g;
    $DATA =~ s/"/'/g;

    #   (   
    #     )   DIV   
    $result .= qq{
    <link rel='stylesheet' href='/styles/lte_adm/plugins/jstree/themes/default/style.min.css' />
    <script type='text/javascript' src='/styles/lte_adm/plugins/jstree/jstree.min.js'></script>
    <div id='MY_TREE' align='left'></div>
  };
    #    js
    $result .= qq(
    <script>
      jQuery('#MY_TREE').jstree($DATA);
      </script>
   );

    #, ,  
    return $result;
}
      
      



スポイラーの下の画像:





そうです、これはすべて AdminLTE フレームワークのデフォルト テーマで描かれているため、色とアイコンが使用されています。「モジュール」ボタンに注意を払っていないため、それはありません。





次は何ですか。まず、mib ブラウザがどのように表示されるかを覚えておきましょう。





これらは 2 つの機能と 1 つの情報ブロックです。





  1. 直接、作業するツリー自体。





  2. デバイスによって返されるデータのブロック。データの種類に応じて、いくつかの操作を実行できます。





  3. 選択した識別子に関する詳細情報が表示されます。





私たちはすでにその木を持っています。情報ブロックを描画しましょう:





#  %lang   
sub nms_show {
    my ($attr) = @_;
    $snmpparms{UseSprintValue} = 1;

    #    API,      
    my $table = $html->table(
        {
            ID      => 'SNMP_SHOW',
            caption => $label,
        }
    );
    #   -,      
    $table->addrow( $html->b('objectID'),
        $SNMP::MIB{ $attr->{OID} }{objectID} );
    $table->addrow( $html->b( $lang{TYPE} ), $SNMP::MIB{ $attr->{OID} }{type} )
      if $SNMP::MIB{ $attr->{OID} }{type};
    $table->addrow( $html->b('Module'), $SNMP::MIB{ $attr->{OID} }{moduleID} );
    $table->addrow( $html->b('Varbinds'),
        "@{$SNMP::MIB{ $attr->{OID} }{varbinds}}" ) if $SNMP::MIB{ $attr->{OID} }{varbinds};;
    $table->addrow( $html->b( $lang{ACCESS} ),
        $SNMP::MIB{ $attr->{OID} }{access} );
    $table->addrow( $html->b('Syntax'), $SNMP::MIB{ $attr->{OID} }{syntax} )
      if $SNMP::MIB{ $attr->{OID} }{syntax};
    $table->addrow(
        $html->b( $lang{RANGE} ),
"$SNMP::MIB{$attr->{OID}}{ranges}[0]{low} .. $SNMP::MIB{$attr->{OID}}{ranges}[0]{high}"
    ) if $SNMP::MIB{ $attr->{OID} }{ranges}[0];
    $table->addrow( $html->b( $lang{DESCRIBE} ),
        $SNMP::MIB{ $attr->{OID} }{description} )
      if $SNMP::MIB{ $attr->{OID} }{description};
    $table->addrow( $html->b('Reference'),
        $SNMP::MIB{ $attr->{OID} }{reference} )
      if $SNMP::MIB{ $attr->{OID} }{reference};
    $table->addrow( $html->b('Index(es)'),
        "@{$SNMP::MIB{$attr->{OID}}{indexes}}" )
      if $SNMP::MIB{ $attr->{OID} }{indexes}[0];
    $table->addrow( $html->b('Value List'),
        oid_enums( $attr->{OID}, { STR => 1 } ) )
      if keys %{ $SNMP::MIB{ $attr->{OID} }{enums} };
    
    return $table->show();
}

#    enums
sub oid_enums {
    my ( $oid, $attr ) = @_;
    my %enums;
    my $str = '';
    foreach my $el ( keys %{ $SNMP::MIB{$oid}{enums} } ) {
        $enums{ $SNMP::MIB{$oid}{enums}{$el} } = $el;
    }
    if ($attr) {
        foreach my $key ( sort { $a <=> $b } keys %enums ) {
            $str .= "$key = $enums{$key} </br>";
        }
        return $str;
    }

    return %enums;
}
      
      



, 2- , . walk, get, gettable, snmpset. , :





#    snmpget
sub mibs_browser {

    my ($attr) = @_;
  
    if ( $FORM{OID} ) {
        #   
        print nms_show( { OID => $FORM{OID} } } );
        if ( $FORM{GET} ) {
            $snmpparms{UseSprintValue} = 1;
            # ,        IP 
            #      $obj
            my $sess = SNMP::Session->new( DestHost => $obj->{ip}, %snmpparms );
            my $iid = $attr->{IID} || 0;
            my $result = $sess->get( [ $FORM{OID}, $iid ] );
            #  
            if ( $sess->{ErrorNum} ) {
                    return $html->message( 'err', $lang{ERROR}, $sess->{ErrorStr} );
            }
            my $result_tbl = $html->table( {} );
            $result_tbl->addrow( $html->b( $lang{RESULT} ), $result );
            print $result_tbl->show();
            return 1;
        }
        elsif ( ... ) {
                #     
        }
        #
        return 1
    }
    #     2-  3- 
    my $res = $html->element('div', '', { id => 'RESULT'});
    #  
    my $tree = $html->element( 'div', mibs_tree());
    #       
    print $html->element( 'div', $tree . $res, { class => 'row' } );
    return 1;
}
      
      



'RESULT



' . . JavaScrpt - , , - , :





//$ID     ,
//     IP -
function renewLeftBox(itemName,Action,id,iid){
      iid = iid ? iid : 0 ;
      var url = 'index.cgi?OID=' + itemName + '&IID=' + iid + '&' + Action + '=$ID';
      jQuery('#RESULT').load(url);
    };

jQuery('#MY_TREE').on("changed.jstree", function (e, data) {
  renewLeftBox(data.instance.get_node(data.selected[0]).id,'SHOW', '$ID')
});

      
      



jsTree 'contextmenu'.



. JS:





//    
//     
function customMenu(node) {
          var items = {};
  //  ,    ,      
  //   
          if (node.type === 'scalar') {
            items.Get =  {
                  label: 'Get',
                  icon : 'fa fa-angle-down',
                  action: function () {
                    renewLeftBox(node.id,'GET');
                  }
            }        
          }
          if (node.type === 'row' || node.type === 'table' || node.type === 'indexes') {
            items.Walk = { 
                  label: 'Walk',
                  icon : 'fa fa-angle-double-down',
                  action: function () {
                    renewLeftBox(node.id,'WALK');
                  }
            }
          }
          if (node.type === 'table') {
            items.Table = { 
                  label: 'Table',
                  icon : 'fa fa-table',
                  action: function () {
                    renewLeftBox(node.id,'TABLE');
                  }
            }
          }

          return items;
      }
      
      



, , , . , , - , . , .








All Articles