1package vegadns2client 2 3import ( 4 "encoding/json" 5 "fmt" 6 "io/ioutil" 7 "log" 8 "net/http" 9 "strings" 10) 11 12// Domain - struct containing a domain object 13type Domain struct { 14 Status string `json:"status"` 15 Domain string `json:"domain"` 16 DomainID int `json:"domain_id"` 17 OwnerID int `json:"owner_id"` 18} 19 20// DomainResponse - api response of a domain list 21type DomainResponse struct { 22 Status string `json:"status"` 23 Total int `json:"total_domains"` 24 Domains []Domain `json:"domains"` 25} 26 27// GetDomainID - returns the id for a domain 28// Input: domain 29// Output: int, err 30func (vega *VegaDNSClient) GetDomainID(domain string) (int, error) { 31 params := make(map[string]string) 32 params["search"] = domain 33 34 resp, err := vega.Send("GET", "domains", params) 35 36 if err != nil { 37 return -1, fmt.Errorf("Error sending GET to GetDomainID: %s", err) 38 } 39 defer resp.Body.Close() 40 body, err := ioutil.ReadAll(resp.Body) 41 if err != nil { 42 return -1, fmt.Errorf("Error reading response from GET to GetDomainID: %s", err) 43 } 44 if resp.StatusCode != http.StatusOK { 45 return -1, fmt.Errorf("Got bad answer from VegaDNS on GetDomainID. Code: %d. Message: %s", resp.StatusCode, string(body)) 46 } 47 48 answer := DomainResponse{} 49 if err := json.Unmarshal(body, &answer); err != nil { 50 return -1, fmt.Errorf("Error unmarshalling body from GetDomainID: %s", err) 51 } 52 log.Println(answer) 53 for _, d := range answer.Domains { 54 if d.Domain == domain { 55 return d.DomainID, nil 56 } 57 } 58 59 return -1, fmt.Errorf("Didnt find domain %s", domain) 60 61} 62 63// GetAuthZone retrieves the closest match to a given 64// domain. Example: Given an argument "a.b.c.d.e", and a VegaDNS 65// hosted domain of "c.d.e", GetClosestMatchingDomain will return 66// "c.d.e". 67func (vega *VegaDNSClient) GetAuthZone(fqdn string) (string, int, error) { 68 fqdn = strings.TrimSuffix(fqdn, ".") 69 numComponents := len(strings.Split(fqdn, ".")) 70 for i := 1; i < numComponents; i++ { 71 tmpHostname := strings.SplitN(fqdn, ".", i)[i-1] 72 log.Printf("tmpHostname for i = %d: %s\n", i, tmpHostname) 73 if domainID, err := vega.GetDomainID(tmpHostname); err == nil { 74 log.Printf("Found zone: %s\n\tShortened to %s\n", tmpHostname, strings.TrimSuffix(tmpHostname, ".")) 75 return strings.TrimSuffix(tmpHostname, "."), domainID, nil 76 } 77 } 78 log.Println("Unable to find hosted zone in vegadns") 79 return "", -1, fmt.Errorf("Unable to find auth zone for fqdn %s", fqdn) 80} 81