From 8b71a50b24c06d854e25e39bc7be9ce43468d257 Mon Sep 17 00:00:00 2001 From: Gzx1999 Date: Mon, 3 Apr 2023 15:33:09 +0800 Subject: [PATCH] client add RunScript method --- sdk/plugin/client.go | 103 +++++++++++++++++++++++++++++++++++++++++++ sdk/plugin/plugin.go | 67 ---------------------------- 2 files changed, 103 insertions(+), 67 deletions(-) create mode 100644 sdk/plugin/client.go diff --git a/sdk/plugin/client.go b/sdk/plugin/client.go new file mode 100644 index 00000000..3816dd2e --- /dev/null +++ b/sdk/plugin/client.go @@ -0,0 +1,103 @@ +package plugin + +import ( + "encoding/json" + "fmt" + "io" + "net/http" + "net/http/httputil" + "net/url" + "strings" + + "github.com/gin-gonic/gin" +) + +type Client struct { + HttpEngine *gin.Engine + Server string + PluginName string +} + +var BaseInfo *PluginInfo + +func InfoHandler(c *gin.Context) { + + c.JSON(http.StatusOK, BaseInfo) +} + +func ReverseProxyHandler(c *gin.Context) { + remote := c.GetString("__internal__reverse_dest") + if remote == "" { + fmt.Println("get reverse dest failed!") + return + } + + target, err := url.Parse(remote) + if err != nil { + return + } + + proxy := httputil.NewSingleHostReverseProxy(target) + c.Request.URL.Path = strings.Replace(c.Request.URL.Path, "/plugin/grafana", "", 1) //请求API + + proxy.ServeHTTP(c.Writer, c.Request) +} + +func DefaultClient(desc *PluginInfo) *Client { + BaseInfo = desc + dest := desc.ReverseDest + + router := gin.Default() + mg := router.Group("plugin_manage/") + { + mg.GET("/info", InfoHandler) + } + + pg := router.Group("/plugin/" + desc.Name) + { + pg.Any("/*any", func(c *gin.Context) { + c.Set("__internal__reverse_dest", dest) + ReverseProxyHandler(c) + }) + } + + return &Client{ + HttpEngine: router, + } +} + +func (c *Client) Serve(url ...string) { + // TODO: 启动http服务 + c.HttpEngine.Run(url...) +} + +func (c *Client) RunScript(batch []string, cmd string) (int, string, string, error) { + url := c.Server + "/api/v1/pluginapi/run_script" + req, err := http.NewRequest("POST", url, nil) + if err != nil { + return 0, "", "", err + } + + hc := &http.Client{} + resp, err := hc.Do(req) + if err != nil { + return 0, "", "", err + } + defer resp.Body.Close() + + bs, err := io.ReadAll(resp.Body) + if err != nil { + return 0, "", "", err + } + + res := struct { + Code int + Stdout string + Stderr string + }{} + if err := json.Unmarshal(bs, res); err != nil { + return 0, "", "", err + } + + return res.Code, res.Stdout, res.Stderr, nil +} diff --git a/sdk/plugin/plugin.go b/sdk/plugin/plugin.go index 444b600e..ac8be1d8 100644 --- a/sdk/plugin/plugin.go +++ b/sdk/plugin/plugin.go @@ -1,15 +1,5 @@ package plugin -import ( - "fmt" - "net/http" - "net/http/httputil" - "net/url" - "strings" - - "github.com/gin-gonic/gin" -) - type PluginInfo struct { Name string `json:"name"` Version string `json:"version"` @@ -19,60 +9,3 @@ type PluginInfo struct { Url string `json:"url"` ReverseDest string `json:"reverse_dest"` } - -type Client struct { - Router *gin.Engine -} - -var BaseInfo *PluginInfo - -func InfoHandler(c *gin.Context) { - - c.JSON(http.StatusOK, BaseInfo) -} - -func ReverseProxyHandler(c *gin.Context) { - remote := c.GetString("__internal__reverse_dest") - if remote == "" { - fmt.Println("get reverse dest failed!") - return - } - - target, err := url.Parse(remote) - if err != nil { - return - } - - proxy := httputil.NewSingleHostReverseProxy(target) - c.Request.URL.Path = strings.Replace(c.Request.URL.Path, "/plugin/grafana", "", 1) //请求API - - proxy.ServeHTTP(c.Writer, c.Request) -} - -func DefaultClient(desc *PluginInfo) *Client { - BaseInfo = desc - dest := desc.ReverseDest - - router := gin.Default() - mg := router.Group("plugin_manage/") - { - mg.GET("/info", InfoHandler) - } - - pg := router.Group("/plugin/" + desc.Name) - { - pg.Any("/*any", func(c *gin.Context) { - c.Set("__internal__reverse_dest", dest) - ReverseProxyHandler(c) - }) - } - - return &Client{ - Router: router, - } -} - -func (c *Client) Serve(url ...string) { - // TODO: 启动http服务 - c.Router.Run(url...) -} -- Gitee