mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2025-12-09 13:46:07 +08:00
164 lines
4 KiB
Go
164 lines
4 KiB
Go
package infomaniak
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
)
|
|
|
|
const baseURL = "https://api.infomaniak.com/2"
|
|
|
|
type dnssecRecord struct {
|
|
IsEnabled bool `json:"is_enabled"`
|
|
}
|
|
|
|
type dnsZoneResponse struct {
|
|
Result string `json:"result"`
|
|
Data dnsZone `json:"data"`
|
|
}
|
|
|
|
type dnsRecordResponse struct {
|
|
Result string `json:"result"`
|
|
Data []dnsRecord `json:"data"`
|
|
}
|
|
|
|
type boolResponse struct {
|
|
Result string `json:"result"`
|
|
Data bool `json:"data"`
|
|
}
|
|
type dnsZone struct {
|
|
ID int64 `json:"id,omitempty"`
|
|
FQDN string `json:"fqdn,omitempty"`
|
|
DNSSEC dnssecRecord `json:"dnssec,omitempty"`
|
|
Nameservers []string `json:"nameservers,omitempty"`
|
|
}
|
|
|
|
type dnsRecord struct {
|
|
ID string `json:"hostname,omitempty"`
|
|
Source string `json:"source,omitempty"`
|
|
Type string `json:"type,omitempty"`
|
|
TTL int64 `json:"ttl,omitempty"`
|
|
Target string `json:"target,omitempty"`
|
|
UpdatedAt int64 `json:"updated_at,omitempty"`
|
|
}
|
|
|
|
type dnsRecordCreate struct {
|
|
Source string `json:"source,omitempty"`
|
|
Type string `json:"type,omitempty"`
|
|
TTL int64 `json:"ttl,omitempty"`
|
|
Target string `json:"target,omitempty"`
|
|
}
|
|
|
|
// Get zone information
|
|
// See https://developer.infomaniak.com/docs/api/get/2/zones/%7Bzone%7D
|
|
func (p *infomaniakProvider) getDNSZone(zone string) (*dnsZone, error) {
|
|
reqURL := fmt.Sprintf("%s/zones/%s", baseURL, zone)
|
|
|
|
req, err := http.NewRequest(http.MethodGet, reqURL, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
req.Header.Add("Authorization", "Bearer "+p.apiToken)
|
|
req.Header.Add("Content-Type", "application/json")
|
|
|
|
res, err := http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer res.Body.Close()
|
|
|
|
response := &dnsZoneResponse{}
|
|
err = json.NewDecoder(res.Body).Decode(response)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &response.Data, nil
|
|
}
|
|
|
|
// Retrieve all dns record for a given zone
|
|
// See https://developer.infomaniak.com/docs/api/get/2/zones/%7Bzone%7D/records
|
|
func (p *infomaniakProvider) getDNSRecords(zone string) ([]dnsRecord, error) {
|
|
reqURL := fmt.Sprintf("%s/zones/%s/records", baseURL, zone)
|
|
|
|
req, err := http.NewRequest(http.MethodGet, reqURL, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
req.Header.Add("Authorization", "Bearer "+p.apiToken)
|
|
req.Header.Add("Content-Type", "application/json")
|
|
|
|
res, err := http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer res.Body.Close()
|
|
|
|
response := &dnsRecordResponse{}
|
|
err = json.NewDecoder(res.Body).Decode(response)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return response.Data, nil
|
|
}
|
|
|
|
// Delete a dns record
|
|
// See https://developer.infomaniak.com/docs/api/delete/2/zones/%7Bzone%7D/records/%7Brecord%7D
|
|
func (p *infomaniakProvider) deleteDNSRecord(zone string, record string) error {
|
|
reqURL := fmt.Sprintf("%s/zones/%s/records/%s", baseURL, zone, record)
|
|
|
|
req, err := http.NewRequest(http.MethodDelete, reqURL, nil)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
req.Header.Add("Authorization", "Bearer "+p.apiToken)
|
|
req.Header.Add("Content-Type", "application/json")
|
|
|
|
res, err := http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer res.Body.Close()
|
|
|
|
response := &boolResponse{}
|
|
err = json.NewDecoder(res.Body).Decode(response)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Create a dns record in a given zone
|
|
// See https://developer.infomaniak.com/docs/api/post/2/zones/%7Bzone%7D/records
|
|
func (p *infomaniakProvider) createDNSRecord(zone string, rec *dnsRecordCreate) (*dnsRecord, error) {
|
|
reqURL := fmt.Sprintf("%s/zones/%s/records", baseURL, zone)
|
|
|
|
data, err := json.Marshal(rec)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
req, err := http.NewRequest(http.MethodPost, reqURL, bytes.NewReader(data))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
req.Header.Add("Authorization", "Bearer "+p.apiToken)
|
|
req.Header.Add("Content-Type", "application/json")
|
|
|
|
res, err := http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer res.Body.Close()
|
|
|
|
record := &dnsRecord{}
|
|
err = json.NewDecoder(res.Body).Decode(record)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return record, nil
|
|
}
|