package main import ( "errors" "flag" "io/fs" "os" "git.faercol.me/faercol/http-boot-config/config/logger" "git.faercol.me/faercol/http-boot-config/config/prober" ) type action int const ( actionList action = iota actionGetRemote actionUnknown ) type cliArgs struct { debug bool colour bool action action } var defaultArgs cliArgs = cliArgs{ debug: false, colour: true, action: actionUnknown, } func parseArgs() (cliArgs, error) { args := defaultArgs var firstArg int getRemoteFlagSet := flag.NewFlagSet("get-remote", flag.ExitOnError) listFlagSet := flag.NewFlagSet("list", flag.ExitOnError) debugFlag := flag.Bool("debug", false, "Display debug logs") noColourFlag := flag.Bool("no-colour", false, "Disable colour logs") for i, v := range os.Args { switch v { case "list": args.action = actionList case "get-remote": args.action = actionGetRemote default: continue } firstArg = i + 1 } switch args.action { case actionList: listFlagSet.Parse(os.Args[firstArg:]) case actionGetRemote: getRemoteFlagSet.Parse(os.Args[firstArg:]) default: flag.Parse() return cliArgs{}, errors.New("missing an action") } flag.Parse() args.debug = *debugFlag args.colour = !*noColourFlag return args, nil } func displayAppList(l *logger.SimpleLogger) { l.Info("Checking EFI directory for available boot images...") apps, err := prober.GetEFIApps(l) if err != nil { if errors.Is(err, fs.ErrPermission) { l.Fatal("Permission error, try to run the command as sudo") } l.Fatalf("Failed to check EFI directory: %s", err.Error()) } l.Info("Found the following EFI applications:") for _, a := range apps { prefix := " " if a.Active { prefix = "*" } l.Infof("\t- %s[%d] %s: %s", prefix, a.ID, a.Name, a.Path) } } func getRemoteConfig(l *logger.SimpleLogger) { l.Info("Getting config from remote server...") } func main() { args, err := parseArgs() if err != nil { l := logger.New(true, false) l.Fatalf("Invalid command: %s", err.Error()) } l := logger.New(args.colour, args.debug) switch args.action { case actionList: displayAppList(l) case actionGetRemote: getRemoteConfig(l) default: l.Fatal("Unknown action") } }