telegraf/plugins/inputs/snmp_trap/snmp_trap_test.go

1321 lines
30 KiB
Go

package snmp_trap
import (
"fmt"
"net"
"strconv"
"strings"
"testing"
"time"
"github.com/soniah/gosnmp"
"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/internal"
"github.com/influxdata/telegraf/testutil"
"github.com/stretchr/testify/require"
)
func TestLoad(t *testing.T) {
s := &SnmpTrap{}
require.Nil(t, s.Init())
defer s.clear()
s.load(
".1.3.6.1.6.3.1.1.5.1",
mibEntry{
"SNMPv2-MIB",
"coldStart",
},
)
e, err := s.lookup(".1.3.6.1.6.3.1.1.5.1")
require.NoError(t, err)
require.Equal(t, "SNMPv2-MIB", e.mibName)
require.Equal(t, "coldStart", e.oidText)
}
func fakeExecCmd(_ internal.Duration, x string, y ...string) ([]byte, error) {
return nil, fmt.Errorf("mock " + x + " " + strings.Join(y, " "))
}
func sendTrap(t *testing.T, port uint16, now uint32, trap gosnmp.SnmpTrap, version gosnmp.SnmpVersion, secLevel string, username string, authProto string, authPass string, privProto string, privPass string, contextName string, engineID string) {
var s gosnmp.GoSNMP
if version == gosnmp.Version3 {
var msgFlags gosnmp.SnmpV3MsgFlags
switch strings.ToLower(secLevel) {
case "noauthnopriv", "":
msgFlags = gosnmp.NoAuthNoPriv
case "authnopriv":
msgFlags = gosnmp.AuthNoPriv
case "authpriv":
msgFlags = gosnmp.AuthPriv
default:
msgFlags = gosnmp.NoAuthNoPriv
}
var authenticationProtocol gosnmp.SnmpV3AuthProtocol
switch strings.ToLower(authProto) {
case "md5":
authenticationProtocol = gosnmp.MD5
case "sha":
authenticationProtocol = gosnmp.SHA
//case "sha224":
// authenticationProtocol = gosnmp.SHA224
//case "sha256":
// authenticationProtocol = gosnmp.SHA256
//case "sha384":
// authenticationProtocol = gosnmp.SHA384
//case "sha512":
// authenticationProtocol = gosnmp.SHA512
case "":
authenticationProtocol = gosnmp.NoAuth
default:
authenticationProtocol = gosnmp.NoAuth
}
var privacyProtocol gosnmp.SnmpV3PrivProtocol
switch strings.ToLower(privProto) {
case "aes":
privacyProtocol = gosnmp.AES
case "des":
privacyProtocol = gosnmp.DES
case "aes192":
privacyProtocol = gosnmp.AES192
case "aes192c":
privacyProtocol = gosnmp.AES192C
case "aes256":
privacyProtocol = gosnmp.AES256
case "aes256c":
privacyProtocol = gosnmp.AES256C
case "":
privacyProtocol = gosnmp.NoPriv
default:
privacyProtocol = gosnmp.NoPriv
}
sp := &gosnmp.UsmSecurityParameters{
AuthoritativeEngineID: "1",
AuthoritativeEngineBoots: 1,
AuthoritativeEngineTime: 1,
UserName: username,
PrivacyProtocol: privacyProtocol,
PrivacyPassphrase: privPass,
AuthenticationPassphrase: authPass,
AuthenticationProtocol: authenticationProtocol,
}
s = gosnmp.GoSNMP{
Port: port,
Version: version,
Timeout: time.Duration(2) * time.Second,
Retries: 1,
MaxOids: gosnmp.MaxOids,
Target: "127.0.0.1",
SecurityParameters: sp,
SecurityModel: gosnmp.UserSecurityModel,
MsgFlags: msgFlags,
ContextName: contextName,
ContextEngineID: engineID,
}
} else {
s = gosnmp.GoSNMP{
Port: port,
Version: version,
Timeout: time.Duration(2) * time.Second,
Retries: 1,
MaxOids: gosnmp.MaxOids,
Target: "127.0.0.1",
Community: "public",
}
}
err := s.Connect()
if err != nil {
t.Errorf("Connect() err: %v", err)
}
defer s.Conn.Close()
_, err = s.SendTrap(trap)
if err != nil {
t.Errorf("SendTrap() err: %v", err)
}
}
func TestReceiveTrap(t *testing.T) {
var now uint32
now = 123123123
var fakeTime time.Time
fakeTime = time.Unix(456456456, 456)
type entry struct {
oid string
e mibEntry
}
// If the first pdu isn't type TimeTicks, gosnmp.SendTrap() will
// prepend one with time.Now()
var tests = []struct {
name string
// send
version gosnmp.SnmpVersion
trap gosnmp.SnmpTrap // include pdus
// V3 auth and priv parameters
secName string // v3 username
secLevel string // v3 security level
authProto string // Auth protocol: "", MD5 or SHA
authPass string // Auth passphrase
privProto string // Priv protocol: "", DES or AES
privPass string // Priv passphrase
// V3 sender context
contextName string
engineID string
// receive
entries []entry
metrics []telegraf.Metric
}{
//ordinary v2c coldStart trap
{
name: "v2c coldStart",
version: gosnmp.Version2c,
trap: gosnmp.SnmpTrap{
Variables: []gosnmp.SnmpPDU{
{
Name: ".1.3.6.1.2.1.1.3.0",
Type: gosnmp.TimeTicks,
Value: now,
},
{
Name: ".1.3.6.1.6.3.1.1.4.1.0", // SNMPv2-MIB::snmpTrapOID.0
Type: gosnmp.ObjectIdentifier,
Value: ".1.3.6.1.6.3.1.1.5.1", // coldStart
},
},
},
entries: []entry{
{
oid: ".1.3.6.1.6.3.1.1.4.1.0",
e: mibEntry{
"SNMPv2-MIB",
"snmpTrapOID.0",
},
},
{
oid: ".1.3.6.1.6.3.1.1.5.1",
e: mibEntry{
"SNMPv2-MIB",
"coldStart",
},
},
{
oid: ".1.3.6.1.2.1.1.3.0",
e: mibEntry{
"UNUSED_MIB_NAME",
"sysUpTimeInstance",
},
},
},
metrics: []telegraf.Metric{
testutil.MustMetric(
"snmp_trap", // name
map[string]string{ // tags
"oid": ".1.3.6.1.6.3.1.1.5.1",
"name": "coldStart",
"mib": "SNMPv2-MIB",
"version": "2c",
"source": "127.0.0.1",
},
map[string]interface{}{ // fields
"sysUpTimeInstance": now,
},
fakeTime,
),
},
},
//Check that we're not running snmptranslate to look up oids
//when we shouldn't be. This sends and receives a valid trap
//but metric production should fail because the oids aren't in
//the cache and oid lookup is intentionally mocked to fail.
{
name: "missing oid",
version: gosnmp.Version2c,
trap: gosnmp.SnmpTrap{
Variables: []gosnmp.SnmpPDU{
{
Name: ".1.3.6.1.2.1.1.3.0",
Type: gosnmp.TimeTicks,
Value: now,
},
{
Name: ".1.3.6.1.6.3.1.1.4.1.0", // SNMPv2-MIB::snmpTrapOID.0
Type: gosnmp.ObjectIdentifier,
Value: ".1.3.6.1.6.3.1.1.5.1", // coldStart
},
},
},
entries: []entry{}, //nothing in cache
metrics: []telegraf.Metric{},
},
//v1 enterprise specific trap
{
name: "v1 trap enterprise",
version: gosnmp.Version1,
trap: gosnmp.SnmpTrap{
Variables: []gosnmp.SnmpPDU{
{
Name: ".1.2.3.4.5",
Type: gosnmp.OctetString,
Value: "payload",
},
},
Enterprise: ".1.2.3",
AgentAddress: "10.20.30.40",
GenericTrap: 6, // enterpriseSpecific
SpecificTrap: 55,
Timestamp: uint(now),
},
entries: []entry{
{
".1.2.3.4.5",
mibEntry{
"valueMIB",
"valueOID",
},
},
{
".1.2.3.0.55",
mibEntry{
"enterpriseMIB",
"enterpriseOID",
},
},
},
metrics: []telegraf.Metric{
testutil.MustMetric(
"snmp_trap", // name
map[string]string{ // tags
"oid": ".1.2.3.0.55",
"name": "enterpriseOID",
"mib": "enterpriseMIB",
"version": "1",
"source": "127.0.0.1",
"agent_address": "10.20.30.40",
},
map[string]interface{}{ // fields
"sysUpTimeInstance": uint(now),
"valueOID": "payload",
},
fakeTime,
),
},
},
//v1 generic trap
{
name: "v1 trap generic",
version: gosnmp.Version1,
trap: gosnmp.SnmpTrap{
Variables: []gosnmp.SnmpPDU{
{
Name: ".1.2.3.4.5",
Type: gosnmp.OctetString,
Value: "payload",
},
},
Enterprise: ".1.2.3",
AgentAddress: "10.20.30.40",
GenericTrap: 0, //coldStart
SpecificTrap: 0,
Timestamp: uint(now),
},
entries: []entry{
{
".1.2.3.4.5",
mibEntry{
"valueMIB",
"valueOID",
},
},
{
".1.3.6.1.6.3.1.1.5.1",
mibEntry{
"coldStartMIB",
"coldStartOID",
},
},
},
metrics: []telegraf.Metric{
testutil.MustMetric(
"snmp_trap", // name
map[string]string{ // tags
"oid": ".1.3.6.1.6.3.1.1.5.1",
"name": "coldStartOID",
"mib": "coldStartMIB",
"version": "1",
"source": "127.0.0.1",
"agent_address": "10.20.30.40",
},
map[string]interface{}{ // fields
"sysUpTimeInstance": uint(now),
"valueOID": "payload",
},
fakeTime,
),
},
},
//ordinary v3 coldStart trap no auth and no priv
{
name: "v3 coldStart noAuthNoPriv",
version: gosnmp.Version3,
secName: "noAuthNoPriv",
secLevel: "noAuthNoPriv",
contextName: "foo_context_name",
engineID: "bar_engine_id",
trap: gosnmp.SnmpTrap{
Variables: []gosnmp.SnmpPDU{
{
Name: ".1.3.6.1.2.1.1.3.0",
Type: gosnmp.TimeTicks,
Value: now,
},
{
Name: ".1.3.6.1.6.3.1.1.4.1.0", // SNMPv2-MIB::snmpTrapOID.0
Type: gosnmp.ObjectIdentifier,
Value: ".1.3.6.1.6.3.1.1.5.1", // coldStart
},
},
},
entries: []entry{
{
oid: ".1.3.6.1.6.3.1.1.4.1.0",
e: mibEntry{
"SNMPv2-MIB",
"snmpTrapOID.0",
},
},
{
oid: ".1.3.6.1.6.3.1.1.5.1",
e: mibEntry{
"SNMPv2-MIB",
"coldStart",
},
},
{
oid: ".1.3.6.1.2.1.1.3.0",
e: mibEntry{
"UNUSED_MIB_NAME",
"sysUpTimeInstance",
},
},
},
metrics: []telegraf.Metric{
testutil.MustMetric(
"snmp_trap", // name
map[string]string{ // tags
"oid": ".1.3.6.1.6.3.1.1.5.1",
"name": "coldStart",
"mib": "SNMPv2-MIB",
"version": "3",
"source": "127.0.0.1",
"context_name": "foo_context_name",
"engine_id": "6261725f656e67696e655f6964",
},
map[string]interface{}{ // fields
"sysUpTimeInstance": now,
},
fakeTime,
),
},
},
//ordinary v3 coldstart trap SHA auth and no priv
{
name: "v3 coldStart authShaNoPriv",
version: gosnmp.Version3,
secName: "authShaNoPriv",
secLevel: "authNoPriv",
authProto: "SHA",
authPass: "passpass",
trap: gosnmp.SnmpTrap{
Variables: []gosnmp.SnmpPDU{
{
Name: ".1.3.6.1.2.1.1.3.0",
Type: gosnmp.TimeTicks,
Value: now,
},
{
Name: ".1.3.6.1.6.3.1.1.4.1.0", // SNMPv2-MIB::snmpTrapOID.0
Type: gosnmp.ObjectIdentifier,
Value: ".1.3.6.1.6.3.1.1.5.1", // coldStart
},
},
},
entries: []entry{
{
oid: ".1.3.6.1.6.3.1.1.4.1.0",
e: mibEntry{
"SNMPv2-MIB",
"snmpTrapOID.0",
},
},
{
oid: ".1.3.6.1.6.3.1.1.5.1",
e: mibEntry{
"SNMPv2-MIB",
"coldStart",
},
},
{
oid: ".1.3.6.1.2.1.1.3.0",
e: mibEntry{
"UNUSED_MIB_NAME",
"sysUpTimeInstance",
},
},
},
metrics: []telegraf.Metric{
testutil.MustMetric(
"snmp_trap", // name
map[string]string{ // tags
"oid": ".1.3.6.1.6.3.1.1.5.1",
"name": "coldStart",
"mib": "SNMPv2-MIB",
"version": "3",
"source": "127.0.0.1",
},
map[string]interface{}{ // fields
"sysUpTimeInstance": now,
},
fakeTime,
),
},
},
/*
//ordinary v3 coldstart trap SHA224 auth and no priv
{
name: "v3 coldStart authShaNoPriv",
version: gosnmp.Version3,
secName: "authSha224NoPriv",
secLevel: "authNoPriv",
authProto: "SHA224",
authPass: "passpass",
trap: gosnmp.SnmpTrap{
Variables: []gosnmp.SnmpPDU{
{
Name: ".1.3.6.1.2.1.1.3.0",
Type: gosnmp.TimeTicks,
Value: now,
},
{
Name: ".1.3.6.1.6.3.1.1.4.1.0", // SNMPv2-MIB::snmpTrapOID.0
Type: gosnmp.ObjectIdentifier,
Value: ".1.3.6.1.6.3.1.1.5.1", // coldStart
},
},
},
entries: []entry{
{
oid: ".1.3.6.1.6.3.1.1.4.1.0",
e: mibEntry{
"SNMPv2-MIB",
"snmpTrapOID.0",
},
},
{
oid: ".1.3.6.1.6.3.1.1.5.1",
e: mibEntry{
"SNMPv2-MIB",
"coldStart",
},
},
{
oid: ".1.3.6.1.2.1.1.3.0",
e: mibEntry{
"UNUSED_MIB_NAME",
"sysUpTimeInstance",
},
},
},
metrics: []telegraf.Metric{
testutil.MustMetric(
"snmp_trap", // name
map[string]string{ // tags
"oid": ".1.3.6.1.6.3.1.1.5.1",
"name": "coldStart",
"mib": "SNMPv2-MIB",
"version": "3",
"source": "127.0.0.1",
},
map[string]interface{}{ // fields
"sysUpTimeInstance": now,
},
fakeTime,
),
},
},
//ordinary v3 coldstart trap SHA256 auth and no priv
{
name: "v3 coldStart authSha256NoPriv",
version: gosnmp.Version3,
secName: "authSha256NoPriv",
secLevel: "authNoPriv",
authProto: "SHA256",
authPass: "passpass",
trap: gosnmp.SnmpTrap{
Variables: []gosnmp.SnmpPDU{
{
Name: ".1.3.6.1.2.1.1.3.0",
Type: gosnmp.TimeTicks,
Value: now,
},
{
Name: ".1.3.6.1.6.3.1.1.4.1.0", // SNMPv2-MIB::snmpTrapOID.0
Type: gosnmp.ObjectIdentifier,
Value: ".1.3.6.1.6.3.1.1.5.1", // coldStart
},
},
},
entries: []entry{
{
oid: ".1.3.6.1.6.3.1.1.4.1.0",
e: mibEntry{
"SNMPv2-MIB",
"snmpTrapOID.0",
},
},
{
oid: ".1.3.6.1.6.3.1.1.5.1",
e: mibEntry{
"SNMPv2-MIB",
"coldStart",
},
},
{
oid: ".1.3.6.1.2.1.1.3.0",
e: mibEntry{
"UNUSED_MIB_NAME",
"sysUpTimeInstance",
},
},
},
metrics: []telegraf.Metric{
testutil.MustMetric(
"snmp_trap", // name
map[string]string{ // tags
"oid": ".1.3.6.1.6.3.1.1.5.1",
"name": "coldStart",
"mib": "SNMPv2-MIB",
"version": "3",
"source": "127.0.0.1",
},
map[string]interface{}{ // fields
"sysUpTimeInstance": now,
},
fakeTime,
),
},
},
//ordinary v3 coldstart trap SHA384 auth and no priv
{
name: "v3 coldStart authSha384NoPriv",
version: gosnmp.Version3,
secName: "authSha384NoPriv",
secLevel: "authNoPriv",
authProto: "SHA384",
authPass: "passpass",
trap: gosnmp.SnmpTrap{
Variables: []gosnmp.SnmpPDU{
{
Name: ".1.3.6.1.2.1.1.3.0",
Type: gosnmp.TimeTicks,
Value: now,
},
{
Name: ".1.3.6.1.6.3.1.1.4.1.0", // SNMPv2-MIB::snmpTrapOID.0
Type: gosnmp.ObjectIdentifier,
Value: ".1.3.6.1.6.3.1.1.5.1", // coldStart
},
},
},
entries: []entry{
{
oid: ".1.3.6.1.6.3.1.1.4.1.0",
e: mibEntry{
"SNMPv2-MIB",
"snmpTrapOID.0",
},
},
{
oid: ".1.3.6.1.6.3.1.1.5.1",
e: mibEntry{
"SNMPv2-MIB",
"coldStart",
},
},
{
oid: ".1.3.6.1.2.1.1.3.0",
e: mibEntry{
"UNUSED_MIB_NAME",
"sysUpTimeInstance",
},
},
},
metrics: []telegraf.Metric{
testutil.MustMetric(
"snmp_trap", // name
map[string]string{ // tags
"oid": ".1.3.6.1.6.3.1.1.5.1",
"name": "coldStart",
"mib": "SNMPv2-MIB",
"version": "3",
"source": "127.0.0.1",
},
map[string]interface{}{ // fields
"sysUpTimeInstance": now,
},
fakeTime,
),
},
},
//ordinary v3 coldstart trap SHA512 auth and no priv
{
name: "v3 coldStart authShaNoPriv",
version: gosnmp.Version3,
secName: "authSha512NoPriv",
secLevel: "authNoPriv",
authProto: "SHA512",
authPass: "passpass",
trap: gosnmp.SnmpTrap{
Variables: []gosnmp.SnmpPDU{
{
Name: ".1.3.6.1.2.1.1.3.0",
Type: gosnmp.TimeTicks,
Value: now,
},
{
Name: ".1.3.6.1.6.3.1.1.4.1.0", // SNMPv2-MIB::snmpTrapOID.0
Type: gosnmp.ObjectIdentifier,
Value: ".1.3.6.1.6.3.1.1.5.1", // coldStart
},
},
},
entries: []entry{
{
oid: ".1.3.6.1.6.3.1.1.4.1.0",
e: mibEntry{
"SNMPv2-MIB",
"snmpTrapOID.0",
},
},
{
oid: ".1.3.6.1.6.3.1.1.5.1",
e: mibEntry{
"SNMPv2-MIB",
"coldStart",
},
},
{
oid: ".1.3.6.1.2.1.1.3.0",
e: mibEntry{
"UNUSED_MIB_NAME",
"sysUpTimeInstance",
},
},
},
metrics: []telegraf.Metric{
testutil.MustMetric(
"snmp_trap", // name
map[string]string{ // tags
"oid": ".1.3.6.1.6.3.1.1.5.1",
"name": "coldStart",
"mib": "SNMPv2-MIB",
"version": "3",
"source": "127.0.0.1",
},
map[string]interface{}{ // fields
"sysUpTimeInstance": now,
},
fakeTime,
),
},
},*/
//ordinary v3 coldstart trap SHA auth and no priv
{
name: "v3 coldStart authShaNoPriv",
version: gosnmp.Version3,
secName: "authShaNoPriv",
secLevel: "authNoPriv",
authProto: "SHA",
authPass: "passpass",
trap: gosnmp.SnmpTrap{
Variables: []gosnmp.SnmpPDU{
{
Name: ".1.3.6.1.2.1.1.3.0",
Type: gosnmp.TimeTicks,
Value: now,
},
{
Name: ".1.3.6.1.6.3.1.1.4.1.0", // SNMPv2-MIB::snmpTrapOID.0
Type: gosnmp.ObjectIdentifier,
Value: ".1.3.6.1.6.3.1.1.5.1", // coldStart
},
},
},
entries: []entry{
{
oid: ".1.3.6.1.6.3.1.1.4.1.0",
e: mibEntry{
"SNMPv2-MIB",
"snmpTrapOID.0",
},
},
{
oid: ".1.3.6.1.6.3.1.1.5.1",
e: mibEntry{
"SNMPv2-MIB",
"coldStart",
},
},
{
oid: ".1.3.6.1.2.1.1.3.0",
e: mibEntry{
"UNUSED_MIB_NAME",
"sysUpTimeInstance",
},
},
},
metrics: []telegraf.Metric{
testutil.MustMetric(
"snmp_trap", // name
map[string]string{ // tags
"oid": ".1.3.6.1.6.3.1.1.5.1",
"name": "coldStart",
"mib": "SNMPv2-MIB",
"version": "3",
"source": "127.0.0.1",
},
map[string]interface{}{ // fields
"sysUpTimeInstance": now,
},
fakeTime,
),
},
},
//ordinary v3 coldstart trap MD5 auth and no priv
{
name: "v3 coldStart authMD5NoPriv",
version: gosnmp.Version3,
secName: "authMD5NoPriv",
secLevel: "authNoPriv",
authProto: "MD5",
authPass: "passpass",
trap: gosnmp.SnmpTrap{
Variables: []gosnmp.SnmpPDU{
{
Name: ".1.3.6.1.2.1.1.3.0",
Type: gosnmp.TimeTicks,
Value: now,
},
{
Name: ".1.3.6.1.6.3.1.1.4.1.0", // SNMPv2-MIB::snmpTrapOID.0
Type: gosnmp.ObjectIdentifier,
Value: ".1.3.6.1.6.3.1.1.5.1", // coldStart
},
},
},
entries: []entry{
{
oid: ".1.3.6.1.6.3.1.1.4.1.0",
e: mibEntry{
"SNMPv2-MIB",
"snmpTrapOID.0",
},
},
{
oid: ".1.3.6.1.6.3.1.1.5.1",
e: mibEntry{
"SNMPv2-MIB",
"coldStart",
},
},
{
oid: ".1.3.6.1.2.1.1.3.0",
e: mibEntry{
"UNUSED_MIB_NAME",
"sysUpTimeInstance",
},
},
},
metrics: []telegraf.Metric{
testutil.MustMetric(
"snmp_trap", // name
map[string]string{ // tags
"oid": ".1.3.6.1.6.3.1.1.5.1",
"name": "coldStart",
"mib": "SNMPv2-MIB",
"version": "3",
"source": "127.0.0.1",
},
map[string]interface{}{ // fields
"sysUpTimeInstance": now,
},
fakeTime,
),
},
},
//ordinary v3 coldStart SHA trap auth and AES priv
{
name: "v3 coldStart authSHAPrivAES",
version: gosnmp.Version3,
secName: "authSHAPrivAES",
secLevel: "authPriv",
authProto: "SHA",
authPass: "passpass",
privProto: "AES",
privPass: "passpass",
trap: gosnmp.SnmpTrap{
Variables: []gosnmp.SnmpPDU{
{
Name: ".1.3.6.1.2.1.1.3.0",
Type: gosnmp.TimeTicks,
Value: now,
},
{
Name: ".1.3.6.1.6.3.1.1.4.1.0", // SNMPv2-MIB::snmpTrapOID.0
Type: gosnmp.ObjectIdentifier,
Value: ".1.3.6.1.6.3.1.1.5.1", // coldStart
},
},
},
entries: []entry{
{
oid: ".1.3.6.1.6.3.1.1.4.1.0",
e: mibEntry{
"SNMPv2-MIB",
"snmpTrapOID.0",
},
},
{
oid: ".1.3.6.1.6.3.1.1.5.1",
e: mibEntry{
"SNMPv2-MIB",
"coldStart",
},
},
{
oid: ".1.3.6.1.2.1.1.3.0",
e: mibEntry{
"UNUSED_MIB_NAME",
"sysUpTimeInstance",
},
},
},
metrics: []telegraf.Metric{
testutil.MustMetric(
"snmp_trap", // name
map[string]string{ // tags
"oid": ".1.3.6.1.6.3.1.1.5.1",
"name": "coldStart",
"mib": "SNMPv2-MIB",
"version": "3",
"source": "127.0.0.1",
},
map[string]interface{}{ // fields
"sysUpTimeInstance": now,
},
fakeTime,
),
},
},
//ordinary v3 coldStart SHA trap auth and DES priv
{
name: "v3 coldStart authSHAPrivDES",
version: gosnmp.Version3,
secName: "authSHAPrivDES",
secLevel: "authPriv",
authProto: "SHA",
authPass: "passpass",
privProto: "DES",
privPass: "passpass",
trap: gosnmp.SnmpTrap{
Variables: []gosnmp.SnmpPDU{
{
Name: ".1.3.6.1.2.1.1.3.0",
Type: gosnmp.TimeTicks,
Value: now,
},
{
Name: ".1.3.6.1.6.3.1.1.4.1.0", // SNMPv2-MIB::snmpTrapOID.0
Type: gosnmp.ObjectIdentifier,
Value: ".1.3.6.1.6.3.1.1.5.1", // coldStart
},
},
},
entries: []entry{
{
oid: ".1.3.6.1.6.3.1.1.4.1.0",
e: mibEntry{
"SNMPv2-MIB",
"snmpTrapOID.0",
},
},
{
oid: ".1.3.6.1.6.3.1.1.5.1",
e: mibEntry{
"SNMPv2-MIB",
"coldStart",
},
},
{
oid: ".1.3.6.1.2.1.1.3.0",
e: mibEntry{
"UNUSED_MIB_NAME",
"sysUpTimeInstance",
},
},
},
metrics: []telegraf.Metric{
testutil.MustMetric(
"snmp_trap", // name
map[string]string{ // tags
"oid": ".1.3.6.1.6.3.1.1.5.1",
"name": "coldStart",
"mib": "SNMPv2-MIB",
"version": "3",
"source": "127.0.0.1",
},
map[string]interface{}{ // fields
"sysUpTimeInstance": now,
},
fakeTime,
),
},
},
//ordinary v3 coldStart SHA trap auth and AES192 priv
{
name: "v3 coldStart authSHAPrivAES192",
version: gosnmp.Version3,
secName: "authSHAPrivAES192",
secLevel: "authPriv",
authProto: "SHA",
authPass: "passpass",
privProto: "AES192",
privPass: "passpass",
trap: gosnmp.SnmpTrap{
Variables: []gosnmp.SnmpPDU{
{
Name: ".1.3.6.1.2.1.1.3.0",
Type: gosnmp.TimeTicks,
Value: now,
},
{
Name: ".1.3.6.1.6.3.1.1.4.1.0", // SNMPv2-MIB::snmpTrapOID.0
Type: gosnmp.ObjectIdentifier,
Value: ".1.3.6.1.6.3.1.1.5.1", // coldStart
},
},
},
entries: []entry{
{
oid: ".1.3.6.1.6.3.1.1.4.1.0",
e: mibEntry{
"SNMPv2-MIB",
"snmpTrapOID.0",
},
},
{
oid: ".1.3.6.1.6.3.1.1.5.1",
e: mibEntry{
"SNMPv2-MIB",
"coldStart",
},
},
{
oid: ".1.3.6.1.2.1.1.3.0",
e: mibEntry{
"UNUSED_MIB_NAME",
"sysUpTimeInstance",
},
},
},
metrics: []telegraf.Metric{
testutil.MustMetric(
"snmp_trap", // name
map[string]string{ // tags
"oid": ".1.3.6.1.6.3.1.1.5.1",
"name": "coldStart",
"mib": "SNMPv2-MIB",
"version": "3",
"source": "127.0.0.1",
},
map[string]interface{}{ // fields
"sysUpTimeInstance": now,
},
fakeTime,
),
},
},
//ordinary v3 coldStart SHA trap auth and AES192C priv
{
name: "v3 coldStart authSHAPrivAES192C",
version: gosnmp.Version3,
secName: "authSHAPrivAES192C",
secLevel: "authPriv",
authProto: "SHA",
authPass: "passpass",
privProto: "AES192C",
privPass: "passpass",
trap: gosnmp.SnmpTrap{
Variables: []gosnmp.SnmpPDU{
{
Name: ".1.3.6.1.2.1.1.3.0",
Type: gosnmp.TimeTicks,
Value: now,
},
{
Name: ".1.3.6.1.6.3.1.1.4.1.0", // SNMPv2-MIB::snmpTrapOID.0
Type: gosnmp.ObjectIdentifier,
Value: ".1.3.6.1.6.3.1.1.5.1", // coldStart
},
},
},
entries: []entry{
{
oid: ".1.3.6.1.6.3.1.1.4.1.0",
e: mibEntry{
"SNMPv2-MIB",
"snmpTrapOID.0",
},
},
{
oid: ".1.3.6.1.6.3.1.1.5.1",
e: mibEntry{
"SNMPv2-MIB",
"coldStart",
},
},
{
oid: ".1.3.6.1.2.1.1.3.0",
e: mibEntry{
"UNUSED_MIB_NAME",
"sysUpTimeInstance",
},
},
},
metrics: []telegraf.Metric{
testutil.MustMetric(
"snmp_trap", // name
map[string]string{ // tags
"oid": ".1.3.6.1.6.3.1.1.5.1",
"name": "coldStart",
"mib": "SNMPv2-MIB",
"version": "3",
"source": "127.0.0.1",
},
map[string]interface{}{ // fields
"sysUpTimeInstance": now,
},
fakeTime,
),
},
},
//ordinary v3 coldStart SHA trap auth and AES256 priv
{
name: "v3 coldStart authSHAPrivAES256",
version: gosnmp.Version3,
secName: "authSHAPrivAES256",
secLevel: "authPriv",
authProto: "SHA",
authPass: "passpass",
privProto: "AES256",
privPass: "passpass",
trap: gosnmp.SnmpTrap{
Variables: []gosnmp.SnmpPDU{
{
Name: ".1.3.6.1.2.1.1.3.0",
Type: gosnmp.TimeTicks,
Value: now,
},
{
Name: ".1.3.6.1.6.3.1.1.4.1.0", // SNMPv2-MIB::snmpTrapOID.0
Type: gosnmp.ObjectIdentifier,
Value: ".1.3.6.1.6.3.1.1.5.1", // coldStart
},
},
},
entries: []entry{
{
oid: ".1.3.6.1.6.3.1.1.4.1.0",
e: mibEntry{
"SNMPv2-MIB",
"snmpTrapOID.0",
},
},
{
oid: ".1.3.6.1.6.3.1.1.5.1",
e: mibEntry{
"SNMPv2-MIB",
"coldStart",
},
},
{
oid: ".1.3.6.1.2.1.1.3.0",
e: mibEntry{
"UNUSED_MIB_NAME",
"sysUpTimeInstance",
},
},
},
metrics: []telegraf.Metric{
testutil.MustMetric(
"snmp_trap", // name
map[string]string{ // tags
"oid": ".1.3.6.1.6.3.1.1.5.1",
"name": "coldStart",
"mib": "SNMPv2-MIB",
"version": "3",
"source": "127.0.0.1",
},
map[string]interface{}{ // fields
"sysUpTimeInstance": now,
},
fakeTime,
),
},
},
//ordinary v3 coldStart SHA trap auth and AES256C priv
{
name: "v3 coldStart authSHAPrivAES256C",
version: gosnmp.Version3,
secName: "authSHAPrivAES256C",
secLevel: "authPriv",
authProto: "SHA",
authPass: "passpass",
privProto: "AES256C",
privPass: "passpass",
trap: gosnmp.SnmpTrap{
Variables: []gosnmp.SnmpPDU{
{
Name: ".1.3.6.1.2.1.1.3.0",
Type: gosnmp.TimeTicks,
Value: now,
},
{
Name: ".1.3.6.1.6.3.1.1.4.1.0", // SNMPv2-MIB::snmpTrapOID.0
Type: gosnmp.ObjectIdentifier,
Value: ".1.3.6.1.6.3.1.1.5.1", // coldStart
},
},
},
entries: []entry{
{
oid: ".1.3.6.1.6.3.1.1.4.1.0",
e: mibEntry{
"SNMPv2-MIB",
"snmpTrapOID.0",
},
},
{
oid: ".1.3.6.1.6.3.1.1.5.1",
e: mibEntry{
"SNMPv2-MIB",
"coldStart",
},
},
{
oid: ".1.3.6.1.2.1.1.3.0",
e: mibEntry{
"UNUSED_MIB_NAME",
"sysUpTimeInstance",
},
},
},
metrics: []telegraf.Metric{
testutil.MustMetric(
"snmp_trap", // name
map[string]string{ // tags
"oid": ".1.3.6.1.6.3.1.1.5.1",
"name": "coldStart",
"mib": "SNMPv2-MIB",
"version": "3",
"source": "127.0.0.1",
},
map[string]interface{}{ // fields
"sysUpTimeInstance": now,
},
fakeTime,
),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// We would prefer to specify port 0 and let the network
// stack choose an unused port for us but TrapListener
// doesn't have a way to return the autoselected port.
// Instead, we'll use an unusual port and hope it's
// unused.
const port = 12399
// Hook into the trap handler so the test knows when the
// trap has been received
received := make(chan int)
wrap := func(f handler) handler {
return func(p *gosnmp.SnmpPacket, a *net.UDPAddr) {
f(p, a)
received <- 0
}
}
// Set up the service input plugin
s := &SnmpTrap{
ServiceAddress: "udp://:" + strconv.Itoa(port),
makeHandlerWrapper: wrap,
timeFunc: func() time.Time {
return fakeTime
},
Log: testutil.Logger{},
Version: tt.version.String(),
SecName: tt.secName,
SecLevel: tt.secLevel,
AuthProtocol: tt.authProto,
AuthPassword: tt.authPass,
PrivProtocol: tt.privProto,
PrivPassword: tt.privPass,
}
require.Nil(t, s.Init())
var acc testutil.Accumulator
require.Nil(t, s.Start(&acc))
defer s.Stop()
// Preload the cache with the oids we'll use in this test
// so snmptranslate and mibs don't need to be installed.
for _, entry := range tt.entries {
s.load(entry.oid, entry.e)
}
// Don't look up oid with snmptranslate.
s.execCmd = fakeExecCmd
// Send the trap
sendTrap(t, port, now, tt.trap, tt.version, tt.secLevel, tt.secName, tt.authProto, tt.authPass, tt.privProto, tt.privPass, tt.contextName, tt.engineID)
// Wait for trap to be received
select {
case <-received:
case <-time.After(2 * time.Second):
t.Fatal("timed out waiting for trap to be received")
}
// Verify plugin output
testutil.RequireMetricsEqual(t,
tt.metrics, acc.GetTelegrafMetrics(),
testutil.SortMetrics())
})
}
}