func snmpTranslateCall()

in plugins/inputs/snmp/snmp.go [921:993]


func snmpTranslateCall(oid string) (mibName string, oidNum string, oidText string, conversion string, err error) {
	var out []byte
	if strings.ContainsAny(oid, ":abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") {
		out, err = execCmd("snmptranslate", "-Td", "-Ob", oid)
	} else {
		out, err = execCmd("snmptranslate", "-Td", "-Ob", "-m", "all", oid)
		if err, ok := err.(*exec.Error); ok && err.Err == exec.ErrNotFound {
			// Silently discard error if snmptranslate not found and we have a numeric OID.
			// Meaning we can get by without the lookup.
			return "", oid, oid, "", nil
		}
	}
	if err != nil {
		return "", "", "", "", err
	}

	bb := bytes.NewBuffer(out)

	oidText, err = bb.ReadString('\n')
	if err != nil {
		return "", "", "", "", Errorf(err, "getting OID text")
	}
	oidText = oidText[:len(oidText)-1]

	i := strings.Index(oidText, "::")
	if i == -1 {
		// was not found in MIB.
		if bytes.Index(bb.Bytes(), []byte(" [TRUNCATED]")) >= 0 {
			return "", oid, oid, "", nil
		}
		// not truncated, but not fully found. We still need to parse out numeric OID, so keep going
		oidText = oid
	} else {
		mibName = oidText[:i]
		oidText = oidText[i+2:]
	}

	if i := bytes.Index(bb.Bytes(), []byte("  -- TEXTUAL CONVENTION ")); i != -1 {
		bb.Next(i + len("  -- TEXTUAL CONVENTION "))
		tc, err := bb.ReadString('\n')
		if err != nil {
			return "", "", "", "", Errorf(err, "getting textual convention")
		}
		tc = tc[:len(tc)-1]
		switch tc {
		case "MacAddress", "PhysAddress":
			conversion = "hwaddr"
		case "InetAddressIPv4", "InetAddressIPv6", "InetAddress":
			conversion = "ipaddr"
		}
	}

	i = bytes.Index(bb.Bytes(), []byte("::= { "))
	bb.Next(i + len("::= { "))
	objs, err := bb.ReadString('}')
	if err != nil {
		return "", "", "", "", Errorf(err, "getting numeric oid")
	}
	objs = objs[:len(objs)-1]
	for _, obj := range strings.Split(objs, " ") {
		if len(obj) == 0 {
			continue
		}
		if i := strings.Index(obj, "("); i != -1 {
			obj = obj[i+1:]
			oidNum += "." + obj[:strings.Index(obj, ")")]
		} else {
			oidNum += "." + obj
		}
	}

	return mibName, oidNum, oidText, conversion, nil
}