// RunDropletActionRebuild rebuilds a droplet using an image id or slug. func RunDropletActionRebuild(ns string, config doit.Config, out io.Writer, args []string) error { fn := func(client *godo.Client) (*godo.Action, error) { if len(args) != 1 { return nil, doit.NewMissingArgsErr(ns) } id, err := strconv.Atoi(args[0]) if err != nil { return nil, err } image, err := config.GetString(ns, doit.ArgImage) if err != nil { return nil, err } var a *godo.Action if i, aerr := strconv.Atoi(image); aerr == nil { a, _, err = client.DropletActions.RebuildByImageID(id, i) } else { a, _, err = client.DropletActions.RebuildByImageSlug(id, image) } return a, err } return performAction(out, config, fn) }
// RunImagesUpdate updates an image. func RunImagesUpdate(ns string, config doit.Config, out io.Writer, args []string) error { client := config.GetGodoClient() if len(args) != 1 { return doit.NewMissingArgsErr(ns) } id, err := strconv.Atoi(args[0]) if err != nil { return err } name, err := config.GetString(ns, doit.ArgImageName) req := &godo.ImageUpdateRequest{ Name: name, } image, _, err := client.Images.Update(id, req) if err != nil { return err } return doit.DisplayOutput(image, out) }
// RunDropletActionResize resizesx a droplet giving a size slug and // optionally expands the disk. func RunDropletActionResize(ns string, config doit.Config, out io.Writer, args []string) error { fn := func(client *godo.Client) (*godo.Action, error) { if len(args) != 1 { return nil, doit.NewMissingArgsErr(ns) } id, err := strconv.Atoi(args[0]) if err != nil { return nil, err } size, err := config.GetString(ns, doit.ArgImageSlug) if err != nil { return nil, err } disk, err := config.GetBool(ns, doit.ArgResizeDisk) if err != nil { return nil, err } a, _, err := client.DropletActions.Resize(id, size, disk) return a, err } return performAction(out, config, fn) }
// RunDomainCreate runs domain create. func RunDomainCreate(ns string, config doit.Config, out io.Writer, args []string) error { if len(args) != 1 { return doit.NewMissingArgsErr(ns) } domainName := args[0] client := config.GetGodoClient() ipAddress, err := config.GetString(ns, "ip-address") if err != nil { return err } req := &godo.DomainCreateRequest{ Name: domainName, IPAddress: ipAddress, } d, _, err := client.Domains.Create(req) if err != nil { return err } return doit.DisplayOutput(d, out) }
// RunImageActionsTransfer an image. func RunImageActionsTransfer(ns string, config doit.Config, out io.Writer, args []string) error { client := config.GetGodoClient() if len(args) != 1 { return doit.NewMissingArgsErr(ns) } id, err := strconv.Atoi(args[0]) if err != nil { return err } region, err := config.GetString(ns, doit.ArgRegionSlug) if err != nil { return err } req := &godo.ActionRequest{ "region": region, } action, _, err := client.ImageActions.Transfer(id, req) if err != nil { logrus.WithField("err", err).Fatal("could not transfer image") } return doit.DisplayOutput(action, out) }
// RunKeyUpdate updates a key. func RunKeyUpdate(ns string, config doit.Config, out io.Writer, args []string) error { client := config.GetGodoClient() if len(args) != 1 { return doit.NewMissingArgsErr(ns) } rawKey := args[0] name, err := config.GetString(ns, doit.ArgKeyName) if err != nil { return err } req := &godo.KeyUpdateRequest{ Name: name, } var key *godo.Key if i, aerr := strconv.Atoi(rawKey); aerr == nil { key, _, err = client.Keys.UpdateByID(i, req) } else { key, _, err = client.Keys.UpdateByFingerprint(rawKey, req) } if err != nil { return err } return doit.DisplayOutput(key, out) }
// RunKeyCreate uploads a SSH key. func RunKeyCreate(ns string, config doit.Config, out io.Writer, args []string) error { client := config.GetGodoClient() if len(args) != 1 { return doit.NewMissingArgsErr(ns) } name := args[0] publicKey, err := config.GetString(ns, doit.ArgKeyPublicKey) if err != nil { return err } kcr := &godo.KeyCreateRequest{ Name: name, PublicKey: publicKey, } r, _, err := client.Keys.Create(kcr) if err != nil { logrus.WithField("err", err).Fatal("could not create key") } return doit.DisplayOutput(r, out) }
// RunKeyImport imports a key from a file func RunKeyImport(ns string, config doit.Config, out io.Writer, args []string) error { client := config.GetGodoClient() if len(args) != 1 { return doit.NewMissingArgsErr(ns) } keyPath, err := config.GetString(ns, doit.ArgKeyPublicKeyFile) if err != nil { return err } keyName := args[0] keyFile, err := ioutil.ReadFile(keyPath) if err != nil { return err } _, comment, _, _, err := ssh.ParseAuthorizedKey(keyFile) if err != nil { return err } if len(keyName) < 1 { keyName = comment } kcr := &godo.KeyCreateRequest{ Name: keyName, PublicKey: string(keyFile), } r, _, err := client.Keys.Create(kcr) if err != nil { return err } return doit.DisplayOutput(r, out) }
// RunDropletActionSnapshot creates a snapshot for a droplet. func RunDropletActionSnapshot(ns string, config doit.Config, out io.Writer, args []string) error { fn := func(client *godo.Client) (*godo.Action, error) { if len(args) != 1 { return nil, doit.NewMissingArgsErr(ns) } id, err := strconv.Atoi(args[0]) if err != nil { return nil, err } name, err := config.GetString(ns, doit.ArgSnapshotName) if err != nil { return nil, err } a, _, err := client.DropletActions.Snapshot(id, name) return a, err } return performAction(out, config, fn) }
// RunRecordUpdate updates a domain record. func RunRecordUpdate(ns string, config doit.Config, out io.Writer, args []string) error { if len(args) != 1 { return doit.NewMissingArgsErr(ns) } domainName := args[0] client := config.GetGodoClient() recordID, err := config.GetInt(ns, doit.ArgRecordID) if err != nil { return err } rType, err := config.GetString(ns, doit.ArgRecordType) if err != nil { return err } rName, err := config.GetString(ns, doit.ArgRecordName) if err != nil { return err } rData, err := config.GetString(ns, doit.ArgRecordData) if err != nil { return err } rPriority, err := config.GetInt(ns, doit.ArgRecordPriority) if err != nil { return err } rPort, err := config.GetInt(ns, doit.ArgRecordPort) if err != nil { return err } rWeight, err := config.GetInt(ns, doit.ArgRecordWeight) if err != nil { return err } drcr := &godo.DomainRecordEditRequest{ Type: rType, Name: rName, Data: rData, Priority: rPriority, Port: rPort, Weight: rWeight, } r, _, err := client.Domains.EditRecord(domainName, recordID, drcr) if err != nil { return err } return doit.DisplayOutput(r, out) }
// RunSSH finds a droplet to ssh to given input parameters (name or id). func RunSSH(ns string, config doit.Config, out io.Writer, args []string) error { client := config.GetGodoClient() if len(args) == 0 { return doit.NewMissingArgsErr(ns) } dropletID := args[0] if dropletID == "" { return doit.NewMissingArgsErr(ns) } user, err := config.GetString(ns, doit.ArgSSHUser) if err != nil { return err } keyPath, err := config.GetString(ns, doit.ArgsSSHKeyPath) if err != nil { return err } port, err := config.GetInt(ns, doit.ArgsSSHPort) if err != nil { return err } var droplet *godo.Droplet if id, err := strconv.Atoi(dropletID); err == nil { // dropletID is an integer droplet, err = getDropletByID(client, id) } else { // dropletID is a string var droplets []godo.Droplet droplets, err := listDroplets(client) if err != nil { return err } shi := extractHostInfo(dropletID) user = shi.user if i, err := strconv.Atoi(shi.port); shi.port != "" && err != nil { port = i } for _, d := range droplets { if d.Name == shi.host { droplet = &d break } } if droplet == nil { return errors.New("could not find droplet by name") } } if user == "" { user = defaultSSHUser(droplet) } publicIP := extractDropletPublicIP(droplet) if len(publicIP) < 1 { return errors.New(sshNoAddress) } runner := config.SSH(user, publicIP, keyPath, port) return runner.Run() }