Как получить сведения об узле из проанализированного 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 я хочу получить данные из проанализированных модулей.

теперь две проблемы, с которыми я столкнулся:

  1. Как мне узнать, какой модуль нужно изучить, поскольку я проанализировал несколько модулей, и мне придется зайти в каждый модуль, чтобы декодировать OID и получить точный узел.
  2. Есть ли там какая-либо встроенная библиотека для декодирования oid и извлечения данных из анализируемого модуля. Если нет, если, например, oid: 2.1.1.4057, то для поиска в дереве модулей и узлов, какую логику мне лучше всего было бы декодировать oid и получить детали узла 4057 из иерархии узлов.

0 ответов

Другие вопросы по тегам