SNMP Process Experimental
(server *Server)
| 27 | //SNMP Process |
| 28 | //Experimental |
| 29 | func startSNMPProcess(server *Server) { |
| 30 | config := util.GetConfig() |
| 31 | enabled := config.GetParam("snmp", nil) |
| 32 | if enabled == nil { |
| 33 | return |
| 34 | } |
| 35 | host := config.GetString("snmp/address", "localhost:162") |
| 36 | |
| 37 | path := "snmp://" |
| 38 | env, err := server.NewEnvironmentForPath("snmp", path) |
| 39 | if err != nil { |
| 40 | log.Fatal(err.Error()) |
| 41 | } |
| 42 | |
| 43 | addr, err := net.ResolveUDPAddr("udp", host) |
| 44 | if err != nil { |
| 45 | log.Fatal(err) |
| 46 | } |
| 47 | |
| 48 | conn, err := net.ListenUDP("udp", addr) |
| 49 | if err != nil { |
| 50 | log.Fatal(err) |
| 51 | } |
| 52 | |
| 53 | buf := make([]byte, 1024) |
| 54 | go func() { |
| 55 | defer l.FatalPanic(log) |
| 56 | defer conn.Close() |
| 57 | for server.running { |
| 58 | rlen, remote, err := conn.ReadFromUDP(buf) |
| 59 | if err != nil { |
| 60 | log.Error(fmt.Sprintf("[SNMP] failed read bytes %s", err)) |
| 61 | return |
| 62 | } |
| 63 | decoded, err := wapsnmp.DecodeSequence(buf[:rlen]) |
| 64 | if err != nil { |
| 65 | log.Error(fmt.Sprintf("[SNMP] failed decode bytes %s", err)) |
| 66 | continue |
| 67 | } |
| 68 | infos := decoded[3].([]interface{})[4].([]interface{})[1:] |
| 69 | trap := map[string]string{} |
| 70 | for _, info := range infos { |
| 71 | listInfo := info.([]interface{}) |
| 72 | oid := listInfo[1].(wapsnmp.Oid) |
| 73 | trap[oid.String()] = fmt.Sprintf("%v", listInfo[2]) |
| 74 | } |
| 75 | |
| 76 | context := map[string]interface{}{ |
| 77 | "trap": trap, |
| 78 | "remote": remote, |
| 79 | } |
| 80 | if err := env.HandleEvent("notification", context); err != nil { |
| 81 | log.Warning(fmt.Sprintf("extension error: %s", err)) |
| 82 | } |
| 83 | } |
| 84 | }() |
| 85 | } |
| 86 |
no test coverage detected