first commit
This commit is contained in:
commit
4b1861fa9b
14 changed files with 811 additions and 0 deletions
217
hetzner/records.go
Normal file
217
hetzner/records.go
Normal file
|
|
@ -0,0 +1,217 @@
|
|||
package hetzner
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"git.readonly.ch/bouzoure/gestion-dns/helpers"
|
||||
)
|
||||
|
||||
type Record struct {
|
||||
ID string `json:"id"`
|
||||
Type string `json:"type"`
|
||||
Name string `json:"name"`
|
||||
Value string `json:"value"`
|
||||
TTL int `json:"ttl"`
|
||||
ZoneID string `json:"zone_id"`
|
||||
Created string `json:"created"`
|
||||
Modified string `json:"modified"`
|
||||
}
|
||||
|
||||
type Records struct {
|
||||
Records []Record `json:"records"`
|
||||
}
|
||||
|
||||
type CreateRecordResponse struct {
|
||||
Record Record `json:"record"`
|
||||
}
|
||||
|
||||
type UpdateRecordResponse struct {
|
||||
Record Record `json:"record"`
|
||||
}
|
||||
|
||||
func GetRecords(zone *Zone) error {
|
||||
config, err := helpers.GetConfig()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Create client
|
||||
client := &http.Client{}
|
||||
|
||||
// Create request
|
||||
url := fmt.Sprintf("https://dns.hetzner.com/api/v1/records?zone_id=%s", zone.ID)
|
||||
req, err := http.NewRequest("GET", url, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Headers
|
||||
req.Header.Add("Auth-API-Token", config.Hetzner.ApiToken)
|
||||
|
||||
// Fetch Request
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Read Response Body
|
||||
respBody, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var records Records
|
||||
err = json.Unmarshal(respBody, &records)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var recordsToKeep []Record
|
||||
for _, record := range records.Records {
|
||||
if strings.EqualFold(record.Type, "NS") {
|
||||
continue
|
||||
}
|
||||
|
||||
if strings.EqualFold(record.Type, "SOA") {
|
||||
continue
|
||||
}
|
||||
|
||||
record.Value = strings.TrimPrefix(record.Value, "\"")
|
||||
record.Value = strings.TrimSuffix(record.Value, "\"")
|
||||
|
||||
recordsToKeep = append(recordsToKeep, record)
|
||||
}
|
||||
|
||||
zone.Records = recordsToKeep
|
||||
return nil
|
||||
}
|
||||
|
||||
func CreateRecord(record *Record) (Record, error) {
|
||||
var newRecord Record
|
||||
|
||||
config, err := helpers.GetConfig()
|
||||
if err != nil {
|
||||
return newRecord, err
|
||||
}
|
||||
|
||||
payload, err := json.Marshal(record)
|
||||
if err != nil {
|
||||
return newRecord, err
|
||||
}
|
||||
body := bytes.NewBuffer(payload)
|
||||
|
||||
// Create client
|
||||
client := &http.Client{}
|
||||
|
||||
// Create request
|
||||
req, err := http.NewRequest("POST", "https://dns.hetzner.com/api/v1/records", body)
|
||||
if err != nil {
|
||||
return newRecord, err
|
||||
}
|
||||
|
||||
// Headers
|
||||
req.Header.Add("Content-Type", "application/json")
|
||||
req.Header.Add("Auth-API-Token", config.Hetzner.ApiToken)
|
||||
|
||||
// Fetch Request
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
return newRecord, err
|
||||
}
|
||||
|
||||
// Read Response Body
|
||||
respBody, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return newRecord, err
|
||||
}
|
||||
|
||||
var createRecordResponse CreateRecordResponse
|
||||
err = json.Unmarshal(respBody, &createRecordResponse)
|
||||
if err != nil {
|
||||
return newRecord, err
|
||||
}
|
||||
|
||||
return createRecordResponse.Record, nil
|
||||
}
|
||||
|
||||
func UpdateRecord(record *Record) (Record, error) {
|
||||
var newRecord Record
|
||||
|
||||
config, err := helpers.GetConfig()
|
||||
if err != nil {
|
||||
return newRecord, err
|
||||
}
|
||||
|
||||
payload, err := json.Marshal(record)
|
||||
if err != nil {
|
||||
return newRecord, err
|
||||
}
|
||||
body := bytes.NewBuffer(payload)
|
||||
|
||||
// Create client
|
||||
client := &http.Client{}
|
||||
|
||||
// Create request
|
||||
url := fmt.Sprintf("https://dns.hetzner.com/api/v1/records/%s", record.ID)
|
||||
req, err := http.NewRequest("PUT", url, body)
|
||||
if err != nil {
|
||||
return newRecord, err
|
||||
}
|
||||
|
||||
// Headers
|
||||
req.Header.Add("Content-Type", "application/json")
|
||||
req.Header.Add("Auth-API-Token", config.Hetzner.ApiToken)
|
||||
|
||||
// Fetch Request
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
return newRecord, err
|
||||
}
|
||||
|
||||
// Read Response Body
|
||||
respBody, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return newRecord, err
|
||||
}
|
||||
|
||||
var updateRecordResponse UpdateRecordResponse
|
||||
err = json.Unmarshal(respBody, &updateRecordResponse)
|
||||
if err != nil {
|
||||
return newRecord, err
|
||||
}
|
||||
|
||||
return updateRecordResponse.Record, nil
|
||||
}
|
||||
|
||||
func DeleteRecord(record *Record) error {
|
||||
config, err := helpers.GetConfig()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Create client
|
||||
client := &http.Client{}
|
||||
|
||||
// Create request
|
||||
url := fmt.Sprintf("https://dns.hetzner.com/api/v1/records/%s", record.ID)
|
||||
req, err := http.NewRequest("DELETE", url, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Headers
|
||||
req.Header.Add("Auth-API-Token", config.Hetzner.ApiToken)
|
||||
|
||||
// Fetch Request
|
||||
_, err = client.Do(req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue