O elemento pode ser real ou simulado.
A MIB deve ser escrita usando SMIv2 e deve conter de 10 a 15 informações sobre o elemento gerenciado com no mínimo 1 tabela. Obrigatoriamente devem ser implementados novos objetos, não sendo permitido o uso apenas de objetos já existentes na MIB-II ou em outras MIBs. Devem ser incluídos objetos com acesso para somente leitura e leitura/escrita.
O agente pode ser implementado usando o pacote net-snmp (http://www.net-snmp.org/) ou outra biblioteca/framework para desenvolvimento de agentes SNMP.
Net-snmp manpage (http://www.net-snmp.org/docs/man/snmpd.conf.html) - seção "EXTENDING AGENT FUNCTIONALITY"
O agente deverá permitir a execução de operações get, getnext e set.
O elemento gerenciado é uma cafeteria simulada através do aquivo cofeeshop.py. A cafeteria possui os seguintes elementos:
- revenue: valor total das vendas.
- totalOrders: número total de pedidos.
- coffee: número de cafés pedidos.
- tea: número de chás pedidos.
- soda: número de refrigerantes pedidos.
- muffin: número de muffins pedidos.
- sandwich: número de sanduíches pedidos.
- pie: número de tortas pedidos.
- employees: lista de funcionários.
- status: status da cafeteria (aberta ou fechada).
O elemento gerenciado, quando executado, escreve o valor de cada elemento em um arquivo json chamado logs.json. A atualização do arquivo ocorre a cada 10 segundos, simulando um novo pedido aleatório sendo solicitado.
Para executar o simulador da cafeteria, basta abrir um terminal e executar:
python coffeeshop.py
A implementação da COFFEESHOP MIB está no arquivo COFFEESHOP.TXT. A MIB está localizada no ramo experimental e possui 10 itens, sendo 8 destes do tipo Integer32, 1 do tipo DisplayString e 1 tabela. A seguir, um exemplo de cada tipo de objeto implementado.
Integer32
O objeto revenue pode ser acessado pelo OID = .1.3.6.1.3.1234.1.1.0.
revenue OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The total revenue of the coffeeshop."
::= { items 1 }
DisplayString
O objeto status pode ser acessado pelo OID = .1.3.6.1.3.1234.1.9.0. Além disso, esse objeto pode receber a operação set pois permite a escrita.
status OBJECT-TYPE
SYNTAX DisplayString (SIZE(0..255))
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"The status of the coffeeshop (open or closed)."
::= { items 9 }
Tabela
O objeto employeesTable é uma tabela composta por uma sequência de objetos Employee. Cada objeto Employee possui um identificador employeeId do tipo Integer32 e um nome employeeName do tipo DisplayString.
employeesTable OBJECT-TYPE
SYNTAX SEQUENCE OF Employee
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The cofeeshop employees list."
::= { items 10 }
employee OBJECT-TYPE
SYNTAX Employee
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"An employee."
INDEX { employeeId }
::= { employeesTable 1 }
Employee ::= SEQUENCE {
employeeId Integer32,
employeeName DisplayString (SIZE(0..255))
}
O agente implementado faz a leitura do arquivo logs.json para retornar o valor solicitado do elemento gerenciado de acordo com o OID do objeto. Ele suporta os comandos de get, getnext e set.
Os elementos gerenciados, seus respectivos OIDs:
- revenue: .1.3.6.1.3.1234.1.1.0
- totalOrders: .1.3.6.1.3.1234.1.2.0
- coffee: .1.3.6.1.3.1234.1.3.0
- tea: .1.3.6.1.3.1234.1.4.0
- soda: .1.3.6.1.3.1234.1.5.0
- muffin: .1.3.6.1.3.1234.1.6.0
- sandwich: .1.3.6.1.3.1234.1.7.0
- pie: .1.3.6.1.3.1234.1.8.0
- status: .1.3.6.1.3.1234.1.9.0
- employeesTable: .1.3.6.1.3.1234.1.10
- employee: .1.3.6.1.3.1234.1.10.1
- employeeId: .1.3.6.1.3.1234.1.10.1.1
- employeeName: .1.3.6.1.3.1234.1.10.1.2
Todos os elementos suportam os comandos get e getnext. Para acessar os elementos da tabela employeeTable é necessário acessar o objeto final, dado pelo número do objeto employee, o número do parâmetro desejado (employeeId ou employeeName), seguido do número da linha: .1.3.6.1.3.1234.1.10.1.{employeeId|employeeName}.{numLinha}. O elemento status suporta também o comando set.
Para executar somente o agente, podem ser executados os seguintes comandos no terminal:
get
python agent.py -g .1.3.6.1.3.1234.1.9.0
getnext
python agent.py -n .1.3.6.1.3.1234.1.9.0
set
python agent.py -s .1.3.6.1.3.1234.1.9.0 s Close
O passo-a-passo para execução do trabalho está implementado no arquivo SNMP.ipynb.
Antes de executar, atualizar o caminho absoluto dos arquivos que serão consultados.
SNMP.ipyn (Agente)
- pass .1.3.6.1.3.1234.1 /usr/bin/python3 {path}/agent.py - {path} deve ser substituído pelo caminho absoluto da pasta no GitHub.
agent.py e coffeeshop.py
- PATH = {path} - {path} deve ser substituído pelo caminho absoluto da pasta no GitHub.
EXEMPLOS DE EXECUÇÃO OID
get
snmpget -v2c -c public localhost .1.3.6.1.3.1234.1.1.0
# retorno: SNMPv2-SMI::experimental.1234.1.1.0 = INTEGER: 104
getnext
# primeiro ínidice da tabela
snmpgetnext -v2c -c public localhost .1.3.6.1.3.1234.1.10
# retorno: SNMPv2-SMI::experimental.1234.1.10.1.1 = INTEGER: 1
set
snmpset -v2c -c private localhost .1.3.6.1.3.1234.1.9.0 s Close
# retorno: SNMPv2-SMI::experimental.1234.1.9.0 = STRING: "Close"
EXEMPLOS DE EXECUÇÃO NOME OBJETO
get
snmpget -v2c -c public -M +. -m +COFFEESHOP localhost revenue.0
# retorno: COFFEESHOP::revenue.0 = INTEGER: 104
getnext
# primeiro ínidice da tabela
snmpgetnext -v2c -c public -M +. -m +COFFEESHOP localhost employeesTable
# retorno: COFFEESHOP::employeeId = INTEGER: 1
set
snmpset -v2c -c private -M +. -m +COFFEESHOP localhost status.0 s Open
# retorno: COFFEESHOP::status.0 = STRING: Open
Mais exemplos podem ser vistos no arquivo SNMP.ipynb.