94 lines
1.7 KiB
Go
94 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
// External
|
|
"git.gibonuddevalla.se/go/html_template"
|
|
|
|
// Standard
|
|
"embed"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"os"
|
|
"slices"
|
|
"html/template"
|
|
)
|
|
|
|
var (
|
|
htmlEngine HTMLTemplate.Engine
|
|
|
|
//go:embed static
|
|
staticFS embed.FS
|
|
|
|
//go:embed views
|
|
viewFS embed.FS
|
|
)
|
|
|
|
func registerWebserverHandlers() {
|
|
var err error
|
|
htmlEngine, err = HTMLTemplate.NewEngine(viewFS, staticFS, flagDev)
|
|
if err != nil {
|
|
logger.Error("webserver", "error", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
http.HandleFunc("/", rootHandler)
|
|
}
|
|
|
|
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) {
|
|
if r.URL.Path == "/" {
|
|
page := HTMLTemplate.SimplePage{}
|
|
page.Layout = "main"
|
|
page.Page = "index"
|
|
|
|
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
|
|
}
|
|
|
|
slices.SortFunc(entries, SortDNSRecord)
|
|
data["DNSRecords"] = entries
|
|
|
|
tree := BuildRecordsTree(entries)
|
|
htmlElements := tree.ToHTMLElements([]string{})
|
|
|
|
var html string
|
|
for _, el := range htmlElements {
|
|
html += el.HTML
|
|
}
|
|
|
|
data["Tree"] = template.HTML(html)
|
|
|
|
j, _ := json.Marshal(tree)
|
|
os.WriteFile("/tmp/tree.json", j, 0644)
|
|
|
|
data["VERSION"] = VERSION
|
|
page.Data = data
|
|
|
|
err = htmlEngine.Render(page, w, r)
|
|
if err != nil {
|
|
w.Write([]byte(err.Error()))
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
htmlEngine.StaticResource(w, r)
|
|
}
|