package configui import ( "net/http" "path/filepath" "kumoly.io/lib/ksrv" "kumoly.io/lib/stat" "kumoly.io/tools/kconfig" ) 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 { ext := filepath.Ext(r.URL.Path) switch ext { case ".js": return true case ".css": return true case ".ttf": return true case ".ico": return true } return r.URL.Query().Get("f") == "true" }) 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/profile", func(w http.ResponseWriter, r *http.Request) { if r.Method == "GET" { ksrv.JSON(w, stat.GetProfile()) } else { w.WriteHeader(404) } }) 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) } }) k := kconfig.New() k.Schema = SCHEMA k.Load = func() []byte { b, err := cui.Config() if err != nil { cui.log.Error(err) return []byte{} } return b } k.Apply = func(b []byte) error { err := cui.LoadConfig(string(b)) if err == nil { k.AppName = cui.AppName } return err } cuiR.Handle("/kconfig/", http.StripPrefix("/kconfig", k)) cuiR.Handle("/public/", http.StripPrefix("/public/", http.FileServer(http.FS(cui.PublicFS)))) cuiR.HandleFunc("/", cui.App) return cuiR }