Skip to content

Instantly share code, notes, and snippets.

@korchasa
Last active April 12, 2021 07:16
Show Gist options
  • Save korchasa/d5b056e4dc3ab8497933f6b2f0f74011 to your computer and use it in GitHub Desktop.
Save korchasa/d5b056e4dc3ab8497933f6b2f0f74011 to your computer and use it in GitHub Desktop.
Copy domain between Cloudflare accounts
package main
import (
"context"
"fmt"
"github.com/cloudflare/cloudflare-go"
"log"
"os"
)
func main() {
log.SetFlags(0)
if len(os.Args) != 3 {
fmt.Printf("Usage: %s <dest_account_id> <zone_name>\n", os.Args[0])
os.Exit(1)
}
toAccountId := os.Args[1]
zoneName := os.Args[2]
api, err := cloudflare.New(os.Getenv("CLOUDFLARE_KEY"), os.Getenv("CLOUDFLARE_EMAIL"))
if err != nil {
log.Fatalf("Can't init cloudflare api: %s", err)
}
ctx := context.Background()
log.Printf("Load source zone...")
fromId, err := api.ZoneIDByName(zoneName)
if err != nil {
log.Fatalf("Can't get source zone by name `%s`: %s", zoneName, err)
}
fromZone, err := api.ZoneDetails(ctx, fromId)
if err != nil {
log.Fatalf("Can't get source zone details: %s", err)
}
log.Println()
log.Printf("Create destination zone...")
toAccount, _, err := api.Account(ctx, toAccountId)
if err != nil {
log.Fatalf("Can't get destination account details: %s", err)
}
toZone, err := api.CreateZone(ctx, fromZone.Name, false, toAccount, "full")
if err != nil {
log.Fatalf("Can't create destination zone details: %s", err)
}
log.Println()
log.Printf("Copy DNS records...")
records, err := api.DNSRecords(ctx, fromId, cloudflare.DNSRecord{})
if err != nil {
log.Fatalf("Can't get source zone records: %s", err)
}
for _, r := range records {
log.Printf(" - create record %s %s...", r.Type, r.Name)
_, err = api.CreateDNSRecord(ctx, toZone.ID, r)
if err != nil {
log.Fatalf("Can't create record: %s", err)
}
}
log.Println()
log.Printf("Copy page rules...")
cr, err := api.ListPageRules(ctx, fromId)
for _, r := range cr {
log.Printf(" - create page rule %v...", r.Targets)
r.ID = ""
_, err = api.CreatePageRule(ctx, toZone.ID, r)
if err != nil {
log.Fatalf("Can't create page rule: %s", err)
}
}
log.Println()
log.Printf("Copy settings...")
var settingsWithErrors []string
allSettings, err := api.ZoneSettings(ctx, fromId)
if err != nil {
log.Fatalf("Can't get source zone settings: %s", err)
}
for _, s := range allSettings.Result {
sets := []cloudflare.ZoneSetting{s}
_, err = api.UpdateZoneSettings(ctx, toZone.ID, sets)
if err != nil {
settingsWithErrors = append(settingsWithErrors, fmt.Sprintf(" - %s: %v", s.ID, err))
} else {
log.Printf(" - %s: %v", s.ID, s.Value)
}
}
log.Println()
log.Printf("Next steps:")
log.Printf("!!! Check and update settings manualy:")
for _, er := range settingsWithErrors {
log.Println(er)
}
log.Printf("!!! Migrate load balancers")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment