goddy.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package ddns
  2. import (
  3. "bytes"
  4. "context"
  5. "fmt"
  6. "github.com/IceWhaleTech/CasaOS/pkg/ddns"
  7. "github.com/tidwall/gjson"
  8. "io/ioutil"
  9. "net/http"
  10. "time"
  11. )
  12. type GoDaddyService interface {
  13. Update(ctx context.Context, client *http.Client)
  14. }
  15. type GoDaddy struct {
  16. Host string `json:"host"`
  17. Key string `json:"key"`
  18. Secret string `json:"secret"`
  19. Domain string `json:"domain"`
  20. IPV4 string `json:"ipv_4"`
  21. IPV6 string `json:"ipv_6"`
  22. ApiHost string `json:"api_host"`
  23. }
  24. func (g *GoDaddy) Update() string {
  25. client := &http.Client{Timeout: 30 * time.Second}
  26. recordType := ddns.A
  27. buffer1 := bytes.NewBuffer(nil)
  28. buffer1.WriteString(`[{"data":"`)
  29. buffer1.WriteString(g.IPV4)
  30. buffer1.WriteString(`"}]`)
  31. request, err := http.NewRequest(http.MethodPut, fmt.Sprintf("%s/v1/domains/%s/records/%s/%s", g.ApiHost, g.Domain, recordType, g.Host), buffer1)
  32. if err != nil {
  33. return err.Error()
  34. }
  35. g.setHead(request)
  36. response, err := client.Do(request)
  37. if err != nil {
  38. return err.Error()
  39. }
  40. defer response.Body.Close()
  41. b, err := ioutil.ReadAll(response.Body)
  42. if err != nil {
  43. return err.Error()
  44. }
  45. defer response.Body.Close()
  46. if len(b) > 0 {
  47. r := gjson.GetBytes(b, "message")
  48. return r.String()
  49. }
  50. if len(g.IPV6) > 0 {
  51. recordType = ddns.AAAA
  52. buffer1 := bytes.NewBuffer(nil)
  53. buffer1.WriteString(`[{"data":"`)
  54. buffer1.WriteString(g.IPV6)
  55. buffer1.WriteString(`"}]`)
  56. request6, err := http.NewRequest(http.MethodPut, fmt.Sprintf("%s/v1/domains/%s/records/%s/%s", ddns.GODADDYAPIURL, g.Domain, recordType, g.Host), buffer1)
  57. if err != nil {
  58. return err.Error()
  59. }
  60. g.setHead(request6)
  61. response6, err := client.Do(request6)
  62. if err != nil {
  63. return err.Error()
  64. }
  65. defer response6.Body.Close()
  66. d, err := ioutil.ReadAll(response6.Body)
  67. if err != nil {
  68. return err.Error()
  69. }
  70. if len(d) > 0 {
  71. r := gjson.GetBytes(d, "message")
  72. return r.String()
  73. }
  74. }
  75. return ""
  76. }
  77. func (g *GoDaddy) setHead(request *http.Request) {
  78. SetUserAgent(request)
  79. SetAuthSSOKey(request, g.Key, g.Secret)
  80. SetContentType(request, "application/json")
  81. SetAccept(request, "application/json")
  82. }