github.com/simpleiot/simpleiot@v0.18.3/client/debug.go (about) 1 package client 2 3 import ( 4 "fmt" 5 "log" 6 "os" 7 "strings" 8 9 "github.com/nats-io/nats.go" 10 ) 11 12 // Dump converts displays a NATS message 13 func Dump(nc *nats.Conn, msg *nats.Msg) error { 14 s, err := String(nc, msg) 15 if err != nil { 16 return err 17 } 18 if s != "" { 19 log.Print(s) 20 } 21 22 return nil 23 } 24 25 // String converts a NATS message to a string 26 func String(nc *nats.Conn, msg *nats.Msg) (string, error) { 27 ret := "" 28 29 chunks := strings.Split(msg.Subject, ".") 30 31 if len(chunks) < 2 { 32 return "", fmt.Errorf("don't know how to decode this subject: %v", msg.Subject) 33 } 34 35 switch chunks[0] { 36 case "p": 37 nodeID := chunks[1] 38 39 // Fetch node so we can print description 40 nodes, err := GetNodes(nc, "all", nodeID, "", false) 41 42 var description, typ string 43 44 if err == nil && len(nodes) > 0 { 45 description = nodes[0].Desc() 46 typ = nodes[0].Type 47 } else { 48 typ = "unknown" 49 } 50 51 if err != nil { 52 description = err.Error() 53 } 54 55 ret += fmt.Sprintf("NODE: %v (%v) (%v)\n", description, typ, nodeID) 56 pointLabel := "POINT" 57 if len(chunks) == 3 { 58 parent := chunks[2] 59 ret += fmt.Sprintf(" Parent: %v\n", parent) 60 pointLabel = "EDGE POINT" 61 } 62 _, points, err := DecodeNodePointsMsg(msg) 63 if err != nil { 64 return "", err 65 } 66 67 for _, p := range points { 68 ret += fmt.Sprintf(" - %v: %v\n", pointLabel, p) 69 } 70 } 71 72 return ret, nil 73 } 74 75 // Log all nats messages. This function does not block and does not clean up 76 // after itself. 77 func Log(natsServer, authToken string) { 78 log.Println("Logging all NATS messages") 79 80 opts := EdgeOptions{ 81 URI: natsServer, 82 AuthToken: authToken, 83 NoEcho: true, 84 Disconnected: func() { 85 log.Println("NATS Disconnected") 86 }, 87 Reconnected: func() { 88 log.Println("NATS Reconnected") 89 }, 90 Closed: func() { 91 log.Println("NATS Closed") 92 os.Exit(0) 93 }, 94 } 95 96 nc, err := EdgeConnect(opts) 97 98 if err != nil { 99 log.Println("Error connecting to NATS server:", err) 100 os.Exit(-1) 101 } 102 103 _, _ = nc.Subscribe("p.*", func(msg *nats.Msg) { 104 err := Dump(nc, msg) 105 if err != nil { 106 log.Println("Error dumping nats msg:", err) 107 } 108 }) 109 110 _, _ = nc.Subscribe("node.*.not", func(msg *nats.Msg) { 111 err := Dump(nc, msg) 112 if err != nil { 113 log.Println("Error dumping nats msg:", err) 114 } 115 }) 116 117 _, _ = nc.Subscribe("node.*.msg", func(msg *nats.Msg) { 118 err := Dump(nc, msg) 119 if err != nil { 120 log.Println("Error dumping nats msg:", err) 121 } 122 }) 123 124 _, _ = nc.Subscribe("p.*.*", func(msg *nats.Msg) { 125 err := Dump(nc, msg) 126 if err != nil { 127 log.Println("Error dumping nats msg:", err) 128 } 129 }) 130 131 if err != nil { 132 log.Println("Nats subscribe error:", err) 133 os.Exit(-1) 134 } 135 136 _, err = nc.Subscribe("node.*", func(msg *nats.Msg) { 137 err := Dump(nc, msg) 138 if err != nil { 139 log.Println("Error dumping nats msg:", err) 140 } 141 }) 142 143 if err != nil { 144 log.Println("Nats subscribe error:", err) 145 os.Exit(-1) 146 } 147 148 _, err = nc.Subscribe("edge.*.*", func(msg *nats.Msg) { 149 err := Dump(nc, msg) 150 if err != nil { 151 log.Println("Error dumping nats msg:", err) 152 } 153 }) 154 155 if err != nil { 156 log.Println("Nats subscribe error:", err) 157 os.Exit(-1) 158 } 159 }