blob: 41fb98fd8a584d5c180bacb0fe8a5e572fbb1d2b [file] [log] [blame]
Giorgi Lekveishvilie58fc592023-12-07 13:24:07 +04001package controllers
2
3import (
4 "fmt"
5 "io"
6 "strings"
7 "time"
8
9 "github.com/miekg/dns"
10)
11
12type ZoneFile struct {
13 rrs []dns.RR
14}
15
16func NewZoneFile(r io.Reader) (*ZoneFile, error) {
17 rrs := make([]dns.RR, 0)
18 p := dns.NewZoneParser(r, "", "")
19 p.SetIncludeAllowed(false)
20 for {
21 if rr, ok := p.Next(); ok {
22 rrs = append(rrs, rr)
23 } else {
24 if err := p.Err(); err != nil {
25 return nil, err
26 }
27 break
28 }
29 }
30 return &ZoneFile{rrs}, nil
31}
32
33func (z *ZoneFile) DeleteTxtRecord(name, value string) {
34 for i, rr := range z.rrs {
35 if txt, ok := rr.(*dns.TXT); ok {
36 if txt.Hdr.Name == name && strings.Join(txt.Txt, "") == value {
37 z.rrs = append(z.rrs[:i], z.rrs[i+1:]...)
38 }
39 }
40 }
41}
42
43func (z *ZoneFile) CreateOrReplaceTxtRecord(name, value string) {
44 for i, rr := range z.rrs {
45 if txt, ok := rr.(*dns.TXT); ok {
46 if txt.Hdr.Name == name && strings.Join(txt.Txt, "") == value {
47 txt.Txt = []string{value}
48 z.rrs = append(z.rrs[:i], z.rrs[i+1:]...)
49 z.rrs = append(z.rrs, txt)
50 return
51 }
52 }
53 }
54 z.rrs = append(z.rrs, &dns.TXT{
55 Hdr: dns.RR_Header{
56 Name: name,
57 Rrtype: dns.TypeTXT,
58 Class: dns.ClassINET,
59 Ttl: 300,
60 },
61 Txt: []string{value},
62 })
63}
64
65func (z *ZoneFile) Write(w io.Writer) error {
66 for _, rr := range z.rrs {
67 if soa, ok := rr.(*dns.SOA); ok {
68 soa.Serial = NowUnix()
69 }
70 if _, err := fmt.Fprintf(w, "%s\n", rr.String()); err != nil {
71 return err
72 }
73 }
74 return nil
75}
76
77// TODO(gio): not going to work in 15 years?
78// TODO(gio): remove 10 *
79func NowUnix() uint32 {
80 return 10 * uint32(time.Now().Unix())
81}