tutorial snmp.pdf

Upload: sileno-de-oliveira-brito

Post on 02-Mar-2016

109 views

Category:

Documents


0 download

TRANSCRIPT

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (1) | Jedizone

    jedizone.wordpress.com/2012/02/02/o-guia-definitivo-para-os-iniciantes-em-net-snmp-1/ 1/4

    Jedizone

    O guia definitivo para os iniciantes em Net-SNMP (1)

    Introduo

    interessante observar como existem perguntas que so feitas repetidamente. Enquanto muitomais fcil assumir que quem pergunta no sabe perguntar ou no entende a resposta, por outrolado a frequncia da pergunta pode indicar que a resposta no boa. No meu ponto de vista, istoacontece com o Net-SNMP. Existem muitas fontes de informao, em geral dispersas. Vriosdetalhes so respondidos via cdigo fonte apenas, o que pode atrapalhar tambm. Associe isto a umassunto com jargo e conceitos prprios e tudo fica ainda mais complexo.

    Foi pensando neste cenrio que resolvi escrever um tutorial de como iniciar com o Net-SNMP. Noquero publicar um monte de cdigo fonte, como geralmente encontramos por a. Quero discutir osprincpios envolvidos e levar o leitor para um ponto de entendimento verdadeiro, no um merodigitador de tutorial, um escriba digital. uma meta audaciosa, da o ttulo pretensioso da srie. Noentanto, como j consegui realiz-la em outros tutoriais, como o super referenciado tutorial deVLAN em Linux (http://www.vivaolinux.com.br/artigo/Criando-Redes-Locais-Virtuais-%28VLANs%29-com-Linux) ou sobre a srie criao de um RTOS

    (http://jedizone.wordpress.com/2010/08/11/ajude-a-divulgar-a-serie/), acredito que posso conseguirnovamente. Contarei com a ajuda do meu amigo Alan Carvalho (http://acassis.wordpress.com/)como revisor desta srie. Como ambos j implementamos equipamentos com Net-SNMP, pode seruma boa chance de diminuir possveis erros.

    Uma observao final: no espere encontrar tudo sobre SNMP nesta introduo. Na verdade, oobjetivo justamente o inverso: espere encontrar apenas o necessrio para conseguir entender oprximo post. A ideia ir aumentando o conhecimento de forma gradual, omitindo detalhes quepodem apenas tornar o primeiro passo mais difcil. Livros e RFCs podem ajudar a refinar osconceitos quando voc decidir que realmente a hora ou precisar de algo mais avanado.

    O que o SNMP ?

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (1) | Jedizone

    jedizone.wordpress.com/2012/02/02/o-guia-definitivo-para-os-iniciantes-em-net-snmp-1/ 2/4

    A traduo livre de SNMP (Simple Network Management Protocol) pode ser Protocolo Simples deGerenciamento de Rede [1]. Como o nome indica, ele foi criado com o foco em gerncia de rede,permitindo avaliar e monitorizar, em tempo real, as condies de switches, roteadores, impressoras,entre outros. O SNMP foi criado pelo IETF (Internet Engineering Task Force), sendo normatizadoatravs de vrios RFC (Request For Comments), cada um descrevendo aspectos particulares doprotocolo e da sua implementao, sendo que os mais antigos datam de 1990. Ao final do textoexiste uma lista de RFCs relacionados ao SNMP.

    O SNMP no segue sempre o paradigma cliente/servidor e gera um jargo prprio para denominaros seus elementos. Em geral, os elementos envolvidos com o SNMP se dividem em manageddevices (dispositivos gerenciados) e managers (gerentes). Os dispositivos gerenciados executamAgentes (agents, em ingls) que se comunicam com os Sistemas de Gesto de Redes (Network-Management Systems, em ingls).

    Esta comunicao, na maior parte do tempo cliente/servidor, com o sistema de gesto (cliente)

    pedindo ou enviando informaes para o agente (servidor). Por exemplo, existem comandos comoGET, usado para pedir uma informao, ou SET, usado para enviar um novo valor de informao.

    No entanto, o agente pode tambm enviar informaes para o sistema de gesto, sem que este tenharequisitado, agindo como cliente e este ltimo como servidor, neste caso. Esta uma situaocomum para envio de alarmes, denominados traps, em ingls. O seu roteador poderia serconfigurado para enviar um alarme quando a taxa de utilizao do link atingisse um determinadovalor, por exemplo, sem que o manager fizesse uma requisio explcita.

    Na figura a seguir temos um exemplo da comunicao entre um manager (executando numservidor) e de um agente, rodando num switch. Fluxos do tipo cliente/servidor e trap estorepresentados.

    (http://jedizone.files.wordpress.com/2012/02/net-snmp-manager-agente.png)

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (1) | Jedizone

    jedizone.wordpress.com/2012/02/02/o-guia-definitivo-para-os-iniciantes-em-net-snmp-1/ 3/4

    Verses do SNMP

    O SNMP vem sempre evoluindo, agregando mais segurana e funcionalidades com o decorrer dotempo. No entanto, caractersticas sofisticadas de segurana s so encontradas na verso maisrecente, infelizmente nem to utilizada como as verses anteriores. De forma rpida, as verses estolistadas a seguir [3]:

    SNMP Version 1 (SNMPv1): verso inicial, definida no RFC 1157 e grandemente suportada.Pouco segura por usar passwords em texto puro.SNMP version 2 (SNMPv2): devinida nos RFC 3416, 3417 e 3418 e conhecida como SNMPv2c(c de community), com categorias de acesso ao agente definidas como comunidades.SNMP version 3 (SNMPv3), com grandes melhorias em segurana, tais como autenticao,criptografia, etc. Definida atravs de vrios RFCs: 3410, 3411, 3412, 3413, 3414, 3415, 3416,3417, 3418 e 2576. Ainda relativamente pouco usada.

    O que o Net-SNMP ?

    O Net-SNMP um grande projeto de fonte aberta iniciado em 1992 e responsvel por um conjuntode programas usados para a implementao das vrias verses do SNMP e com suporte a IPv4 eIPv6. Licenciado por licenas que se assemelham a BSD (existem algumas pequenas variaes), oNet-SNMP pode ser executado em vrios sistemas Unix, Linux e at mesmo Windows. Ser atravsda infraestrutura do Net-SNMP que desenvolveremos todos os nossos exemplos.

    Est bom por hoje. No prximo post (jedizone.wordpress.com/2012/02/09/o-guia-definitivo-para-os-iniciantes-em-net-snmp-2/), vamos discutir mais alguns conceitos, como MIBs e OIDs. Voc podeme seguir no twitter para receber notificaes dos futuros posts desta srie atravs do usurio@marcelobarros (http://twitter.com/marcelobarros). At l !

    Referncias:

    [1] SNMP: detalhes tcnicos, RFCs, etc:http://en.wikipedia.org/wiki/Simple_Network_Management_Protocol(http://en.wikipedia.org/wiki/Simple_Network_Management_Protocol)[2] Net-SNMP: http://www.net-snmp.org/ (http://www.net-snmp.org/)[3] Essential SNMP, 2nd Edition, Douglas Mauro, Kevin Schmidt, Editora OReilly

    Linux , NET-SNMP , SNMP About these ads (http://en.wordpress.com/about-these-ads/)

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (1) | Jedizone

    jedizone.wordpress.com/2012/02/02/o-guia-definitivo-para-os-iniciantes-em-net-snmp-1/ 4/4

    This entry was posted on fevereiro 2, 2012, 9:16 am and is filed under Linux, Redes, SNMP. You canfollow any responses to this entry through RSS 2.0. Voc pode deixar uma resposta, ou trackback doseu prprio site.

    COMENTRIOS (0) TRACKBACKS (4)

    1. O guia definitivo para os iniciantes em Net-SNMP (2) Jedizone2. O guia definitivo para os iniciantes em Net-SNMP (3) Jedizone3. O guia definitivo para os iniciantes em Net-SNMP (4) Jedizone4. O guia definitivo para os iniciantes em Net-SNMP (5) Jedizone

    Blog no WordPress.com. The Fusion Theme.

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (2) | Jedizone

    jedizone.wordpress.com/2012/02/09/o-guia-definitivo-para-os-iniciantes-em-net-snmp-2/ 1/3

    Jedizone

    O guia definitivo para os iniciantes em Net-SNMP (2)

    MIBs e OIDs

    De volta ao assunto Net-SNMP, vamos hoje discutir sobre como a informao organizada noSNMP. Se voc est comeando deste post melhor ler o post anterior(http://jedizone.wordpress.com/2012/02/02/o-guia-definitivo-para-os-iniciantes-em-net-snmp-1/)antes. Lembrando tambm que esta srie conta com a reviso do Alan Carvalho(http://acassis.wordpress.com).

    Toda informao gerenciada pelo agente descrita atravs de uma MIB (Management InformationBase). A MIB pode ser entendida como a descrio da base de dados hierrquica que um agente estdisponibilizando. A figura a seguir ilustra uma parte desta MIB, geralmente representada em formade rvore. Cada novo nodo tem um nome e um nmero relacionado, como pode ser visto abaixo. Aespecificao do SNMP deixa claro como a organizao da rvore feita, assim como o nome dosnodos padronizados.

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (2) | Jedizone

    jedizone.wordpress.com/2012/02/09/o-guia-definitivo-para-os-iniciantes-em-net-snmp-2/ 2/3

    (http://jedizone.files.wordpress.com/2012/02/mid_oid.png)

    Cada elemento descrito nesta base de dados possui um identificador, denominado de OID (ObjectIdentifier, em ingls). Eles podem ser referenciados usando os nomes dos nodos separados por pontoou atravs da sequncia de nmeros dos nodos.

    Por exemplo, considere o seguinte OID:

    .iso.org.dod.internet.private.enterprises

    Usando os nmeros dos nodos, o endereo anterior poderia ser descrito como (procure os nmero nafigura anterior, para entender):

    .1.3.6.1.4.1

    Os OIDs que comeam com pontos so considerados absolutos, isto , sempre referenciam a origemda hierarquia, a raiz. No entanto, possvel ter tambm OIDs relativos, cuja origem parte de umponto especfico da hierarquia. Alm disso, existe uma terceira forma suportada pelo Net-SNMPonde empregada uma notao de escopo, geralmente relacionada a um ponto especfico darvore bastante utilizado e referenciado na documentao do SNMP.

    A diferena entre as trs formas pode ser vista a seguir, onde um nodo da ramificao system usado:

    Notao absoluta: .1.3.6.1.2.1.1.1 ou .iso.org.dod.internet.mgmt.mib-2.system.sysDescrNotao relativa: system.sysDescr

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (2) | Jedizone

    jedizone.wordpress.com/2012/02/09/o-guia-definitivo-para-os-iniciantes-em-net-snmp-2/ 3/3

    Notao de escopo: SNMPv2-MIB::system.sysDescr

    No se preocupe muito com o contedo do OID ou com a rvore. Neste momento, basta saber comoeles so organizados. Ao fazer o seu prprio exemplo isto vai ficar bem mais claro. Depois, com adescrio do tipo de dado de cada OID e a sua posio hierrquica na rvore, fica possvel que umgerente consiga fazer o acesso informao desejada na base de dados.

    Est bom por hoje. No prximo post (http://jedizone.wordpress.com/2012/02/15/o-guia-definitivo-para-os-iniciantes-em-net-snmp-3/), vamos discutir os tipos de dados que podem ser usados e ospassos iniciais para a criao de uma MIB personalizada. At l !

    Linux , NET-SNMP , SNMP

    This entry was posted on fevereiro 9, 2012, 12:05 am and is filed under Linux, Redes, SNMP. Youcan follow any responses to this entry through RSS 2.0. Voc pode deixar uma resposta, outrackback do seu prprio site.

    COMENTRIOS (0) TRACKBACKS (3)

    1. O guia definitivo para os iniciantes em Net-SNMP (3) Jedizone2. O guia definitivo para os iniciantes em Net-SNMP (4) Jedizone3. O guia definitivo para os iniciantes em Net-SNMP (5) Jedizone

    Blog no WordPress.com. The Fusion Theme.

    About these ads (http://en.wordpress.com/about-these-ads/)

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (3) | Jedizone

    jedizone.wordpress.com/2012/02/15/o-guia-definitivo-para-os-iniciantes-em-net-snmp-3/ 1/3

    Jedizone

    O guia definitivo para os iniciantes em Net-SNMP (3)

    Tipos de dados no SNMP

    Continuando a srie (veja tambm os posts anteriores, I(http://jedizone.wordpress.com/2012/02/02/o-guia-definitivo-para-os-iniciantes-em-net-snmp-1/) e II(http://jedizone.wordpress.com/2012/02/09/o-guia-definitivo-para-os-iniciantes-em-net-snmp-2/)), sevoc pretende criar um equipamento que tenha suporte a SNMP, vai ter que descrever a sua parteda rvore. Isto significa ter que aprender a linguagem que descreve uma MIB, chamada de ASN.1,ou Abstract Syntax Notation One, em ingls. O primeiro passo, neste caso, entender os tipos dedados que podem ser usados. Felizmente, a lista no grande, sendo resumida logo a seguir (verRFC 1155 para detalhes):

    Tipos primitivos:

    OCTET STRING: uma string, de zero ou mais octetos. Lembrando que um octeto um byte de

    8 bits. O octet string usado como uma forma geral de descrio j que pode conter textoslegveis (pelo menos em codificaes ocidentais). O nome do equipamento, do responsvel oumesmo o modelo se encaixam muito bem em octect string.COUNTER: um nmero de 32 bits, na faixa de [0,2^32-1] e que deve ser inicializado com zero.Caso este nmero ultrapasse o limite superior, ele deve continuar partir do zero. Ele deve sersempre crescente, at que o limite superior seja alcanado e o contador reinicie. Este tipo de dado usado geralmente para contar eventos, como nmero de bytes transmitidos, frames recebidos,etc.INTEGER: apesar de ser tambm um nmero de 32 bits, o integer geralmente usado para secriar enumeraes, isto , um conjunto de valores numricos finito que descrevem estados,caractersticas, etc. Por exemplo, um LED poderia ter uma enumerao com dois valores: (1)para APAGADO e (2) para ACESO. O valor zero no deve ser usado na enumerao, pornorma. Todos os valores usados na enumerao so documentados na MIB e existem testes paraverificar a faixa.OBJECT IDENTIFIER: um tipo de dado que descreve um OID, aquela sequncia de nmerosseparados por pontos, visto no post anterior.NULL: Indica um valor nulo. No usado na descrio da MIB, geralmente apenas nacomunicao.

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (3) | Jedizone

    jedizone.wordpress.com/2012/02/15/o-guia-definitivo-para-os-iniciantes-em-net-snmp-3/ 2/3

    Tipos compostos tambm existem:

    SEQUENCE: um tipo de dado que especifica uma lista de elementos formados por tiposprimitivos. Usado para descrever listas de valores e ajuda na formao de tabelas.SEQUENCE OF: Geralmente usado para a descrio de tabelas, onde cada coluna de umdeterminado tipo de dado primitivo e precisa-se enviar uma linha dessa tabela por vez. Nestecaso, sequence of ir se referir a uma lista, ou seja, um dado do tipo sequence. Uma situaocomum quando se envia uma tabela de interfaces de rede de um roteador, com colunas comonome, estado, frames recebidos. Cada linha desta tabela pode ser descrita por uma lista(sequence) de octect string (nome), Integer (estado) e Counter (frames recebidos) e a tabela comouma sequncia de sequncias (sequence of). Sim, um pouco confuso, vale a pena reler esteltimos dois tipos.IpAddress: um endereo IP de 32 bits, isto , IP verso 4 (IPv4).NetwordAddress: um endereo de rede de 32 bits, isto , IP verso 4 (IPv4).Gauge: apesar de ser um nmero de 32 bits como o counter, o gauge no precisa ser semprecrescente, basta obedecer a faixa [0,2^32-1]. Se voc tiver que especificar, por exemplo, o uso debanda instantneo, este seria um bom candidato.TimeTicks: este tipo de dado, tambm de 32 bits, representa um valor de tempo. Cada unidaderepresenta um centsimo de segundo. Poderia ser usado para indicar, por exemplo, por quantotempo um determinado servidor est em execuo.Opaque: um tipo de dado especial que permite que outros tipos possam ser representados parauma sequncias de bytes, isto , como um octect string. Imagine, por exemplo, que voc preciseenviar um nmero de dupla preciso (ponto flutuante). Seria possvel fazer isto com o tipoopaque, ficando a decodificao/decodificao na responsabilidade dos agentes e gerentes. Dpara perceber que possvel colocar qualquer coisa aqui, no ?

    Com estes tipos j possvel pensar na representao dos dados da MIB. Como voc deve terpercebido, cada um deles tem um propsito bem especfico, no so simplesmente nmeros comfaixas diferentes. Tentei mostrar isso ao dar exemplos de uso de cada um deles.

    Por exemplo, usar um Gauge no lugar de um Counter um erro grave j que o Counter precisa sercrescente. No fundo, o SNMP poderia trabalhar apenas a com diferena entre o valor atual e oanterior, o que faz sentido para o Counter mas no para o Gauge.

    Continuaremos com o assunto MIBs personalizadas no prximo post(http://jedizone.wordpress.com/2012/02/23/o-guia-definitivo-para-os-iniciantes-em-net-snmp-4/).At l !

    Linux , NET-SNMP , SNMP

    This entry was posted on fevereiro 15, 2012, 8:00 pm and is filed under Linux, Redes, SNMP. Youcan follow any responses to this entry through RSS 2.0. Voc pode deixar uma resposta, outrackback do seu prprio site.

    COMENTRIOS (0) TRACKBACKS (3)

    1. O guia definitivo para os iniciantes em Net-SNMP (4) Jedizone2. O guia definitivo para os iniciantes em Net-SNMP (5) Jedizone3. O guia definitivo para os iniciantes em Net-SNMP (2) | Jedizone

    About these ads (http://en.wordpress.com/about-these-ads/)

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (3) | Jedizone

    jedizone.wordpress.com/2012/02/15/o-guia-definitivo-para-os-iniciantes-em-net-snmp-3/ 3/3

    Blog no WordPress.com. The Fusion Theme.

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (4) | Jedizone

    jedizone.wordpress.com/2012/02/23/o-guia-definitivo-para-os-iniciantes-em-net-snmp-4/ 1/3

    Jedizone

    O guia definitivo para os iniciantes em Net-SNMP (4)

    Planejando uma MIB

    No leu os posts anteriores ? Por favor, ento faa isso agora, antes de continuar nesse post, parano perder a linha de raciocnio e conceitos bsicos (veja os links para os posts I(http://jedizone.wordpress.com/2012/02/02/o-guia-definitivo-para-os-iniciantes-em-net-snmp-1/), II(http://jedizone.wordpress.com/2012/02/09/o-guia-definitivo-para-os-iniciantes-em-net-snmp-2/) e III(http://jedizone.wordpress.com/2012/02/15/o-guia-definitivo-para-os-iniciantes-em-net-snmp-3/)).

    Neste post, o assunto como planejar a sua MIB personalizada. Como j comentamos, a partepersonalizada da sua MIB deve estar abaixo do nodo enterprises. Ser necessrio requisitar umponto de entrada na hierarquia da MIB para a sua empresa, caso ela ainda no tenha. Se quiserapenas testar, use um nmero ainda no alocado. Vale lembrar que o IANA registra(http://pen.iana.org/pen/PenApplication.page), gratuitamente, estes pontos de entrada (veja a listacompleta aqui (http://www.iana.org/assignments/enterprise-numbers)).

    Por exemplo, suponha que a empresa fictcia ACME esteja listada como o nmero de enterpriseprivado 54321 (Private Enterprise Number, ou PEN). Teremos o seguinte ponto de entrada:

    absoluto: .iso.org.dod.internet.private.enterprise.acmeabsoluto (numrico): .1.3.6.1.4.1.54321relativo: entreprises.54321

    Abaixo desta entrada, quem manda voc. Eu recomendo que d uma olhada em como outrasempresas pensaram a organizao do espao delas de MIB. Isto pode lhe ajudar a fazer umadistribuio mais racional e preparada para o futuro. muito comum ver ramos para produtos,ramos experimentais e de teste.

    Para um exemplo bem didtico e visual, resolvemos expor, atravs da nossa MIB exemplo, quatroelementos comuns de um sistema baseado em PC:

    O estado do led do caps lock (apenas leitura e com estados aceso ou apagado)O estado do led num lock (apenas leitura e com estados aceso ou apagado)O estado do led scroll lock (leitura e escrita e com estados aceso ou apagado). Como pouca se usao scroll lock, acreditamos que no seja problema escrever nele.

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (4) | Jedizone

    jedizone.wordpress.com/2012/02/23/o-guia-definitivo-para-os-iniciantes-em-net-snmp-4/ 2/3

    O tempo de execuo do sistema (apenas leitura), em segundos

    Vamos colocar os leds dentro de um nodo leds e o tempo de execuo dentro de um nodosistema. Alm disso, toda esta estrutura vai ficar abaixo de um nodo chamado exemplo,subordinado ao nodo acme. Graficamente, teremos:

    (http://jedizone.files.wordpress.com/2012/02/mib-exemplo.png)MIB exemplo rvore

    Com esta MIB em mente, o OID do led scroll lock, por exemplo, pode ser escrito como:

    absoluto: .iso.org.dod.internet.private.enterprise.acme.examplo.leds.scrolllockabsoluto (numrico): .1.3.6.1.4.1.54321.0.0.2relativo: entreprises.54321.0.0.2

    Notem que os nmeros dos nodos foram escolhidos pelo gerente de redes da empresa ACME (eumesmo) e no precisariam ser necessariamente sequenciais. Com relao aos tipos de dados, j deupara perceber que os os leds sero do tipo INTEGER, com dois valores possveis (1 para aceso e 2para apagado), e que o tempo de execuo ser do tipo COUNTER ? Se no ficou claro, recomendoreler o post anterior (http://jedizone.wordpress.com/2012/02/15/o-guia-definitivo-para-os-iniciantes-em-net-snmp-3/).

    Muito bem. Com tudo definido hora de usar a linguagem ASN.1(http://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One), ou Abstract Syntax Notation One,para descrever a MIB que planejamos. Sim, no prximo post(http://jedizone.wordpress.com/2012/03/02/o-guia-definitivo-para-os-iniciantes-em-net-snmp-5/).Vejo vocs l.

    Linux , NET-SNMP , SNMP

    This entry was posted on fevereiro 23, 2012, 11:33 pm and is filed under Linux, Redes, SNMP. Youcan follow any responses to this entry through RSS 2.0. Voc pode deixar uma resposta, outrackback do seu prprio site.

    About these ads (http://en.wordpress.com/about-these-ads/)

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (4) | Jedizone

    jedizone.wordpress.com/2012/02/23/o-guia-definitivo-para-os-iniciantes-em-net-snmp-4/ 3/3

    COMENTRIOS (0) TRACKBACKS (2)

    1. O guia definitivo para os iniciantes em Net-SNMP (5) Jedizone2. O guia definitivo para os iniciantes em Net-SNMP (3) | Jedizone

    Blog no WordPress.com. The Fusion Theme.

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (5) | Jedizone

    jedizone.wordpress.com/2012/03/02/o-guia-definitivo-para-os-iniciantes-em-net-snmp-5/ 1/8

    Jedizone

    O guia definitivo para os iniciantes em Net-SNMP (5)

    Introduo

    Este o nosso ltimo post terico e vamos aprender nele como escrever a nossa MIB de exemplo nanotao ASN.1. Antes de mais nada, j aviso que no sairo letrados nesta notao, apenasaprenderemos o necessrio para o exemplo. Afinal, uma srie para iniciantes, no ? Aumente seunvel de concentrao pois teremos um post bem mais extenso aqui. Mos obra ! (Links para osposts anteriores: I (http://jedizone.wordpress.com/2012/02/02/o-guia-definitivo-para-os-iniciantes-em-net-snmp-1/), II (http://jedizone.wordpress.com/2012/02/09/o-guia-definitivo-para-os-iniciantes-em-net-snmp-2/), III (http://jedizone.wordpress.com/2012/02/15/o-guia-definitivo-para-os-iniciantes-em-net-snmp-3/), e IV (http://jedizone.wordpress.com/2012/02/23/o-guia-definitivo-para-os-iniciantes-em-net-snmp-4/))

    Descrevendo a hierarquia

    A primeira coisa a saber como derivar um nodo do outro na notao ASN.1, isto , comoestabelecer as relaes de hierarquia entre os objetos (OIDs) na rvore. Para indicar isto, veja aseguinte notao:

    nodoFilho ::= { nodoPai numeroDoNodoFilho }

    Uma observao: o correto se referir ao nodo como OID ou objeto, mas vou usar nodo enquantoconsiderar que ele represente com mais clareza o conceito e ir mudando para OID no decorrer dotexto. Perdoem a falta de rigor tcnico em favorecimento da aprendizagem.

    Voltando ao nosso caso, para indicar a relao de hierarquia entre o nodo acme, cujo supostonmero privado foi 54321, e a sua origem, enterprises, fazemos a seguinte declarao:

    acme ::= { enterprises 54321 }

    Se voc esqueceu, a representao grfica da MIB est a seguir:

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (5) | Jedizone

    jedizone.wordpress.com/2012/03/02/o-guia-definitivo-para-os-iniciantes-em-net-snmp-5/ 2/8

    (http://jedizone.files.wordpress.com/2012/02/mib-exemplo.png)

    MIB exemplo rvore

    Observando a hierarquia, possvel notar que temos o nodo exemplo logo a seguir, com nmerozero. Ou seja:

    exemplo ::= { acme 0 }

    Da mesma forma, os nodos leds e sistema, derivados de exemplo, so representados comoabaixo, em plena conformidade com o nosso diagrama de MIB:

    leds ::= { exemplo 0 }sistema ::= { exemplo 1 }

    Finalmente, temos derivaes de leds e sistema, onde realmente se encontram os objetos quequeremos ter acesso:

    capsLock ::= { leds 0 }numLock ::= { leds 1 }scrollLock ::= { leds 2 }runTime ::= { sistema 0 }

    Colocando tudo junto, ficamos com a lista abaixo (compare este resultado com a figura querepresente a MIB, caso tenha dvida):

    acme ::= { enterprises 54321 }exemplo ::= { acme 0 }leds ::= { exemplo 0 }sistema ::= { exemplo 1 }capsLock ::= { leds 0 }numLock ::= { leds 1 }scrollLock ::= { leds 2 }runTime ::= { sistema 0 }

    Fcil, nhein ? Mas no s isso. Precisamos ainda detalhar cada entrada dessas. Algumas delas soapenas relaes de hierarquia que precisam ser declaradas, outras so objetos que sero realmentelidos e precisam ter definidos os seus tipos de dados, direitos de acesso, descrio, etc. Tambm preciso prover uma informao geral sobre a MIB, como data de criao, verso, entre outras coisas.

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (5) | Jedizone

    jedizone.wordpress.com/2012/03/02/o-guia-definitivo-para-os-iniciantes-em-net-snmp-5/ 3/8

    Detalhando a descrio do objeto

    De uma forma geral, as declaraes anteriores sero modificadas para apresentar este detalhamento,ou melhor, esta caracterizao do objeto, segundo este novo modelo:

    nodoFilho MACRO-DE-CARACTERIZACAO-DO-OBJETO DETALHE-1 valor-1 DETALHE-2 valor-2 ... DETALHE-n valor-n ::= { nodoPai numeroDoNodoFilho }

    Por exemplo, os objetos capsLock, numLock, scrollLock e runTime so os elementos que serorealmente acessados pelo gerente SNMP. Na realidade, eles devem ser declarados com a ajuda deuma macro chamada OBJECT-TYPE (ver RFC 1212), que ir permitir definir o tipo de dado,direitos de acesso, etc. Esta macro ir ser inserida entre o nome do objeto e sua declarao deherana. Vamos ver como ficaria a declarao completa do runTime para se ter uma ideia:

    runTime OBJECT-TYPE SYNTAX Counter32 ACCESS read-only STATUS mandatory DESCRIPTION "Current running time in seconds" ::= { sistema 3 }

    Note que foi definido o tipo de dado (Counter32), os direitos de acesso (read-only), a suaobrigatoriedade de implementao e a descrio do objeto. Recomendo fortemente que voc leia as

    RFCs citadas ao final deste post ou quando for precisar de criar a sua prpria MIB.

    Vamos ver outro exemplo, no caso para o led capsLock:

    capsLock OBJECT-TYPE SYNTAX INTEGER { aceso(1), apagado(2) } ACCESS read-only STATUS mandatory DESCRIPTION " Caps Lock Led Status: 1: Aceso 2: Apagado " ::= { leds 0 }

    O tipo de dado usado agora foi INTEGER, sendo tambm fornecida a faixa vlida de valores, 1 e 2,com seus respectivos rtulos, aceso e apagado. Isto lembra muito uma enumerao emlinguagem C, com uma notao um pouco diferente, no caso rtulo(id). Caso queira declarar

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (5) | Jedizone

    jedizone.wordpress.com/2012/03/02/o-guia-definitivo-para-os-iniciantes-em-net-snmp-5/ 4/8

    apenas uma faixa de valores, sem rtulos, voc pode usar algo como INTEGER(0..65536),

    indicando uma faixa de 0 a 65536. Tambm possvel usar o tipo Integer32 e no ter queespecificar faixas (RFC 2578). Notou como simples colocar strings longas, de mltiplas linhas ?

    numLock segue o mesmo padro de capsLock, por ser somente leitura:

    numLock OBJECT-TYPE SYNTAX INTEGER { aceso(1), apagado(2) } ACCESS read-only STATUS mandatory DESCRIPTION " Num Lock Led Status: 1: Aceso 2: Apagado " ::= { leds 1 }

    Apenas scrollLock se altera, j que permite a escrita no objeto. No preciso ter midi-chlorians nosangue para chutar como ficaria:

    scrollLock OBJECT-TYPE SYNTAX INTEGER { aceso(1), apagado(2) } ACCESS read-write STATUS mandatory DESCRIPTION " Scroll Lock Led Status: 1: Aceso 2: Apagado " ::= { leds 2 }

    Isto completa a descrio dos objetos que sero acessados mas faltam ainda trs coisas:

    1. A descrio da MIB exemplo que estamos criando (autor, data, reviso, etc)2. Detalhamento de nodos que so puramente para descrio da hierarquia (leds e sistema)3. Sees de importao de macros, algo parecido com o que temos nos #includes em um

    programa em C.

    Detalhando o mdulo

    Para a descrio da MIB, a referncia a RFC 2578, que apresenta todos os detalhes. A grossomodo, a nossa definio poderia ser feita com a ajuda da macro MODULE-IDENTITY:

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (5) | Jedizone

    jedizone.wordpress.com/2012/03/02/o-guia-definitivo-para-os-iniciantes-em-net-snmp-5/ 5/8

    exemplo MODULE-IDENTITY LAST-UPDATED "201203010000Z"

    ORGANIZATION "ACME S/A" CONTACT-INFO " Marcelo Barros de Almeida Sertaozinho/SP Brazil -http://jedizone.wordpress.com " DESCRIPTION "exemplo MIB, initial revision" ::= { acme 0 }

    Relativamente simples, no ? Caso a MIB mude, voc pode ir adicionando a descrio das revisescom os campos REVISION e DESCRIPTION. Perceba tambm que a data segue o formatoYYYYMMDDHHMMZ. O Z significa GMT e precisa estar no final. Os outros campos soauto-explicativos.

    Detalhando a hierarquia

    Objetos teis apenas para montagem da hierarquia, como leds e sistema, so definidos com aajuda de OBJECT IDENTIFIER, sem muitos rodeios:

    acme OBJECT IDENTIFIER ::= { enterprises 54321 }leds OBJECT IDENTIFIER ::= { exemplo 0 }sistema OBJECT IDENTIFIER ::= { exemplo 1 }

    Detalhando a definio da MIB

    Quase pronto. O toque final envelopar tudo que fizemos, indicando os includes necessrios,como pode ser visto abaixo. So as incluses que trazem a definio de cada macro utilizada etambm passam a prover determinados tipos de dados. Aproveite para aprender que linhascomeando com significam comentrios e so excelentes para melhorar ainda mais adocumentao da MIB:

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (5) | Jedizone

    jedizone.wordpress.com/2012/03/02/o-guia-definitivo-para-os-iniciantes-em-net-snmp-5/ 6/8

    EXEMPLO-MIB DEFINITIONS ::= BEGIN IMPORTS MODULE-IDENTITY, OBJECT-TYPE, Counter32 FROM SNMPv2-SMI, enterprises FROM SNMPv2-SMI; -- -- Nossa declarao de MIB vai aqui dentro !

    --END

    Fica um lembrete de que a conveno usar nomes de OIDs que comecem em letras minsculas eque o nome da MIB deve ser escrito em letras maisculas. Tambm no vlido usar _ nadefinio do nome, da a definio EXEMPLO-MIB.

    Finalmente, basta colocar tudo junto e teremos o arquivo de MIB que pode ser visto ao final do post.Salve-o com o nome EXEMPLO-MIB. Neste ponto, uma vez que voc j deve ter entendido a lgicada MIB, no difcil comear a planejar a sua MIB. De novo, no deixe de ler as RFCs pertinentespara aprender a usar outros tipos de dados e aprofundar-se nos detalhes (a lista de leituras est logoao final).

    Por hoje s. No prximo post (http://jedizone.wordpress.com/2012/03/08/o-guia-definitivo-para-os-iniciantes-em-net-snmp-6/) vamos dar uma pausa na teoria e fazer a instalao do Net-SNMP.Vamos precisar tambm do cdigo fonte para adicionar a nossa MIB no agente. At l !

    Referncias

    RFC4181 (http://www.ietf.org/rfc/rfc4181.txt): Guidelines for Authors and Reviewers of MIBDocumentsRFC2578 (http://www.ietf.org/rfc/rfc2578.txt): Structure of Management Information Version 2(SMIv2)RFC1212 (http://www.ietf.org/rfc/rfc1212.txt): Concise MIB DefinitionsDicas (http://www.mibdesigner.com/html/mibdesign.html)do que fazer e no fazer

    Arquivo EXEMPLO-MIB

    EXEMPLO-MIB DEFINITIONS ::= BEGIN IMPORTS MODULE-IDENTITY, OBJECT-TYPE, Counter32 FROM SNMPv2-SMI,

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (5) | Jedizone

    jedizone.wordpress.com/2012/03/02/o-guia-definitivo-para-os-iniciantes-em-net-snmp-5/ 7/8

    enterprises FROM SNMPv2-SMI;

    -- -- Descrio da MIB exemplo -- exemplo MODULE-IDENTITY LAST-UPDATED "201203010000Z" ORGANIZATION "ACME S/A" CONTACT-INFO " Marcelo Barros de Almeida Sertaozinho/SP Brazil - http://jedizone.wordpress.com " DESCRIPTION "exemplo MIB, initial revision." ::= { acme 0 }

    -- -- Hierarquia auxiliar -- acme OBJECT IDENTIFIER ::= { enterprises 54321 } leds OBJECT IDENTIFIER ::= { exemplo 0 } sistema OBJECT IDENTIFIER ::= { exemplo 1 }

    -- -- Objetos exportados -- capsLock OBJECT-TYPE SYNTAX INTEGER { aceso(1), apagado(2) } ACCESS read-only STATUS mandatory DESCRIPTION " Caps Lock Led Status: 1: Aceso 2: Apagado " ::= { leds 0 }

    numLock OBJECT-TYPE SYNTAX INTEGER { aceso(1), apagado(2) } ACCESS read-only STATUS mandatory DESCRIPTION " Num Lock Led Status: 1: Aceso 2: Apagado

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (5) | Jedizone

    jedizone.wordpress.com/2012/03/02/o-guia-definitivo-para-os-iniciantes-em-net-snmp-5/ 8/8

    " ::= { leds 1 }

    scrollLock OBJECT-TYPE SYNTAX INTEGER { aceso(1), apagado(2) } ACCESS read-write STATUS mandatory DESCRIPTION " Scroll Lock Led Status: 1: Aceso 2: Apagado " ::= { leds 2 }

    runTime OBJECT-TYPE SYNTAX Counter32 ACCESS read-only STATUS mandatory DESCRIPTION "Current running ime in seconds" ::= { sistema 3 }

    END

    Linux , NET-SNMP , SNMP

    This entry was posted on maro 2, 2012, 2:11 am and is filed under Linux, Redes, SNMP. You canfollow any responses to this entry through RSS 2.0. Voc pode deixar uma resposta, ou trackback doseu prprio site.

    COMENTRIOS (1) TRACKBACKS (2)

    #1 por tales em setembro 19, 2013 - 3:11 pm

    Muito bom Estou comeando a implementao de um agente com MIBs personalizadas e estefoi a melhor orientao que li at agora, fala detalhadamente sobre o assunto. Mais uma vezparabns.Se tiver mais informaes sobre SNMP, MIB ou gerenciamento de redes gostaria de ler tambm.

    1. O guia definitivo para os iniciantes em Net-SNMP (6) Jedizone2. O guia definitivo para os iniciantes em Net-SNMP (4) | Jedizone

    Blog no WordPress.com. The Fusion Theme.

    About these ads (http://en.wordpress.com/about-these-ads/)

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (6) | Jedizone

    jedizone.wordpress.com/2012/03/08/o-guia-definitivo-para-os-iniciantes-em-net-snmp-6/ 1/6

    Jedizone

    O guia definitivo para os iniciantes em Net-SNMP (6)

    Introduo

    No post anterior (http://jedizone.wordpress.com/2012/03/02/o-guia-definitivo-para-os-iniciantes-em-net-snmp-5/) entendemos como criar a nossa MIB. Hoje iremos validar a MIB criada e prepar-lapara uso como o Net-SNMP. Todos os testes foram realizados no Ubuntu 10.10 e tambm no LinuxMint 12, usando os pacotes originais de cada distribuio. Ambas usavam verses do Net-SNMPderivadas da verso original 5.4.3.

    Instalando as dependncias

    O primeiro passo instalar os programas necessrios e tambm as MIBs oficiais. O comando abaixodeve resolver, j que as dependncias do libsnmp-dev e snmp iro trazer os outros pacotes

    necessrios. J o pacote snmp-mibs-downloader faz a mgica de baixar todas as MIBs requeridas.Se este processo falhar, voc pode tentar novamente executando o script /usr/bin/download-mibsdiretamente.

    sudo apt-get install snmp-mibs-downloader libsnmp-dev snmp

    Preparando o ambiente

    Como vamos realizar todas as tarefas dentro da conta usurio para evitar conflitos com verses deNet-SNMP do seu sistema, ser necessrio criar alguns diretrios. So eles:

    mkdir -p ~/.snmp/mibs/mkdir -p ~/snmp/src/

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (6) | Jedizone

    jedizone.wordpress.com/2012/03/08/o-guia-definitivo-para-os-iniciantes-em-net-snmp-6/ 2/6

    Copie a MIB que criamos no post anterior (EXEMPLO-MIB) para o diretrio ~/.snmp/mibs/.Estamos assumindo que o arquivo da MIB ser denominado de EXEMPLO-MIB, use exatamenteeste nome para poder reproduzir o contedo do post.

    Verificando a instalao

    Para se certificar de que tudo est certo, verifique como o Net-SNMP est procurando asinformaes de diretrios de MIBs com o comando:

    net-snmp-config --default-mibdirs

    A sada 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 tambm os caminhos de configurao com:

    net-snmp-config --snmpconfpath

    Sada:

    /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 configurao(no meu caso, o diretrio de usurio /home/marcelo/)

    Crie o arquivo ~/.snmp/snmp.conf, com o seguinte contedo

    mibs +EXEMPLO-MIB

    Isto ir permitir a carga da sua MIB de dentro da sua prpria conta, sem precisar escrever em reasonde somente o administrador da mquina teria acesso.

    Validando a MIB

    Para verificar se a MIB no tem nenhum erro, percorra-a com o snmptranslate:

    snmptranslate -Tp -IR acme

    Dever ser produzida uma sada em rvore, evidenciando tudo que foi feito, como a seguir:

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (6) | Jedizone

    jedizone.wordpress.com/2012/03/08/o-guia-definitivo-para-os-iniciantes-em-net-snmp-6/ 3/6

    +--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 definio 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 verque, dentro dela, existe um OID exemplo.

    Alis, 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 comear a escrever o cdigo de acesso aos dados dasua MIB.

    Gerando cdigo com mib2c

    Felizmente o Net-SNMP tem um utilitrio chamado mib2c que permite a gerao automtica decallbacks para acesso aos seus OIDs aps analisar a sua MIB. Isto ir lhe fazer economizar um bomtempo.

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (6) | Jedizone

    jedizone.wordpress.com/2012/03/08/o-guia-definitivo-para-os-iniciantes-em-net-snmp-6/ 4/6

    O mib2c usa um perfil de gerao de cdigo (veja a lista completa com ls /etc/snmp/mib2c.*). Operfil a ser usado depender da complexidade da sua MIB e das respostas que ela precisa prover. Nonosso caso, existiro apenas leituras simples de OIDs, sem tabelas ou outras estruturas maiscomplexas. Isto pode ser tranquilamente gerado pelo perfil escalar. O mib2c vai precisar ainda deum OID partir do qual ele ir gerar os callbacks. Vamos usar o OID exemplo, o nome domduloda nossa MIB:

    cd ~/snmp/srcmib2c -c mib2c.scalar.conf exemplo

    A sada deve ser algo como abaixo:

    writing to exemplo.hwriting to exemplo.crunning indent on exemplo.crunning indent on exemplo.h

    Este comando ir gerar um arquivo exemplo.c e outro exemplo.h, com todos os esqueletos defuno e definies necessrios. Como dever de casa, inspecione estes arquivos e verifique, porexemplo, os registros de OIDs. Parte do arquivo est abaixo, para os que no puderem rodar ainda omib2c:

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (6) | Jedizone

    jedizone.wordpress.com/2012/03/08/o-guia-definitivo-para-os-iniciantes-em-net-snmp-6/ 5/6

    /** Initializes the exemplo module */voidinit_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 funes e recompilar o net-snmp. Mas isto vai ficar para o prximo post(http://jedizone.wordpress.com/2012/03/21/o-guia-definitivo-para-os-iniciantes-em-net-snmp/). Noperca !

    Linux , NET-SNMP , SNMP

    This entry was posted on maro 8, 2012, 11:45 pm and is filed under Linux, Redes, SNMP. You canfollow any responses to this entry through RSS 2.0. Voc pode deixar uma resposta, ou trackback doseu prprio site.

    COMENTRIOS (0) TRACKBACKS (2)

    1. O guia definitivo para os iniciantes em Net-SNMP (7) Jedizone2. O guia definitivo para os iniciantes em Net-SNMP (5) | Jedizone

    About these ads (http://en.wordpress.com/about-these-ads/)

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (6) | Jedizone

    jedizone.wordpress.com/2012/03/08/o-guia-definitivo-para-os-iniciantes-em-net-snmp-6/ 6/6

    Blog no WordPress.com. The Fusion Theme.

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (7) | Jedizone

    jedizone.wordpress.com/2012/03/21/o-guia-definitivo-para-os-iniciantes-em-net-snmp/ 1/15

    Jedizone

    O guia definitivo para os iniciantes em Net-SNMP (7)

    Introduo

    No post anterior (http://jedizone.wordpress.com/2012/03/08/o-guia-definitivo-para-os-iniciantes-em-net-snmp-6/) usamos o aplicativo mib2c para gerar o esqueleto de cdigo da nossa MIB. Neste postdiscutiremos como rechear o esqueleto de cdigo gerado. No fundo, a quantidade de cdigonecessria bem pequena quando se usa o modelo escalar de gerao, facilitando bastante umaprimeira implementao do agente. Recomendo que leiam depois o tutorial (http://www.net-snmp.org/wiki/index.php/TUT:Writing_a_MIB_Module) disponvel no site do Net-SNMP paramaiores esclarecimento e dicas. Tambm recomendo que olhem a implementao de outrasmdulos para aprenderem um pouco mais atravs de exemplos (os fontes do Net-SNMP podemajudar).

    Preenchendo os callabcks da MIB exemplo

    Se voc observar, vai notar que foram criadas cinco funes dentro de exemplo.c (ao final do texto).Em cada uma delas voc ir preencher um pequeno pedao. A primeira funo a inicializao daMIB, chamada na partida do snmpd, e que deve conter o que for necessrio para inicializar o seumdulo:

    void init_exemplo()

    J as outras quatro so os callbacks dos OIDs presentes na MIB propriamente ditos, e que devem serpreenchidos adequadamente, de acordo com o esperado para o tipo de dado.

    int handle_capsLock()int handle_numLock()int handle_scrollLock()int handle_runTime()

    A seguir, vamos dar uma descrio sumria sobre as funes geradas e o seu preenchimento.

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (7) | Jedizone

    jedizone.wordpress.com/2012/03/21/o-guia-definitivo-para-os-iniciantes-em-net-snmp/ 2/15

    Inicializando a MIB

    Para cada mdulo gerado com o mib2c usando a opo escalar, ser gerada uma funo deinicializao com o prottipo abaixo, chamada apenas uma vez, na partida.

    void init_nomedomodulo(void)

    Dentro desta funo voc deve inicializar os dados que pretende usar posteriormente e registrar cadaOID que tenha um callback associado com ajuda da funo netsnmp_register_scalar(http://www.net-snmp.org/dev/agent/group__scalar.html). No nosso caso, foi feita a seguinteinicializao e registro (o cdigo foi generosamente criado pelo nosso revisor e colaborador, AlanCarvalho (http://acassis.wordpress.com/)):

    #include #include #include #include

    #include #include #include #include "exemplo.h"

    #define CAPSLOCK 1#define NUMLOCK 2#define SCRLOCK 4

    static int capsLockLED = 0;static int numLockLED = 0;static int scrollLockLED = 0;

    unsigned int kbd;Display *disp = NULL;

    /** Initializes the exemplo module */voidinit_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"));

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (7) | Jedizone

    jedizone.wordpress.com/2012/03/21/o-guia-definitivo-para-os-iniciantes-em-net-snmp/ 3/15

    /* Open X Display to read keyboard status later */

    disp = XOpenDisplay(NULL);

    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 ));}

    Em azul est a parte efetivamente criada pelo Alan, para que vocs tenham um noo do trabalho.D pra perceber que ficou a cargo do programador basicamente a inicializao da varivel disp ede variveis internas do mdulo.

    Criando callbacks somente de leitura

    Callbacks somente de leitura tambm so simples de serem feitos, bastando implementar o mtodoGET. O mib2c j gera o esqueleto e voc precisa apenas preencher adequadamente a rea indicadapelo ponteiro passado na requisio, respeitando o tipo de dado. Abaixo, o callback para o caps lock,com comentrios logo depois.

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (7) | Jedizone

    jedizone.wordpress.com/2012/03/21/o-guia-definitivo-para-os-iniciantes-em-net-snmp/ 4/15

    inthandle_capsLock(netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests){ /* We are never called for a GETNEXT if it's registered as a "instance", as it's "magically" handled for us. */ if (disp) { XkbGetIndicatorState(disp, XkbUseCoreKbd, &kbd); capsLockLED = (kbd & CAPSLOCK) == CAPSLOCK; }

    /* a instance handler also only hands us one request at a time, so we don't need to loop over a list of requests; we'll only get one. */ switch(reqinfo->mode) {

    case MODE_GET: snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER, (u_char *) &capsLockLED, sizeof(capsLockLED) break;

    default: /* we should never get here, so this is a really bad error */ snmp_log(LOG_ERR, "unknown mode (%d) in handle_capsLock\n", reqinfo->mode ); return SNMP_ERR_GENERR; }

    return SNMP_ERR_NOERROR;}

    O switch permite identificar o tipo de requisio via reqinfo->mode e a funosnmp_set_var_typed_value() realiza a cpia do valor desejado (contedo davarivel capsLockLED) dentro do buffer de resposta. Se voc for investigar a estruturanetsnmp_request_info (http://www.net-snmp.org/dev/agent/structnetsnmp__request__info__s.html), vai notar que requestvb, do tiponetsnmp_variable_list (http://www.net-snmp.org/dev/agent/structvariable__list.html), possui ocampo de dados (val (http://www.net-snmp.org/dev/agent/structvariable__list.html)) definido comouma unio dos diversos tipos de dados (http://www.net-snmp.org/dev/agent/unionnetsnmp__vardata.html) do Net-SNMP. a estratgia para tratar tiposdiferentes de dados com uma mesma interface (union). Estratgia, alis, bastante comum em C.

    Criando callbacks de leitura e escrita

    No caso de leitura e escrita, existe trabalho adicional. Isto acontece porque o Net-SNMP assumeque, ao pedir a escrita de um OID (mtodo SET), ele deve fazer isto da maneira mais segurapossvel. Antes de fazer a escrita propriamente dita, ele pede que o agente verifique o tipo de dado a

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (7) | Jedizone

    jedizone.wordpress.com/2012/03/21/o-guia-definitivo-para-os-iniciantes-em-net-snmp/ 5/15

    ser gravado (estado RESERVE1 da mquina de estados abaixo, retirada do site do Net-SNMP(http://www.net-snmp.org/wiki/images/5/5c/Set-actions.jpg)), aloque espao para ele (estadoRESERVE2) e s ento requisita a escrita (estado ACTION). O valor s efetivado posteriormente,com o estado COMMIT (qualquer semelhana com uma base de dados no mera coincidncia). Perceba que existem estados para tratar as falhas tambm, como no caso de no existir espao parao recurso (sada pelo estado FREE) ou em falha da escrita (estado UNDO, que desfaz tudo e retornaao valor anterior).

    Felizmente o nosso caso bastante simples e possvel ignorar a maioria dos estados e implementarapenas o estado ACTION para o mtodo SET. Obviamente, tambm necessrio implementar omtodo GET. Veja como ficou ento o callback para o scroll lock:

    inthandle_scrollLock(netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests){ int ret; XKeyboardControl values;

    /* We are never called for a GETNEXT if it's registered as a "instance", as it's "magically" handled for us. */

    if (disp) { XkbGetIndicatorState(disp, XkbUseCoreKbd, &kbd); scrollLockLED = (kbd & SCRLOCK) == SCRLOCK; }

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (7) | Jedizone

    jedizone.wordpress.com/2012/03/21/o-guia-definitivo-para-os-iniciantes-em-net-snmp/ 6/15

    /* a instance handler also only hands us one request at a time, so we don't need to loop over a list of requests; we'll only get one. */

    switch(reqinfo->mode) {

    case MODE_GET: snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER, (u_char *) &scrollLockLED, sizeof(scrollLockLED) break;

    /* * SET REQUEST * * multiple states in the transaction. See: * http://www.net-snmp.org/tutorial-5/toolkit/mib_module/set-actions.jpg */ case MODE_SET_RESERVE1: /* or you could use netsnmp_check_vb_type_and_size instead */ ret = netsnmp_check_vb_type(requests->requestvb, ASN_INTEGER); if ( ret != SNMP_ERR_NOERROR ) { netsnmp_set_request_error(reqinfo, requests, ret ); } break;

    case MODE_SET_RESERVE2: /* XXX malloc "undo" storage buffer */ break;

    case MODE_SET_FREE: /* XXX: free resources allocated in RESERVE1 and/or RESERVE2. Something failed somewhere, and the states below won't be called. */ break;

    case MODE_SET_ACTION: /* XXX: perform the value change here */

    /* Setup ScrollLock LED */

    /* SCROLL LOCK is value 3 in X Graphic mode */ values.led = SCRLOCK - 1; /* led_mode = 0 is LED OFF. led_mode = 1 is LED ON. */ values.led_mode = *(requests->requestvb->val.integer);

    /* Change status of ScrollLock LED */ XChangeKeyboardControl(disp, KBLed | KBLedMode, &values); /* Syncronize imediately */ XSync(disp, 0);

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (7) | Jedizone

    jedizone.wordpress.com/2012/03/21/o-guia-definitivo-para-os-iniciantes-em-net-snmp/ 7/15

    break;

    case MODE_SET_COMMIT: /* XXX: delete temporary storage */ break;

    case MODE_SET_UNDO: /* XXX: UNDO and return to previous value for the object */ break;

    default: /* we should never get here, so this is a really bad error */ snmp_log(LOG_ERR, "unknown mode (%d) in handle_scrollLock\n", reqinfo->mode ); return SNMP_ERR_GENERR; }

    return SNMP_ERR_NOERROR;}

    Moleza, nhein ? Basicamente cdigo para acesso ao led, sendo que o valor recebido veio atravs daunio citada anteriormente (requests->requestvb->val.integer).

    Listagem final

    A seguir esto os arquivos exemplo.c e exemplo.h, para referncia. No prximo post vamosrecompilar o Net-SNMP usando estes arquivos. Aproveite para ler um pouco a wiki do Net-SNMP(http://www.net-snmp.org/wiki/). Ela levemente confusa mas com muita informao til. At l!

    exemplo.h

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (7) | Jedizone

    jedizone.wordpress.com/2012/03/21/o-guia-definitivo-para-os-iniciantes-em-net-snmp/ 8/15

    /* * Note: this file originally auto-generated by mib2c using * : mib2c.scalar.conf 11805 2005-01-07 09:37:18Z dts12 $ */#ifndef EXEMPLO_H#define EXEMPLO_H

    /* function declarations */void init_exemplo(void);Netsnmp_Node_Handler handle_capsLock;

    Netsnmp_Node_Handler handle_numLock;Netsnmp_Node_Handler handle_scrollLock;Netsnmp_Node_Handler handle_runTime;

    #endif /* EXEMPLO_H */

    exemplo.c

    /* * Note: this file originally auto-generated by mib2c using * : mib2c.scalar.conf 11805 2005-01-07 09:37:18Z dts12 $ */

    #include #include #include #include

    #include #include #include #include "exemplo.h"

    #define CAPSLOCK 1#define NUMLOCK 2#define SCRLOCK 4

    static int capsLockLED = 0;static int numLockLED = 0;static int scrollLockLED = 0;

    unsigned int kbd;Display *disp = NULL;

    /** Initializes the exemplo module */void

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (7) | Jedizone

    jedizone.wordpress.com/2012/03/21/o-guia-definitivo-para-os-iniciantes-em-net-snmp/ 9/15

    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"));

    /* Open X Display to read keyboard status later */ disp = XOpenDisplay(NULL);

    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 ));}

    inthandle_capsLock(netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests){ /* We are never called for a GETNEXT if it's registered as a "instance", as it's "magically" handled for us. */

    if (disp) { XkbGetIndicatorState(disp, XkbUseCoreKbd, &kbd); capsLockLED = (kbd & CAPSLOCK) == CAPSLOCK; }

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (7) | Jedizone

    jedizone.wordpress.com/2012/03/21/o-guia-definitivo-para-os-iniciantes-em-net-snmp/ 10/15

    /* a instance handler also only hands us one request at a time, so we don't need to loop over a list of requests; we'll only get one. */ switch(reqinfo->mode) {

    case MODE_GET: snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER, (u_char *) &capsLockLED, sizeof(capsLockLED)); break;

    default: /* we should never get here, so this is a really bad error */ snmp_log(LOG_ERR, "unknown mode (%d) in handle_capsLock\n", reqinfo->mode ); return SNMP_ERR_GENERR; }

    return SNMP_ERR_NOERROR;}inthandle_numLock(netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests){ /* We are never called for a GETNEXT if it's registered as a "instance", as it's "magically" handled for us. */

    if (disp) { XkbGetIndicatorState(disp, XkbUseCoreKbd, &kbd); numLockLED = (kbd & NUMLOCK) == NUMLOCK; }

    /* a instance handler also only hands us one request at a time, so we don't need to loop over a list of requests; we'll only get one. */

    switch(reqinfo->mode) {

    case MODE_GET: snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER, (u_char *) &numLockLED, sizeof(numLockLED)); break;

    default: /* we should never get here, so this is a really bad error */ snmp_log(LOG_ERR, "unknown mode (%d) in handle_numLock\n", reqinfo->mode ); return SNMP_ERR_GENERR; }

    return SNMP_ERR_NOERROR;

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (7) | Jedizone

    jedizone.wordpress.com/2012/03/21/o-guia-definitivo-para-os-iniciantes-em-net-snmp/ 11/15

    }

    inthandle_scrollLock(netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests){ int ret; XKeyboardControl values;

    /* We are never called for a GETNEXT if it's registered as a "instance", as it's "magically" handled for us. */

    if (disp) { XkbGetIndicatorState(disp, XkbUseCoreKbd, &kbd); scrollLockLED = (kbd & SCRLOCK) == SCRLOCK; }

    /* a instance handler also only hands us one request at a time, so we don't need to loop over a list of requests; we'll only get one. */

    switch(reqinfo->mode) {

    case MODE_GET: snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER, (u_char *) &scrollLockLED, sizeof(scrollLockLED)); break;

    /* * SET REQUEST * * multiple states in the transaction. See: * http://www.net-snmp.org/tutorial-5/toolkit/mib_module/set-actions.jpg */ case MODE_SET_RESERVE1: /* or you could use netsnmp_check_vb_type_and_size instead */ ret = netsnmp_check_vb_type(requests->requestvb, ASN_INTEGER); if ( ret != SNMP_ERR_NOERROR ) { netsnmp_set_request_error(reqinfo, requests, ret ); } break;

    case MODE_SET_RESERVE2: /* XXX malloc "undo" storage buffer */ break;

    case MODE_SET_FREE: /* XXX: free resources allocated in RESERVE1 and/or

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (7) | Jedizone

    jedizone.wordpress.com/2012/03/21/o-guia-definitivo-para-os-iniciantes-em-net-snmp/ 12/15

    RESERVE2. Something failed somewhere, and the states below won't be called. */ break;

    case MODE_SET_ACTION: /* XXX: perform the value change here */

    /* Setup ScrollLock LED */

    /* SCROLL LOCK is value 3 in X Graphic mode */ values.led = SCRLOCK - 1; /* led_mode = 0 is LED OFF. led_mode = 1 is LED ON. */ values.led_mode = *(requests->requestvb->val.integer);

    /* Change status of ScrollLock LED */ XChangeKeyboardControl(disp, KBLed | KBLedMode, &values); /* Syncronize imediately */ XSync(disp, 0);

    break;

    case MODE_SET_COMMIT: /* XXX: delete temporary storage */ break;

    case MODE_SET_UNDO: /* XXX: UNDO and return to previous value for the object */ break;

    default: /* we should never get here, so this is a really bad error */ snmp_log(LOG_ERR, "unknown mode (%d) in handle_scrollLock\n", reqinfo->mode ); return SNMP_ERR_GENERR; }

    return SNMP_ERR_NOERROR;}inthandle_runTime(netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests){ /* We are never called for a GETNEXT if it's registered as a "instance", as it's "magically" handled for us. */

    time_t now = 0;

    /* a instance handler also only hands us one request at a time, so

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (7) | Jedizone

    jedizone.wordpress.com/2012/03/21/o-guia-definitivo-para-os-iniciantes-em-net-snmp/ 13/15

    we don't need to loop over a list of requests; we'll only get one. */

    now = time(NULL);

    switch(reqinfo->mode) {

    case MODE_GET: snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER, (u_char *) now, sizeof(now)); break;

    default: /* we should never get here, so this is a really bad error */ snmp_log(LOG_ERR, "unknown mode (%d) in handle_runTime\n", reqinfo->mode ); return SNMP_ERR_GENERR; }

    return SNMP_ERR_NOERROR;}

    Linux , NET-SNMP , SNMP

    This entry was posted on maro 21, 2012, 8:16 am and is filed under Linux, Redes, SNMP. You canfollow any responses to this entry through RSS 2.0. Voc pode deixar uma resposta, ou trackback doseu prprio site.

    COMENTRIOS (12) TRACKBACKS (2)

    #1 por acassis em maro 24, 2012 - 10:37 am

    Marcelo,

    A linha destacada em azul no inicio do seu post:

    if (disp) { XkbGetIndicatorState(disp, XkbUseCoreKbd, &kbd); capsLockLED = (kbd &CAPSLOCK) == CAPSLOCK; }

    deveria ter quebra de linha, ficou tudo na mesma linha.

    []s

    Alan

    #2 por Marcelo Barros em maro 24, 2012 - 12:17 pm

    Pois , pena que o wordpress no programa em C. Eu altero, ele acerta. Depois ele vai e mudasozinho se edito o post novamente. Tem um bug nele. No sei bem o que fazer neste caso . :/

    #3 por Thiago Neves em julho 27, 2012 - 9:13 pm

    Oi Marcelo, descobri a pouco tempo esse seu blog e estou achando bastante til para aprender a

    About these ads (http://en.wordpress.com/about-these-ads/)

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (7) | Jedizone

    jedizone.wordpress.com/2012/03/21/o-guia-definitivo-para-os-iniciantes-em-net-snmp/ 14/15

    Oi Marcelo, descobri a pouco tempo esse seu blog e estou achando bastante til para aprender amexer no net-snmp Existem planos para um post 8? Abcs.

    #4 por Marcelo Barros em julho 28, 2012 - 12:23 am

    Sim, mais uns dois ou trs. Aguarde que o oitavo t semi pronto.

    #5 por Thiago Neves em julho 30, 2012 - 8:05 pm

    Caro Marcelo, uma dvida. Nesse ltimo post voc mostrou como gerar uma MIB com aestrutura SMIv2 e gerar um cdigo C relativo a essa estrutura. Esse cdigo em C possui funesGET e SET. Minha dvida , onde eu incorporaria essas funes GET e SET? Imagino que sejaem algum programa que eu queira que seja visvel para o gerente snmp. isso mesmo? Abcs.

    #6 por cleitonbueno em julho 30, 2012 - 9:26 pm

    Talvez isso possa ajuda..http://cleitonbueno.wordpress.com/2012/05/22/codigos-de-programacao-nos-posts-do-wordpress/

    #7 por Marcelo Barros em julho 31, 2012 - 12:04 am

    Thiago,Sim, voc vai ter que alimentar estes GET e SET de algum lugar. Existem algumas formas,que vo depender de como pretende fazer a sua integrao com o net-snmp. A mais simples otratamento entrar dentro do cdigo final do net-snmp, ao escrev-lo dentro do arquivo geradopelo net-snmp, algo que pretendo mostrar em breve. Mas existem outras formas. Voc podeimplementar uma lib que carregada pelo net-snmp e que usada para fornecer os valores ouainda possvel usar comunicao entre processos. Nestes casos, a complexidade cresce bastante.Eu acho mais simples deixar parte do seu cdigo dentro do net-snmp mesmo e ler/setar coisasem arquivos do /proc. O /proc seria uma espcie de gateway entre a manipulao do get/set e ogrosso do seu programa. Isto pode no ser bom, dependendo das licenas que pretenda usar, daa comunicao entre processos o caminho. Tem exemplos disso no site do net-snmp.

    #8 por Marcelo Barros em julho 31, 2012 - 12:08 am

    Obrigado pela dica, Cleiton. Vou us-la daqui pra diante !

    #9 por Renan Carlos em agosto 23, 2012 - 6:26 pm

    Ol, quando sai a prxima parte do tutorial? Abcs.

    #10 por Marcelo Barros (@marcelobarros) em agosto 23, 2012 - 7:48 pm

    Nos prximos dias, texto praticamente pronto, preciso apenas validar

    #11 por joao em abril 27, 2013 - 12:14 pm

    Ola. aonde consigo mais destas informaes ? estou aguardando o proximo post, porem estouem fase de implementao e preciso fazer funcionar.muito grato. joao

  • 04/10/13 O guia definitivo para os iniciantes em Net-SNMP (7) | Jedizone

    jedizone.wordpress.com/2012/03/21/o-guia-definitivo-para-os-iniciantes-em-net-snmp/ 15/15

    #12 por lasacochehomme.com em junho 30, 2013 - 2:44 pm

    An outstanding share! Ive just forwarded this onto a co-worker who was conducting a littleresearch on this. And he actually bought me lunch due to the fact that I discovered it for himlol. So allow me to reword this. Thank YOU for the meal!! But yeah, thanx for spending sometime to talk about this topic here on your website.

    1. O guia definitivo para os iniciantes em Net-SNMP (6) | Jedizone2. O guia definitivo para os iniciantes em Net-SNMP (8) | Jedizone

    Blog no WordPress.com. The Fusion Theme.