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