func zoneRecords(c *cli.Context) { 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 } // Create a an empty record for searching for records rr := cloudflare.DNSRecord{} var records []cloudflare.DNSRecord if c.String("id") != "" { rec, err := api.DNSRecord(zone, 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(zone, 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 := reflect.ValueOf(r.Data).Interface().(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 dnsCreateOrUpdate(c *cli.Context) { 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") // Look for an existing record rr := cloudflare.DNSRecord{ Name: name + "." + zone, } records, err := api.DNSRecords(zone, 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(zone, 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 err := api.CreateDNSRecord(zone, rr) if err != nil { fmt.Println("Error creating DNS record:", err) } } }