Navegador SNMP MIB (continuación)

Primero, quiero retroceder un poco. En la primera parte, no escribí por qué el navegador MIB y los módulos MIB en sí son generalmente necesarios, porque muchos de alguna manera se las arreglan sin todo esto y monitorean sus redes por sí mismos. Como regla general, se utiliza un OID digital de la forma " .1.3.6.1.4.1.171.11.113.1.3.2.2.3" y los foros temáticos están llenos de solicitudes " Dime el OID para ...". Si lo desea, puede encontrar el OID requerido usted mismo caminando a algún lugar más cercano a la sucursal privada .





El navegador MIB es exactamente la herramienta que le permitirá simplificar su trabajo con el equipo. En realidad, esto es lo mismo que tener una estructura jerárquica en una base de datos con búsquedas, índices y tipos de datos rápidos y convenientes. Obtiene acceso rápido a todos los sensores y activadores del equipo, con la capacidad de crearlos / editarlos. Esto facilita la administración de redes, la identificación de errores y una respuesta más rápida a las fallas. Esto es especialmente importante cuando se trabaja con nuevos modelos previamente desconocidos para usted.





Por supuesto, mucho aquí depende de los proveedores, o más bien de la calidad de las MIB que proporcionan y de la implementación de snmp en el hardware. Los módulos a menudo carecen de descripciones de los índices requeridos, los índices no corresponden a los valores reales devueltos, etc. En general, hay situaciones más allá de los límites de la lógica: tengo equipos gepon de un fabricante chino, ¡que tiene dos proveedores diferentes en la rama de empresas ! Así que intente encontrar los OID requeridos por la fuerza bruta. Y no es necesario escribir "todos ustedes son ganado, compren sólo tsiski". Estoy exagerando, por supuesto, pero a menudo los comentarios suenan así. Y de alguna manera juzgo a un tsiska sobre osr . Si el tema sobre cómo trabajar con módulos MIB es interesante, es posible que vuelva a él en el futuro.





Algo como esto. En la primera parte, preparamos los datos para formar un árbol usando jsTree . Carguemos los datos (si tiene una buena organización mental, es mejor alejarse de las pantallas):





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



Imagen debajo del spoiler:





Oh, sí, todo esto se dibuja en el marco AdminLTE, en el tema predeterminado, de ahí los colores y los iconos. No prestamos atención al botón "Módulos", no lo tendrás.





Que sigue. Primero recordemos cómo se verá nuestro navegador mib:





Estos son 2 bloques funcionales y uno de información:





  1. Directamente el propio árbol, con el que trabajaremos.





  2. Un bloque de datos devuelto por el dispositivo. Dependiendo del tipo de datos, se puede realizar alguna manipulación.





  3. Habrá información detallada sobre los identificadores seleccionados.





Ya tenemos el árbol. Dibujemos un bloque de información:





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