SNMP MIB Browser (lanjutan)

Pertama, saya ingin kembali sedikit. Pada bagian pertama, saya tidak menulis mengapa browser MIB dan modul MIB itu sendiri umumnya diperlukan, karena banyak yang entah bagaimana mengelola tanpa semua ini dan cukup memantau jaringan mereka sendiri. Sebagai aturan, OID digital dalam bentuk " .1.3.6.1.4.1.171.11.113.1.3.2.2.3" digunakan untuk ini dan forum tematik penuh dengan permintaan " Beri tahu saya OID untuk ...". Jika mau, Anda dapat menemukan sendiri OID yang diperlukan dengan berjalan-jalan di suatu tempat yang lebih dekat ke cabang pribadi .





Peramban MIB adalah alat yang memungkinkan Anda menyederhanakan pekerjaan Anda dengan peralatan tersebut. Ini sebenarnya sama dengan memiliki struktur hierarkis dalam database dengan pencarian, indeks, tipe data yang cepat dan nyaman. Anda mendapatkan akses cepat ke semua sensor dan pemicu peralatan, dengan kemampuan untuk membuat / mengeditnya. Ini membuatnya lebih mudah untuk mengelola jaringan, mengidentifikasi kesalahan, dan merespons kesalahan dengan lebih cepat. Ini sangat penting ketika bekerja dengan model baru yang sebelumnya tidak Anda kenal.





Tentu saja, banyak di sini tergantung pada vendor, atau lebih tepatnya pada kualitas MIB yang mereka sediakan dan implementasi snmp pada perangkat keras. Modul sering kekurangan deskripsi indeks yang diperlukan, indeks tidak sesuai dengan nilai aktual yang dikembalikan, dll. Secara umum, ada situasi di luar batas logika - Saya memiliki peralatan gepon dari satu pabrikan Cina, yang memiliki dua vendor berbeda di cabang perusahaan ! Jadi cobalah untuk menemukan OID yang diperlukan dengan kekerasan. Dan tidak perlu menulis "Anda semua adalah ternak, beli hanya tsiski". Saya melebih-lebihkan, tentu saja, tetapi sering kali komentarnya terdengar seperti ini. Dan entah bagaimana saya menilai tsiska tentang osr . Jika topik tentang bekerja dengan modul MIB menarik, saya dapat kembali ke sana di masa mendatang.





Sesuatu seperti ini. Pada bagian pertama, kami menyiapkan data untuk membentuk pohon menggunakan jsTree . Mari memuat data (jika Anda memiliki organisasi mental yang baik, lebih baik menjauh dari layar):





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



Gambar di bawah spoiler:





Oh ya, semua ini digambar pada kerangka AdminLTE, dalam tema default, maka warna dan ikonnya. Kami tidak memperhatikan tombol "Modul", Anda tidak akan memilikinya.





Apa berikutnya. Pertama-tama mari kita ingat bagaimana tampilan browser mib kita:





ini adalah 2 fungsional dan satu blok informasi:





  1. Langsung pohon itu sendiri, yang dengannya kita akan bekerja.





  2. Blok data yang dikembalikan oleh perangkat. Tergantung pada jenis data, beberapa manipulasi dapat dilakukan.





  3. Akan ada informasi rinci tentang pengidentifikasi yang dipilih.





Kami sudah memiliki pohonnya. Mari menggambar blok informasi:





#  %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