From a117923b327d0d5a74ef64b51082e2ec4bcd9cfd Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Sat, 30 Dec 2023 12:20:20 -0600 Subject: show droplets Signed-off-by: Jeff Carr --- digitalocean/droplet.go | 69 ++++++++++++++++++++++++++++++++++++++++++++ digitalocean/listDroplets.go | 14 ++++----- digitalocean/main.go | 68 +++++++++++++++++++++++++++++++++++++++++++ digitalocean/mainWindow.go | 65 ----------------------------------------- digitalocean/structs.go | 31 ++++++++++++++++++++ 5 files changed, 175 insertions(+), 72 deletions(-) create mode 100644 digitalocean/droplet.go create mode 100644 digitalocean/main.go delete mode 100644 digitalocean/mainWindow.go (limited to 'digitalocean') diff --git a/digitalocean/droplet.go b/digitalocean/droplet.go new file mode 100644 index 0000000..eb4d97e --- /dev/null +++ b/digitalocean/droplet.go @@ -0,0 +1,69 @@ +package digitalocean + +import ( + "fmt" + "github.com/digitalocean/godo" + + "go.wit.com/log" + // "go.wit.com/gui" +) + +func (d *DigitalOcean) NewDroplet(dd godo.Droplet) *Droplet { + if ! myDo.Ready() {return nil} + + droplet := new(Droplet) + droplet.ready = false + droplet.poll = dd // the information polled from the digital ocean API + + if (d.dGrid == nil) { + d.dGrid = d.group.NewGrid("grid", 2, 1).Pad() + } + + droplet.name = d.dGrid.NewLabel(dd.Name) + + droplet.box4 = d.dGrid.NewBox("hBox", true) + droplet.grid4 = droplet.box4.NewGrid("grid", 2, 1).Pad() + + fmt.Printf("Droplet: %s\n", dd.Name) + for _, network := range dd.Networks.V4 { + if network.Type == "public" { + fmt.Printf("IPv4: %s\n", network.IPAddress) + droplet.grid4.NewLabel(network.IPAddress) + droplet.grid4.NewButton("Connect", func () { + log.Info("ssh here", network.IPAddress) + }) + } + } + for _, network := range dd.Networks.V6 { + if network.Type == "public" { + fmt.Printf("IPv6: %s\n", network.IPAddress) + } + } + fmt.Println("-------------------------") + + droplet.ready = true + return droplet +} + +func (d *Droplet) Show() { + if ! myDo.Ready() {return} + log.Info("droplet.Show() window") + if d.hidden { + // my.window.Show() + } + d.hidden = false +} + +func (d *Droplet) Hide() { + if ! myDo.Ready() {return} + log.Info("droplet.Hide() window") + if ! d.hidden { + // d.window.Hide() + } + d.hidden = true +} + +func (d *Droplet) Exists() bool { + if ! myDo.Ready() {return false} + return true +} diff --git a/digitalocean/listDroplets.go b/digitalocean/listDroplets.go index a46be29..52840e6 100644 --- a/digitalocean/listDroplets.go +++ b/digitalocean/listDroplets.go @@ -10,9 +10,9 @@ import ( ) // ListDroplets fetches and prints out the droplets along with their IPv4 and IPv6 addresses. -func ListDroplets(token string) error { +func (d *DigitalOcean) ListDroplets() bool { // OAuth token for authentication. - tokenSource := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token}) + tokenSource := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: d.token}) // OAuth2 client. oauthClient := oauth2.NewClient(context.Background(), tokenSource) @@ -24,13 +24,13 @@ func ListDroplets(token string) error { ctx := context.TODO() // List all droplets. - droplets, _, err := client.Droplets.List(ctx, &godo.ListOptions{}) - if err != nil { - return err + d.droplets, _, d.err = client.Droplets.List(ctx, &godo.ListOptions{}) + if d.err != nil { + return false } // Iterate over droplets and print their details. - for _, droplet := range droplets { + for _, droplet := range d.droplets { fmt.Printf("Droplet: %s\n", droplet.Name) for _, network := range droplet.Networks.V4 { if network.Type == "public" { @@ -45,5 +45,5 @@ func ListDroplets(token string) error { fmt.Println("-------------------------") } - return nil + return true } diff --git a/digitalocean/main.go b/digitalocean/main.go new file mode 100644 index 0000000..a86b150 --- /dev/null +++ b/digitalocean/main.go @@ -0,0 +1,68 @@ +package digitalocean + +import ( + "os" + "go.wit.com/log" + "go.wit.com/gui" +) + +var myDo *DigitalOcean + +// This is initializes the main DO object +// You can only have one of these +func New(p *gui.Node) *DigitalOcean { + if myDo != nil {return myDo} + myDo = new(DigitalOcean) + myDo.parent = p + + myDo.ready = false + + // Your personal API token from DigitalOcean. + myDo.token = os.Getenv("DIGITALOCEAN_TOKEN") + + myDo.window = p.NewWindow("DigitalOcean Control Panel") + + // make a group label and a grid + myDo.group = myDo.window.NewGroup("data").Pad() + myDo.grid = myDo.group.NewGrid("grid", 2, 1).Pad() + + myDo.ready = true + myDo.Hide() + return myDo +} + +// Returns true if the status is valid +func (d *DigitalOcean) Ready() bool { + if d == nil {return false} + return d.ready +} + +func (d *DigitalOcean) Show() { + if ! d.Ready() {return} + log.Info("digitalocean.Show() window") + if d.hidden { + d.window.Show() + } + d.hidden = false +} + +func (d *DigitalOcean) Hide() { + if ! d.Ready() {return} + log.Info("digitalocean.Hide() window") + if ! d.hidden { + d.window.Hide() + } + d.hidden = true +} + +func (d *DigitalOcean) Update() bool { + if ! d.Ready() {return false} + if ! d.ListDroplets() { + log.Error(d.err, "Error listing droplets") + return false + } + for _, droplet := range d.droplets { + d.NewDroplet(droplet) + } + return true +} diff --git a/digitalocean/mainWindow.go b/digitalocean/mainWindow.go deleted file mode 100644 index 6bffaf5..0000000 --- a/digitalocean/mainWindow.go +++ /dev/null @@ -1,65 +0,0 @@ -package digitalocean - -import ( - "os" - "go.wit.com/log" - "go.wit.com/gui" -) - -var myDo *DigitalOcean - -// This is initializes the main DO object -// You can only have one of these -func New(p *gui.Node) *DigitalOcean { - if myDo != nil {return myDo} - myDo = new(DigitalOcean) - myDo.parent = p - - myDo.ready = false - - // Your personal API token from DigitalOcean. - myDo.token = os.Getenv("DIGITALOCEAN_TOKEN") - - myDo.window = p.NewWindow("DigitalOcean Control Panel") - - // make a group label and a grid - myDo.group = myDo.window.NewGroup("data").Pad() - myDo.grid = myDo.group.NewGrid("grid", 2, 1).Pad() - - myDo.ready = true - return myDo -} - -// Returns true if the status is valid -func (d *DigitalOcean) Ready() bool { - if d == nil {return false} - return d.ready -} - -func (d *DigitalOcean) Show() { - if ! d.Ready() {return} - log.Info("digitalocean.Show() window") - if d.hidden { - d.window.Show() - } - d.hidden = false -} - -func (d *DigitalOcean) Hide() { - if ! d.Ready() {return} - log.Info("digitalocean.Hide() window") - if ! d.hidden { - d.window.Hide() - } - d.hidden = true -} - -func (d *DigitalOcean) Update() bool { - if ! d.Ready() {return false} - err := ListDroplets(d.token) - if err != nil { - log.Error(err, "Error listing droplets") - return false - } - return true -} diff --git a/digitalocean/structs.go b/digitalocean/structs.go index 2c1fc55..5cb886d 100644 --- a/digitalocean/structs.go +++ b/digitalocean/structs.go @@ -5,6 +5,8 @@ package digitalocean import ( + "github.com/digitalocean/godo" + "go.wit.com/gui" "go.wit.com/gui/gadgets" ) @@ -12,17 +14,46 @@ import ( type DigitalOcean struct { ready bool hidden bool + err error token string // You're Digital Ocean API key + droplets []godo.Droplet parent *gui.Node // should be the root of the 'gui' package binary tree window *gui.Node // our window for displaying digital ocean droplets group *gui.Node // our window for displaying digital ocean droplets grid *gui.Node // our window for displaying digital ocean droplets + dGrid *gui.Node // the grid for the droplets + // Primary Directives status *gadgets.OneLiner summary *gadgets.OneLiner statusIPv4 *gadgets.OneLiner statusIPv6 *gadgets.OneLiner } + +type ipButton struct { + ip *gui.Node + c *gui.Node +} + +type Droplet struct { + ready bool + hidden bool + err error + + poll godo.Droplet // store what the digital ocean API returned + + name *gui.Node + + // a box and grid of the IPv4 addresses + box4 *gui.Node + grid4 *gui.Node + ipv4 []ipButton + + // a box and grid of the IPv6 addresses + box6 *gui.Node + grid6 *gui.Node + ipv6 []ipButton +} -- cgit v1.2.3