1321 lines
30 KiB
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())
|
|
})
|
|
}
|
|
|
|
}
|