Initial code commit
This commit is contained in:
parent
64c13c9d59
commit
3e5e8b4478
6 changed files with 229 additions and 0 deletions
27
.gitignore
vendored
Normal file
27
.gitignore
vendored
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
# Compiled Object files, Static and Dynamic libs (Shared Objects)
|
||||||
|
*.o
|
||||||
|
*.a
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Folders
|
||||||
|
_obj
|
||||||
|
_test
|
||||||
|
|
||||||
|
# Architecture specific extensions/prefixes
|
||||||
|
*.[568vq]
|
||||||
|
[568vq].out
|
||||||
|
|
||||||
|
*.cgo1.go
|
||||||
|
*.cgo2.c
|
||||||
|
_cgo_defun.c
|
||||||
|
_cgo_gotypes.go
|
||||||
|
_cgo_export.*
|
||||||
|
|
||||||
|
_testmain.go
|
||||||
|
|
||||||
|
*.exe
|
||||||
|
*.test
|
||||||
|
*.prof
|
||||||
|
|
||||||
|
# Testing Configurations
|
||||||
|
config.json
|
90
api/api.go
Normal file
90
api/api.go
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
package api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
productionUrl = "https://api.name.com/"
|
||||||
|
devUrl = "https://api.dev.name.com/"
|
||||||
|
)
|
||||||
|
|
||||||
|
type API struct {
|
||||||
|
baseUrl string
|
||||||
|
username string
|
||||||
|
token string
|
||||||
|
}
|
||||||
|
|
||||||
|
type DNSRecord struct {
|
||||||
|
RecordId string `json:"record_id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
Content string `json:"content"`
|
||||||
|
Ttl string `json:"ttl"`
|
||||||
|
CreateDate string `json:"create_date"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type resultResponse struct {
|
||||||
|
Code int `json:"code"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewAPI(c Config) API {
|
||||||
|
a := API{username: c.Username, token: c.Token}
|
||||||
|
|
||||||
|
if c.Debug {
|
||||||
|
a.baseUrl = devUrl
|
||||||
|
} else {
|
||||||
|
a.baseUrl = productionUrl
|
||||||
|
}
|
||||||
|
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
|
||||||
|
func (api API) performRequest(method, url string, body io.Reader) (response []byte, err error) {
|
||||||
|
var client http.Client
|
||||||
|
req, err := http.NewRequest(method, url, body)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
req.Header.Add("api-username", api.username)
|
||||||
|
req.Header.Add("api-token", api.token)
|
||||||
|
|
||||||
|
resp, err := client.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer resp.Body.Close()
|
||||||
|
return ioutil.ReadAll(resp.Body)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (api API) GetRecords(hostname string) (records []DNSRecord, err error) {
|
||||||
|
resp, err := api.performRequest("GET", fmt.Sprintf("%s%s%s", api.baseUrl, "api/dns/list/", hostname), nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var result struct {
|
||||||
|
Result resultResponse
|
||||||
|
Records []DNSRecord
|
||||||
|
}
|
||||||
|
|
||||||
|
err = json.Unmarshal(resp, &result)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure the API call was successful
|
||||||
|
if result.Result.Code != 100 {
|
||||||
|
return nil, errors.New(result.Result.Message)
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.Records, nil
|
||||||
|
}
|
32
api/config.go
Normal file
32
api/config.go
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
package api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"io/ioutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
Debug bool `json:"debug"`
|
||||||
|
Domains []string `json:"domains"`
|
||||||
|
Interval int `json:"interval"`
|
||||||
|
Token string `json:"token"`
|
||||||
|
Username string `json:"username"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func LoadConfigs(path string) ([]Config, error) {
|
||||||
|
var configs struct {
|
||||||
|
Configs []Config
|
||||||
|
}
|
||||||
|
|
||||||
|
file, err := ioutil.ReadFile(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = json.Unmarshal(file, &configs)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return configs.Configs, nil
|
||||||
|
}
|
38
api/config_test.go
Normal file
38
api/config_test.go
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
package api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
var expectedConfigs []Config
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
expectedConfigs = []Config{
|
||||||
|
Config{
|
||||||
|
Username: "debug-account",
|
||||||
|
Token: "asdasdasdasdasdad",
|
||||||
|
Interval: 60,
|
||||||
|
Debug: true,
|
||||||
|
Domains: []string{"test.com", "fake.com"},
|
||||||
|
},
|
||||||
|
Config{
|
||||||
|
Username: "production-account",
|
||||||
|
Token: "123123123123",
|
||||||
|
Interval: 3600,
|
||||||
|
Domains: []string{"live.com", "abc.live.com"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLoadConfigs(t *testing.T) {
|
||||||
|
configs, err := LoadConfigs("./config_test.json")
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed to load configs: %s\n", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !reflect.DeepEqual(expectedConfigs, configs) {
|
||||||
|
t.Fatalf("Unexpected configuration")
|
||||||
|
}
|
||||||
|
}
|
17
api/config_test.json
Normal file
17
api/config_test.json
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
"configs": [
|
||||||
|
{
|
||||||
|
"username": "debug-account",
|
||||||
|
"token": "asdasdasdasdasdad",
|
||||||
|
"interval": 60,
|
||||||
|
"debug": true,
|
||||||
|
"domains": [ "test.com", "fake.com" ]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"username": "production-account",
|
||||||
|
"token": "123123123123",
|
||||||
|
"interval": 3600,
|
||||||
|
"domains": [ "live.com", "abc.live.com" ]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
25
main.go
Normal file
25
main.go
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/mfycheng/name-dyndns/api"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
defaultConfigPath = "./config.json"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
configs, err := api.LoadConfigs(defaultConfigPath)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error loading config:", err)
|
||||||
|
os.Exit(1)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("Successfully loaded %d configs\n", len(configs))
|
||||||
|
for _, config := range configs {
|
||||||
|
fmt.Println("Processing config", config)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue