add basic command parser
This commit is contained in:
parent
1383272d2c
commit
136a90db19
1 changed files with 74 additions and 17 deletions
|
@ -4,29 +4,80 @@ 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
|
||||
}
|
||||
|
||||
func parseArgs() cliArgs {
|
||||
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")
|
||||
|
||||
flag.Parse()
|
||||
|
||||
return cliArgs{
|
||||
debug: *debugFlag,
|
||||
colour: !*noColourFlag,
|
||||
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(apps []prober.EfiApp, l *logger.SimpleLogger) {
|
||||
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 := " "
|
||||
|
@ -37,18 +88,24 @@ func displayAppList(apps []prober.EfiApp, l *logger.SimpleLogger) {
|
|||
}
|
||||
}
|
||||
|
||||
func getRemoteConfig(l *logger.SimpleLogger) {
|
||||
l.Info("Getting config from remote server...")
|
||||
}
|
||||
|
||||
func main() {
|
||||
args := parseArgs()
|
||||
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)
|
||||
|
||||
l.Info("Checking EFI directory for available boot images...")
|
||||
images, 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())
|
||||
switch args.action {
|
||||
case actionList:
|
||||
displayAppList(l)
|
||||
case actionGetRemote:
|
||||
getRemoteConfig(l)
|
||||
default:
|
||||
l.Fatal("Unknown action")
|
||||
}
|
||||
|
||||
displayAppList(images, l)
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue