Added basic multidevice support
This commit is contained in:
parent
d0b0aba30d
commit
7feeacea42
7 changed files with 505 additions and 186 deletions
127
webserver.go
127
webserver.go
|
|
@ -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)
|
||||
}
|
||||
} // }}}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue