func GetValue(oid asn1.ObjectIdentifier, community string, addr net.UDPAddr) (interface{}, error) { conn, err := net.DialUDP("udp", nil, &addr) if err != nil { return nil, err } defer conn.Close() r := PDU{ RequestId: 199, ErrorStatus: 0, ErrorIndex: 0, VarBindList: []VarBind{ VarBind{ Name: oid, Value: Null(), }, }, } data, err := asn1.Marshal(r) if err != nil { return nil, err } m := Message{ Version: 1, Community: NewOctetString(community), Data: Any(data), } data, err = asn1.Marshal(m) if err != nil { return nil, err } _, err = conn.Write(data) if err != nil { return nil, err } data = make([]byte, 1500) read, err := conn.Read(data) if err != nil { return nil, err } pdu, err := decode(data[:read]) if err != nil { return nil, err } switch response := pdu.(type) { case *PDU: return parseVarValue(response.VarBindList[0].Value) } return nil, nil }
func TestSNMPGetNextRequest(t *testing.T) { r := PDU{ RequestId: 199, ErrorStatus: 0, ErrorIndex: 0, VarBindList: []VarBind{ VarBind{ Name: []int{1, 3, 6, 1, 2, 1, 1, 1, 0}, Value: Null(), }, }, } data, err := asn1.Marshal(r) if err != nil { t.Error(err) } m := Message{ Version: 1, Community: NewOctetString("timer"), Data: Any(data), } data, err = asn1.Marshal(m) if err != nil { t.Error(err) } addr := net.UDPAddr{net.IPv4(192, 168, 1, 254), 161} conn, err := net.DialUDP("udp4", nil, &addr) if err != nil { t.Error(err) } defer conn.Close() written, err := conn.Write(data) if err != nil { t.Error(err) } if written != len(data) { t.Errorf("did not write the full data %d", written) } }