Introdução
No post anterior entendemos como criar a nossa MIB. Hoje iremos validar a MIB criada e prepará-la para uso como o Net-SNMP. Todos os testes foram realizados no Ubuntu 10.10 e também no Linux Mint 12, usando os pacotes originais de cada distribuição. Ambas usavam versões do Net-SNMP derivadas da versão original 5.4.3.
Instalando as dependências
O primeiro passo é instalar os programas necessários e também as MIBs oficiais. O comando abaixo deve resolver, já que as dependências do libsnmp-dev e snmp irão trazer os outros pacotes necessários. Já o pacote snmp-mibs-downloader faz a mágica de baixar todas as MIBs requeridas. Se este processo falhar, você pode tentar novamente executando o script /usr/bin/download-mibs diretamente.
sudo apt-get install snmp-mibs-downloader libsnmp-dev snmp
Preparando o ambiente
Como vamos realizar todas as tarefas dentro da conta usuário para evitar conflitos com versões de Net-SNMP do seu sistema, será necessário criar alguns diretórios. São eles:
mkdir -p ~/.snmp/mibs/ mkdir -p ~/snmp/src/
Copie a MIB que criamos no post anterior (EXEMPLO-MIB) para o diretório ~/.snmp/mibs/. Estamos assumindo que o arquivo da MIB será denominado de EXEMPLO-MIB, use exatamente este nome para poder reproduzir o conteúdo do post.
Verificando a instalação
Para se certificar de que tudo está certo, verifique como o Net-SNMP está procurando as informações de diretórios de MIBs com o comando:
net-snmp-config --default-mibdirs
A saída deve ser algo como abaixo:
/home/marcelo/.snmp/mibs:/usr/share/mibs/site:/usr/share/snmp/mibs:/usr/share/mibs/iana:/usr/share/mibs/ietf:/usr/share/mibs/netsnmp
Teste também os caminhos de configuração com:
net-snmp-config --snmpconfpath
Saída:
/etc/snmp:/usr/share/snmp:/usr/lib/snmp:/home/marcelo/.snmp:/var/lib/snmp
Ou seja, ~/.snmp/mibs é mesmo um local de procura de MIBs e ~/.snmp um local de configuração (no meu caso, o diretório de usuário é /home/marcelo/)
Crie o arquivo ~/.snmp/snmp.conf, com o seguinte conteúdo
mibs +EXEMPLO-MIB
Isto irá permitir a carga da sua MIB de dentro da sua própria conta, sem precisar escrever em áreas onde somente o administrador da máquina teria acesso.
Validando a MIB
Para verificar se a MIB não tem nenhum erro, percorra-a com o snmptranslate:
snmptranslate -Tp -IR acme
Deverá ser produzida uma saída em árvore, evidenciando tudo que foi feito, como a seguir:
+--acme(54321)
|
+--exemplo(0)
|
+--leds(0)
| |
| +-- -R-- EnumVal capsLock(0)
| | Values: aceso(1), apagado(2)
| +-- -R-- EnumVal numLock(1)
| | Values: aceso(1), apagado(2)
| +-- -RW- EnumVal scrollLock(2)
| Values: aceso(1), apagado(2)
|
+--sistema(1)
|
+-- -R-- Counter runTime(3)
Fique atento aos seguinte detalhes:
- O nome do arquivo da MIB e a definição inicial dentro do arquivo da MIB devem bater: “EXEMPLO-MIB” e “EXEMPLO-MIB DEFINITIONS …” (ver dentro do arquivo).
- Ao rodar o comando snmptranslate, o que importa é o nome do OID. No caso, leia a MIB e verá que, dentro dela, existe um OID “exemplo”.
Aliás, você poderia inspecionar outro ponto qualquer da árvore. Por exemplo:
snmptranslate -Tp -IR leds
+--leds(0)
|
+-- -R-- EnumVal capsLock(0)
| Values: aceso(1), apagado(2)
+-- -R-- EnumVal numLock(1)
| Values: aceso(1), apagado(2)
+-- -RW- EnumVal scrollLock(2)
Values: aceso(1), apagado(2)
Se deu tudo certo até agora, o passo seguinte é começar a escrever o código de acesso aos dados da sua MIB.
Gerando código com mib2c
Felizmente o Net-SNMP tem um utilitário chamado mib2c que permite a geração automática de callbacks para acesso aos seus OIDs após analisar a sua MIB. Isto irá lhe fazer economizar um bom tempo.
O mib2c usa um perfil de geração de código (veja a lista completa com “ls /etc/snmp/mib2c.*“). O perfil a ser usado dependerá da complexidade da sua MIB e das respostas que ela precisa prover. No nosso caso, existirão apenas leituras simples de OIDs, sem tabelas ou outras estruturas mais complexas. Isto pode ser tranquilamente gerado pelo perfil “escalar”. O mib2c vai precisar ainda de um OID à partir do qual ele irá gerar os callbacks. Vamos usar o OID exemplo, o nome do móduloda nossa MIB:
mib2c -c mib2c.scalar.conf exemplo
A saída deve ser algo como abaixo:
writing to exemplo.h writing to exemplo.c running indent on exemplo.c running indent on exemplo.h
Este comando irá gerar um arquivo exemplo.c e outro exemplo.h, com todos os esqueletos de função e definições necessários. Como dever de casa, inspecione estes arquivos e verifique, por exemplo, os registros de OIDs. Parte do arquivo está abaixo, para os que não puderem rodar ainda o mib2c:
/** Initializes the exemplo module */
void
init_exemplo(void)
{
static oid capsLock_oid[] = { 1,3,6,1,4,1,54321,0,0,0 };
static oid numLock_oid[] = { 1,3,6,1,4,1,54321,0,0,1 };
static oid scrollLock_oid[] = { 1,3,6,1,4,1,54321,0,0,2 };
static oid runTime_oid[] = { 1,3,6,1,4,1,54321,0,1,3 };
DEBUGMSGTL(("exemplo", "Initializing\n"));
netsnmp_register_scalar(
netsnmp_create_handler_registration("capsLock", handle_capsLock,
capsLock_oid, OID_LENGTH(capsLock_oid),
HANDLER_CAN_RONLY
));
netsnmp_register_scalar(
netsnmp_create_handler_registration("numLock", handle_numLock,
numLock_oid, OID_LENGTH(numLock_oid),
HANDLER_CAN_RONLY
));
netsnmp_register_scalar(
netsnmp_create_handler_registration("scrollLock", handle_scrollLock,
scrollLock_oid, OID_LENGTH(scrollLock_oid),
HANDLER_CAN_RWRITE
));
netsnmp_register_scalar(
netsnmp_create_handler_registration("runTime", handle_runTime,
runTime_oid, OID_LENGTH(runTime_oid),
HANDLER_CAN_RONLY
));
}
Basta agora preencher as funções e recompilar o net-snmp. Mas isto vai ficar para o próximo post. Não perca !