From 2ed379d5e8307456b695b814e246511111c05c1d Mon Sep 17 00:00:00 2001 From: Tension Date: Sat, 1 Nov 2025 16:05:56 +0800 Subject: [PATCH] feat(report): add module registration and port management functionality --- ...ld github.com_perfect-panel_server.run.xml | 12 ----- internal/report/report.go | 22 ++++++++ internal/report/tool.go | 51 +++++++++++++++++++ internal/report/tool_test.go | 21 ++++++++ 4 files changed, 94 insertions(+), 12 deletions(-) delete mode 100644 .run/go build github.com_perfect-panel_server.run.xml create mode 100644 internal/report/report.go create mode 100644 internal/report/tool.go create mode 100644 internal/report/tool_test.go diff --git a/.run/go build github.com_perfect-panel_server.run.xml b/.run/go build github.com_perfect-panel_server.run.xml deleted file mode 100644 index 608afe7..0000000 --- a/.run/go build github.com_perfect-panel_server.run.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/internal/report/report.go b/internal/report/report.go new file mode 100644 index 0000000..31768e4 --- /dev/null +++ b/internal/report/report.go @@ -0,0 +1,22 @@ +package report + +const ( + GatewayURL = "http://127.0.0.1:%d" // 网关地址 + RegisterAPI = "/basic/register" // 模块注册接口 +) + +// RegisterRequest 模块注册请求参数 +type RegisterRequest struct { + Secret string `json:"secret"` // 通讯密钥 + ProxyPath string `json:"proxy_path"` // 代理路径 + ServiceURL string `json:"service_url"` // 服务地址 + Repository string `json:"repository"` // 服务代码仓库 + ServiceName string `json:"service_name"` // 服务名称 + ServiceVersion string `json:"service_version"` // 服务版本 +} + +// RegisterResponse 模块注册响应参数 +type RegisterResponse struct { + Success bool `json:"success"` // 注册是否成功 + Message string `json:"message"` // 返回信息 +} diff --git a/internal/report/tool.go b/internal/report/tool.go new file mode 100644 index 0000000..76894c2 --- /dev/null +++ b/internal/report/tool.go @@ -0,0 +1,51 @@ +package report + +import ( + "fmt" + "net" + "os" + + "github.com/pkg/errors" +) + +// FreePort returns a free TCP port by opening a listener on port 0. +func FreePort() (int, error) { + l, err := net.Listen("tcp", ":0") + if err != nil { + return 0, err + } + defer l.Close() + // Get the assigned port + addr := l.Addr().(*net.TCPAddr) + return addr.Port, nil +} + +// ModulePort returns the module port from the environment variable or a free port. +func ModulePort() (int, error) { + // 从环境变量获取端口号 + value, exists := os.LookupEnv("PPANEL_PORT") + if exists { + var port int + _, err := fmt.Sscanf(value, "%d", &port) + if err != nil { + return FreePort() + } + return port, nil + } + return FreePort() +} + +// GatewayPort returns the gateway port from the environment variable or a free port. +func GatewayPort() (int, error) { + // 从环境变量获取端口号 + value, exists := os.LookupEnv("GATEWAY_PORT") + if exists { + var port int + _, err := fmt.Sscanf(value, "%d", &port) + if err != nil { + panic(err) + } + return port, nil + } + return 0, errors.New("could not determine gateway port") +} diff --git a/internal/report/tool_test.go b/internal/report/tool_test.go new file mode 100644 index 0000000..cee9d83 --- /dev/null +++ b/internal/report/tool_test.go @@ -0,0 +1,21 @@ +package report + +import ( + "testing" +) + +func TestFreePort(t *testing.T) { + port, err := FreePort() + if err != nil { + t.Fatalf("FreePort() error: %v", err) + } + t.Logf("FreePort: %v", port) +} + +func TestModulePort(t *testing.T) { + port, err := ModulePort() + if err != nil { + t.Fatalf("ModulePort() error: %v", err) + } + t.Logf("ModulePort: %v", port) +}