From 865b6cba3fa608f68e15ec679c2c42b517179b2b Mon Sep 17 00:00:00 2001 From: ssongliu Date: Mon, 29 Jul 2024 14:13:47 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 4 ++ agent/cmd/server/conf/app.yaml | 2 +- agent/global/global.go | 2 + agent/init/router/router.go | 11 +--- agent/server/server.go | 27 +++++++-- core/constant/status.go | 3 + core/middleware/proxy.go | 51 ++++++++++------ frontend/src/api/index.ts | 1 + .../src/layout/components/Sidebar/index.vue | 60 +++++++++++++++++++ frontend/src/store/interface/index.ts | 2 + frontend/src/store/modules/global.ts | 2 + 11 files changed, 131 insertions(+), 34 deletions(-) diff --git a/Makefile b/Makefile index 8bff5b613..f50c34daa 100644 --- a/Makefile +++ b/Makefile @@ -40,6 +40,10 @@ build_agent_on_darwin: cd $(AGENT_PATH) \ && GOOS=linux GOARCH=amd64 $(GOBUILD) -trimpath -ldflags '-s -w' -o $(BUILD_PATH)/$(AGENT_NAME) $(AGENT_MAIN) +build_agent_xpack_on_darwin: + cd $(AGENT_PATH) \ + && GOOS=linux GOARCH=amd64 $(GOBUILD) -tags=xpack -trimpath -ldflags '-s -w' -o $(BUILD_PATH)/$(AGENT_NAME) $(AGENT_MAIN) + build_all: build_frontend build_core_on_linux build_agent_on_linux build_on_local: clean_assets build_frontend build_core_on_darwin build_agent_on_darwin upx_bin diff --git a/agent/cmd/server/conf/app.yaml b/agent/cmd/server/conf/app.yaml index 44efd5510..2bed83268 100644 --- a/agent/cmd/server/conf/app.yaml +++ b/agent/cmd/server/conf/app.yaml @@ -1,5 +1,5 @@ system: - db_file: agent.db + db_agent_file: agent.db base_dir: /opt mode: dev repo_url: https://resource.fit2cloud.com/1panel/package diff --git a/agent/global/global.go b/agent/global/global.go index 7a797db47..d40732fa9 100644 --- a/agent/global/global.go +++ b/agent/global/global.go @@ -26,5 +26,7 @@ var ( MonitorCronID cron.EntryID OneDriveCronID cron.EntryID + CurrentNode string + I18n *i18n.Localizer ) diff --git a/agent/init/router/router.go b/agent/init/router/router.go index a8803aab7..15ea31a91 100644 --- a/agent/init/router/router.go +++ b/agent/init/router/router.go @@ -2,7 +2,6 @@ package router import ( "github.com/1Panel-dev/1Panel/agent/i18n" - "github.com/1Panel-dev/1Panel/agent/middleware" rou "github.com/1Panel-dev/1Panel/agent/router" "github.com/gin-contrib/gzip" "github.com/gin-gonic/gin" @@ -12,13 +11,6 @@ var ( Router *gin.Engine ) -func setWebStatic(rootRouter *gin.RouterGroup) { - rootRouter.Static("/api/v1/images", "./uploads") - rootRouter.Use(func(c *gin.Context) { - c.Next() - }) -} - func Routers() *gin.Engine { Router = gin.Default() Router.Use(i18n.UseI18n()) @@ -29,10 +21,9 @@ func Routers() *gin.Engine { c.JSON(200, "ok") }) PublicGroup.Use(gzip.Gzip(gzip.DefaultCompression)) - setWebStatic(PublicGroup) + PublicGroup.Static("/api/v1/images", "./uploads") } PrivateGroup := Router.Group("/api/v2") - PrivateGroup.Use(middleware.GlobalLoading()) for _, router := range rou.RouterGroupApp { router.InitRouter(PrivateGroup) } diff --git a/agent/server/server.go b/agent/server/server.go index e4b1b075a..1872ffeba 100644 --- a/agent/server/server.go +++ b/agent/server/server.go @@ -6,6 +6,7 @@ import ( "os" "github.com/1Panel-dev/1Panel/agent/cron" + "github.com/1Panel-dev/1Panel/agent/global" "github.com/1Panel-dev/1Panel/agent/i18n" "github.com/1Panel-dev/1Panel/agent/init/app" "github.com/1Panel-dev/1Panel/agent/init/business" @@ -39,11 +40,25 @@ func Start() { server := &http.Server{ Handler: rootRouter, } - - _ = os.Remove("/tmp/agent.sock") - listener, err := net.Listen("unix", "/tmp/agent.sock") - if err != nil { - panic(err) + if len(global.CurrentNode) == 0 || global.CurrentNode == "127.0.0.1" { + _ = os.Remove("/tmp/agent.sock") + listener, err := net.Listen("unix", "/tmp/agent.sock") + if err != nil { + panic(err) + } + _ = server.Serve(listener) + } else { + server.Addr = "0.0.0.0:9999" + type tcpKeepAliveListener struct { + *net.TCPListener + } + ln, err := net.Listen("tcp4", "0.0.0.0:9999") + if err != nil { + panic(err) + } + global.LOG.Info("listen at http://0.0.0.0:9999") + if err := server.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)}); err != nil { + panic(err) + } } - _ = server.Serve(listener) } diff --git a/core/constant/status.go b/core/constant/status.go index e3b8fc05b..711c4ccb1 100644 --- a/core/constant/status.go +++ b/core/constant/status.go @@ -3,4 +3,7 @@ package constant const ( StatusSuccess = "Success" StatusFailed = "Failed" + + StatusHealthy = "Healthy" + StatusUnhealthy = "Unhealthy" ) diff --git a/core/middleware/proxy.go b/core/middleware/proxy.go index 5cbfaf070..0f4cf4522 100644 --- a/core/middleware/proxy.go +++ b/core/middleware/proxy.go @@ -2,9 +2,11 @@ package middleware import ( "context" + "fmt" "net" "net/http" "net/http/httputil" + "net/url" "os" "strings" @@ -19,26 +21,41 @@ func Proxy() gin.HandlerFunc { c.Next() return } - sockPath := "/tmp/agent.sock" - if _, err := os.Stat(sockPath); err != nil { + currentNode := c.Request.Header.Get("CurrentNode") + if currentNode == "127.0.0.1" { + sockPath := "/tmp/agent.sock" + if _, err := os.Stat(sockPath); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrProxy, err) + return + } + dialUnix := func() (conn net.Conn, err error) { + return net.Dial("unix", sockPath) + } + transport := &http.Transport{ + DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { + return dialUnix() + }, + } + proxy := &httputil.ReverseProxy{ + Director: func(req *http.Request) { + req.URL.Scheme = "http" + req.URL.Host = "unix" + }, + Transport: transport, + } + proxy.ServeHTTP(c.Writer, c.Request) + c.Abort() + return + } + target, err := url.Parse(fmt.Sprintf("http://%s:9999", currentNode)) + if err != nil { helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrProxy, err) return } - dialUnix := func() (conn net.Conn, err error) { - return net.Dial("unix", sockPath) - } - transport := &http.Transport{ - DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { - return dialUnix() - }, - } - proxy := &httputil.ReverseProxy{ - Director: func(req *http.Request) { - req.URL.Scheme = "http" - req.URL.Host = "unix" - }, - Transport: transport, - } + proxy := httputil.NewSingleHostReverseProxy(target) + c.Request.Host = target.Host + c.Request.URL.Scheme = target.Scheme + c.Request.URL.Host = target.Host proxy.ServeHTTP(c.Writer, c.Request) c.Abort() } diff --git a/frontend/src/api/index.ts b/frontend/src/api/index.ts index ca40a309e..fe8b03cb8 100644 --- a/frontend/src/api/index.ts +++ b/frontend/src/api/index.ts @@ -26,6 +26,7 @@ class RequestHttp { 'Accept-Language': language, ...config.headers, }; + config.headers.CurrentNode = globalStore.currentNode; if (config.url === '/auth/login' || config.url === '/auth/mfalogin') { let entrance = Base64.encode(globalStore.entrance); config.headers.EntranceCode = entrance; diff --git a/frontend/src/layout/components/Sidebar/index.vue b/frontend/src/layout/components/Sidebar/index.vue index cf2722c46..66293dac7 100644 --- a/frontend/src/layout/components/Sidebar/index.vue +++ b/frontend/src/layout/components/Sidebar/index.vue @@ -7,6 +7,21 @@ element-loading-background="rgba(122, 122, 122, 0.01)" > + + + {{ globalStore.currentNode || '127.0.0.1' }} + + + + + + { await logOutApi(); }; +const loadNodes = async () => { + if (globalStore.isProductPro) { + let listXNodes; + const xpackModules = import.meta.glob('../../../xpack/api/modules/node.ts', { eager: true }); + if (xpackModules['../../../xpack/api/modules/node.ts']) { + console.log('dqwdqwd'); + listXNodes = xpackModules['../../../xpack/api/modules/node.ts']['listNodes'] || {}; + const res = await listXNodes(); + if (!res) { + nodes.value = []; + return; + } + console.log('dqwdqwd'); + nodes.value = res.data; + return; + } + nodes.value = []; + } +}; +const changeNode = (command: string) => { + globalStore.currentNode = command || '127.0.0.1'; + location.reload(); +}; + function extractLabels(node: Node, result: string[]): void { if (node.isCheck) { result.push(node.label); @@ -172,6 +212,7 @@ const search = async () => { onMounted(() => { menuStore.setMenuList(menuList); search(); + loadNodes(); }); @@ -194,4 +235,23 @@ onMounted(() => { } } } + +.el-dropdown-link { + margin-top: -5px; + margin-left: 30px; + font-size: 14px; + font-weight: 500; + cursor: pointer; + color: var(--el-color-primary); + display: flex; + align-items: center; + height: 28px; +} +.ico { + margin-top: -20px; + display: flex; + float: left; + position: absolute; + right: 25px; +} diff --git a/frontend/src/store/interface/index.ts b/frontend/src/store/interface/index.ts index f027f44a3..b15623c18 100644 --- a/frontend/src/store/interface/index.ts +++ b/frontend/src/store/interface/index.ts @@ -37,6 +37,8 @@ export interface GlobalState { productProExpires: number; errStatus: string; + + currentNode: string; } export interface MenuState { diff --git a/frontend/src/store/modules/global.ts b/frontend/src/store/modules/global.ts index cd3d5f661..a4550f534 100644 --- a/frontend/src/store/modules/global.ts +++ b/frontend/src/store/modules/global.ts @@ -41,6 +41,8 @@ const GlobalStore = defineStore({ productProExpires: 0, errStatus: '', + + currentNode: '', }), getters: { isDarkTheme: (state) =>