package service import ( "encoding/json" "io" "net/http" "os" makeshift "git.towk2.me/towk/makeshift/pkg" "github.com/go-chi/chi/v5" "github.com/rs/zerolog/log" ) func (s *Service) ListPlugins() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var ( plugins map[string]makeshift.Plugin names []string body []byte err error ) plugins, err = LoadPluginsFromDir(s.PathForPlugins()) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } for name := range plugins { names = append(names, name) } body, err = json.Marshal(names) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.Write(body) } } func (s *Service) GetPluginInfo() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var ( pluginName = chi.URLParam(r, "name") path = s.PathForPluginWithName(pluginName) plugin makeshift.Plugin body []byte err error ) plugin, err = LoadPluginFromFile(path) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } body, err = json.Marshal(makeshift.PluginToMap(plugin)) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.Write(body) } } func (s *Service) GetPluginRaw() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var ( pluginName = chi.URLParam(r, "name") path = s.PathForPluginWithName(pluginName) rawPlugin []byte err error ) rawPlugin, err = os.ReadFile(path) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.Write(rawPlugin) } } func (s *Service) CreatePlugin() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var ( pluginName = chi.URLParam(r, "name") body []byte path string err error ) // helper to check for valid plugin name var hasValidName = func(name string) bool { return name != "" && len(name) < 64 } // check for a valid plugin name if !hasValidName(pluginName) { http.Error(w, "invalid name for plugin", http.StatusBadRequest) return } body, err = io.ReadAll(r.Body) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } path = s.PathForPluginWithName(pluginName) err = os.WriteFile(path, body, 0o777) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } w.WriteHeader(http.StatusOK) } } func (s *Service) DeletePlugin() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var ( pluginName = chi.URLParam(r, "name") path = s.PathForPluginWithName(pluginName) err error ) log.Debug().Str("path", path).Send() err = os.Remove(path) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.WriteHeader(http.StatusOK) } }