diff --git a/digitalocean/droplet.go b/digitalocean/droplet.go index 45deb3d..6c0da08 100644 --- a/digitalocean/droplet.go +++ b/digitalocean/droplet.go @@ -20,6 +20,7 @@ func (d *DigitalOcean) NewDroplet(dd *godo.Droplet) *Droplet { droplet := new(Droplet) droplet.ready = false droplet.poll = dd // the information polled from the digital ocean API + droplet.ID = dd.ID if (d.dGrid == nil) { d.dGrid = d.group.NewGrid("grid", 9, 1).Pad() @@ -104,11 +105,13 @@ func (d *Droplet) Update(dpoll *godo.Droplet) { func (d *Droplet) PowerOn() { if ! d.Exists() {return} log.Info("droplet.PowerOn() should do it here") + myDo.PowerOn(d.ID) } func (d *Droplet) PowerOff() { if ! d.Exists() {return} log.Info("droplet.PowerOff() here") + myDo.PowerOff(d.ID) } func (d *Droplet) Destroy() { diff --git a/digitalocean/listKeys.go b/digitalocean/listKeys.go index 000a66d..97c82bb 100644 --- a/digitalocean/listKeys.go +++ b/digitalocean/listKeys.go @@ -2,30 +2,37 @@ package digitalocean import ( "context" - "fmt" "golang.org/x/oauth2" "github.com/digitalocean/godo" + + "go.wit.com/log" ) -func GetSSHKeyID(token, name string) (string, error) { - tokenSource := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token}) +// func (d *DigitalOcean) ListDroplets() bool { +func (d *DigitalOcean) ListSSHKeyID() error { + tokenSource := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: d.token}) oauthClient := oauth2.NewClient(context.Background(), tokenSource) client := godo.NewClient(oauthClient) // List all keys. keys, _, err := client.Keys.List(context.Background(), &godo.ListOptions{}) if err != nil { - return "", err + return err } // Find the key by name. - for _, key := range keys { - if key.Name == name { - return key.Fingerprint, nil - } + for i, key := range keys { + log.Info("found ssh i =", i) + log.Info("found ssh key.Name =", key.Name) + log.Info("found ssh key.Fingerprint =", key.Fingerprint) + log.Info("found ssh key:", key) + // if key.Name == name { + // return key.Fingerprint, nil + // } } - return "", fmt.Errorf("SSH Key not found") + // return fmt.Errorf("SSH Key not found") + return nil } diff --git a/digitalocean/main.go b/digitalocean/main.go index de96521..5c40498 100644 --- a/digitalocean/main.go +++ b/digitalocean/main.go @@ -58,18 +58,21 @@ func (d *DigitalOcean) Hide() { func (d *DigitalOcean) Update() bool { if ! d.Ready() {return false} - if ! d.ListDroplets() { + d.ListSSHKeyID() + if d.ListDroplets() { + for _, droplet := range d.dpolled { + // check if the droplet ID already exists + if (d.dropMap[droplet.ID] == nil) { + d.dropMap[droplet.ID] = d.NewDroplet(&droplet) + } else { + log.Info("droplet.Update()", droplet.ID, droplet.Name, "already exists") + d.dropMap[droplet.ID].Update(&droplet) + continue + } + } + } else { log.Error(d.err, "Error listing droplets") return false } - for _, droplet := range d.dpolled { - // check if the droplet ID already exists - if (d.dropMap[droplet.ID] != nil) { - log.Info("droplet.Update()", droplet.ID, droplet.Name, "already exists") - d.dropMap[droplet.ID].Update(&droplet) - continue - } - d.dropMap[droplet.ID] = d.NewDroplet(&droplet) - } return true } diff --git a/digitalocean/poweron.go b/digitalocean/poweron.go new file mode 100644 index 0000000..d897f6a --- /dev/null +++ b/digitalocean/poweron.go @@ -0,0 +1,45 @@ +package digitalocean + +import ( + "context" + + "golang.org/x/oauth2" + + "github.com/digitalocean/godo" + + "go.wit.com/log" +) + +func (d *DigitalOcean) PowerOn(dropletID int) error { + tokenSource := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: d.token}) + oauthClient := oauth2.NewClient(context.Background(), tokenSource) + client := godo.NewClient(oauthClient) + + ctx := context.TODO() + + // Create a request to power on the droplet. + _, _, err := client.DropletActions.PowerOn(ctx, dropletID) + if err != nil { + return err + } + + log.Printf("Power-on signal sent to droplet with ID: %d\n", dropletID) + return nil +} + +func (d *DigitalOcean) PowerOff(dropletID int) error { + tokenSource := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: d.token}) + oauthClient := oauth2.NewClient(context.Background(), tokenSource) + client := godo.NewClient(oauthClient) + + ctx := context.TODO() + + // Create a request to power on the droplet. + _, _, err := client.DropletActions.PowerOff(ctx, dropletID) + if err != nil { + return err + } + + log.Printf("Power-on signal sent to droplet with ID: %d\n", dropletID) + return nil +} diff --git a/digitalocean/structs.go b/digitalocean/structs.go index 6f12994..cfd400d 100644 --- a/digitalocean/structs.go +++ b/digitalocean/structs.go @@ -41,6 +41,8 @@ type ipButton struct { } type Droplet struct { + ID int + ready bool hidden bool err error diff --git a/examples/control-panel-digitalocean/Makefile b/examples/control-panel-digitalocean/Makefile index 39a387a..f1edb86 100644 --- a/examples/control-panel-digitalocean/Makefile +++ b/examples/control-panel-digitalocean/Makefile @@ -1,6 +1,6 @@ # export GO111MODULE="off" run: build - ./control-panel-digitalocean --gui-debug + ./control-panel-digitalocean --gui-debug --log-debug build-release: go get -v -u -x .