neighbour.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package neighbour
  2. import (
  3. "log"
  4. "time"
  5. "imuslab.com/arozos/mod/network/mdns"
  6. )
  7. /*
  8. This is a module for discovering nearby arozos systems.
  9. Require MDNS Service
  10. */
  11. type Discoverer struct {
  12. Host *mdns.MDNSHost
  13. LastScanningTime int64
  14. NearbyHosts []*mdns.NetworkHost
  15. d chan bool
  16. t *time.Ticker
  17. }
  18. //NEw Discoverer return a nearby Aroz Discover agent
  19. func NewDiscoverer(MDNS *mdns.MDNSHost) Discoverer {
  20. return Discoverer{
  21. Host: MDNS,
  22. LastScanningTime: -1,
  23. NearbyHosts: []*mdns.NetworkHost{},
  24. }
  25. }
  26. //Return a list of NetworkHost with the same domain
  27. func (d *Discoverer) GetNearbyHosts() []*mdns.NetworkHost {
  28. nearbyHosts := []*mdns.NetworkHost{}
  29. for _, host := range d.NearbyHosts {
  30. nearbyHosts = append(nearbyHosts, host)
  31. }
  32. return nearbyHosts
  33. }
  34. //Start Scanning, interval and scna Duration in seconds
  35. func (d *Discoverer) StartScanning(interval int, scanDuration int) {
  36. log.Println("ArozOS Neighbour Scanning Started")
  37. if d.ScannerRunning() {
  38. //Another scanner already running. Terminate it
  39. d.StopScanning()
  40. }
  41. //Create a new ticker with the given interval and duration
  42. ticker := time.NewTicker(time.Duration(interval) * time.Second)
  43. done := make(chan bool)
  44. //Start scanner routine
  45. go func() {
  46. for {
  47. select {
  48. case <-done:
  49. return
  50. case <-ticker.C:
  51. d.UpdateScan(scanDuration)
  52. }
  53. }
  54. }()
  55. //Update the Discoverer settings
  56. d.d = done
  57. d.t = ticker
  58. }
  59. func (d *Discoverer) UpdateScan(scanDuration int) {
  60. d.LastScanningTime = time.Now().Unix()
  61. results := d.Host.Scan(scanDuration, d.Host.Host.Domain)
  62. d.NearbyHosts = results
  63. }
  64. func (d *Discoverer) ScannerRunning() bool {
  65. if d.d != nil {
  66. return true
  67. } else {
  68. return false
  69. }
  70. }
  71. func (d *Discoverer) StopScanning() {
  72. if d.d != nil {
  73. //Another ticker already running. Terminate it
  74. d.d <- true
  75. //Clear the old ticker
  76. d.t.Stop()
  77. d.d = nil
  78. d.t = nil
  79. }
  80. log.Println("ArozOS Neighbour Scanning Stopped")
  81. }