File: wrapper.go

package info (click to toggle)
golang-github-xenolf-lego 4.9.1-2
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 5,080 kB
  • sloc: xml: 533; makefile: 128; sh: 18
file content (115 lines) | stat: -rw-r--r-- 2,664 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package internal

import (
	"fmt"

	"github.com/softlayer/softlayer-go/datatypes"
	"github.com/softlayer/softlayer-go/services"
	"github.com/softlayer/softlayer-go/session"
	"github.com/softlayer/softlayer-go/sl"
)

type Wrapper struct {
	session *session.Session
}

func NewWrapper(sess *session.Session) *Wrapper {
	return &Wrapper{session: sess}
}

func (w Wrapper) AddTXTRecord(fqdn, domain, value string, ttl int) error {
	service := services.GetDnsDomainService(w.session)

	domainID, err := getDomainID(service, domain)
	if err != nil {
		return fmt.Errorf("failed to get domain ID: %w", err)
	}

	service.Options.Id = domainID

	if _, err := service.CreateTxtRecord(sl.String(fqdn), sl.String(value), sl.Int(ttl)); err != nil {
		return fmt.Errorf("failed to create TXT record: %w", err)
	}

	return nil
}

func (w Wrapper) CleanupTXTRecord(fqdn, domain string) error {
	service := services.GetDnsDomainService(w.session)

	domainID, err := getDomainID(service, domain)
	if err != nil {
		return fmt.Errorf("failed to get domain ID: %w", err)
	}

	service.Options.Id = domainID

	records, err := findTxtRecords(service, fqdn)
	if err != nil {
		return fmt.Errorf("failed to find TXT records: %w", err)
	}

	return deleteResourceRecords(service, records)
}

func getDomainID(service services.Dns_Domain, domain string) (*int, error) {
	res, err := service.GetByDomainName(sl.String(domain))
	if err != nil {
		return nil, err
	}

	for _, r := range res {
		if r.Id == nil || toString(r.Name) != domain {
			continue
		}

		return r.Id, nil
	}

	return nil, fmt.Errorf("no data found of domain: %s", domain)
}

func findTxtRecords(service services.Dns_Domain, fqdn string) ([]datatypes.Dns_Domain_ResourceRecord, error) {
	var results []datatypes.Dns_Domain_ResourceRecord

	records, err := service.GetResourceRecords()
	if err != nil {
		return nil, err
	}

	for _, record := range records {
		if toString(record.Host) == fqdn && toString(record.Type) == "txt" {
			results = append(results, record)
		}
	}

	if len(results) == 0 {
		return nil, fmt.Errorf("no data found of fqdn: %s", fqdn)
	}

	return results, nil
}

func deleteResourceRecords(service services.Dns_Domain, records []datatypes.Dns_Domain_ResourceRecord) error {
	resourceRecord := services.GetDnsDomainResourceRecordService(service.Session)

	// TODO maybe a bug: only the last record will be deleted
	for _, record := range records {
		resourceRecord.Options.Id = record.Id
	}

	_, err := resourceRecord.DeleteObject()
	if err != nil {
		return fmt.Errorf("no data found of fqdn: %w", err)
	}

	return nil
}

func toString(v *string) string {
	if v == nil {
		return ""
	}

	return *v
}