package configui import ( "net/http" "strings" "kumoly.io/lib/ksrv" ) func (cui *ConfigUI) ServeHTTP(w http.ResponseWriter, r *http.Request) { cui.middleware(cui.mux()).ServeHTTP(w, r) } func (cui *ConfigUI) middleware(next http.Handler) http.Handler { k := ksrv.New() cui.ksrv_log = k.GetLogger() cui.setLog() k.SetNoLogCondition(func(r *http.Request) bool { if strings.HasPrefix(r.URL.Path, "/public") || r.URL.Query().Get("f") == "true" { return true } return false }) return k.Middleware( http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { if cui.AllowIP != "" { ip := ksrv.GetIP(r) if !ksrv.MatchIPGlob(ip, cui.AllowIP) { rw.WriteHeader(403) panic("permission denied") } } next.ServeHTTP(rw, r) }), ) } func (cui *ConfigUI) mux() *http.ServeMux { cuiR := http.NewServeMux() cuiR.HandleFunc("/api/conf", func(w http.ResponseWriter, r *http.Request) { if r.Method == "GET" { cui.GetConfig(w, r) } else if r.Method == "POST" { cui.PostConfig(w, r) } else { w.WriteHeader(404) } }) cuiR.HandleFunc("/api/files", func(w http.ResponseWriter, r *http.Request) { if r.Method == "GET" { cui.ListFiles(w, r) } else { w.WriteHeader(404) } }) cuiR.HandleFunc("/api/file", func(w http.ResponseWriter, r *http.Request) { if r.Method == "GET" { cui.GetFile(w, r) } else if r.Method == "POST" { cui.PostFile(w, r) } else { w.WriteHeader(404) } }) cuiR.HandleFunc("/api/delta", func(w http.ResponseWriter, r *http.Request) { if r.Method == "GET" { cui.GetDelta(w, r) } else { w.WriteHeader(404) } }) cuiR.HandleFunc("/api/apply", func(w http.ResponseWriter, r *http.Request) { if r.Method == "POST" { cui.Apply(w, r) } else { w.WriteHeader(404) } }) cuiR.HandleFunc("/api/export", func(w http.ResponseWriter, r *http.Request) { if r.Method == "GET" { cui.Download(w, r) } else { w.WriteHeader(404) } }) cuiR.HandleFunc("/api/action", func(w http.ResponseWriter, r *http.Request) { if r.Method == "POST" { cui.DoAction(w, r) } else { w.WriteHeader(404) } }) cuiR.HandleFunc("/api/integration", func(w http.ResponseWriter, r *http.Request) { if r.Method == "POST" { cui.DoIntegration(w, r) } else { w.WriteHeader(404) } }) cuiR.HandleFunc("/api/running", func(w http.ResponseWriter, r *http.Request) { if r.Method == "GET" { cui.GetRunning(w, r) } else { w.WriteHeader(404) } }) cuiR.Handle("/public/", http.StripPrefix("/public/", http.FileServer(http.FS(cui.PublicFS)))) cuiR.HandleFunc("/", cui.App) return cuiR }