Added basic multidevice support

This commit is contained in:
Magnus Åhall 2026-02-26 15:21:24 +01:00
parent d0b0aba30d
commit 7feeacea42
7 changed files with 505 additions and 186 deletions

View file

@ -24,7 +24,7 @@ var (
viewFS embed.FS
)
func registerWebserverHandlers() {
func registerWebserverHandlers() { // {{{
var err error
htmlEngine, err = HTMLTemplate.NewEngine(viewFS, staticFS, flagDev)
if err != nil {
@ -33,17 +33,31 @@ func registerWebserverHandlers() {
}
http.HandleFunc("/", rootHandler)
http.HandleFunc("/record/save", actionRecordSave)
http.HandleFunc("/record/delete/{id}", actionRecordDelete)
}
func startWebserver() {
http.HandleFunc("/devices", actionDevices)
http.HandleFunc("GET /device/{dev}/dns_records", actionDNSRecords)
http.HandleFunc("POST /device/{dev}/record", actionRecordSave)
http.HandleFunc("DELETE /device/{dev}/record/{id}", actionRecordDelete)
} // }}}
func startWebserver() { // {{{
listen := fmt.Sprintf("%s:%d", config.Network.Address, config.Network.Port)
logger.Info("webserver", "listen", listen)
http.ListenAndServe(listen, nil)
}
} // }}}
func rootHandler(w http.ResponseWriter, r *http.Request) {
func httpError(w http.ResponseWriter, err error) { // {{{
resp := struct {
OK bool
Error string
}{
false,
err.Error(),
}
j, _ := json.Marshal(resp)
w.Write(j)
} // }}}
func rootHandler(w http.ResponseWriter, r *http.Request) { // {{{
if r.URL.Path == "/" {
page := HTMLTemplate.SimplePage{}
page.Layout = "main"
@ -52,21 +66,6 @@ func rootHandler(w http.ResponseWriter, r *http.Request) {
var err error
data := make(map[string]any)
data["Identity"], err = device.GetIdentity()
if err != nil {
w.Write([]byte(err.Error()))
return
}
var entries []DNSRecord
entries, err = device.StaticDNSEntries()
if err != nil {
w.Write([]byte(err.Error()))
return
}
data["DNSRecords"] = entries
data["VERSION"] = VERSION
page.Data = data
@ -79,25 +78,62 @@ func rootHandler(w http.ResponseWriter, r *http.Request) {
}
htmlEngine.StaticResource(w, r)
}
func httpError(w http.ResponseWriter, err error) {
resp := struct {
OK bool
Error string
}{
false,
err.Error(),
} // }}}
func actionDevices(w http.ResponseWriter, r *http.Request) { // {{{
var devs []Device
for _, dev := range config.Devices {
dev.Password = ""
devs = append(devs, dev)
}
j, _ := json.Marshal(resp)
w.Write(j)
}
j, _ := json.Marshal(struct {
OK bool
Devices []Device
}{
true,
devs,
})
w.Write(j)
} // }}}
func actionDNSRecords(w http.ResponseWriter, r *http.Request) { // {{{
devname := r.PathValue("dev")
device, err := routerosDevice(devname)
if err != nil {
httpError(w, err)
return
}
var records []DNSRecord
records, err = device.StaticDNSEntries()
if err != nil {
httpError(w, err)
return
}
j, _ := json.Marshal(struct {
OK bool
Records []DNSRecord
}{
true,
records,
})
w.Write(j)
} // }}}
func actionRecordSave(w http.ResponseWriter, r *http.Request) { // {{{
devName := r.PathValue("dev")
device, err := routerosDevice(devName)
if err != nil {
httpError(w, err)
return
}
func actionRecordSave(w http.ResponseWriter, r *http.Request) {
body, _ := io.ReadAll(r.Body)
var record DNSRecord
err := json.Unmarshal(body, &record)
err = json.Unmarshal(body, &record)
if err != nil {
httpError(w, err)
return
@ -117,17 +153,22 @@ func actionRecordSave(w http.ResponseWriter, r *http.Request) {
Record DNSRecord
}{true, record})
w.Write(j)
}
} // }}}
func actionRecordDelete(w http.ResponseWriter, r *http.Request) { // {{{
devName := r.PathValue("dev")
device, err := routerosDevice(devName)
if err != nil {
httpError(w, err)
return
}
func actionRecordDelete(w http.ResponseWriter, r *http.Request) {
id := r.PathValue("id")
if id == "" {
httpError(w, errors.New("No ID provided"))
return
}
err := device.DeleteDNSEntry(id)
err = device.DeleteDNSEntry(id)
if err != nil {
httpError(w, err)
logger.Error("webserver", "op", "record_delete", "error", err)
@ -135,7 +176,7 @@ func actionRecordDelete(w http.ResponseWriter, r *http.Request) {
}
j, _ := json.Marshal(struct {
OK bool
OK bool
}{true})
w.Write(j)
}
} // }}}