Add secmark/var + render blrules/conntrack/secmark/vars
- 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).
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
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")))
|
||||
}
|
||||
@@ -64,6 +64,7 @@ func (s *Server) mountResources(r chi.Router) {
|
||||
s.mountPerDevice(r)
|
||||
s.mountPerDeviceL2(r)
|
||||
s.mountTraffic(r)
|
||||
s.mountGlobal2(r)
|
||||
}
|
||||
|
||||
// respondOne writes a single resource, mapping ErrNotFound to 404.
|
||||
|
||||
Reference in New Issue
Block a user