Primeiro, quero voltar um pouco. Na primeira parte, eu não escrevi por que o navegador MIB e os próprios módulos MIB são geralmente necessários, porque muitos de alguma forma gerenciam sem tudo isso e monitoram suas redes por si próprios. Como regra, um OID digital no formato " .1.3.6.1.4.1.171.11.113.1.3.2.2.3" é usado para isso e os fóruns temáticos estão cheios de solicitações " Diga-me o OID para ...". Se desejar, você mesmo pode encontrar o OID necessário caminhando em algum lugar mais próximo da agência privada .
O navegador MIB é exatamente a ferramenta que permitirá simplificar o trabalho com o equipamento. Na verdade, isso é o mesmo que ter uma estrutura hierárquica em um banco de dados com pesquisas, índices e tipos de dados rápidos e convenientes. Você tem acesso rápido a todos os sensores e gatilhos do equipamento, com a possibilidade de criá-los / editá-los. Isso torna mais fácil administrar redes, identificar erros e responder mais rapidamente a falhas. Isso é especialmente importante ao trabalhar com novos modelos até então desconhecidos para você.
Claro, muito aqui depende dos fornecedores, ou melhor, da qualidade dos MIBs que eles fornecem e da implementação do snmp no hardware. Freqüentemente, os módulos não têm descrições dos índices necessários, os índices não correspondem aos valores reais retornados, etc. Em geral, existem situações além dos limites da lógica - eu tenho equipamento Gepon de um fabricante chinês, que tem dois fornecedores diferentes no ramo de empresas ! Portanto, tente encontrar os OIDs necessários pela força bruta. E não é necessário escrever "vocês são todos gado, compre apenas tsiski". Estou exagerando, é claro, mas muitas vezes os comentários soam assim. E de alguma forma eu julgo um tsiska sobre osr . Se o tópico sobre como trabalhar com módulos MIB for interessante, posso retornar a ele no futuro.
Algo assim. Na primeira parte, preparamos os dados para formar uma árvore usando jsTree . Vamos carregar os dados (se você tiver uma boa organização mental, é melhor se afastar das telas):
# 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;
}
Imagem sob o spoiler:
Ah, sim, tudo isso é desenhado no framework AdminLTE, no tema padrão, daí as cores e os ícones. Não prestamos atenção ao botão "Módulos", você não o terá.
Qual é o próximo. Vamos primeiro lembrar como será o nosso navegador mib:
estes são 2 funcionais e um bloco de informações:
Diretamente a própria árvore, com a qual trabalharemos.
Um bloco de dados retornado pelo dispositivo. Dependendo do tipo de dados, algumas manipulações podem ser realizadas.
Haverá informações detalhadas sobre os identificadores selecionados.
Já temos a árvore. Vamos desenhar um bloco de informações:
# %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;
}
, , , . , , - , . , .