package feta import "os" //import "os/signal" import "sync" //import "syscall" import "time" import "github.com/rs/zerolog" import "github.com/rs/zerolog/log" import "golang.org/x/crypto/ssh/terminal" func CLIEntry(version string, buildtime string, buildarch string, builduser string) int { f := new(FetaProcess) f.version = version f.buildtime = buildtime f.buildarch = buildarch f.builduser = builduser f.setupLogging() return f.runForever() } // FetaProcess is the main structure/process of this app type FetaProcess struct { version string buildtime string buildarch string builduser string archiver *TootArchiver api *TootArchiverAPIServer wg *sync.WaitGroup //quit chan os.Signal } func (f *FetaProcess) identify() { log.Info(). Str("version", f.version). Str("buildtime", f.buildtime). Str("buildarch", f.buildarch). Str("builduser", f.builduser). Msg("starting") } func (f *FetaProcess) setupLogging() { log.Logger = log.With().Caller().Logger() if terminal.IsTerminal(int(os.Stdout.Fd())) { log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr}) } // always log in UTC zerolog.TimestampFunc = func() time.Time { return time.Now().UTC() } zerolog.SetGlobalLevel(zerolog.InfoLevel) if os.Getenv("DEBUG") != "" { zerolog.SetGlobalLevel(zerolog.DebugLevel) } f.identify() } func (f *FetaProcess) runForever() int { f.archiver = NewTootArchiver() f.api = new(TootArchiverAPIServer) f.api.SetArchiver(f.archiver) //FIXME(sneak) get this channel into places that need to be shut down //f.quit = make(chan os.Signal) //signal.Notify(f.quit, syscall.SIGINT, syscall.SIGTERM) f.wg = new(sync.WaitGroup) // start api webserver goroutine f.wg.Add(1) go func() { f.api.Serve() f.wg.Done() }() f.wg.Add(1) go func() { f.archiver.RunForever() f.wg.Done() }() f.wg.Wait() return 0 }