forked from TrueCloudLab/lego
81 lines
2.4 KiB
Go
81 lines
2.4 KiB
Go
|
package vegadns2client
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"io/ioutil"
|
||
|
"log"
|
||
|
"net/http"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
// Domain - struct containing a domain object
|
||
|
type Domain struct {
|
||
|
Status string `json:"status"`
|
||
|
Domain string `json:"domain"`
|
||
|
DomainID int `json:"domain_id"`
|
||
|
OwnerID int `json:"owner_id"`
|
||
|
}
|
||
|
|
||
|
// DomainResponse - api response of a domain list
|
||
|
type DomainResponse struct {
|
||
|
Status string `json:"status"`
|
||
|
Total int `json:"total_domains"`
|
||
|
Domains []Domain `json:"domains"`
|
||
|
}
|
||
|
|
||
|
// GetDomainID - returns the id for a domain
|
||
|
// Input: domain
|
||
|
// Output: int, err
|
||
|
func (vega *VegaDNSClient) GetDomainID(domain string) (int, error) {
|
||
|
params := make(map[string]string)
|
||
|
params["search"] = domain
|
||
|
|
||
|
resp, err := vega.Send("GET", "domains", params)
|
||
|
|
||
|
if err != nil {
|
||
|
return -1, fmt.Errorf("Error sending GET to GetDomainID: %s", err)
|
||
|
}
|
||
|
defer resp.Body.Close()
|
||
|
body, err := ioutil.ReadAll(resp.Body)
|
||
|
if err != nil {
|
||
|
return -1, fmt.Errorf("Error reading response from GET to GetDomainID: %s", err)
|
||
|
}
|
||
|
if resp.StatusCode != http.StatusOK {
|
||
|
return -1, fmt.Errorf("Got bad answer from VegaDNS on GetDomainID. Code: %d. Message: %s", resp.StatusCode, string(body))
|
||
|
}
|
||
|
|
||
|
answer := DomainResponse{}
|
||
|
if err := json.Unmarshal(body, &answer); err != nil {
|
||
|
return -1, fmt.Errorf("Error unmarshalling body from GetDomainID: %s", err)
|
||
|
}
|
||
|
log.Println(answer)
|
||
|
for _, d := range answer.Domains {
|
||
|
if d.Domain == domain {
|
||
|
return d.DomainID, nil
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return -1, fmt.Errorf("Didnt find domain %s", domain)
|
||
|
|
||
|
}
|
||
|
|
||
|
// GetAuthZone retrieves the closest match to a given
|
||
|
// domain. Example: Given an argument "a.b.c.d.e", and a VegaDNS
|
||
|
// hosted domain of "c.d.e", GetClosestMatchingDomain will return
|
||
|
// "c.d.e".
|
||
|
func (vega *VegaDNSClient) GetAuthZone(fqdn string) (string, int, error) {
|
||
|
fqdn = strings.TrimSuffix(fqdn, ".")
|
||
|
numComponents := len(strings.Split(fqdn, "."))
|
||
|
for i := 1; i < numComponents; i++ {
|
||
|
tmpHostname := strings.SplitN(fqdn, ".", i)[i-1]
|
||
|
log.Printf("tmpHostname for i = %d: %s\n", i, tmpHostname)
|
||
|
if domainID, err := vega.GetDomainID(tmpHostname); err == nil {
|
||
|
log.Printf("Found zone: %s\n\tShortened to %s\n", tmpHostname, strings.TrimSuffix(tmpHostname, "."))
|
||
|
return strings.TrimSuffix(tmpHostname, "."), domainID, nil
|
||
|
}
|
||
|
}
|
||
|
log.Println("Unable to find hosted zone in vegadns")
|
||
|
return "", -1, fmt.Errorf("Unable to find auth zone for fqdn %s", fqdn)
|
||
|
}
|