他に何をすべきかわからない場合、仕事で何をすべきですか? もちろん、Habrに手紙を書いてください!
勇敢な立法者のおかげで、これ以上の事業展開は私たち自身では採算が合わず、大規模な事業者の下に身を置いています。そのため、古いプロジェクトを変更、書き直し、修正しても意味がないという状況があります。いいえ、「大物」にはすべてのサービスがあります。私は座って喫煙します。そして、なぜ座るのだろう、私は Habr に手紙を書こうと思います。記事はモデレートされ、「そしてオスタプは苦しんだ...」.
では、この記事の内容です。ネットワーキングに関わっている人なら誰でも、遅かれ早かれMIB に出会います。リンクをたどるのが面倒な人のために、これはオブジェクト (この場合はネットワーク デバイス) に関する情報を含むデータベースです。MIB の操作に専念するHabréに関するいくつかの記事と、そこから生じる質問がありました。SNMP MIB とその準備方法の記事が気に入りました。、作成者は D-Link のツール (MIB を操作するための D-View ユーティリティ) を使用しました。このベンダーからの MIB の品質を知っているので、すぐに言わなければなりません。実際のプロジェクトで D-View を使用することはお勧めしません。ただし、それはそのようなソフトウェアの典型的なインターフェースのアイデアを提供します。奇妙なことに、MIB を直接操作するためのプログラムはそれほど多くなく、機能的には少なくとも D-View と似ています。私はほとんど言いません。それらの長所と短所をすべて説明するつもりはありません。ここでは、おそらく最良ではない私の実装を示したいと思いますが、「自分のために」書かれており、必要に応じて機能が追加されています。
したがって、サーバー側全体が Perl とSNMP.pmライブラリに基づいています。おそらく、記事を 2 つの部分に分割することになるでしょう。2 番目の部分はクライアント側の説明になります。必要な MIB をロードすることから始めましょう。
sub load_mibs {
my ($attr, $Nms) = @_;
# MIB ,
#( - ),
my $MIB_search_path = '../modules/Nms/mibs';
#
SNMP::addMibDirs($MIB_search_path);
SNMP::addMibDirs($MIB_search_path . '/private');
# , -
# .
if ( $attr->{ALL} ) {
SNMP::addMibFiles( glob( $MIB_search_path . '/private' . '/*' ) );
SNMP::initMib();
}
# DES3200-28
elsif ( $attr->{SYS_ID} ) {
my @mods = ('EQUIPMENT-MIB', 'DES3200-28-L3MGMT-MIB', 'CABLE-DIAG-MIB');
#, , MIB
SNMP::loadModules(@mods);
SNMP::initMib();
}
return 1;
}
一度にいくつかの説明: - 最初に、必要なモジュールのみをロードすると、OID ツリーでのその後の作業が大幅に高速化されます。- 次に、必要なモジュールをすべて指定する必要はありません。適切に「準備された」MIB では、必要なモジュールへのリンクが使用され、それらは自動的にロードされます。たとえば、次のようになります。
IMPORTS
MODULE-IDENTITY, OBJECT-TYPE, NOTIFICATION-TYPE,
OBJECT-IDENTITY, Counter32, Gauge32, Integer32, mib-2
FROM SNMPv2-SMI
DisplayString, TimeStamp, TimeInterval, TestAndIncr,
AutonomousType, TEXTUAL-CONVENTION
FROM SNMPv2-TC
MODULE-COMPLIANCE, OBJECT-GROUP
FROM SNMPv2-CONF;
つまり、何をどこにインポートするかを指定します。
, OID %SNMP::MIB. , , - JS . , - . jsTree, :
sub mibs_tree {
my ($attr) = @_;
my %labels;
my @tree_arr;
foreach my $oid ( sort keys(%SNMP::MIB) ) {
# , .
my $prev_id =
( $SNMP::MIB{$oid}{parent} )
? $SNMP::MIB{$oid}{parent}{objectID}
: '#';
# OID jsTree
my $icon = '';
my %type;
if ( $SNMP::MIB{$oid}{children}[0]{indexes}[0] ) {
$type{type} = 'table';
}
elsif ($SNMP::MIB{$oid}{parent} && $SNMP::MIB{$oid}{parent}{indexes}[0]){
$type{type} = 'row';
}
elsif ( $SNMP::MIB{$oid}{type} ) {
$type{type} = 'scalar';
}
elsif ( $SNMP::MIB{$oid}{indexes}[0] ) {
$type{type} = 'indexes';
}
else {
$type{type} = 'folder';
}
push @tree_arr,
(
{
id => $SNMP::MIB{$oid}{objectID},
text => $SNMP::MIB{$oid}{label},
parent => $prev_id,
%type
}
);
}
}
my %types = (
table => { icon => 'fa fa-table' },
row => { icon => 'fa fa-columns' },
scalar => { icon => 'fa fa-paragraph' },
indexes => { icon => 'fa fa-list-ul' },
folder => { icon => 'fa fa-folder-o' },
);
return make_tree(
{
plugins => [ 'types', 'search', 'contextmenu' ],
contextmenu => { items => '*customMenu*' },
types => \%types,
core => { data => \@tree_arr }
}
);
}
, JS HTML. , :
, , . github. , , Perl, .