blob: 8dfd914c5a4fe6fa59e959f5552b7d3a13ef70db [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 {
giof6ad2982024-08-23 17:42:49 +040010 Log() 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
giof6ad2982024-08-23 17:42:49 +040024func (s *fsRecordStore) Log() error {
25 r, err := s.fs.Reader(s.db)
26 if err != nil {
27 return err
28 }
29 defer r.Close()
30 _, err = io.Copy(os.Stdout, r)
31 return err
32}
33
gioe72b54f2024-04-22 10:44:41 +040034func (s *fsRecordStore) read() (*RecordsFile, error) {
35 r, err := s.fs.Reader(s.db)
36 if err != nil {
37 return nil, err
38 }
39 defer r.Close()
giof6ad2982024-08-23 17:42:49 +040040 return NewRecordsFile(io.TeeReader(r, os.Stdout))
gioe72b54f2024-04-22 10:44:41 +040041}
giof6ad2982024-08-23 17:42:49 +040042
gioe72b54f2024-04-22 10:44:41 +040043func (s *fsRecordStore) write(z *RecordsFile) error {
44 w, err := s.fs.Writer(s.db)
45 if err != nil {
46 return err
47 }
48 defer w.Close()
giof6ad2982024-08-23 17:42:49 +040049 return z.Write(io.MultiWriter(w, os.Stdout))
gioe72b54f2024-04-22 10:44:41 +040050}
51
52func (s *fsRecordStore) Add(entry, txt string) error {
53 z, err := s.read()
54 if err != nil {
55 return err
56 }
57 fqdn := fmt.Sprintf("%s.%s.", entry, s.zone)
58 z.CreateOrReplaceTxtRecord(fqdn, txt)
59 // for _, ip := range s.publicIP {
60 // z.CreateARecord(fqdn, ip)
61 // }
62 return s.write(z)
63}
64
giof6ad2982024-08-23 17:42:49 +040065func (s *fsRecordStore) AddARecord(entry, ip string) error {
66 z, err := s.read()
67 if err != nil {
68 return err
69 }
70 fqdn := fmt.Sprintf("%s.%s.", entry, s.zone)
71 z.CreateARecord(fqdn, ip)
72 // for _, ip := range s.publicIP {
73 // z.CreateARecord(fqdn, ip)
74 // }
75 return s.write(z)
76}
77
gioe72b54f2024-04-22 10:44:41 +040078func (s *fsRecordStore) Delete(entry, txt string) error {
79 z, err := s.read()
80 if err != nil {
81 return err
82 }
83 fqdn := fmt.Sprintf("%s.%s.", entry, s.zone)
84 z.DeleteTxtRecord(fqdn, txt)
85 // z.DeleteRecordsFor(fqdn)
86 return s.write(z)
87}
giof6ad2982024-08-23 17:42:49 +040088
89func (s *fsRecordStore) DeleteARecord(entry, ip string) error {
90 z, err := s.read()
91 if err != nil {
92 return err
93 }
94 fqdn := fmt.Sprintf("%s.%s.", entry, s.zone)
95 if err := z.DeleteARecord(fqdn, ip); err != nil {
96 return err
97 }
98 // z.DeleteRecordsFor(fqdn)
99 return s.write(z)
100}