O que fazer no trabalho se não souber mais o que fazer? Claro, escreva para Habr!
Graças aos nossos valentes legisladores, o desenvolvimento de novos negócios por conta própria não é lucrativo e estamos saindo de um operador maior. Portanto, estou numa situação tal que não adianta modificar, reescrever e corrigir meus projetos antigos - não, o "grande homem" tem todos os seus serviços. Eu sento e fumo . E então penso, por que sentar, escreverei para Habr . O artigo foi moderado, "E então Ostap sofreu ...".
Então, do que trata este artigo. Qualquer pessoa que esteja envolvida em redes, mais cedo ou mais tarde se depara com o MIB . Para quem tem preguiça de seguir o link, trata-se de um banco de dados contendo informações sobre um objeto, no nosso caso, um dispositivo de rede. Vários artigos sobre Habré se dedicaram a trabalhar com o MIB e as questões daí decorrentes. Gostei do artigo SNMP MIBs e como prepará-los, onde o autor usou uma ferramenta do D-Link - o utilitário D-View para trabalhar com o MIB. Devo dizer desde já, conhecendo a qualidade do MIB deste fornecedor - não recomendo o uso do D-View em projetos reais. No entanto, dá uma ideia da interface típica de tal software. Curiosamente, não existem tantos programas para trabalhar diretamente com o MIB, semelhante em funcionalidade, pelo menos, ao D-View. Eu diria mesmo muito pouco . Não vou descrever todos os seus prós e contras. Aqui eu quero mostrar minha implementação, provavelmente não a melhor, mas ela foi escrita "para mim" e a funcionalidade foi adicionada conforme necessário.
Assim, o lado do servidor inteiro será baseado em Perl eo SNMP.pm biblioteca . Talvez eu divida o artigo em duas partes - a segunda será uma descrição do lado do cliente. Vamos começar carregando os MIBs de que precisamos:
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;
}
Várias explicações ao mesmo tempo: - primeiro, carregar apenas os módulos necessários, acelera significativamente o trabalho posterior com a árvore OID; - em segundo lugar, não é necessário especificar todos os módulos necessários, em um MIB devidamente "preparado" são usados links para os módulos necessários, e eles serão carregados automaticamente, por exemplo:
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;
ou seja, especifica o que e para onde importar.
, 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, .