package main import ( "context" "os" "os/signal" "path/filepath" "syscall" "dev.mediocregopher.com/mediocre-go-lib.git/mctx" "dev.mediocregopher.com/mediocre-go-lib.git/mlog" ) func getAppDirPath() string { appDirPath := os.Getenv("APPDIR") if appDirPath == "" { appDirPath = "." } return appDirPath } var ( envAppDirPath = getAppDirPath() envBinDirPath = filepath.Join(envAppDirPath, "bin") ) func binPath(name string) string { return filepath.Join(envBinDirPath, name) } func main() { logger := mlog.NewLogger(&mlog.LoggerOpts{ MessageHandler: newLogMsgHandler(), MaxLevel: mlog.LevelInfo.Int(), // TODO make this configurable }) defer logger.Close() ctx, cancel := context.WithCancel(context.Background()) signalCh := make(chan os.Signal, 2) signal.Notify(signalCh, syscall.SIGINT, syscall.SIGTERM) go func() { sig := <-signalCh cancel() ctx := mctx.Annotate(ctx, "signal", sig.String()) logger.Info(ctx, "got signal, exiting gracefully") sig = <-signalCh ctx = mctx.Annotate(ctx, "signal", sig.String()) logger.FatalString(ctx, "second signal received, force quitting, there may be zombie children left behind, good luck!") }() err := subCmdCtx{ Context: ctx, logger: logger, args: os.Args[1:], }.doSubCmd( subCmdDaemon, subCmdGarage, subCmdHost, subCmdNebula, subCmdNetwork, subCmdVersion, ) if err != nil { logger.Fatal(ctx, "error running command", err) } }