Skip to content

Commit

Permalink
Initial Commit
Browse files Browse the repository at this point in the history
  • Loading branch information
barneyparker committed Apr 8, 2018
0 parents commit 6de9740
Show file tree
Hide file tree
Showing 10 changed files with 578 additions and 0 deletions.
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
vendor/
src
terraform-provider-gd
terraform.tfstate
terraform.tfstate.backup
*.tgz
30 changes: 30 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
.PHONY: setup clean build install package

setup:
go get ./...

clean:
rm terraform-provider-gd

build:
go build -o terraform-provider-gd

install:
cp terraform-provider-gd ~/.terraform/plugins/terraform-provider-gd

package:
./package.sh darwin amd64
./package.sh freebsd 386
./package.sh freebsd amd64
./package.sh freebsd arm
./package.sh linux 386
./package.sh linux amd64
./package.sh linux arm
./package.sh openbsd 386
./package.sh openbsd amd64
./package.sh openbsd arm
./package.sh solaris amd64
./package.sh windows 386
./package.sh windows amd64
# Should automatically upload here
# Then rm *.tgz
164 changes: 164 additions & 0 deletions godaddy.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
package main

import (
"fmt"
"bytes"
"net/http"
"io/ioutil"
"encoding/json"
)

type DnsRecord struct {
Data string `json:"data"`
Name string `json:"name"`
Priority int `json:"priority"`
Ttl int `json:"ttl"`
Record_type string `json:"type"`
}

func fetchState(
sso_key string,
sso_secret string,
domain string,
) ([]DnsRecord, error) {
baseurl := "https://api.godaddy.com/v1/domains/"

url := baseurl + domain + "/records"

client := &http.Client{}

request, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, err
}

request.Header.Add("Authorization", "sso-key " + sso_key + ":" + sso_secret)
request.Header.Add("accept", "application/json")
request.Header.Add("Content-Type", "application/json")

response, err := client.Do(request)
if err != nil {
return nil, err
}

defer response.Body.Close()
contents, err := ioutil.ReadAll(response.Body)

if err != nil {
return nil, err
}

var s = new([]DnsRecord)
xerr := json.Unmarshal(contents, &s)

if xerr != nil {
return nil, xerr
}
//---------------

filtered := []DnsRecord{}

for _, element := range *s {
if(
element.Record_type == "A" ||
element.Record_type == "AAAA" ||
element.Record_type == "CNAME" ||
element.Record_type == "MX" ||
element.Record_type == "NS" ||
element.Record_type == "SRV" ||
element.Record_type == "TXT" ) {
filtered = append(filtered, element)
}
}

return filtered, nil
//---------------
return *s, nil
}

func putState(
sso_key string,
sso_secret string,
domain string,
state []DnsRecord,
) ([]byte, error) {

baseurl := "https://api.godaddy.com/v1/domains/"

jdata, err := json.Marshal(state)

if err != nil {
return nil, err
}

url := baseurl + domain + "/records/"

client := &http.Client{}

request, err := http.NewRequest("PUT", url, bytes.NewBuffer(jdata))
if err != nil {
return nil, err
}

request.Header.Add("Authorization", "sso-key " + sso_key + ":" + sso_secret)
request.Header.Add("accept", "application/json")
request.Header.Add("Content-Type", "application/json")

response, err := client.Do(request)
if err != nil {
return nil, err
}

defer response.Body.Close()
contents, err := ioutil.ReadAll(response.Body)

if err != nil {
return nil, err
}

return contents, nil
}

func appendRecord(record DnsRecord, state []DnsRecord) ([]DnsRecord) {
filtered := state[:0]
appended := false

for _, element := range state {
if(
element.Record_type == record.Record_type &&
element.Name == record.Name &&
appended == false ) {
filtered = append(filtered, record)
appended = true
} else {
filtered = append(filtered, element)
}
}

if appended == false {
filtered = append(filtered, record)
}

return filtered
}

func removeRecord(record DnsRecord, state []DnsRecord) ([]DnsRecord) {
fmt.Printf("Removal: %s %s\n", record.Record_type, record.Name)
if(record.Name == "@") {
// these are a bit complicated - just refuse to remove them, but say we did!
return state
}

filtered := state[:0]

for _, element := range state {
if( element.Record_type == record.Record_type &&
element.Name == record.Name ) {
fmt.Printf("Removing %s %s %s %s\n", element.Record_type, element.Name, record.Record_type, record.Name)
} else {
filtered = append(filtered, element)
}
}

return filtered
}
65 changes: 65 additions & 0 deletions install.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
#!/bin/sh

tag=0.0.1
os=$(uname -s | sed -e 's/\(.*\)/\L\1/')
arch=$(uname -m)

case "$os" in
"linux"|"darwin")
echo "fetching latest revision..."

if [ "$arch" == "x86_64" ]; then
arch="amd64"
else
arch="386"
fi

filename="terraform-provider-gd.$os.$arch"

cd /tmp && curl -fOsSL https://github.com/barneyparker/terraform-provider-gd/releases/download/v$tag/$filename.tgz 2>/dev/null

if [ ! -f /tmp/$filename.tgz ]; then
echo "Install failed"
exit 1
else
cd /tmp && gzip -dc $filename.tgz | tar xf -
fi

if [ ! -f terraform-provider-gd ]; then
echo "Archive extract failed"
exit 1
fi
;;
*)
echo "Unable to download and install for this platform ($os / $arch)"
exit 1
;;
esac

printf "Installing terraform-provider-gd binary..."
mkdir -p ~/.terraform/plugins && mv terraform-provider-gd ~/.terraform/plugins
if [ $? -eq 0 ]; then
echo "Complete"
else
echo "Failed"
exit 1
fi

printf "Configuring Terraform..."
if [ -f ~/.terraformrc ]; then
if [[ $(grep "gd" ~/.terraformrc) ]]; then
echo "Complete"
else
echo "\nPlease add the following line to your terraform config:"
echo ""
echo "\tgd = \"$HOME/.terraform/plugins/terraform-provider-gd\""
echo ""
fi
else
cat > ~/.terraformrc <<EOF
providers {
gd = "$HOME/.terraform/plugins/terraform-provider-gd"
}
EOF
echo "Complete"
fi
5 changes: 5 additions & 0 deletions package.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#!/bin/bash

env GOOS=$1 GOARCH=$2 go build -o terraform-provider-gd
tar -cvzf terraform-provider-gd.$1.$2.tgz ./terraform-provider-gd
rm ./terraform-provider-gd
14 changes: 14 additions & 0 deletions plugin.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package main

import (
"github.com/hashicorp/terraform/plugin"
"github.com/hashicorp/terraform/terraform"
)

func main() {
plugin.Serve(&plugin.ServeOpts{
ProviderFunc: func() terraform.ResourceProvider {
return Provider()
},
})
}
44 changes: 44 additions & 0 deletions provider.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package main

import (
"github.com/hashicorp/terraform/helper/schema"
)

func Provider() *schema.Provider {
return &schema.Provider{
Schema: map[string]*schema.Schema{
"key": {
Type: schema.TypeString,
Required: true,
DefaultFunc: schema.EnvDefaultFunc("GODADDY_API_KEY", nil),
Description: "GoDaddy API Key.",
},

"secret": {
Type: schema.TypeString,
Required: true,
DefaultFunc: schema.EnvDefaultFunc("GODADDY_API_SECRET", nil),
Description: "GoDaddy API Secret.",
},
},

ResourcesMap: map[string]*schema.Resource{
"gd_record": resourceRecord(),
},

ConfigureFunc: providerConfigure,
}
}

// provider config
type GoDaddyConfig struct {
key string
secret string
}

func providerConfigure(d *schema.ResourceData) (interface{}, error) {
return &GoDaddyConfig{
key: d.Get("key").(string),
secret: d.Get("secret").(string),
}, nil
}
Loading

0 comments on commit 6de9740

Please sign in to comment.