package main import ( "context" "fmt" "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) } var rootCmd = subCmd{ name: "isle", descr: "All Isle sub-commands", noNetwork: true, do: func(ctx subCmdCtx) error { return ctx.doSubCmd( subCmdDaemon, subCmdGarage, subCmdHost, subCmdNetwork, subCmdStorage, subCmdVersion, subCmdVPN, ) }, } func doRootCmd( ctx context.Context, logger *mlog.Logger, opts *subCmdCtxOpts, ) error { subCmdCtx := newSubCmdCtx(ctx, logger, rootCmd, opts) return subCmdCtx.subCmd.do(subCmdCtx) } func main() { logger := mlog.NewLogger(nil) 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!") }() if err := doRootCmd(ctx, logger, nil); err != nil { fmt.Fprintln(os.Stderr, err) } }