4693b7093c
- Add secmarks (id-keyed) and vars (key-keyed) resources: migration 0009, model, store CRUD, REST handlers. - Compiler rendering for the global-compiled tail: blrules, conntrack, secmarks render on enforcing devices; vars render on every device. This closes the rendering gap left by batch 1 (blrules/conntrack were stored but not rendered).
80 lines
2.1 KiB
Go
80 lines
2.1 KiB
Go
package server
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/go-chi/chi/v5"
|
|
|
|
"git.unkin.net/unkin/tomswallapi/internal/model"
|
|
)
|
|
|
|
// mountGlobal2 wires secmarks (id-keyed) and vars (key-keyed).
|
|
func (s *Server) mountGlobal2(r chi.Router) {
|
|
idCRUD(r, "/secmarks", s.listSecmarks, s.createSecmark, s.getSecmark, s.deleteSecmark)
|
|
r.Route("/vars", func(r chi.Router) {
|
|
r.Get("/", s.listVars)
|
|
r.Get("/{key}", s.getVar)
|
|
r.Put("/{key}", s.putVar)
|
|
r.Delete("/{key}", s.deleteVar)
|
|
})
|
|
}
|
|
|
|
func (s *Server) listSecmarks(w http.ResponseWriter, r *http.Request) {
|
|
list, err := s.store.ListSecmarks(r.Context())
|
|
respondList(w, list, err)
|
|
}
|
|
func (s *Server) createSecmark(w http.ResponseWriter, r *http.Request) {
|
|
var v model.SecmarkRule
|
|
if !decode(w, r, &v) {
|
|
return
|
|
}
|
|
if v.Secmark == "" || v.Chain == "" {
|
|
writeError(w, http.StatusBadRequest, "secmark and chain are required")
|
|
return
|
|
}
|
|
id, err := s.store.CreateSecmark(r.Context(), v)
|
|
if err == nil {
|
|
v.ID = id
|
|
}
|
|
respondCreated(w, v, err)
|
|
}
|
|
func (s *Server) getSecmark(w http.ResponseWriter, r *http.Request) {
|
|
id, ok := idParam(w, r)
|
|
if !ok {
|
|
return
|
|
}
|
|
v, err := s.store.GetSecmark(r.Context(), id)
|
|
respondOne(w, v, err)
|
|
}
|
|
func (s *Server) deleteSecmark(w http.ResponseWriter, r *http.Request) {
|
|
id, ok := idParam(w, r)
|
|
if !ok {
|
|
return
|
|
}
|
|
respondDelete(w, s.store.DeleteSecmark(r.Context(), id))
|
|
}
|
|
|
|
func (s *Server) listVars(w http.ResponseWriter, r *http.Request) {
|
|
list, err := s.store.ListVars(r.Context())
|
|
respondList(w, list, err)
|
|
}
|
|
func (s *Server) getVar(w http.ResponseWriter, r *http.Request) {
|
|
v, err := s.store.GetVar(r.Context(), chi.URLParam(r, "key"))
|
|
respondOne(w, v, err)
|
|
}
|
|
func (s *Server) putVar(w http.ResponseWriter, r *http.Request) {
|
|
var v model.Var
|
|
if !decode(w, r, &v) {
|
|
return
|
|
}
|
|
v.Key = chi.URLParam(r, "key")
|
|
if err := s.store.UpsertVar(r.Context(), v); err != nil {
|
|
writeError(w, http.StatusInternalServerError, err.Error())
|
|
return
|
|
}
|
|
writeJSON(w, http.StatusOK, v)
|
|
}
|
|
func (s *Server) deleteVar(w http.ResponseWriter, r *http.Request) {
|
|
respondDelete(w, s.store.DeleteVar(r.Context(), chi.URLParam(r, "key")))
|
|
}
|