package main import ( "RenewCMS/api" "RenewCMS/internal/domain/update" "flag" "fmt" "io" "log" ) const ( enableCommand = "enable-browser-updates" disableCommand = "disable-browser-updates" applyCommand = "apply-update" exitOK = 0 exitError = 1 exitUsage = 2 usageText = "usage: renewcms [--version]\n" + " renewcms enable-browser-updates [--service NAME] [--binary PATH] [--data-dir DIR] [--port PORT]\n" + " renewcms disable-browser-updates [--service NAME] [--data-dir DIR]\n" + " renewcms apply-update --binary PATH --data-dir DIR [--service NAME] [--port PORT]" applyNeedsFlagsMessage = "apply-update needs --binary and --data-dir." ) func runCommand(args []string, stdout io.Writer, stderr io.Writer) int { name, rest := args[0], args[1:] switch name { case enableCommand: return withOptions(name, rest, stderr, func(options update.InstallOptions) int { message, err := api.InitBrowserUpdateCommands().Enable.Enable(options) return printOutcome(stdout, stderr, message, err) }) case disableCommand: return withOptions(name, rest, stderr, func(options update.InstallOptions) int { message, err := api.InitBrowserUpdateCommands().Disable.Disable(options) return printOutcome(stdout, stderr, message, err) }) case applyCommand: return withOptions(name, rest, stderr, func(options update.InstallOptions) int { return apply(options, stderr) }) } fmt.Fprintln(stderr, usageText) return exitUsage } func withOptions(name string, args []string, stderr io.Writer, run func(update.InstallOptions) int) int { flags := flag.NewFlagSet(name, flag.ContinueOnError) flags.SetOutput(stderr) var options update.InstallOptions flags.StringVar(&options.Service, "service", "", "systemd service name of RenewCMS") flags.StringVar(&options.Binary, "binary", "", "path of the RenewCMS binary") flags.StringVar(&options.DataDir, "data-dir", "", "directory that holds DB_FILE") flags.StringVar(&options.Port, "port", "", "port RenewCMS listens on") if err := flags.Parse(args); err != nil { return exitUsage } return run(options) } func printOutcome(stdout io.Writer, stderr io.Writer, message string, err error) int { if err != nil { fmt.Fprintln(stderr, err) return exitError } fmt.Fprintln(stdout, message) return exitOK } func apply(options update.InstallOptions, stderr io.Writer) int { if options.Binary == "" || options.DataDir == "" { fmt.Fprintln(stderr, applyNeedsFlagsMessage) return exitUsage } if options.Service == "" { options.Service = update.DefaultService } if options.Port == "" { options.Port = update.DefaultPort } if err := api.InitApplyUpdateCommand(options).Apply(); err != nil { log.Printf("apply-update failed: %v", err) return exitError } return exitOK }