summaryrefslogtreecommitdiffstats
path: root/src/go/plugin/go.d/modules/snmp/init.go
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/go/plugin/go.d/modules/snmp/init.go175
1 files changed, 175 insertions, 0 deletions
diff --git a/src/go/plugin/go.d/modules/snmp/init.go b/src/go/plugin/go.d/modules/snmp/init.go
new file mode 100644
index 000000000..acde4b9b8
--- /dev/null
+++ b/src/go/plugin/go.d/modules/snmp/init.go
@@ -0,0 +1,175 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package snmp
+
+import (
+ "errors"
+ "fmt"
+ "strings"
+ "time"
+
+ "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/matcher"
+
+ "github.com/gosnmp/gosnmp"
+)
+
+func (s *SNMP) validateConfig() error {
+ if s.Hostname == "" {
+ return errors.New("SNMP hostname is required")
+ }
+ return nil
+}
+
+func (s *SNMP) initSNMPClient() (gosnmp.Handler, error) {
+ client := s.newSnmpClient()
+
+ client.SetTarget(s.Hostname)
+ client.SetPort(uint16(s.Options.Port))
+ client.SetRetries(s.Options.Retries)
+ client.SetTimeout(time.Duration(s.Options.Timeout) * time.Second)
+ client.SetMaxOids(s.Options.MaxOIDs)
+ client.SetMaxRepetitions(uint32(s.Options.MaxRepetitions))
+
+ ver := parseSNMPVersion(s.Options.Version)
+ comm := s.Community
+
+ switch ver {
+ case gosnmp.Version1:
+ client.SetCommunity(comm)
+ client.SetVersion(gosnmp.Version1)
+ case gosnmp.Version2c:
+ client.SetCommunity(comm)
+ client.SetVersion(gosnmp.Version2c)
+ case gosnmp.Version3:
+ if s.User.Name == "" {
+ return nil, errors.New("username is required for SNMPv3")
+ }
+ client.SetVersion(gosnmp.Version3)
+ client.SetSecurityModel(gosnmp.UserSecurityModel)
+ client.SetMsgFlags(parseSNMPv3SecurityLevel(s.User.SecurityLevel))
+ client.SetSecurityParameters(&gosnmp.UsmSecurityParameters{
+ UserName: s.User.Name,
+ AuthenticationProtocol: parseSNMPv3AuthProtocol(s.User.AuthProto),
+ AuthenticationPassphrase: s.User.AuthKey,
+ PrivacyProtocol: parseSNMPv3PrivProtocol(s.User.PrivProto),
+ PrivacyPassphrase: s.User.PrivKey,
+ })
+ default:
+ return nil, fmt.Errorf("invalid SNMP version: %s", s.Options.Version)
+ }
+
+ s.Info(snmpClientConnInfo(client))
+
+ return client, nil
+}
+
+func (s *SNMP) initNetIfaceFilters() (matcher.Matcher, matcher.Matcher, error) {
+ byName, byType := matcher.FALSE(), matcher.FALSE()
+
+ if v := s.NetworkInterfaceFilter.ByName; v != "" {
+ m, err := matcher.NewSimplePatternsMatcher(v)
+ if err != nil {
+ return nil, nil, err
+ }
+ byName = m
+ }
+
+ if v := s.NetworkInterfaceFilter.ByType; v != "" {
+ m, err := matcher.NewSimplePatternsMatcher(v)
+ if err != nil {
+ return nil, nil, err
+ }
+ byType = m
+ }
+
+ return byName, byType, nil
+}
+
+func (s *SNMP) initOIDs() (oids []string) {
+ for _, c := range *s.charts {
+ for _, d := range c.Dims {
+ oids = append(oids, d.ID)
+ }
+ }
+ return oids
+}
+
+func parseSNMPVersion(version string) gosnmp.SnmpVersion {
+ switch version {
+ case "0", "1":
+ return gosnmp.Version1
+ case "2", "2c", "":
+ return gosnmp.Version2c
+ case "3":
+ return gosnmp.Version3
+ default:
+ return gosnmp.Version2c
+ }
+}
+
+func parseSNMPv3SecurityLevel(level string) gosnmp.SnmpV3MsgFlags {
+ switch level {
+ case "1", "none", "noAuthNoPriv", "":
+ return gosnmp.NoAuthNoPriv
+ case "2", "authNoPriv":
+ return gosnmp.AuthNoPriv
+ case "3", "authPriv":
+ return gosnmp.AuthPriv
+ default:
+ return gosnmp.NoAuthNoPriv
+ }
+}
+
+func parseSNMPv3AuthProtocol(protocol string) gosnmp.SnmpV3AuthProtocol {
+ switch protocol {
+ case "1", "none", "noAuth", "":
+ return gosnmp.NoAuth
+ case "2", "md5":
+ return gosnmp.MD5
+ case "3", "sha":
+ return gosnmp.SHA
+ case "4", "sha224":
+ return gosnmp.SHA224
+ case "5", "sha256":
+ return gosnmp.SHA256
+ case "6", "sha384":
+ return gosnmp.SHA384
+ case "7", "sha512":
+ return gosnmp.SHA512
+ default:
+ return gosnmp.NoAuth
+ }
+}
+
+func parseSNMPv3PrivProtocol(protocol string) gosnmp.SnmpV3PrivProtocol {
+ switch protocol {
+ case "1", "none", "noPriv", "":
+ return gosnmp.NoPriv
+ case "2", "des":
+ return gosnmp.DES
+ case "3", "aes":
+ return gosnmp.AES
+ case "4", "aes192":
+ return gosnmp.AES192
+ case "5", "aes256":
+ return gosnmp.AES256
+ case "6", "aes192c":
+ return gosnmp.AES192C
+ case "7", "aes256c":
+ return gosnmp.AES256C
+ default:
+ return gosnmp.NoPriv
+ }
+}
+
+func snmpClientConnInfo(c gosnmp.Handler) string {
+ var info strings.Builder
+ info.WriteString(fmt.Sprintf("hostname='%s',port='%d',snmp_version='%s'", c.Target(), c.Port(), c.Version()))
+ switch c.Version() {
+ case gosnmp.Version1, gosnmp.Version2c:
+ info.WriteString(fmt.Sprintf(",community='%s'", c.Community()))
+ case gosnmp.Version3:
+ info.WriteString(fmt.Sprintf(",security_level='%d,%s'", c.MsgFlags(), c.SecurityParameters().Description()))
+ }
+ return info.String()
+}