Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 

126 rindas
2.8 KiB

  1. package main
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/hex"
  6. "fmt"
  7. "os/signal"
  8. "strings"
  9. "sync"
  10. "syscall"
  11. "github.com/AFASystems/presence/internal/pkg/common/appcontext"
  12. "github.com/AFASystems/presence/internal/pkg/common/utils"
  13. "github.com/AFASystems/presence/internal/pkg/config"
  14. "github.com/AFASystems/presence/internal/pkg/kafkaclient"
  15. "github.com/AFASystems/presence/internal/pkg/model"
  16. "github.com/segmentio/kafka-go"
  17. )
  18. var wg sync.WaitGroup
  19. func main() {
  20. // Load global context to init beacons and latest list
  21. appState := appcontext.NewAppState()
  22. cfg := config.Load()
  23. // define context
  24. ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGTERM, syscall.SIGINT)
  25. defer stop()
  26. rawReader := appState.AddKafkaReader(cfg.KafkaURL, "rawbeacons", "gid-raw")
  27. apiReader := appState.AddKafkaReader(cfg.KafkaURL, "apibeacons", "gid-api")
  28. alertWriter := appState.AddKafkaWriter(cfg.KafkaURL, "alertbeacons")
  29. fmt.Println("Decoder initialized, subscribed to Kafka topics")
  30. chRaw := make(chan model.BeaconAdvertisement, 2000)
  31. chApi := make(chan model.ApiUpdate, 2000)
  32. wg.Add(2)
  33. go kafkaclient.Consume(rawReader, chRaw, ctx, &wg)
  34. go kafkaclient.Consume(apiReader, chApi, ctx, &wg)
  35. eventloop:
  36. for {
  37. select {
  38. case <-ctx.Done():
  39. break eventloop
  40. case msg := <-chRaw:
  41. processIncoming(msg, appState, alertWriter)
  42. case msg := <-chApi:
  43. switch msg.Method {
  44. case "POST":
  45. id := msg.Beacon.ID
  46. appState.AddBeaconToLookup(id)
  47. case "DELETE":
  48. id := msg.Beacon.ID
  49. appState.RemoveBeaconFromLookup(id)
  50. fmt.Println("Beacon removed from lookup: ", id)
  51. }
  52. }
  53. }
  54. fmt.Println("broken out of the main event loop")
  55. wg.Wait()
  56. fmt.Println("All go routines have stopped, Beggining to close Kafka connections")
  57. appState.CleanKafkaReaders()
  58. appState.CleanKafkaWriters()
  59. }
  60. func processIncoming(adv model.BeaconAdvertisement, appState *appcontext.AppState, writer *kafka.Writer) {
  61. id := adv.MAC
  62. ok := appState.BeaconExists(id)
  63. if !ok {
  64. return
  65. }
  66. err := decodeBeacon(adv, appState, writer)
  67. if err != nil {
  68. fmt.Println("error in decoding")
  69. return
  70. }
  71. }
  72. func decodeBeacon(adv model.BeaconAdvertisement, appState *appcontext.AppState, writer *kafka.Writer) error {
  73. beacon := strings.TrimSpace(adv.Data)
  74. id := adv.MAC
  75. if beacon == "" {
  76. return nil
  77. }
  78. b, err := hex.DecodeString(beacon)
  79. if err != nil {
  80. return err
  81. }
  82. b = utils.RemoveFlagBytes(b)
  83. indeces := utils.ParseADFast(b)
  84. event := utils.LoopADStructures(b, indeces, id)
  85. if event.ID == "" {
  86. return nil
  87. }
  88. prevEvent, ok := appState.GetBeaconEvent(id)
  89. appState.UpdateBeaconEvent(id, event)
  90. if ok && bytes.Equal(prevEvent.Hash(), event.Hash()) {
  91. return nil
  92. }
  93. eMsg, err := event.ToJSON()
  94. if err != nil {
  95. return err
  96. }
  97. if err := writer.WriteMessages(context.Background(), kafka.Message{Value: eMsg}); err != nil {
  98. return err
  99. }
  100. return nil
  101. }