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  }