package main import ( "flag" "fmt" "github.com/gosnmp/gosnmp" "log" "os" "reflect" "strconv" "time" ) var ( oid string oidValue string ) func main() { version := flag.Int("v", 2, "SNMP version") community := flag.String("c", "pulic", "SNMP community") host := flag.String("h", "127.0.0.1", "SNMP server host") port := flag.Uint("p", 161, "SNMP server port") oidstr := flag.String("o", ".1.3.6.1.2.1.1.3.0", "SNMP oid") oidval := flag.String("s", "", "SNMP set value") flag.Parse() oid = *oidstr oidValue = *oidval if oidValue != "" { rping(*host, uint16(*port), *community) } else { switch *version { case 1: getV1(*host, uint16(*port), *community) case 3: getV3(*host, uint16(*port), *community) default: getV2c(*host, uint16(*port), *community) } } } func getV2c(target string, port uint16, community string) { gosnmp.Default.Target = target gosnmp.Default.Port = port gosnmp.Default.Version = gosnmp.Version2c gosnmp.Default.Community = community if err := gosnmp.Default.Connect(); err != nil { log.Fatal(err) } all, err := gosnmp.Default.WalkAll(".1.3.6.1.2.1.2.2.1") if err != nil { log.Fatal(err) } for _, r := range all { fmt.Println("Walk:", r.Name, r.Value, reflect.TypeOf(r.Value), r.Type) } res, err := gosnmp.Default.Get([]string{oid}) if err != nil { log.Fatal(err) } for i, v := range res.Variables { num := strconv.Itoa(i + 1) fmt.Println("snmpOid" + num, v.Name) fmt.Println("snmpResult" + num, v.Value) } } func getV1(target string, port uint16, community string) { gosnmp.Default.Target = target gosnmp.Default.Port = port gosnmp.Default.Version = gosnmp.Version1 gosnmp.Default.Community = community if err := gosnmp.Default.Connect(); err != nil { log.Fatal(err) } res, err := gosnmp.Default.Get([]string{oid}) if err != nil { log.Fatal(err) } for i, v := range res.Variables { num := strconv.Itoa(i + 1) fmt.Println("snmpResult" + num, v.Value) fmt.Println("snmpOid" + num, v.Name) } } func getV3(target string, port uint16, community string) { // Default is a pointer to a GoSNMP struct that contains sensible defaults // eg port 161, community public, etc params := &gosnmp.GoSNMP{ Target: target, Port: port, Version: gosnmp.Version3, Community: community, Timeout: time.Duration(30) * time.Second, SecurityModel: gosnmp.UserSecurityModel, MsgFlags: gosnmp.AuthPriv, Logger: log.New(os.Stdout, "", 0), SecurityParameters: &gosnmp.UsmSecurityParameters{ UserName: "user", AuthoritativeEngineID: "1234", AuthenticationProtocol: gosnmp.SHA, AuthenticationPassphrase: "password", PrivacyProtocol: gosnmp.DES, PrivacyPassphrase: "password", }, } if err := params.Connect(); err != nil { log.Fatal(err) } res, err := params.Get([]string{oid}) if err != nil { log.Fatal(err) } for i, v := range res.Variables { num := strconv.Itoa(i + 1) fmt.Println("snmpResult" + num, v.Value) fmt.Println("snmpOid" + num, v.Name) } } func rping(target string, port uint16, community string) { gosnmp.Default.Target = target gosnmp.Default.Port = port gosnmp.Default.Version = gosnmp.Version2c gosnmp.Default.Community = community if err := gosnmp.Default.Connect(); err != nil { log.Fatal(err) } // test oid: .1.3.6.1.2.1.1.5.0 res, err := gosnmp.Default.Set([]gosnmp.SnmpPDU{ { Name: oid, Type: gosnmp.OctetString, Value: oidValue, }, }) if err != nil { log.Fatal(err) } log.Println(res.Error) for _, v := range res.Variables { var val interface{} switch v.Type { case gosnmp.OctetString: val = string(v.Value.([]byte)) case gosnmp.TimeTicks: a := gosnmp.ToBigInt(v.Value) val = fmt.Sprintf("%d", (*a).Int64()) case gosnmp.ObjectIdentifier: val = v.Value default: val = v.Value } fmt.Println("Oid:", v.Name) fmt.Println("Type:", v.Type.String()) fmt.Println("Val:", val) } } /* SNMP System Group: sysDescr 1.3.6.1.2.1.1.1 sysObjectID 1.3.6.1.2.1.1.2 sysUpTime 1.3.6.1.2.1.1.3 sysContact 1.3.6.1.2.1.1.4 sysName 1.3.6.1.2.1.1.5 sysLocation 1.3.6.1.2.1.1.6 sysServices 1.3.6.1.2.1.1.7 */