blob: 588a2f2d2da6d853a75341e0cc60e94e0411dba2 [file] [log] [blame]
gioe72b54f2024-04-22 10:44:41 +04001package main
2
3import (
4 "fmt"
giof6ad2982024-08-23 17:42:49 +04005 "io"
6 "os"
gioe72b54f2024-04-22 10:44:41 +04007)
8
9type RecordStore interface {
gio381c7672026-07-23 15:28:26 +040010 All() (string, error)
gioe72b54f2024-04-22 10:44:41 +040011 Add(entry, txt string) error
giof6ad2982024-08-23 17:42:49 +040012 AddARecord(entry, ip string) error
gioe72b54f2024-04-22 10:44:41 +040013 Delete(entry, txt string) error
giof6ad2982024-08-23 17:42:49 +040014 DeleteARecord(entry, ip string) error
gioe72b54f2024-04-22 10:44:41 +040015}
16
17type fsRecordStore struct {
18 zone string
19 publicIP []string
20 fs FS
21 db string
22}
23
gio381c7672026-07-23 15:28:26 +040024func (s *fsRecordStore) All() (string, error) {
giof6ad2982024-08-23 17:42:49 +040025 r, err := s.fs.Reader(s.db)
26 if err != nil {
gio381c7672026-07-23 15:28:26 +040027 return "", err
giof6ad2982024-08-23 17:42:49 +040028 }
29 defer r.Close()
gio381c7672026-07-23 15:28:26 +040030 ret, err := io.ReadAll(r)
31 if err != nil {
32 return "", err
33 }
34 return string(ret), nil
giof6ad2982024-08-23 17:42:49 +040035}
36
gioe72b54f2024-04-22 10:44:41 +040037func (s *fsRecordStore) read() (*RecordsFile, error) {
38 r, err := s.fs.Reader(s.db)
39 if err != nil {
40 return nil, err
41 }
42 defer r.Close()
giof6ad2982024-08-23 17:42:49 +040043 return NewRecordsFile(io.TeeReader(r, os.Stdout))
gioe72b54f2024-04-22 10:44:41 +040044}
giof6ad2982024-08-23 17:42:49 +040045
gioe72b54f2024-04-22 10:44:41 +040046func (s *fsRecordStore) write(z *RecordsFile) error {
47 w, err := s.fs.Writer(s.db)
48 if err != nil {
49 return err
50 }
51 defer w.Close()
giof6ad2982024-08-23 17:42:49 +040052 return z.Write(io.MultiWriter(w, os.Stdout))
gioe72b54f2024-04-22 10:44:41 +040053}
54
55func (s *fsRecordStore) Add(entry, txt string) error {
56 z, err := s.read()
57 if err != nil {
58 return err
59 }
60 fqdn := fmt.Sprintf("%s.%s.", entry, s.zone)
61 z.CreateOrReplaceTxtRecord(fqdn, txt)
62 // for _, ip := range s.publicIP {
63 // z.CreateARecord(fqdn, ip)
64 // }
65 return s.write(z)
66}
67
giof6ad2982024-08-23 17:42:49 +040068func (s *fsRecordStore) AddARecord(entry, ip string) error {
69 z, err := s.read()
70 if err != nil {
71 return err
72 }
73 fqdn := fmt.Sprintf("%s.%s.", entry, s.zone)
74 z.CreateARecord(fqdn, ip)
75 // for _, ip := range s.publicIP {
76 // z.CreateARecord(fqdn, ip)
77 // }
78 return s.write(z)
79}
80
gioe72b54f2024-04-22 10:44:41 +040081func (s *fsRecordStore) Delete(entry, txt string) error {
82 z, err := s.read()
83 if err != nil {
84 return err
85 }
86 fqdn := fmt.Sprintf("%s.%s.", entry, s.zone)
87 z.DeleteTxtRecord(fqdn, txt)
88 // z.DeleteRecordsFor(fqdn)
89 return s.write(z)
90}
giof6ad2982024-08-23 17:42:49 +040091
92func (s *fsRecordStore) DeleteARecord(entry, ip string) error {
93 z, err := s.read()
94 if err != nil {
95 return err
96 }
97 fqdn := fmt.Sprintf("%s.%s.", entry, s.zone)
98 if err := z.DeleteARecord(fqdn, ip); err != nil {
99 return err
100 }
101 // z.DeleteRecordsFor(fqdn)
102 return s.write(z)
103}