func actionList(ctx *cli.Context) { if ctx.BoolT("help") == true { cli.ShowAppHelp(ctx) os.Exit(1) } tokenSource := &TokenSource{ AccessToken: APIKey, } oauthClient := oauth2.NewClient(oauth2.NoContext, tokenSource) client := godo.NewClient(oauthClient) opt := &godo.ListOptions{ Page: ctx.Int("page"), PerPage: ctx.Int("page-size"), } actionList, _, err := client.Actions.List(opt) if err != nil { fmt.Printf("Unable to list Actions: %s\n", err) os.Exit(1) } cliOut := NewCLIOutput() defer cliOut.Flush() cliOut.Header("ID", "Region", "ResourceType", "ResourceID", "Type", "StartedAt", "CompletedAt", "Status") for _, action := range actionList { cliOut.Writeln("%d\t%s\t%s\t%d\t%s\t%s\t%s\t%s\n", action.ID, action.RegionSlug, action.ResourceType, action.ResourceID, action.Type, action.StartedAt, action.CompletedAt, action.Status) } }
func sizeList(ctx *cli.Context) { if ctx.BoolT("help") == true { cli.ShowAppHelp(ctx) os.Exit(1) } tokenSource := &TokenSource{ AccessToken: APIKey, } oauthClient := oauth2.NewClient(oauth2.NoContext, tokenSource) client := godo.NewClient(oauthClient) opt := &godo.ListOptions{ Page: 1, PerPage: 50, // Not likely to have more than 50 sizes soon } sizeList, _, err := client.Sizes.List(opt) if err != nil { fmt.Printf("Unable to list Sizes: %s\n", err) os.Exit(1) } cliOut := NewCLIOutput() defer cliOut.Flush() cliOut.Header("Slug", "Memory", "VCPUs", "Disk", "Transfer", "Price Monthly", "Price Hourly") for _, size := range sizeList { cliOut.Writeln("%s\t%dMB\t%d\t%dGB\t%d\t$%.0f\t$%.5f\n", size.Slug, size.Memory, size.Vcpus, size.Disk, size.Transfer, size.PriceMonthly, size.PriceHourly) } }
func regionList(ctx *cli.Context) { if ctx.BoolT("help") == true { cli.ShowAppHelp(ctx) os.Exit(1) } tokenSource := &TokenSource{ AccessToken: APIKey, } oauthClient := oauth2.NewClient(oauth2.NoContext, tokenSource) client := godo.NewClient(oauthClient) opt := &godo.ListOptions{ Page: 1, PerPage: 50, // Not likely to have more than 50 regions soon } regionList, _, err := client.Regions.List(opt) if err != nil { fmt.Printf("Unable to list Regions: %s\n", err) os.Exit(1) } cliOut := NewCLIOutput() defer cliOut.Flush() cliOut.Header("Name", "Slug", "Available") for _, region := range regionList { cliOut.Writeln("%s\t%s\t%t\n", region.Name, region.Slug, region.Available) } }
func domainList(ctx *cli.Context) { if ctx.BoolT("help") == true { cli.ShowAppHelp(ctx) os.Exit(1) } tokenSource := &TokenSource{ AccessToken: APIKey, } oauthClient := oauth2.NewClient(oauth2.NoContext, tokenSource) client := godo.NewClient(oauthClient) opt := &godo.ListOptions{ Page: ctx.Int("page"), PerPage: ctx.Int("page-size"), } domainList, _, err := client.Domains.List(opt) if err != nil { log.Fatalf("Unable to list Domains: %s.", err) } cliOut := NewCLIOutput() defer cliOut.Flush() cliOut.Header("Name", "TTL") for _, domain := range domainList { cliOut.Writeln("%s\t%d\n", domain.Name, domain.TTL) } }
func dropletList(ctx *cli.Context) { if ctx.BoolT("help") == true { cli.ShowAppHelp(ctx) os.Exit(1) } tokenSource := &TokenSource{ AccessToken: APIKey, } oauthClient := oauth2.NewClient(oauth2.NoContext, tokenSource) client := godo.NewClient(oauthClient) opt := &godo.ListOptions{} dropletList := []godo.Droplet{} for { // TODO make all optional dropletPage, resp, err := client.Droplets.List(opt) if err != nil { fmt.Printf("Unable to list Droplets: %s\n", err) os.Exit(1) } // append the current page's droplets to our list for _, d := range dropletPage { dropletList = append(dropletList, d) } // if we are at the last page, break out the for loop if resp.Links == nil || resp.Links.IsLastPage() { break } page, err := resp.Links.CurrentPage() if err != nil { fmt.Printf("Unable to get pagination: %s\n", err) os.Exit(1) } // set the page we want for the next request opt.Page = page + 1 } cliOut := NewCLIOutput() defer cliOut.Flush() cliOut.Header("ID", "Name", "IP Address", "Status", "Memory", "Disk", "Region") for _, droplet := range dropletList { publicIP := PublicIPForDroplet(&droplet) cliOut.Writeln("%d\t%s\t%s\t%s\t%dMB\t%dGB\t%s\n", droplet.ID, droplet.Name, publicIP, droplet.Status, droplet.Memory, droplet.Disk, droplet.Region.Slug) } }
func Test_ShowAppHelp_NoAuthor(t *testing.T) { output := new(bytes.Buffer) app := cli.NewApp() app.Writer = output c := cli.NewContext(app, nil, nil) cli.ShowAppHelp(c) if bytes.Index(output.Bytes(), []byte("AUTHOR(S):")) != -1 { t.Errorf("expected\n%snot to include %s", output.String(), "AUTHOR(S):") } }
func main() { app := cli.NewApp() app.Name = "doctl" app.Version = AppVersion app.Usage = "Digital Ocean Control TooL." app.Flags = []cli.Flag{ cli.StringFlag{ Name: "api-key, k", Value: "", Usage: "API Key for DO APIv2.", EnvVar: "DIGITALOCEAN_API_KEY, DIGITAL_OCEAN_API_KEY", }, cli.StringFlag{Name: "format,f", Value: "yaml", Usage: "Format for output."}, cli.BoolFlag{Name: "debug,d", Usage: "Turn on debug output."}, } app.Before = func(ctx *cli.Context) error { if ctx.String("api-key") != "" { APIKey = ctx.String("api-key") } if APIKey == "" && ctx.BoolT("help") != false { cli.ShowAppHelp(ctx) fmt.Println("Must provide API Key via DIGITALOCEAN_API_KEY environment variable or via CLI argument.") os.Exit(1) } switch ctx.String("format") { case "json": OutputFormat = ctx.String("format") case "yaml": OutputFormat = ctx.String("format") default: fmt.Printf("Invalid output format: %s. Available output options: json, yaml.\n", ctx.String("format")) os.Exit(64) } return nil } app.Commands = []cli.Command{ AccountCommand, ActionCommand, DomainCommand, DropletCommand, RegionCommand, SizeCommand, SSHCommand, } app.Run(os.Args) }
func sshList(ctx *cli.Context) { if ctx.BoolT("help") == true { cli.ShowAppHelp(ctx) os.Exit(1) } tokenSource := &TokenSource{ AccessToken: APIKey, } oauthClient := oauth2.NewClient(oauth2.NoContext, tokenSource) client := godo.NewClient(oauthClient) opt := &godo.ListOptions{} keyList := []godo.Key{} for { keyPage, resp, err := client.Keys.List(opt) if err != nil { fmt.Printf("Unable to list SSH Keys: %s\n", err) os.Exit(1) } // append the current page's droplets to our list for _, d := range keyPage { keyList = append(keyList, d) } // if we are at the last page, break out the for loop if resp.Links == nil || resp.Links.IsLastPage() { break } page, err := resp.Links.CurrentPage() if err != nil { fmt.Printf("Unable to get pagination: %s\n", err) os.Exit(1) } // set the page we want for the next request opt.Page = page + 1 } cliOut := NewCLIOutput() defer cliOut.Flush() cliOut.Header("ID", "Name", "Fingerprint") for _, key := range keyList { cliOut.Writeln("%d\t%s\t%s\n", key.ID, key.Name, key.Fingerprint) } }
func domainRecordCreate(ctx *cli.Context) { if len(ctx.Args()) != 1 { cli.ShowAppHelp(ctx) fmt.Printf("Must specify a domain name to add a record to.\n") os.Exit(1) } domainName := ctx.Args().First() tokenSource := &TokenSource{ AccessToken: APIKey, } oauthClient := oauth2.NewClient(oauth2.NoContext, tokenSource) client := godo.NewClient(oauthClient) createRequest := &godo.DomainRecordEditRequest{ Type: strings.ToUpper(ctx.String("type")), Name: ctx.String("name"), Data: ctx.String("data"), } if createRequest.Type == "MX" || createRequest.Type == "SRV" { createRequest.Priority = ctx.Int("priority") } if createRequest.Type == "SRV" { createRequest.Port = ctx.Int("port") createRequest.Weight = ctx.Int("weight") } domainRecord, _, err := client.Domains.CreateRecord(domainName, createRequest) if err != nil { fmt.Printf("%s\n", err) os.Exit(1) } WriteOutput(domainRecord) }