88 lines
2.1 KiB
Go
88 lines
2.1 KiB
Go
package ddns
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"fmt"
|
|
"github.com/IceWhaleTech/CasaOS/pkg/ddns"
|
|
"github.com/tidwall/gjson"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"time"
|
|
)
|
|
|
|
type GoDaddyService interface {
|
|
Update(ctx context.Context, client *http.Client)
|
|
}
|
|
type GoDaddy struct {
|
|
Host string `json:"host"`
|
|
Key string `json:"key"`
|
|
Secret string `json:"secret"`
|
|
Domain string `json:"domain"`
|
|
IPV4 string `json:"ipv_4"`
|
|
IPV6 string `json:"ipv_6"`
|
|
ApiHost string `json:"api_host"`
|
|
}
|
|
|
|
func (g *GoDaddy) Update() string {
|
|
client := &http.Client{Timeout: 30 * time.Second}
|
|
recordType := ddns.A
|
|
buffer1 := bytes.NewBuffer(nil)
|
|
buffer1.WriteString(`[{"data":"`)
|
|
buffer1.WriteString(g.IPV4)
|
|
buffer1.WriteString(`"}]`)
|
|
request, err := http.NewRequest(http.MethodPut, fmt.Sprintf("%s/v1/domains/%s/records/%s/%s", g.ApiHost, g.Domain, recordType, g.Host), buffer1)
|
|
if err != nil {
|
|
return err.Error()
|
|
}
|
|
g.setHead(request)
|
|
response, err := client.Do(request)
|
|
if err != nil {
|
|
return err.Error()
|
|
}
|
|
defer response.Body.Close()
|
|
b, err := ioutil.ReadAll(response.Body)
|
|
if err != nil {
|
|
return err.Error()
|
|
}
|
|
defer response.Body.Close()
|
|
if len(b) > 0 {
|
|
r := gjson.GetBytes(b, "message")
|
|
return r.String()
|
|
}
|
|
if len(g.IPV6) > 0 {
|
|
recordType = ddns.AAAA
|
|
buffer1 := bytes.NewBuffer(nil)
|
|
buffer1.WriteString(`[{"data":"`)
|
|
buffer1.WriteString(g.IPV6)
|
|
buffer1.WriteString(`"}]`)
|
|
request6, err := http.NewRequest(http.MethodPut, fmt.Sprintf("%s/v1/domains/%s/records/%s/%s", ddns.GODADDYAPIURL, g.Domain, recordType, g.Host), buffer1)
|
|
if err != nil {
|
|
return err.Error()
|
|
}
|
|
g.setHead(request6)
|
|
response6, err := client.Do(request6)
|
|
if err != nil {
|
|
return err.Error()
|
|
}
|
|
defer response6.Body.Close()
|
|
|
|
d, err := ioutil.ReadAll(response6.Body)
|
|
if err != nil {
|
|
return err.Error()
|
|
}
|
|
if len(d) > 0 {
|
|
r := gjson.GetBytes(d, "message")
|
|
return r.String()
|
|
}
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func (g *GoDaddy) setHead(request *http.Request) {
|
|
SetUserAgent(request)
|
|
SetAuthSSOKey(request, g.Key, g.Secret)
|
|
SetContentType(request, "application/json")
|
|
SetAccept(request, "application/json")
|
|
}
|