package main import ( "context" "os" "os/signal" "runtime/debug" "syscall" "ac/internal/logger" "ac/internal/version" "ac/pkg/factory" "ac/pkg/service" ) func main() { defer func() { if p := recover(); p != nil { // Print stack for panic to log. Fatalf() will let program exit. logger.MainLog.Fatalf("panic: %v\n%s", p, string(debug.Stack())) } }() logger.MainLog.Infoln("AC version: ", version.GetVersionAndHash()) ctx, cancel := context.WithCancel(context.Background()) sigCh := make(chan os.Signal, 1) signal.Notify(sigCh, os.Interrupt, syscall.SIGTERM) go func() { <-sigCh // Wait for interrupt signal to gracefully shutdown cancel() // Notify each goroutine and wait them stopped }() cfg, err := factory.ReadConfig() if err != nil { logger.MainLog.Errorf("AC Run error: %v\n", err) return } factory.AcConfig = cfg ac, err := service.NewApp(ctx, cfg) if err != nil { logger.MainLog.Errorf("AC Run error: %v\n", err) return } ac.Start() }