From d84aba4c1d60c6b02e05cbe3b4588a7d7f420403 Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Sun, 26 Oct 2025 10:30:42 -0500 Subject: someday virtigo will actually work --- argv.custom.go | 50 ---------------------------------- argv.go | 39 +++++++++++++++++++++++++++ argv.struct.go | 39 --------------------------- argv.template.go | 81 -------------------------------------------------------- complete.go | 64 ++++++++++++++++++++++++++++++++++++++++++++ main.go | 2 +- structs.go | 2 -- 7 files changed, 104 insertions(+), 173 deletions(-) delete mode 100644 argv.custom.go create mode 100644 argv.go delete mode 100644 argv.struct.go delete mode 100644 argv.template.go create mode 100644 complete.go diff --git a/argv.custom.go b/argv.custom.go deleted file mode 100644 index 8cc1963..0000000 --- a/argv.custom.go +++ /dev/null @@ -1,50 +0,0 @@ -package main - -import ( - "os" - - "go.wit.com/lib/protobuf/argvpb" - "go.wit.com/log" -) - -// sent via -ldflags -var VERSION string -var BUILDTIME string - -var APPNAME string = "virtigo" - -func (a args) Description() string { - return ` - virtigo: control your cluster - -This maintains a master list of all your vm's (aka 'droplets') -in your homelab cloud. You can import libvirt xml files. -This app talks to your hypervisors via the virtigod daemon. -` -} - -var INFO *log.LogFlag -var POLL *log.LogFlag -var WARN *log.LogFlag -var EVENT *log.LogFlag - -func init() { - full := "go.wit.com/apps/virtigo" - short := "virtigo" - - INFO = log.NewFlag("INFO", false, full, short, "general virtigo") - POLL = log.NewFlag("POLL", false, full, short, "virtigo polling") - WARN = log.NewFlag("WARN", true, full, short, "bad things") - EVENT = log.NewFlag("EVENT", true, full, short, "hypeprvisor/droplet events") -} - -// sends the strings to bash or zsh that will be your options -func (a args) SendCompletionStrings(pb *argvpb.Argv) { - if pb.GetCmd() == "" { - base := []string{"--version", "list", "droplet"} - pb.SendStrings(base) - } else { - pb.SubCommand(pb.Goargs...) - } - os.Exit(0) -} diff --git a/argv.go b/argv.go new file mode 100644 index 0000000..36f7927 --- /dev/null +++ b/argv.go @@ -0,0 +1,39 @@ +package main + +var argv args + +type args struct { + List *ListCmd `arg:"subcommand:list" help:"list things"` + Droplet *DropletCmd `arg:"subcommand:droplet" help:"send events to a droplet"` + Config string `arg:"env:VIRTIGO_HOME" help:"defaults to ~/.config/virtigo/"` + Server string `arg:"env:VIRTIGO_SERVER" help:"what virtigo cluster to connect to"` + Localhost bool `arg:"--localhost" help:"use the local libvirt"` + Daemon bool `arg:"--daemon" help:"run as a daemon"` + Verbose bool `arg:"--verbose" help:"talk more"` + Port int `arg:"--port" default:"8080" help:"allow droplet events via http"` + Xml []string `arg:"--libvirt" help:"import qemu xml files: --libvirt /etc/libvirt/qemu/*.xml"` + Admin bool `arg:"--admin" help:"enter admin mode"` + Bash bool `arg:"--bash" help:"generate bash completion"` + BashAuto []string `arg:"--auto-complete" help:"todo: move this to go-arg"` +} + +type EmptyCmd struct { +} + +type testCmd string + +type ListCmd struct { + Droplets *EmptyCmd `arg:"subcommand:droplets" help:"list droplets"` + Hypervisors *EmptyCmd `arg:"subcommand:hypervisors" help:"list hypervisors"` + On bool `arg:"--on" help:"only show things that are on"` +} + +type DropletCmd struct { + Start *EmptyCmd `arg:"subcommand:start" help:"start droplet"` + Stop *EmptyCmd `arg:"subcommand:stop" help:"stop droplet"` + Show *EmptyCmd `arg:"subcommand:show" help:"show droplet"` + Console *EmptyCmd `arg:"subcommand:console" help:"open serial console"` + VNC *EmptyCmd `arg:"subcommand:vnc" help:"open VNC console"` + Spice *EmptyCmd `arg:"subcommand:spice" help:"open spiceconsole"` + Name string `arg:"--name" help:"what droplet to start"` +} diff --git a/argv.struct.go b/argv.struct.go deleted file mode 100644 index 36f7927..0000000 --- a/argv.struct.go +++ /dev/null @@ -1,39 +0,0 @@ -package main - -var argv args - -type args struct { - List *ListCmd `arg:"subcommand:list" help:"list things"` - Droplet *DropletCmd `arg:"subcommand:droplet" help:"send events to a droplet"` - Config string `arg:"env:VIRTIGO_HOME" help:"defaults to ~/.config/virtigo/"` - Server string `arg:"env:VIRTIGO_SERVER" help:"what virtigo cluster to connect to"` - Localhost bool `arg:"--localhost" help:"use the local libvirt"` - Daemon bool `arg:"--daemon" help:"run as a daemon"` - Verbose bool `arg:"--verbose" help:"talk more"` - Port int `arg:"--port" default:"8080" help:"allow droplet events via http"` - Xml []string `arg:"--libvirt" help:"import qemu xml files: --libvirt /etc/libvirt/qemu/*.xml"` - Admin bool `arg:"--admin" help:"enter admin mode"` - Bash bool `arg:"--bash" help:"generate bash completion"` - BashAuto []string `arg:"--auto-complete" help:"todo: move this to go-arg"` -} - -type EmptyCmd struct { -} - -type testCmd string - -type ListCmd struct { - Droplets *EmptyCmd `arg:"subcommand:droplets" help:"list droplets"` - Hypervisors *EmptyCmd `arg:"subcommand:hypervisors" help:"list hypervisors"` - On bool `arg:"--on" help:"only show things that are on"` -} - -type DropletCmd struct { - Start *EmptyCmd `arg:"subcommand:start" help:"start droplet"` - Stop *EmptyCmd `arg:"subcommand:stop" help:"stop droplet"` - Show *EmptyCmd `arg:"subcommand:show" help:"show droplet"` - Console *EmptyCmd `arg:"subcommand:console" help:"open serial console"` - VNC *EmptyCmd `arg:"subcommand:vnc" help:"open VNC console"` - Spice *EmptyCmd `arg:"subcommand:spice" help:"open spiceconsole"` - Name string `arg:"--name" help:"what droplet to start"` -} diff --git a/argv.template.go b/argv.template.go deleted file mode 100644 index 6948afe..0000000 --- a/argv.template.go +++ /dev/null @@ -1,81 +0,0 @@ -package main - -// these are stubbed in functions needed -// just copy this file from another working app for now -// you shouldn't need to change anything here -// TODO: clean this up in argv - -import ( - "os" - - "go.wit.com/dev/alexflint/arg" - "go.wit.com/gui" - "go.wit.com/lib/env" - "go.wit.com/lib/fhelp" - "go.wit.com/log" -) - -func (args) InitArgv() (string, string, string) { - return APPNAME, BUILDTIME, VERSION -} - -// this function will send the current argv PB to go-args for parsing -func (args) ParseFlags(flags []string) error { - var err error - if me.pp == nil { - // log.Info("Parse Flags GOT flags:", flags) - me.pp, err = arg.ParseFlags(flags, &argv) - // panic("got to the app's ParseFlags()") - } else { - panic("me.pp was not nil") - } - return err -} - -// add this funcgion: this will print the help -func (args) WriteHelpForSubcommand(cmd string) error { - me.pp.WriteHelpForSubcommand(os.Stderr, cmd) - return nil -} - -// this will print the help for the subcmd -func (args) WriteHelpForAutocomplete(part string, subcmd ...string) error { - return me.pp.WriteHelpForAutocomplete(os.Stderr, os.Stdout, part, subcmd...) -} - -func (args) WriteHelpForAutocompleteDebug(part string, subcmd ...string) error { - f, _ := os.OpenFile("/tmp/argv.junk", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) - return me.pp.WriteHelpForAutocomplete(f, os.Stdout, part, subcmd...) -} - -// add this funcgion: this will print the help -func (args) WriteHelp() error { - me.pp.WriteHelp(os.Stderr) - return nil -} - -func (args) InitGui() error { - // panic("got here") - arg.Register(&gui.ArgvGui) - // me.gui = gui.PreInit() - me.myGui = fhelp.Gui() - return nil -} - -func (args) Exit() { - gui.UnloadToolkits() - if env.Verbose() { - log.Info("argv.Exit() called", APPNAME+".Exit()") - } - // remove this from the template for your app (or make one for youself if you need it) - // forgeExit() // custom forge shutdown function -} - -func (args) Help() string { - return "got app help" -} - -func (args) MustParse() error { - me.pp = arg.MustParse(&argv) - return nil -} diff --git a/complete.go b/complete.go new file mode 100644 index 0000000..5ad12b1 --- /dev/null +++ b/complete.go @@ -0,0 +1,64 @@ +package main + +import ( + "fmt" + "strings" + + "go.wit.com/dev/alexflint/arg" + "go.wit.com/lib/protobuf/argvpb" + "go.wit.com/log" +) + +// sent via -ldflags +var VERSION string +var BUILDTIME string + +var APPNAME string = "virtigo" + +func (a args) Description() string { + return ` + virtigo: control your cluster + +This maintains a master list of all your vm's (aka 'droplets') +in your homelab cloud. You can import libvirt xml files. +This app talks to your hypervisors via the virtigod daemon. +` +} + +var INFO *log.LogFlag +var POLL *log.LogFlag +var WARN *log.LogFlag +var EVENT *log.LogFlag + +func init() { + full := "go.wit.com/apps/virtigo" + short := "virtigo" + + INFO = log.NewFlag("INFO", false, full, short, "general virtigo") + POLL = log.NewFlag("POLL", false, full, short, "virtigo polling") + WARN = log.NewFlag("WARN", true, full, short, "bad things") + EVENT = log.NewFlag("EVENT", true, full, short, "hypeprvisor/droplet events") +} + +func (args) MustParse() error { + me.pp = arg.MustParse(&argv) + return nil +} + +// sends the strings to bash or zsh that will be your options +func (a args) DoAutoComplete() error { + if argvpb.PB.GetCmd() == "" { + matches := []string{"--version", "list", "droplet"} + fmt.Fprintf(argvpb.Stdout, " %s", strings.Join(matches, " ")) + return nil + } + var err error + if me.pp == nil { + me.pp, err = arg.ParseFlagsArgv(&argv) + if err != nil { + return err + } + } + err = me.pp.WriteHelpForAutocomplete(argvpb.PB.Partial, argvpb.PB.Real...) + return err +} diff --git a/main.go b/main.go index 34fc02d..369441a 100644 --- a/main.go +++ b/main.go @@ -19,7 +19,7 @@ var resources embed.FS func main() { me = new(virtigoT) - me.argv = argvpb.Autocomplete(&argv) // adds shell auto complete to go-args + argvpb.Init(&argv, APPNAME, BUILDTIME, VERSION) // adds shell auto-complete if os.Getenv("VIRTIGO_HOME") == "" { homeDir, _ := os.UserHomeDir() diff --git a/structs.go b/structs.go index 5dfcdc1..81cd7ea 100644 --- a/structs.go +++ b/structs.go @@ -8,7 +8,6 @@ import ( "go.wit.com/gui" "go.wit.com/lib/fhelp" "go.wit.com/lib/gadgets" - "go.wit.com/lib/protobuf/argvpb" "go.wit.com/lib/protobuf/forgepb" "go.wit.com/lib/protobuf/virtpb" ) @@ -27,7 +26,6 @@ func (b *virtigoT) Enable() { // this app's variables type virtigoT struct { - argv *argvpb.Argv // more experiments for bash handling pp *arg.Parser // for parsing the command line args. Yay to alexf lint! myGui *fhelp.GuiPrep // for initializing the GUI toolkits forge *forgepb.Forge // your customized repo preferences and settings -- cgit v1.2.3