testsnmp.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "github.com/gosnmp/gosnmp"
  6. "log"
  7. "os"
  8. "reflect"
  9. "strconv"
  10. "time"
  11. )
  12. var (
  13. oid string
  14. oidValue string
  15. )
  16. func main() {
  17. version := flag.Int("v", 2, "SNMP version")
  18. community := flag.String("c", "pulic", "SNMP community")
  19. host := flag.String("h", "127.0.0.1", "SNMP server host")
  20. port := flag.Uint("p", 161, "SNMP server port")
  21. oidstr := flag.String("o", ".1.3.6.1.2.1.1.3.0", "SNMP oid")
  22. oidval := flag.String("s", "", "SNMP set value")
  23. flag.Parse()
  24. oid = *oidstr
  25. oidValue = *oidval
  26. if oidValue != "" {
  27. rping(*host, uint16(*port), *community)
  28. } else {
  29. switch *version {
  30. case 1:
  31. getV1(*host, uint16(*port), *community)
  32. case 3:
  33. getV3(*host, uint16(*port), *community)
  34. default:
  35. getV2c(*host, uint16(*port), *community)
  36. }
  37. }
  38. }
  39. func getV2c(target string, port uint16, community string) {
  40. gosnmp.Default.Target = target
  41. gosnmp.Default.Port = port
  42. gosnmp.Default.Version = gosnmp.Version2c
  43. gosnmp.Default.Community = community
  44. if err := gosnmp.Default.Connect(); err != nil {
  45. log.Fatal(err)
  46. }
  47. all, err := gosnmp.Default.WalkAll(".1.3.6.1.2.1.2.2.1")
  48. if err != nil {
  49. log.Fatal(err)
  50. }
  51. for _, r := range all {
  52. fmt.Println("Walk:", r.Name, r.Value, reflect.TypeOf(r.Value), r.Type)
  53. }
  54. res, err := gosnmp.Default.Get([]string{oid})
  55. if err != nil {
  56. log.Fatal(err)
  57. }
  58. for i, v := range res.Variables {
  59. num := strconv.Itoa(i + 1)
  60. fmt.Println("snmpOid" + num, v.Name)
  61. fmt.Println("snmpResult" + num, v.Value)
  62. }
  63. }
  64. func getV1(target string, port uint16, community string) {
  65. gosnmp.Default.Target = target
  66. gosnmp.Default.Port = port
  67. gosnmp.Default.Version = gosnmp.Version1
  68. gosnmp.Default.Community = community
  69. if err := gosnmp.Default.Connect(); err != nil {
  70. log.Fatal(err)
  71. }
  72. res, err := gosnmp.Default.Get([]string{oid})
  73. if err != nil {
  74. log.Fatal(err)
  75. }
  76. for i, v := range res.Variables {
  77. num := strconv.Itoa(i + 1)
  78. fmt.Println("snmpResult" + num, v.Value)
  79. fmt.Println("snmpOid" + num, v.Name)
  80. }
  81. }
  82. func getV3(target string, port uint16, community string) {
  83. // Default is a pointer to a GoSNMP struct that contains sensible defaults
  84. // eg port 161, community public, etc
  85. params := &gosnmp.GoSNMP{
  86. Target: target,
  87. Port: port,
  88. Version: gosnmp.Version3,
  89. Community: community,
  90. Timeout: time.Duration(30) * time.Second,
  91. SecurityModel: gosnmp.UserSecurityModel,
  92. MsgFlags: gosnmp.AuthPriv,
  93. Logger: log.New(os.Stdout, "", 0),
  94. SecurityParameters: &gosnmp.UsmSecurityParameters{
  95. UserName: "user",
  96. AuthoritativeEngineID: "1234",
  97. AuthenticationProtocol: gosnmp.SHA,
  98. AuthenticationPassphrase: "password",
  99. PrivacyProtocol: gosnmp.DES,
  100. PrivacyPassphrase: "password",
  101. },
  102. }
  103. if err := params.Connect(); err != nil {
  104. log.Fatal(err)
  105. }
  106. res, err := params.Get([]string{oid})
  107. if err != nil {
  108. log.Fatal(err)
  109. }
  110. for i, v := range res.Variables {
  111. num := strconv.Itoa(i + 1)
  112. fmt.Println("snmpResult" + num, v.Value)
  113. fmt.Println("snmpOid" + num, v.Name)
  114. }
  115. }
  116. func rping(target string, port uint16, community string) {
  117. gosnmp.Default.Target = target
  118. gosnmp.Default.Port = port
  119. gosnmp.Default.Version = gosnmp.Version2c
  120. gosnmp.Default.Community = community
  121. if err := gosnmp.Default.Connect(); err != nil {
  122. log.Fatal(err)
  123. }
  124. // test oid: .1.3.6.1.2.1.1.5.0
  125. res, err := gosnmp.Default.Set([]gosnmp.SnmpPDU{
  126. {
  127. Name: oid,
  128. Type: gosnmp.OctetString,
  129. Value: oidValue,
  130. },
  131. })
  132. if err != nil {
  133. log.Fatal(err)
  134. }
  135. log.Println(res.Error)
  136. for _, v := range res.Variables {
  137. var val interface{}
  138. switch v.Type {
  139. case gosnmp.OctetString:
  140. val = string(v.Value.([]byte))
  141. case gosnmp.TimeTicks:
  142. a := gosnmp.ToBigInt(v.Value)
  143. val = fmt.Sprintf("%d", (*a).Int64())
  144. case gosnmp.ObjectIdentifier:
  145. val = v.Value
  146. default:
  147. val = v.Value
  148. }
  149. fmt.Println("Oid:", v.Name)
  150. fmt.Println("Type:", v.Type.String())
  151. fmt.Println("Val:", val)
  152. }
  153. }
  154. /*
  155. SNMP System Group:
  156. sysDescr 1.3.6.1.2.1.1.1
  157. sysObjectID 1.3.6.1.2.1.1.2
  158. sysUpTime 1.3.6.1.2.1.1.3
  159. sysContact 1.3.6.1.2.1.1.4
  160. sysName 1.3.6.1.2.1.1.5
  161. sysLocation 1.3.6.1.2.1.1.6
  162. sysServices 1.3.6.1.2.1.1.7
  163. */