Skip to content

Commit

Permalink
Added conversion and update of dest account
Browse files Browse the repository at this point in the history
  • Loading branch information
Anders Janmyr committed Sep 25, 2015
1 parent b88727e commit deab0c5
Showing 1 changed file with 87 additions and 13 deletions.
100 changes: 87 additions & 13 deletions main.go
Original file line number Diff line number Diff line change
@@ -1,15 +1,26 @@
package main

import (
"fmt"
"log"
"os"
"path"
"strings"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/service/route53"
)

func getResourceRecords(domain string) ([]*route53.ResourceRecordSet, error) {
service := route53.New(&aws.Config{Region: aws.String("eu-west-1")})
func connect(profile string) *route53.Route53 {
return route53.New(&aws.Config{
Region: aws.String("eu-west-1"),
Credentials: credentials.NewCredentials(&credentials.SharedCredentialsProvider{
Profile: profile,
}),
})
}

func getHostedZone(service *route53.Route53, domain string) (*route53.HostedZone, error) {
params := &route53.ListHostedZonesByNameInput{
DNSName: aws.String(domain),
MaxItems: aws.String("1"),
Expand All @@ -19,27 +30,90 @@ func getResourceRecords(domain string) ([]*route53.ResourceRecordSet, error) {
return nil, err
}

// resp has all of the response data, pull out instance IDs:
fmt.Println("Number of reservation sets: ", len(resp.HostedZones))
zone := resp.HostedZones[0]
fmt.Println("Name: ", *zone.Name)
fmt.Println("Id: ", *zone.Id)
return zone, nil
}

func getResourceRecords(profile string, domain string) ([]*route53.ResourceRecordSet, error) {
service := connect(profile)
zone, err := getHostedZone(service, domain)
if err != nil {
return nil, err
}

rsParams := &route53.ListResourceRecordSetsInput{
params := &route53.ListResourceRecordSetsInput{
HostedZoneId: aws.String(*zone.Id),
}
rsResp, err := service.ListResourceRecordSets(rsParams)
resp, err := service.ListResourceRecordSets(params)
if err != nil {
return nil, err
}
fmt.Println("Number of Records: ", len(rsResp.ResourceRecordSets))
return rsResp.ResourceRecordSets, nil
return resp.ResourceRecordSets, nil
}

func createChanges(domain string, recordSets []*route53.ResourceRecordSet) []*route53.Change {
domain = normalizeDomain(domain)
var changes []*route53.Change
for _, recordSet := range recordSets {
if (*recordSet.Type == "NS" || *recordSet.Type == "SOA") && *recordSet.Name == domain {
log.Println("Skipping", *recordSet.Type, "record for:", domain)
continue
}
change := &route53.Change{
Action: aws.String("UPSERT"),
ResourceRecordSet: recordSet,
}
changes = append(changes, change)
}
return changes

}

func normalizeDomain(domain string) string {
if strings.HasSuffix(domain, ".") {
return domain
} else {
return domain + "."
}
}

func updateRecords(sourceProfile, destProfile, domain string, changes []*route53.Change) (*route53.ChangeInfo, error) {
service := connect(destProfile)
zone, err := getHostedZone(service, domain)
if err != nil {
return nil, err
}
params := &route53.ChangeResourceRecordSetsInput{
HostedZoneId: zone.Id,
ChangeBatch: &route53.ChangeBatch{
Changes: changes,
Comment: aws.String("Importing ALL records from " + sourceProfile),
},
}
resp, err := service.ChangeResourceRecordSets(params)
return resp.ChangeInfo, nil
}

func main() {
resp, err := getResourceRecords("lifelog-dev.sonymobile.com")
program := path.Base(os.Args[0])
args := os.Args[1:]
if len(args) < 3 {
log.Fatalf("Usage: %s <source_profile> <dest_profile> <domain>\n", program)
}
sourceProfile := args[0]
destProfile := args[1]
domain := args[2]
recordSets, err := getResourceRecords(sourceProfile, domain)
if err != nil {
panic(err)
}
changes := createChanges(domain, recordSets)
log.Println("Number of changes", len(changes))
changeInfo, err := updateRecords(sourceProfile, destProfile, domain, changes)
if err != nil {
panic(err)
}
fmt.Printf("%#v\n", resp)
log.Printf("%d records in '%s' are copied from %s to %s",
len(changes), domain, sourceProfile, destProfile)
log.Printf("%#v\n", changeInfo)
}

0 comments on commit deab0c5

Please sign in to comment.