blob: d67ccf6b24e44ea40004773eee9f983758cdb050 [file] [log] [blame]
gioe72b54f2024-04-22 10:44:41 +04001package main
2
3import (
4 "encoding/json"
5 "fmt"
6 "net/http"
7 "strings"
8)
9
10type Server struct {
11 s *http.Server
12 m *http.ServeMux
13 store RecordStore
14 zone string
15 ds string
16 nameserver []string
17}
18
19func NewServer(port int, zone string, ds string, store RecordStore, nameserver []string) *Server {
20 m := http.NewServeMux()
21 s := &Server{
22 s: &http.Server{
23 Addr: fmt.Sprintf(":%d", port),
24 Handler: m,
25 },
26 m: m,
27 store: store,
28 zone: zone,
29 ds: ds,
30 nameserver: nameserver,
31 }
32 m.HandleFunc("/records-to-publish", s.recordsToPublish)
33 m.HandleFunc("/create-txt-record", s.createTxtRecord)
giof6ad2982024-08-23 17:42:49 +040034 m.HandleFunc("/create-a-record", s.createARecord)
35 m.HandleFunc("/delete-a-record", s.deleteARecord)
gioe72b54f2024-04-22 10:44:41 +040036 m.HandleFunc("/delete-txt-record", s.deleteTxtRecord)
37 return s
38}
39
40func (s *Server) Start() error {
41 return s.s.ListenAndServe()
42}
43
44type record struct {
45 Domain string `json:"domain,omitempty"`
46 Entry string `json:"entry,omitempty"`
47 Text string `json:"text,omitempty"`
48}
49
50func (s *Server) recordsToPublish(w http.ResponseWriter, r *http.Request) {
51 subdomain := strings.Split(s.zone, ".")[0]
52 if _, err := fmt.Fprintln(w, s.ds); err != nil {
53 http.Error(w, err.Error(), http.StatusInternalServerError)
54 return
55 }
56 for i, ip := range s.nameserver {
57 if _, err := fmt.Fprintf(w, "ns%d.%s. 10800 IN A %s\n", i+1, s.zone, ip); err != nil {
58 http.Error(w, err.Error(), http.StatusInternalServerError)
59 return
60 }
61 if _, err := fmt.Fprintf(w, "%s 10800 IN NS ns%d.%s.\n", subdomain, i+1, s.zone); err != nil {
62 http.Error(w, err.Error(), http.StatusInternalServerError)
63 return
64 }
65 }
66}
67
68func (s *Server) createTxtRecord(w http.ResponseWriter, r *http.Request) {
69 var req record
70 if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
71 http.Error(w, err.Error(), http.StatusBadRequest)
72 return
73 }
gioe72b54f2024-04-22 10:44:41 +040074 if err := s.store.Add(req.Entry, req.Text); err != nil {
75 http.Error(w, err.Error(), http.StatusInternalServerError)
76 return
77 }
78}
79
giof6ad2982024-08-23 17:42:49 +040080func (s *Server) createARecord(w http.ResponseWriter, r *http.Request) {
81 var req record
82 if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
83 http.Error(w, err.Error(), http.StatusBadRequest)
84 return
85 }
86 if err := s.store.AddARecord(req.Entry, req.Text); err != nil {
87 http.Error(w, err.Error(), http.StatusInternalServerError)
88 return
89 }
90}
91
gioe72b54f2024-04-22 10:44:41 +040092func (s *Server) deleteTxtRecord(w http.ResponseWriter, r *http.Request) {
93 var req record
94 if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
95 http.Error(w, err.Error(), http.StatusBadRequest)
96 return
97 }
gioe72b54f2024-04-22 10:44:41 +040098 if err := s.store.Delete(req.Entry, req.Text); err != nil {
99 http.Error(w, err.Error(), http.StatusInternalServerError)
100 return
101 }
102}
giof6ad2982024-08-23 17:42:49 +0400103
104func (s *Server) deleteARecord(w http.ResponseWriter, r *http.Request) {
105 var req record
106 if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
107 http.Error(w, err.Error(), http.StatusBadRequest)
108 return
109 }
110 if err := s.store.DeleteARecord(req.Entry, req.Text); err != nil {
111 http.Error(w, err.Error(), http.StatusInternalServerError)
112 return
113 }
114}