从SNMP PDU中获取八位字节字符串的gosnmp命令。

huangapple go评论113阅读模式
英文:

gosnmp get octetstring from SNMP PDU

问题

我正在尝试从gosnmp包返回的SNMP PDU中获取OctetString值。即使只有字节也可以。

以下是我的代码:

package snmp_abstract

import (
	"github.com/soniah/gosnmp"
	"time"
	"log"
	"os"
	"strings"
)

type Switch struct {
	Hostname   string
	Connection gosnmp.GoSNMP
}


var ConnectionParams = &gosnmp.GoSNMP{
	Target:    "",
	Port:      161,
	Community: "community",
	Version:   gosnmp.Version2c,
	Timeout:   time.Duration(5) * time.Second,
	Logger:    log.New(os.Stdout, "", 0),
}

type Mibs struct {
	VtpVlanState,
	Dot1dBasePortIfIndex string
}

var Default = &Mibs{
	VtpVlanState:        "1.3.6.1.4.1.9.9.46.1.3.1.1.2",
	Dot1dBasePortIfIndex: "1.3.6.1.2.1.17.1.4.1.2",
}


func SNMPGet(conn *gosnmp.GoSNMP, host string, mib []string) {
	conn.Target = host
	log.Println(conn)
	err := conn.Connect()
	if err != nil {
		log.Printf("Unable to connect to %s\n", host)
	}
	defer conn.Conn.Close()
	res, err := conn.Get(mib)
	if err != nil {
		log.Println("GET error")
		log.Print(err)
	}
	log.Println(res)
}


func SNMPWalk(conn *gosnmp.GoSNMP, host string, mib string) []gosnmp.SnmpPDU {
	conn.Target = host
	log.Println(conn)
	err := conn.Connect()
	if err != nil {
		log.Printf("Unable to connect to %s\n", host)
	}
	defer conn.Conn.Close()
	res, err := conn.BulkWalkAll(mib)
	if err != nil {
		log.Println("GET error")
		log.Print(err)
	}
	return res
}

func (sw *Switch) Vlans() []string {

	res := SNMPWalk(&sw.Connection, sw.Hostname, Default.VtpVlanState)
	var vlans = make([]string, len(res))
	for i, vlan := range res {
		oidSlice := strings.Split(vlan.Name, ".")
		v := oidSlice[len(oidSlice)-1]
		vlans[i] = v
	}
	return vlans
}

func (sw *Switch) MapBPIIfindex(vlan string)  {
	log.Println(vlan)
	s := *sw
	s.Connection.Community += "@" + vlan
	log.Println(s.Connection.Community)
	res := SNMPWalk(&s.Connection, s.Hostname, Default.Dot1dBasePortIfIndex)
	for _, p := range res {
		log.Println(p.Name)
		log.Println(p.Value)
	}
}

当我使用MapBPIIfindex方法时,我得到以下输出:

OID: [.1.3.6.1.2.1.31.1.1.1.1.10001]
[decodeValue: type is OctetString]
decodeValue: value is []interface {}{[]uint8{0x46, 0x61, 0x30, 0x2f, 0x31}}

现在,这应该包含一个OctetString。uint8字节应该解码为Fa0/1,但我无法做到这一点。

当我将log.Println(p.Value)更改为log.Println(p.Value.([]uint8))时,我得到以下错误:

2017/05/29 12:54:59 .1.3.6.1.2.1.17.1.4.1.2
panic: interface conversion: interface {} is nil, not []uint8

我该如何获取这个值?文档对此并不是很清楚。

英文:

I am trying to get the OctetString value from an SNMP PDU returned by the gosnmp package. Even the bytes would suffice.

Here is my code:

package snmp_abstract
import (
"github.com/soniah/gosnmp"
"time"
"log"
"os"
"strings"
)
type Switch struct {
Hostname string
Connection gosnmp.GoSNMP
}
var ConnectionParams = &gosnmp.GoSNMP{
Target: "",
Port: 161,
Community: "community",
Version: gosnmp.Version2c,
Timeout: time.Duration(5) * time.Second,
Logger: log.New(os.Stdout, "", 0),
}
type Mibs struct {
VtpVlanState,
Dot1dBasePortIfIndex string
}
var Default = &Mibs{
VtpVlanState: "1.3.6.1.4.1.9.9.46.1.3.1.1.2",
Dot1dBasePortIfIndex: "1.3.6.1.2.1.17.1.4.1.2",
}
func SNMPGet(conn *gosnmp.GoSNMP, host string, mib []string) {
conn.Target = host
log.Println(conn)
err := conn.Connect()
if err != nil {
log.Printf("Unable to connect to %s\n", host)
}
defer conn.Conn.Close()
res, err := conn.Get(mib)
if err != nil {
log.Println("GET error")
log.Print(err)
}
log.Println(res)
}
func SNMPWalk(conn *gosnmp.GoSNMP, host string, mib string) []gosnmp.SnmpPDU {
conn.Target = host
log.Println(conn)
err := conn.Connect()
if err != nil {
log.Printf("Unable to connect to %s\n", host)
}
defer conn.Conn.Close()
res, err := conn.BulkWalkAll(mib)
if err != nil {
log.Println("GET error")
log.Print(err)
}
return res
}
func (sw *Switch) Vlans() []string {
res := SNMPWalk(&sw.Connection, sw.Hostname, Default.VtpVlanState)
var vlans = make([]string, len(res))
for i, vlan := range res {
oidSlice := strings.Split(vlan.Name, ".")
v := oidSlice[len(oidSlice)-1]
vlans[i] = v
}
return vlans
}
func (sw *Switch) MapBPIIfindex(vlan string)  {
log.Println(vlan)
s := *sw
s.Connection.Community += "@" + vlan
log.Println(s.Connection.Community)
res := SNMPWalk(&s.Connection, s.Hostname, Default.Dot1dBasePortIfIndex)
for _, p := range res {
log.Println(p.Name)
log.Println(p.Value)
}
}

When I use the MapBPIIfindex method I get the following output:

OID: [.1.3.6.1.2.1.31.1.1.1.1.10001]
[decodeValue: type is OctetString]
decodeValue: value is []interface {}{[]uint8{0x46, 0x61, 0x30, 0x2f, 0x31}}

Now, this should contain an OctetString. The uint8 bytes should decode to Fa0/1, but I am not able to do this.

When I change log.Println(p.Value) to log.Println(p.Value.([]uint8)), I get the following error:

2017/05/29 12:54:59 .1.3.6.1.2.1.17.1.4.1.2
panic: interface conversion: interface {} is nil, not []uint8

How can I get this value? The documentation is not so clear on this.

答案1

得分: 1

这是ASCII码。你需要将你的十六进制输出转换一下。
我对GO语言没有任何了解。
https://en.wikipedia.org/wiki/ASCII

英文:

this is ASCII. You need to convert your HEX output.
I don't have any knowledge of GO.
https://en.wikipedia.org/wiki/ASCII

huangapple
  • 本文由 发表于 2017年5月29日 18:56:51
  • 转载请务必保留本文链接:https://go.coder-hub.com/44240806.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定