まず、少し前に戻りたいと思います。では最初の部分、私は書いていない理由を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 つの情報ブロックです。
直接、作業するツリー自体。
デバイスによって返されるデータのブロック。データの種類に応じて、いくつかの操作を実行できます。
選択した識別子に関する詳細情報が表示されます。
私たちはすでにその木を持っています。情報ブロックを描画しましょう:
# %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;
}
, , , . , , - , . , .