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  }