From bdc3d95e8d9409ddc004e77e17b6c795730793e5 Mon Sep 17 00:00:00 2001 From: Elvin Efendi Date: Mon, 15 May 2017 09:32:43 -0400 Subject: [PATCH] break sub-commands into their own files (#124) --- cmd/flarectl/dns.go | 163 +++++++++++++++ cmd/flarectl/flarectl.go | 430 --------------------------------------- cmd/flarectl/misc.go | 96 +++++++++ cmd/flarectl/zone.go | 198 ++++++++++++++++++ 4 files changed, 457 insertions(+), 430 deletions(-) create mode 100644 cmd/flarectl/dns.go create mode 100644 cmd/flarectl/misc.go create mode 100644 cmd/flarectl/zone.go diff --git a/cmd/flarectl/dns.go b/cmd/flarectl/dns.go new file mode 100644 index 00000000000..a595e302c9e --- /dev/null +++ b/cmd/flarectl/dns.go @@ -0,0 +1,163 @@ +package main + +import ( + "fmt" + "strings" + + "github.com/cloudflare/cloudflare-go" + "github.com/codegangsta/cli" +) + +func dnsCreate(c *cli.Context) { + if err := checkEnv(); err != nil { + fmt.Println(err) + return + } + if err := checkFlags(c, "zone", "name", "type", "content"); err != nil { + return + } + zone := c.String("zone") + name := c.String("name") + rtype := c.String("type") + content := c.String("content") + ttl := c.Int("ttl") + proxy := c.Bool("proxy") + + zoneID, err := api.ZoneIDByName(zone) + if err != nil { + fmt.Println(err) + return + } + + record := cloudflare.DNSRecord{ + Name: name, + Type: strings.ToUpper(rtype), + Content: content, + TTL: ttl, + Proxied: proxy, + } + // TODO: Print the result. + _, err = api.CreateDNSRecord(zoneID, record) + if err != nil { + fmt.Println("Error creating DNS record:", err) + } +} + +func dnsCreateOrUpdate(c *cli.Context) { + if err := checkEnv(); err != nil { + fmt.Println(err) + return + } + if err := checkFlags(c, "zone", "name", "type", "content"); err != nil { + return + } + zone := c.String("zone") + name := c.String("name") + rtype := strings.ToUpper(c.String("type")) + content := c.String("content") + ttl := c.Int("ttl") + proxy := c.Bool("proxy") + + zoneID, err := api.ZoneIDByName(zone) + if err != nil { + fmt.Println(err) + return + } + + // Look for an existing record + rr := cloudflare.DNSRecord{ + Name: name + "." + zone, + } + records, err := api.DNSRecords(zoneID, rr) + if err != nil { + fmt.Println(err) + return + } + + if len(records) > 0 { + // Record exists - find the ID and update it. + // This is imprecise without knowing the original content; if a label + // has multiple RRs we'll just update the first one. + for _, r := range records { + if r.Type == rtype { + rr.ID = r.ID + rr.Type = r.Type + rr.Content = content + rr.TTL = ttl + rr.Proxied = proxy + err := api.UpdateDNSRecord(zoneID, r.ID, rr) + if err != nil { + fmt.Println("Error updating DNS record:", err) + } + } + } + } else { + // Record doesn't exist - create it + rr.Type = rtype + rr.Content = content + rr.TTL = ttl + rr.Proxied = proxy + // TODO: Print the response. + _, err := api.CreateDNSRecord(zoneID, rr) + if err != nil { + fmt.Println("Error creating DNS record:", err) + } + } +} + +func dnsUpdate(c *cli.Context) { + if err := checkEnv(); err != nil { + fmt.Println(err) + return + } + if err := checkFlags(c, "zone", "id"); err != nil { + return + } + zone := c.String("zone") + recordID := c.String("id") + name := c.String("name") + content := c.String("content") + ttl := c.Int("ttl") + proxy := c.Bool("proxy") + + zoneID, err := api.ZoneIDByName(zone) + if err != nil { + fmt.Println(err) + return + } + + record := cloudflare.DNSRecord{ + ID: recordID, + Name: name, + Content: content, + TTL: ttl, + Proxied: proxy, + } + err = api.UpdateDNSRecord(zoneID, recordID, record) + if err != nil { + fmt.Println("Error updating DNS record:", err) + } +} + +func dnsDelete(c *cli.Context) { + if err := checkEnv(); err != nil { + fmt.Println(err) + return + } + if err := checkFlags(c, "zone", "id"); err != nil { + return + } + zone := c.String("zone") + recordID := c.String("id") + + zoneID, err := api.ZoneIDByName(zone) + if err != nil { + fmt.Println(err) + return + } + + err = api.DeleteDNSRecord(zoneID, recordID) + if err != nil { + fmt.Println("Error deleting DNS record:", err) + } +} diff --git a/cmd/flarectl/flarectl.go b/cmd/flarectl/flarectl.go index 9e12b71a5dd..4c89f344821 100644 --- a/cmd/flarectl/flarectl.go +++ b/cmd/flarectl/flarectl.go @@ -81,436 +81,6 @@ func checkFlags(c *cli.Context, flags ...string) error { return nil } -func ips(*cli.Context) { - ips, _ := cloudflare.IPs() - fmt.Println("IPv4 ranges:") - for _, r := range ips.IPv4CIDRs { - fmt.Println(" ", r) - } - fmt.Println() - fmt.Println("IPv6 ranges:") - for _, r := range ips.IPv6CIDRs { - fmt.Println(" ", r) - } -} - -func userInfo(*cli.Context) { - if err := checkEnv(); err != nil { - fmt.Println(err) - return - } - user, err := api.UserDetails() - if err != nil { - fmt.Println(err) - return - } - var output []table - output = append(output, table{ - "ID": user.ID, - "Email": user.Email, - "Username": user.Username, - "Name": user.FirstName + " " + user.LastName, - "2FA": fmt.Sprintf("%t", user.TwoFA), - }) - makeTable(output, "ID", "Email", "Username", "Name", "2FA") -} - -func userUpdate(*cli.Context) { -} - -func zoneCreate(c *cli.Context) { - if err := checkEnv(); err != nil { - fmt.Println(err) - return - } - if err := checkFlags(c, "zone"); err != nil { - return - } - zone := c.String("zone") - jumpstart := c.Bool("jumpstart") - orgID := c.String("org-id") - var org cloudflare.Organization - if orgID != "" { - org.ID = orgID - } - api.CreateZone(zone, jumpstart, org) -} - -func zoneCheck(c *cli.Context) { - if err := checkEnv(); err != nil { - fmt.Println(err) - return - } - if err := checkFlags(c, "zone"); err != nil { - return - } - zone := c.String("zone") - - zoneID, err := api.ZoneIDByName(zone) - if err != nil { - fmt.Println(err) - return - } - - res, err := api.ZoneActivationCheck(zoneID) - if err != nil { - fmt.Println(err) - return - } - fmt.Printf("%s\n", res.Messages[0].Message) -} - -func zoneList(c *cli.Context) { - if err := checkEnv(); err != nil { - fmt.Println(err) - return - } - zones, err := api.ListZones() - if err != nil { - fmt.Println(err) - return - } - var output []table - for _, z := range zones { - output = append(output, table{ - "ID": z.ID, - "Name": z.Name, - "Plan": z.Plan.Name, - "Status": z.Status, - }) - } - makeTable(output, "ID", "Name", "Plan", "Status") -} - -func zoneInfo(c *cli.Context) { - if err := checkEnv(); err != nil { - fmt.Println(err) - return - } - var zone string - if len(c.Args()) > 0 { - zone = c.Args()[0] - } else if c.String("zone") != "" { - zone = c.String("zone") - } else { - cli.ShowSubcommandHelp(c) - return - } - zones, err := api.ListZones(zone) - if err != nil { - fmt.Println(err) - return - } - var output []table - for _, z := range zones { - var nameservers []string - if len(z.VanityNS) > 0 { - nameservers = z.VanityNS - } else { - nameservers = z.NameServers - } - output = append(output, table{ - "ID": z.ID, - "Zone": z.Name, - "Plan": z.Plan.Name, - "Status": z.Status, - "Name Servers": strings.Join(nameservers, ", "), - "Paused": fmt.Sprintf("%t", z.Paused), - "Type": z.Type, - }) - } - makeTable(output, "ID", "Zone", "Plan", "Status", "Name Servers", "Paused", "Type") -} - -func zonePlan(*cli.Context) { -} - -func zoneSettings(*cli.Context) { -} - -func zoneRecords(c *cli.Context) { - if err := checkEnv(); err != nil { - fmt.Println(err) - return - } - var zone string - if len(c.Args()) > 0 { - zone = c.Args()[0] - } else if c.String("zone") != "" { - zone = c.String("zone") - } else { - cli.ShowSubcommandHelp(c) - return - } - - zoneID, err := api.ZoneIDByName(zone) - if err != nil { - fmt.Println(err) - return - } - - // Create a an empty record for searching for records - rr := cloudflare.DNSRecord{} - var records []cloudflare.DNSRecord - if c.String("id") != "" { - rec, err := api.DNSRecord(zoneID, c.String("id")) - if err != nil { - fmt.Println(err) - return - } - records = append(records, rec) - } else { - if c.String("name") != "" { - rr.Name = c.String("name") - } - if c.String("content") != "" { - rr.Name = c.String("content") - } - var err error - records, err = api.DNSRecords(zoneID, rr) - if err != nil { - fmt.Println(err) - return - } - } - var output []table - for _, r := range records { - switch r.Type { - case "MX": - r.Content = fmt.Sprintf("%d %s", r.Priority, r.Content) - case "SRV": - dp := r.Data.(map[string]interface{}) - r.Content = fmt.Sprintf("%.f %s", dp["priority"], r.Content) - // Cloudflare's API, annoyingly, automatically prepends the weight - // and port into content, separated by tabs. - // XXX: File this as a bug. LOC doesn't do this. - r.Content = strings.Replace(r.Content, "\t", " ", -1) - } - output = append(output, table{ - "ID": r.ID, - "Type": r.Type, - "Name": r.Name, - "Content": r.Content, - "Proxied": fmt.Sprintf("%t", r.Proxied), - "TTL": fmt.Sprintf("%d", r.TTL), - }) - } - makeTable(output, "ID", "Type", "Name", "Content", "Proxied", "TTL") -} - -func dnsCreate(c *cli.Context) { - if err := checkEnv(); err != nil { - fmt.Println(err) - return - } - if err := checkFlags(c, "zone", "name", "type", "content"); err != nil { - return - } - zone := c.String("zone") - name := c.String("name") - rtype := c.String("type") - content := c.String("content") - ttl := c.Int("ttl") - proxy := c.Bool("proxy") - - zoneID, err := api.ZoneIDByName(zone) - if err != nil { - fmt.Println(err) - return - } - - record := cloudflare.DNSRecord{ - Name: name, - Type: strings.ToUpper(rtype), - Content: content, - TTL: ttl, - Proxied: proxy, - } - // TODO: Print the result. - _, err = api.CreateDNSRecord(zoneID, record) - if err != nil { - fmt.Println("Error creating DNS record:", err) - } -} - -func dnsCreateOrUpdate(c *cli.Context) { - if err := checkEnv(); err != nil { - fmt.Println(err) - return - } - if err := checkFlags(c, "zone", "name", "type", "content"); err != nil { - return - } - zone := c.String("zone") - name := c.String("name") - rtype := strings.ToUpper(c.String("type")) - content := c.String("content") - ttl := c.Int("ttl") - proxy := c.Bool("proxy") - - zoneID, err := api.ZoneIDByName(zone) - if err != nil { - fmt.Println(err) - return - } - - // Look for an existing record - rr := cloudflare.DNSRecord{ - Name: name + "." + zone, - } - records, err := api.DNSRecords(zoneID, rr) - if err != nil { - fmt.Println(err) - return - } - - if len(records) > 0 { - // Record exists - find the ID and update it. - // This is imprecise without knowing the original content; if a label - // has multiple RRs we'll just update the first one. - for _, r := range records { - if r.Type == rtype { - rr.ID = r.ID - rr.Type = r.Type - rr.Content = content - rr.TTL = ttl - rr.Proxied = proxy - err := api.UpdateDNSRecord(zoneID, r.ID, rr) - if err != nil { - fmt.Println("Error updating DNS record:", err) - } - } - } - } else { - // Record doesn't exist - create it - rr.Type = rtype - rr.Content = content - rr.TTL = ttl - rr.Proxied = proxy - // TODO: Print the response. - _, err := api.CreateDNSRecord(zoneID, rr) - if err != nil { - fmt.Println("Error creating DNS record:", err) - } - } -} - -func dnsUpdate(c *cli.Context) { - if err := checkEnv(); err != nil { - fmt.Println(err) - return - } - if err := checkFlags(c, "zone", "id"); err != nil { - return - } - zone := c.String("zone") - recordID := c.String("id") - name := c.String("name") - content := c.String("content") - ttl := c.Int("ttl") - proxy := c.Bool("proxy") - - zoneID, err := api.ZoneIDByName(zone) - if err != nil { - fmt.Println(err) - return - } - - record := cloudflare.DNSRecord{ - ID: recordID, - Name: name, - Content: content, - TTL: ttl, - Proxied: proxy, - } - err = api.UpdateDNSRecord(zoneID, recordID, record) - if err != nil { - fmt.Println("Error updating DNS record:", err) - } -} - -func dnsDelete(c *cli.Context) { - if err := checkEnv(); err != nil { - fmt.Println(err) - return - } - if err := checkFlags(c, "zone", "id"); err != nil { - return - } - zone := c.String("zone") - recordID := c.String("id") - - zoneID, err := api.ZoneIDByName(zone) - if err != nil { - fmt.Println(err) - return - } - - err = api.DeleteDNSRecord(zoneID, recordID) - if err != nil { - fmt.Println("Error deleting DNS record:", err) - } -} - -func zoneCerts(*cli.Context) { -} - -func zoneKeyless(*cli.Context) { -} - -func zoneRailgun(*cli.Context) { -} - -func pageRules(c *cli.Context) { - if err := checkEnv(); err != nil { - fmt.Println(err) - return - } - if err := checkFlags(c, "zone"); err != nil { - return - } - zone := c.String("zone") - - zoneID, err := api.ZoneIDByName(zone) - if err != nil { - fmt.Println(err) - return - } - - rules, err := api.ListPageRules(zoneID) - if err != nil { - fmt.Println(err) - return - } - - fmt.Printf("%3s %-32s %-8s %s\n", "Pri", "ID", "Status", "URL") - for _, r := range rules { - var settings []string - fmt.Printf("%3d %s %-8s %s\n", r.Priority, r.ID, r.Status, r.Targets[0].Constraint.Value) - for _, a := range r.Actions { - var s string - switch v := a.Value.(type) { - case int: - s = fmt.Sprintf("%s: %d", cloudflare.PageRuleActions[a.ID], v) - case float64: - s = fmt.Sprintf("%s: %.f", cloudflare.PageRuleActions[a.ID], v) - case map[string]interface{}: - s = fmt.Sprintf("%s: %.f - %s", cloudflare.PageRuleActions[a.ID], v["status_code"], v["url"]) - case nil: - s = fmt.Sprintf("%s", cloudflare.PageRuleActions[a.ID]) - default: - vs := fmt.Sprintf("%s", v) - s = fmt.Sprintf("%s: %s", cloudflare.PageRuleActions[a.ID], strings.Title(strings.Replace(vs, "_", " ", -1))) - } - settings = append(settings, s) - } - fmt.Println(" ", strings.Join(settings, ", ")) - } -} - -func railgun(*cli.Context) { -} - func main() { app := cli.NewApp() app.Name = "flarectl" diff --git a/cmd/flarectl/misc.go b/cmd/flarectl/misc.go new file mode 100644 index 00000000000..00bfa43e608 --- /dev/null +++ b/cmd/flarectl/misc.go @@ -0,0 +1,96 @@ +package main + +import ( + "fmt" + "strings" + + "github.com/cloudflare/cloudflare-go" + "github.com/codegangsta/cli" +) + +func ips(*cli.Context) { + ips, _ := cloudflare.IPs() + fmt.Println("IPv4 ranges:") + for _, r := range ips.IPv4CIDRs { + fmt.Println(" ", r) + } + fmt.Println() + fmt.Println("IPv6 ranges:") + for _, r := range ips.IPv6CIDRs { + fmt.Println(" ", r) + } +} + +func userInfo(*cli.Context) { + if err := checkEnv(); err != nil { + fmt.Println(err) + return + } + user, err := api.UserDetails() + if err != nil { + fmt.Println(err) + return + } + var output []table + output = append(output, table{ + "ID": user.ID, + "Email": user.Email, + "Username": user.Username, + "Name": user.FirstName + " " + user.LastName, + "2FA": fmt.Sprintf("%t", user.TwoFA), + }) + makeTable(output, "ID", "Email", "Username", "Name", "2FA") +} + +func userUpdate(*cli.Context) { +} + +func pageRules(c *cli.Context) { + if err := checkEnv(); err != nil { + fmt.Println(err) + return + } + if err := checkFlags(c, "zone"); err != nil { + return + } + zone := c.String("zone") + + zoneID, err := api.ZoneIDByName(zone) + if err != nil { + fmt.Println(err) + return + } + + rules, err := api.ListPageRules(zoneID) + if err != nil { + fmt.Println(err) + return + } + + fmt.Printf("%3s %-32s %-8s %s\n", "Pri", "ID", "Status", "URL") + for _, r := range rules { + var settings []string + fmt.Printf("%3d %s %-8s %s\n", r.Priority, r.ID, r.Status, r.Targets[0].Constraint.Value) + for _, a := range r.Actions { + var s string + switch v := a.Value.(type) { + case int: + s = fmt.Sprintf("%s: %d", cloudflare.PageRuleActions[a.ID], v) + case float64: + s = fmt.Sprintf("%s: %.f", cloudflare.PageRuleActions[a.ID], v) + case map[string]interface{}: + s = fmt.Sprintf("%s: %.f - %s", cloudflare.PageRuleActions[a.ID], v["status_code"], v["url"]) + case nil: + s = fmt.Sprintf("%s", cloudflare.PageRuleActions[a.ID]) + default: + vs := fmt.Sprintf("%s", v) + s = fmt.Sprintf("%s: %s", cloudflare.PageRuleActions[a.ID], strings.Title(strings.Replace(vs, "_", " ", -1))) + } + settings = append(settings, s) + } + fmt.Println(" ", strings.Join(settings, ", ")) + } +} + +func railgun(*cli.Context) { +} diff --git a/cmd/flarectl/zone.go b/cmd/flarectl/zone.go new file mode 100644 index 00000000000..c6b875dbabe --- /dev/null +++ b/cmd/flarectl/zone.go @@ -0,0 +1,198 @@ +package main + +import ( + "fmt" + "strings" + + "github.com/cloudflare/cloudflare-go" + "github.com/codegangsta/cli" +) + +func zoneCerts(*cli.Context) { +} + +func zoneKeyless(*cli.Context) { +} + +func zoneRailgun(*cli.Context) { +} + +func zoneCreate(c *cli.Context) { + if err := checkEnv(); err != nil { + fmt.Println(err) + return + } + if err := checkFlags(c, "zone"); err != nil { + return + } + zone := c.String("zone") + jumpstart := c.Bool("jumpstart") + orgID := c.String("org-id") + var org cloudflare.Organization + if orgID != "" { + org.ID = orgID + } + api.CreateZone(zone, jumpstart, org) +} + +func zoneCheck(c *cli.Context) { + if err := checkEnv(); err != nil { + fmt.Println(err) + return + } + if err := checkFlags(c, "zone"); err != nil { + return + } + zone := c.String("zone") + + zoneID, err := api.ZoneIDByName(zone) + if err != nil { + fmt.Println(err) + return + } + + res, err := api.ZoneActivationCheck(zoneID) + if err != nil { + fmt.Println(err) + return + } + fmt.Printf("%s\n", res.Messages[0].Message) +} + +func zoneList(c *cli.Context) { + if err := checkEnv(); err != nil { + fmt.Println(err) + return + } + zones, err := api.ListZones() + if err != nil { + fmt.Println(err) + return + } + var output []table + for _, z := range zones { + output = append(output, table{ + "ID": z.ID, + "Name": z.Name, + "Plan": z.Plan.Name, + "Status": z.Status, + }) + } + makeTable(output, "ID", "Name", "Plan", "Status") +} + +func zoneInfo(c *cli.Context) { + if err := checkEnv(); err != nil { + fmt.Println(err) + return + } + var zone string + if len(c.Args()) > 0 { + zone = c.Args()[0] + } else if c.String("zone") != "" { + zone = c.String("zone") + } else { + cli.ShowSubcommandHelp(c) + return + } + zones, err := api.ListZones(zone) + if err != nil { + fmt.Println(err) + return + } + var output []table + for _, z := range zones { + var nameservers []string + if len(z.VanityNS) > 0 { + nameservers = z.VanityNS + } else { + nameservers = z.NameServers + } + output = append(output, table{ + "ID": z.ID, + "Zone": z.Name, + "Plan": z.Plan.Name, + "Status": z.Status, + "Name Servers": strings.Join(nameservers, ", "), + "Paused": fmt.Sprintf("%t", z.Paused), + "Type": z.Type, + }) + } + makeTable(output, "ID", "Zone", "Plan", "Status", "Name Servers", "Paused", "Type") +} + +func zonePlan(*cli.Context) { +} + +func zoneSettings(*cli.Context) { +} + +func zoneRecords(c *cli.Context) { + if err := checkEnv(); err != nil { + fmt.Println(err) + return + } + var zone string + if len(c.Args()) > 0 { + zone = c.Args()[0] + } else if c.String("zone") != "" { + zone = c.String("zone") + } else { + cli.ShowSubcommandHelp(c) + return + } + + zoneID, err := api.ZoneIDByName(zone) + if err != nil { + fmt.Println(err) + return + } + + // Create a an empty record for searching for records + rr := cloudflare.DNSRecord{} + var records []cloudflare.DNSRecord + if c.String("id") != "" { + rec, err := api.DNSRecord(zoneID, c.String("id")) + if err != nil { + fmt.Println(err) + return + } + records = append(records, rec) + } else { + if c.String("name") != "" { + rr.Name = c.String("name") + } + if c.String("content") != "" { + rr.Name = c.String("content") + } + var err error + records, err = api.DNSRecords(zoneID, rr) + if err != nil { + fmt.Println(err) + return + } + } + var output []table + for _, r := range records { + switch r.Type { + case "MX": + r.Content = fmt.Sprintf("%d %s", r.Priority, r.Content) + case "SRV": + dp := r.Data.(map[string]interface{}) + r.Content = fmt.Sprintf("%.f %s", dp["priority"], r.Content) + // Cloudflare's API, annoyingly, automatically prepends the weight + // and port into content, separated by tabs. + // XXX: File this as a bug. LOC doesn't do this. + r.Content = strings.Replace(r.Content, "\t", " ", -1) + } + output = append(output, table{ + "ID": r.ID, + "Type": r.Type, + "Name": r.Name, + "Content": r.Content, + "Proxied": fmt.Sprintf("%t", r.Proxied), + "TTL": fmt.Sprintf("%d", r.TTL), + }) + } + makeTable(output, "ID", "Type", "Name", "Content", "Proxied", "TTL") +}