github.com/teknogeek/dnscontrol/v2@v2.10.1-0.20200227202244-ae299b55ba42/providers/internetbs/api.go (about) 1 package internetbs 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "io/ioutil" 7 "net/http" 8 "strings" 9 ) 10 11 // Api layer for Internet.bs 12 13 type api struct { 14 key string 15 password string 16 } 17 18 type requestParams map[string]string 19 20 type errorResponse struct { 21 TransactID string `json:"transactid"` 22 Status string `json:"status"` 23 Message string `json:"message,omitempty"` 24 Code uint `json:"code,omitempty"` 25 } 26 27 type domainRecord struct { 28 Nameserver []string `json:"nameserver"` 29 } 30 31 func (c *api) getNameservers(domain string) ([]string, error) { 32 var bodyString, err = c.get("/Domain/Info", requestParams{"Domain": domain}) 33 if err != nil { 34 return []string{}, fmt.Errorf("Error fetching nameservers list from Internet.bs: %s", err) 35 } 36 var dr domainRecord 37 json.Unmarshal(bodyString, &dr) 38 ns := []string{} 39 for _, nameserver := range dr.Nameserver { 40 ns = append(ns, nameserver) 41 } 42 return ns, nil 43 } 44 45 func (c *api) updateNameservers(ns []string, domain string) error { 46 rec := requestParams{} 47 rec["Domain"] = domain 48 rec["Ns_list"] = strings.Join(ns, ",") 49 if _, err := c.get("/Domain/Update", rec); err != nil { 50 return fmt.Errorf("Internet.ns: Error update NS : %s", err) 51 } 52 return nil 53 } 54 55 func (c *api) get(endpoint string, params requestParams) ([]byte, error) { 56 client := &http.Client{} 57 req, _ := http.NewRequest("GET", "https://api.internet.bs/"+endpoint, nil) 58 q := req.URL.Query() 59 60 // Add auth params 61 q.Add("ApiKey", c.key) 62 q.Add("Password", c.password) 63 q.Add("ResponseFormat", "JSON") 64 65 for pName, pValue := range params { 66 q.Add(pName, pValue) 67 } 68 69 req.URL.RawQuery = q.Encode() 70 71 resp, err := client.Do(req) 72 if err != nil { 73 return []byte{}, err 74 } 75 76 bodyString, _ := ioutil.ReadAll(resp.Body) 77 78 // Got error from API ? 79 var errResp errorResponse 80 err = json.Unmarshal(bodyString, &errResp) 81 if errResp.Status == "FAILURE" { 82 return bodyString, fmt.Errorf("Internet.bs API error: %s code: %d transactid: %s URL:%s%s ", 83 errResp.Message, errResp.Code, errResp.TransactID, 84 req.Host, req.URL.RequestURI()) 85 } 86 87 return bodyString, nil 88 }