package main import ( "fmt" "goseg/config" "goseg/docker" "goseg/rectify" "goseg/ws" "log/slog" "net/http" "os" "github.com/gorilla/mux" ) // NativePlanet GroundSeg: Go Edition (goseg) // This is a Golang rewrite of GroundSeg that serves the v2 json // object via websocket. // The v2 rewrite decouples the frontend and backend, which makes it // straightforward to implement alternative backends. // // Under development: reimplementing all pyseg functionality. // Advantages: // - Really, really fast // - Event-driven // - First-class support for concurrent operations // - Very good golang Docker libraries var ( logger = slog.New(slog.NewJSONHandler(os.Stdout, nil)) DevMode = false ) func loadService(loadFunc func() error, errMsg string) { go func() { if err := loadFunc(); err != nil { logger.Error(fmt.Sprintf("%s %v", errMsg, err)) } }() } func main() { logger.Info("Starting GroundSeg") logger.Info("Urbit is love <3") // global SysConfig var is managed through config package conf := config.Conf() internetAvailable := config.NetCheck("1.1.1.1:53") availMsg := fmt.Sprintf("Internet available: %t", internetAvailable) logger.Info(availMsg) // async operation to retrieve version info versionUpdateChannel := make(chan bool) if conf.UpdateMode == "auto" { go func() { _, versionUpdate := config.CheckVersion() if versionUpdate { logger.Info("Version info retrieved") } versionUpdateChannel <- versionUpdate }() } // infinite version check loop go config.CheckVersionLoop() // listen to docker daemon go docker.DockerListener() // digest docker events from eventbus go rectify.DockerSubscriptionHandler() // just making sure we can parse (debug) var pierList string for _, pier := range conf.Piers { pierList = pierList + ", " + pier } logger.Info(pierList) // block until returns (debug) <-versionUpdateChannel // Load Netdata loadService(docker.LoadNetdata, "Unable to load Netdata!") // Load Wireguard loadService(docker.LoadWireguard, "Unable to load Wireguard!") // Load Urbits loadService(docker.LoadUrbits, "Unable to load Urbit ships!") // Load MC loadService(docker.LoadMC, "Unable to load MinIO Client!") // Load MinIOs loadService(docker.LoadMinIOs, "Unable to load MinIO containers!") // Websocket r := mux.NewRouter() r.HandleFunc("/ws", ws.WsHandler) http.ListenAndServe(":3000", r) }