main.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package main
  2. // NativePlanet GroundSeg: Go Edition (goseg)
  3. // 🄯 2023 ~nallux-dozryl & ~sitful-hatred
  4. // This is a Golang rewrite of GroundSeg that serves the v2 json
  5. // object via websocket.
  6. // The v2 rewrite decouples the frontend and backend, which makes it
  7. // straightforward to implement alternative backends.
  8. //
  9. // Under development: reimplementing all pyseg functionality.
  10. // Advantages:
  11. // - Really, really fast
  12. // - Event-driven
  13. // - First-class support for concurrent operations
  14. // - Very good golang Docker libraries
  15. import (
  16. "fmt"
  17. "goseg/config"
  18. "goseg/docker"
  19. "goseg/rectify"
  20. "goseg/startram"
  21. "goseg/ws"
  22. "net/http"
  23. "strings"
  24. "time"
  25. "github.com/gorilla/mux"
  26. )
  27. var (
  28. DevMode = false
  29. )
  30. func loadService(loadFunc func() error, errMsg string) {
  31. go func() {
  32. if err := loadFunc(); err != nil {
  33. config.Logger.Error(fmt.Sprintf("%s %v", errMsg, err))
  34. }
  35. }()
  36. }
  37. func main() {
  38. // global SysConfig var is managed through config package
  39. conf := config.Conf()
  40. internetAvailable := config.NetCheck("1.1.1.1:53")
  41. availMsg := fmt.Sprintf("Internet available: %t", internetAvailable)
  42. config.Logger.Info(availMsg)
  43. // async operation to retrieve version info if updates are on
  44. versionUpdateChannel := make(chan bool)
  45. remoteVersion := false
  46. if conf.UpdateMode == "auto" {
  47. remoteVersion = true
  48. // get version info from remote server
  49. go func() {
  50. _, versionUpdate := config.CheckVersion()
  51. if versionUpdate {
  52. config.Logger.Info("Version info retrieved")
  53. }
  54. versionUpdateChannel <- versionUpdate
  55. }()
  56. // otherwise use cached if possible, or save hardcoded defaults and use that
  57. } else {
  58. versionStruct := config.LocalVersion()
  59. releaseChannel := conf.UpdateBranch
  60. targetChan := versionStruct.Groundseg[releaseChannel]
  61. config.VersionInfo = targetChan
  62. }
  63. // infinite version check loop
  64. go config.CheckVersionLoop()
  65. // listen to docker daemon
  66. go docker.DockerListener()
  67. // digest docker events from eventbus
  68. go rectify.DockerSubscriptionHandler()
  69. // just making sure we can parse (debug)
  70. if len(conf.Piers) > 0 {
  71. pierList := strings.Join(conf.Piers, ", ")
  72. config.Logger.Info(fmt.Sprintf("Loaded piers: %s", pierList))
  73. }
  74. // get the startram config from server
  75. if conf.WgRegistered == true {
  76. _, err := startram.Retrieve()
  77. if err != nil {
  78. config.Logger.Warn(fmt.Sprintf("Could not retrieve StarTram/Anchor config: %v", err))
  79. }
  80. }
  81. // block until version info returns
  82. if remoteVersion == true {
  83. select {
  84. case <-versionUpdateChannel:
  85. config.Logger.Info("Version info retrieved")
  86. case <-time.After(10 * time.Second):
  87. config.Logger.Warn("Could not retrieve version info after 10 seconds!")
  88. versionStruct := config.LocalVersion()
  89. releaseChannel := conf.UpdateBranch
  90. targetChan := versionStruct.Groundseg[releaseChannel]
  91. config.VersionInfo = targetChan
  92. }
  93. }
  94. if conf.WgRegistered == true {
  95. // Load Wireguard
  96. loadService(docker.LoadWireguard, "Unable to load Wireguard!")
  97. // Load MC
  98. loadService(docker.LoadMC, "Unable to load MinIO Client!")
  99. // Load MinIOs
  100. loadService(docker.LoadMinIOs, "Unable to load MinIO containers!")
  101. }
  102. // Load Netdata
  103. loadService(docker.LoadNetdata, "Unable to load Netdata!")
  104. // Load Urbits
  105. loadService(docker.LoadUrbits, "Unable to load Urbit ships!")
  106. // Websocket
  107. r := mux.NewRouter()
  108. r.HandleFunc("/ws", ws.WsHandler)
  109. http.ListenAndServe(":3000", r)
  110. }