Tout d'abord, je veux revenir un peu en arrière. Dans la première partie, je n'ai pas écrit pourquoi le navigateur MIB et les modules MIB eux-mêmes sont généralement nécessaires, car beaucoup se débrouillent en quelque sorte sans tout cela et surveillent tout à fait leurs réseaux eux-mêmes. En règle générale, un OID numérique de la forme « .1.3.6.1.4.1.171.11.113.1.3.2.2.3 » est utilisé pour cela et les forums thématiques regorgent de requêtes « Dites-moi l' OID afin de… ». Si vous le souhaitez, vous pouvez trouver vous-même l'OID requis en vous promenant quelque part plus près de la succursale privée .
Le navigateur MIB est exactement l'outil qui vous permettra de simplifier votre travail avec l'équipement. C'est en fait la même chose que d'avoir une structure hiérarchique dans une base de données avec des recherches, des index et des types de données rapides et pratiques. Vous obtenez un accès rapide à tous les capteurs et déclencheurs de l'équipement, avec la possibilité de les créer/modifier. Cela facilite l'administration des réseaux, l'identification des erreurs et la réponse plus rapide aux pannes. Ceci est particulièrement important lorsque vous travaillez avec de nouveaux modèles qui vous étaient auparavant inconnus.
Bien sûr, beaucoup dépend ici des fournisseurs, ou plutôt de la qualité des MIB qu'ils fournissent et de l'implémentation de snmp sur le matériel. Les modules manquent souvent de descriptions des index requis, les index ne correspondent pas aux valeurs réelles retournées, etc. En général, il y a des situations qui dépassent les limites de la logique - j'ai du matériel Gepon d'un fabricant chinois, qui a deux fournisseurs différents dans la branche entreprises ! Essayez donc de trouver les OID requis par force brute. Et il n'est pas nécessaire d'écrire "vous êtes tous du bétail, n'achetez que des tsiski". J'exagère, bien sûr, mais souvent les commentaires ressemblent à ça. Et je juge en quelque sorte un tsiska sur osr . Si le sujet sur le travail avec les modules MIB est intéressant, j'y reviendrai peut-être à l'avenir.
Quelque chose comme ça. Dans la première partie, nous avons préparé les données pour former un arbre en utilisant jsTree . Chargeons les données (si vous avez une bonne organisation mentale, il vaut mieux s'éloigner des écrans) :
# 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;
}
Photo sous le spoiler :
Ah oui, tout cela est dessiné sur le framework AdminLTE, dans le thème par défaut, d'où les couleurs et les icônes. On ne fait pas attention au bouton "Modules", vous ne l'aurez pas.
Et après. Rappelons d'abord à quoi ressemblera notre navigateur mib :
il s'agit de 2 blocs fonctionnels et d'un bloc d'information :
Directement l'arbre lui-même, avec lequel nous allons travailler.
Un bloc de données renvoyé par l'appareil. Selon le type de données, certaines manipulations peuvent être effectuées.
Il y aura des informations détaillées sur les identifiants sélectionnés.
Nous avons déjà l'arbre. Dessinons un bloc d'informations :
# %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;
}
, , , . , , - , . , .