first commit

This commit is contained in:
William Bouzourène 2025-03-16 19:38:58 +01:00
commit 4b1861fa9b
14 changed files with 811 additions and 0 deletions

217
hetzner/records.go Normal file
View 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
}

62
hetzner/zones.go Normal file
View file

@ -0,0 +1,62 @@
package hetzner
import (
"encoding/json"
"io"
"net/http"
"git.readonly.ch/bouzoure/gestion-dns/helpers"
)
type Zone struct {
ID string `json:"id"`
Name string `json:"name"`
TTL int `json:"ttl"`
NS []string `json:"ns"`
Records []Record `json:"-"`
}
type Zones struct {
Zones []Zone `json:"zones"`
}
func GetZones() ([]Zone, error) {
var zones Zones
config, err := helpers.GetConfig()
if err != nil {
return zones.Zones, err
}
// Create client
client := &http.Client{}
// Create request
req, err := http.NewRequest(
"GET",
"https://dns.hetzner.com/api/v1/zones",
nil,
)
if err != nil {
return zones.Zones, err
}
// Headers
req.Header.Add("Auth-API-Token", config.Hetzner.ApiToken)
// Fetch Request
resp, err := client.Do(req)
if err != nil {
return zones.Zones, err
}
// Read Response Body
respBody, err := io.ReadAll(resp.Body)
if err != nil {
return zones.Zones, err
}
err = json.Unmarshal(respBody, &zones)
return zones.Zones, err
}