| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338 |
- package main
- import (
- //"github.com/joaojeronimo/go-crc16"
- "bytes"
- "encoding/binary"
- "encoding/hex"
- "fmt"
- "net"
- "strconv"
- "time"
- "git.wecise.com/wecise/gosnmp"
- "git.wecise.com/wecise/odbserver/lib/wgwaiter"
- "gitee.com/wecisecode/util/logger"
- //"git.wecise.com/wecise/util/cast"
- //"strconv"
- )
- func IntToBytes(data int64) []byte {
- bytebuf := bytes.NewBuffer([]byte{})
- binary.Write(bytebuf, binary.BigEndian, data)
- return bytebuf.Bytes()
- }
- func ipToHexString(ip string) string {
- ipa := net.ParseIP(ip)
- p1 := fmt.Sprintf("%X", ipa[12])
- if len(p1) == 1 {
- p1 = "0" + p1
- }
- p2 := fmt.Sprintf("%X", ipa[13])
- if len(p2) == 1 {
- p2 = "0" + p2
- }
- p3 := fmt.Sprintf("%X", ipa[14])
- if len(p3) == 1 {
- p3 = "0" + p3
- }
- p4 := fmt.Sprintf("%X", ipa[15])
- if len(p4) == 1 {
- p4 = "0" + p4
- }
- s := fmt.Sprintf("%s%s%s%s", p1, p2, p3, p4)
- return s
- }
- func HexStringToBytes(s string) []byte {
- b, _ := hex.DecodeString(s)
- return b
- }
- func main() {
- n := 100
- snmp := &gosnmp.GoSNMP{
- Port: uint16(161),
- Transport: "udp",
- Community: "2811",
- Timeout: time.Duration(2) * time.Second,
- Retries: 3,
- ExponentialTimeout: false,
- MaxOids: gosnmp.MaxOids,
- }
- snmp.Version = gosnmp.Version2c
- lg := logger.New()
- lg.SetConsole(true)
- //params.Logger = lg
- snmp.Logger = gosnmp.NewLogger(lg)
- snmp.Target = "192.168.169.26"
- snmp.Retries = 3
- snmp.OnRetry = func(gs *gosnmp.GoSNMP) {
- logger.Warn("Found that SNMP has a retry action.")
- }
- if err := snmp.Connect(); err != nil {
- return
- }
- defer func() {
- if snmp.Conn != nil {
- if err := snmp.Conn.Close(); err != nil {
- logger.Warnf("Close rping conn error: %v", err)
- }
- }
- }()
- wg := wgwaiter.NewWaiter()
- for i := 0; i < n; i++ {
- wg.AddOne()
- go run(snmp, i, wg)
- if err := wg.Wait(50 * time.Second); err != nil {
- fmt.Printf("####err ==>%v\n", err)
- }
- }
- /*if err := wg.Wait(50 * time.Second); err != nil {
- fmt.Printf("####err ==>%v\n",err)
- }*/
- //time.Sleep(time.Second)
- print("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n")
- for i := 0; i < n; i++ {
- id := fmt.Sprintf("123456%d", i)
- if m, err := get(snmp, id); err != nil {
- fmt.Printf("####err ==>%v\n", err)
- } else {
- fmt.Printf("######## %i===> %v\n", i, m)
- }
- }
- print("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n")
- /*for i:=0 ; i<n ; i++ {
- id := fmt.Sprintf("123456%d", i)
- res, err := snmp.Set([]gosnmp.SnmpPDU{
- {
- Name: ".1.3.6.1.4.1.9.9.16.1.1.1.16." + id,
- Type: gosnmp.Integer,
- Value: 6,
- },
- })
- if err != nil {
- fmt.Printf("%v",err)
- }
- if res == nil {
- fmt.Printf("nulllllll")
- }else if res.Error != gosnmp.NoError {
- fmt.Printf("%v", res.Error)
- }
- }*/
- }
- func run(snmp *gosnmp.GoSNMP, i int, wg *wgwaiter.WgWaiter) {
- defer wg.Done()
- ip := "192.168.174.91"
- setstr := "matrix"
- id := fmt.Sprintf("123456%d", i)
- //if i%10 == 1 {
- //logger.Errorf("--------------")
- //ip = "192.168.0.1"
- //}
- pdus := []gosnmp.SnmpPDU{
- //{
- // Name: ".1.3.6.1.4.1.9.9.16.1.1.1.16." + id,
- // Type: gosnmp.Integer,
- // Value: 4,
- //},
- {
- Name: ".1.3.6.1.4.1.9.9.16.1.1.1.16." + id,
- Type: gosnmp.Integer,
- Value: 6,
- },
- {
- Name: ".1.3.6.1.4.1.9.9.16.1.1.1.16." + id,
- Type: gosnmp.Integer,
- Value: 5,
- },
- {
- Name: ".1.3.6.1.4.1.9.9.16.1.1.1.15." + id,
- Type: gosnmp.OctetString,
- Value: setstr,
- },
- {
- Name: ".1.3.6.1.4.1.9.9.16.1.1.1.2." + id,
- Type: gosnmp.Integer,
- Value: 1,
- },
- {
- Name: ".1.3.6.1.4.1.9.9.16.1.1.1.3." + id,
- Type: gosnmp.HexString,
- Value: HexStringToBytes(ipToHexString(ip)),
- //Value: HexStringToBytes(ipToHexString(t.Host)),
- },
- {
- Name: ".1.3.6.1.4.1.9.9.16.1.1.1.4." + id,
- Type: gosnmp.Integer,
- Value: 5,
- },
- {
- Name: ".1.3.6.1.4.1.9.9.16.1.1.1.5." + id,
- Type: gosnmp.Integer,
- Value: 64,
- },
- {
- Name: ".1.3.6.1.4.1.9.9.16.1.1.1.6." + id,
- Type: gosnmp.Integer,
- Value: 500,
- },
- //{
- // Name: ".1.3.6.1.4.1.9.9.16.1.1.1.3." + id,
- // Type: gosnmp.IPAddress,
- // Value: t.Server,
- //},
- {
- Name: ".1.3.6.1.4.1.9.9.16.1.1.1.17." + id,
- Type: gosnmp.OctetString,
- Value: "",
- },
- }
- for k := range pdus {
- res, err := snmp.Set([]gosnmp.SnmpPDU{pdus[k]})
- if err != nil {
- logger.Errorf("set %s error: %v", pdus[k].Name, err)
- }
- if res == nil {
- logger.Errorf("set %s result error: %v", pdus[k].Name, res)
- } else if res.Error != gosnmp.NoError {
- logger.Errorf("set %s result error: %v", pdus[k].Name, res.Error)
- }
- }
- name := ".1.3.6.1.4.1.9.9.16.1.1.1.16." + id
- res, err := snmp.Set([]gosnmp.SnmpPDU{
- {
- Name: name,
- Type: gosnmp.Integer,
- Value: 1,
- },
- })
- if err != nil {
- logger.Errorf("set %s error: %v", name, err)
- }
- if res == nil {
- logger.Errorf("set %s result error: %v", name, res)
- } else if res.Error != gosnmp.NoError {
- logger.Errorf("set %s result error: %v", name, res.Error)
- }
- }
- func get(snmp *gosnmp.GoSNMP, id string) (map[string]interface{}, error) {
- time.Sleep(50 * time.Millisecond)
- m := make(map[string]interface{})
- res, err := snmp.Get([]string{
- ".1.3.6.1.4.1.9.9.16.1.1.1.10." + id,
- })
- if err != nil {
- return nil, err
- }
- var numberPackets int64
- for _, pdu := range res.Variables {
- logger.Debugf("rping cisco get: name=%s type=%s value=%v", pdu.Name, pdu.Type.String(), pdu.Value)
- switch pdu.Name {
- case ".1.3.6.1.4.1.9.9.16.1.1.1.10." + id:
- switch pdu.Type {
- case gosnmp.Integer, gosnmp.Gauge32, gosnmp.Counter32, gosnmp.TimeTicks, gosnmp.Counter64:
- numberPackets = gosnmp.ToBigInt(pdu.Value).Int64()
- m["numberPackets"] = numberPackets
- }
- }
- }
- //if numberPackets == 0 {
- // return nil, fmt.Errorf("no responses received")
- //}
- res, err = snmp.Get([]string{
- ".1.3.6.1.4.1.9.9.16.1.1.1.13." + id,
- ".1.3.6.1.4.1.9.9.16.1.1.1.11." + id,
- ".1.3.6.1.4.1.9.9.16.1.1.1.12." + id,
- })
- if err != nil {
- return nil, err
- }
- for _, pdu := range res.Variables {
- logger.Debugf("rping cisco get: name=%s type=%s value=%v", pdu.Name, pdu.Type.String(), pdu.Value)
- switch pdu.Name {
- case ".1.3.6.1.4.1.9.9.16.1.1.1.13." + id:
- switch pdu.Type {
- case gosnmp.Integer, gosnmp.Gauge32, gosnmp.Counter32, gosnmp.TimeTicks, gosnmp.Counter64:
- m["maxRTT"] = gosnmp.ToBigInt(pdu.Value).Int64()
- }
- case ".1.3.6.1.4.1.9.9.16.1.1.1.11." + id:
- switch pdu.Type {
- case gosnmp.Integer, gosnmp.Gauge32, gosnmp.Counter32, gosnmp.TimeTicks, gosnmp.Counter64:
- m["minRTT"] = gosnmp.ToBigInt(pdu.Value).Int64()
- }
- case ".1.3.6.1.4.1.9.9.16.1.1.1.12." + id:
- switch pdu.Type {
- case gosnmp.Integer, gosnmp.Gauge32, gosnmp.Counter32, gosnmp.TimeTicks, gosnmp.Counter64:
- m["averageRTT"] = gosnmp.ToBigInt(pdu.Value).Int64()
- }
- }
- }
- respondPercent, _ := strconv.ParseFloat(fmt.Sprintf("%.0f", float64(numberPackets)/float64(3)*100), 10)
- m["respondPercent"] = respondPercent
- return m, nil
- }
- /*
- func wait(snmp *gosnmp.GoSNMP, id string) int {
- oid := ".1.3.6.1.4.1.9.9.16.1.1.1.14." + id
- var count int
- for count < t.Timeout {
- res, err := snmp.Get([]string{oid})
- if err == nil && res.Variables != nil {
- for _, pdu := range res.Variables {
- logger.Debugf("rping cisco wait: name=%s type=%s value=%v", pdu.Name, pdu.Type.String(), pdu.Value)
- var s string
- switch pdu.Type {
- case gosnmp.OctetString:
- s = string(pdu.Value.([]byte))
- case gosnmp.Integer:
- s = cast.ToString(gosnmp.ToBigInt(pdu.Value).Int64())
- }
- if s == "1" {
- return 0
- } else if s == "true" {
- return 1
- }
- break
- }
- }
- time.Sleep(time.Second)
- count++
- }
- return 2
- }*/
|