Как получить сведения об узле из проанализированного MIB, используя библиотеку golang gosmi на основе oid, полученного в ловушке snmp
Я проанализировал mib с помощью Parser из пакета https://github.com/sleepinggenius2/gosmi в golang и сохранил модули из файлов mib с приведенным ниже кодом:
package main
import (
"fmt"
"os"
"path/filepath"
"github.com/sleepinggenius2/gosmi/parser"
"github.com/sleepinggenius2/gosmi/types"
)
// Module contains details of a MODULE-IDENTITY
type Module struct {
Name string
Parent types.SmiIdentifier
OID types.SmiSubId
Nodes map[string]*Node
Object parser.Module
}
func (m *Module) merge(newModule *Module) {
// Merge the nodes
for name, node := range newModule.Nodes {
if m.Nodes[name] != nil {
continue
}
newNode := *node
m.Nodes[name] = &newNode
}
}
var modules = map[string]*Module{}
// Node contains everything inside a MODULE-IDENTITY
type Node struct {
Name string
Parent types.SmiIdentifier
OID types.SmiSubId
CompleteOID string
Object parser.Node
}
func parseNode(node *parser.Node) *Node {
ret := &Node{
Name: node.Name.String(),
Parent: *node.Oid.SubIdentifiers[0].Name,
OID: *node.Oid.SubIdentifiers[1].Number,
Object: *node,
}
return ret
}
func parseModule(module *parser.Module) *Module {
ret := &Module{
Nodes: make(map[string]*Node),
Object: *module,
}
identity := module.Body.Identity
ret.Name = identity.Name.String()
ret.Parent = *identity.Oid.SubIdentifiers[0].Name
ret.OID = *identity.Oid.SubIdentifiers[1].Number
for _, node := range module.Body.Nodes {
n := parseNode(&node)
ret.Nodes[n.Name] = n
}
return ret
}
// Init reads all MIBs recursively inside "folder"
// Returns error or nil
func Init(folder string) error {
var files []string
err := filepath.Walk(folder, func(path string, info os.FileInfo, err error) error {
if info.IsDir() {
return nil
}
files = append(files, path)
return nil
})
if err != nil {
return err
}
for _, file := range files {
module, err := parser.ParseFile(file)
if err != nil {
return err
}
mod := parseModule(module)
if modules[mod.Name] == nil {
modules[mod.Name] = mod
} else {
// Merge the modules
modules[mod.Name].merge(mod)
}
}
return nil
}
func main() {
Init("/root/testsnmp")
mod := modules["parallelwirelessTrapMIB"]
fmt.Println(mod.Name)
fmt.Println(mod.OID)
}
Также я запустил snmp-сервер, чтобы прослушивать ловушки и распечатывать данные ловушек. В пакете мы получаем oid. На основе этого полученного oid я хочу получить данные из проанализированных модулей.
теперь две проблемы, с которыми я столкнулся:
- Как мне узнать, какой модуль нужно изучить, поскольку я проанализировал несколько модулей, и мне придется зайти в каждый модуль, чтобы декодировать OID и получить точный узел.
- Есть ли там какая-либо встроенная библиотека для декодирования oid и извлечения данных из анализируемого модуля. Если нет, если, например, oid: 2.1.1.4057, то для поиска в дереве модулей и узлов, какую логику мне лучше всего было бы декодировать oid и получить детали узла 4057 из иерархии узлов.