完善通道删除与定时失效功能

This commit is contained in:
2025-03-31 09:09:05 +08:00
parent ec4f499edd
commit 47bb49ce70
18 changed files with 832 additions and 619 deletions

62
pkg/env/env.go vendored
View File

@@ -55,21 +55,21 @@ func loadDb() {
if _DbName != "" {
DbName = _DbName
} else {
panic("环境变量 DB_NAME 的值为空")
panic("环境变量 DB_NAME 的值不能为空")
}
_DbUserName := os.Getenv("DB_USERNAME")
if _DbUserName != "" {
DbUserName = _DbUserName
} else {
panic("环境变量 DB_USERNAME 的值为空")
panic("环境变量 DB_USERNAME 的值不能为空")
}
_DbPassword := os.Getenv("DB_PASSWORD")
if _DbPassword != "" {
DbPassword = _DbPassword
} else {
panic("环境变量 DB_PASSWORD 的值为空")
panic("环境变量 DB_PASSWORD 的值不能为空")
}
}
@@ -134,6 +134,60 @@ func loadLog() {
// endregion
// region remote
var (
RemoteAddr = "http://103.139.212.110:9989"
RemoteToken string
)
func loadRemote() {
_RemoteAddr := os.Getenv("REMOTE_ADDR")
if _RemoteAddr != "" {
RemoteAddr = _RemoteAddr
}
_RemoteToken := os.Getenv("REMOTE_TOKEN")
if _RemoteToken == "" {
panic("环境变量 REMOTE_TOKEN 的值不能为空")
}
RemoteToken = _RemoteToken
}
// endregion
// region debug
var (
// DebugHttpDump 是否打印请求和响应的原始数据
DebugHttpDump = false
// DebugExternalChange 是否实际执行非幂等外部接口的调用。
// 例如外部数据修改接口,在内部接口调试时可以关闭,避免对外部数据产生影响
DebugExternalChange = true
)
func loadDebug() {
debugHttpDump := os.Getenv("DEBUG_HTTP_DUMP")
if debugHttpDump != "" {
value, err := strconv.ParseBool(debugHttpDump)
if err != nil {
panic("环境变量 DEBUG_HTTP_DUMP 的值不是布尔值")
}
DebugHttpDump = value
}
debugExternalChange := os.Getenv("DEBUG_EXTERNAL_CHANGE")
if debugExternalChange != "" {
value, err := strconv.ParseBool(debugExternalChange)
if err != nil {
panic("环境变量 DEBUG_EXTERNAL_CHANGE 的值不是布尔值")
}
DebugExternalChange = value
}
}
// endregion
func Init() {
err := godotenv.Load()
if err != nil {
@@ -146,4 +200,6 @@ func Init() {
loadDb()
loadRedis()
loadLog()
loadDebug()
loadRemote()
}

View File

@@ -6,6 +6,9 @@ import (
"fmt"
"io"
"net/http"
"net/http/httputil"
"net/url"
"platform/pkg/env"
"strconv"
"strings"
)
@@ -18,10 +21,9 @@ type client struct {
var Client client
func Init() {
// todo 从环境变量中获取参数
Client = client{
url: "http://103.139.212.110:9989",
token: "PhdnRF3z6VF2sPgygTSl1Xx6QJN0yFIK.anVpcA==.MTc0MzE2ODAwMQ==",
url: env.RemoteAddr,
token: env.RemoteToken,
}
}
@@ -151,8 +153,8 @@ func (c *client) CloudConnect(param CloudConnectReq) error {
type CloudDisconnectReq struct {
Uuid string `json:"uuid"`
Edge []string `json:"edge"`
Config []Config `json:"auto_config"`
Edge []string `json:"edge,omitempty"`
Config []Config `json:"auto_config,omitempty"`
}
type Config struct {
@@ -246,11 +248,29 @@ func (c *client) requestCloud(method string, url string, data string) (*http.Res
req.Header.Set("Content-Type", "application/json")
req.Header.Set("token", c.token)
if env.DebugHttpDump {
str, err := httputil.DumpRequest(req, true)
if err != nil {
return nil, err
}
fmt.Println("==============================")
fmt.Println(string(str))
}
resp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
}
if env.DebugHttpDump {
str, err := httputil.DumpResponse(resp, true)
if err != nil {
return nil, err
}
fmt.Println("==============================")
fmt.Println(string(str))
}
return resp, nil
}
@@ -267,22 +287,22 @@ func InitGateway(url, username, password string) *Gateway {
// region gateway:/port/configs
type PortConfigsReq struct {
Port int `json:"port"`
Edge []string `json:"edge,omitempty"`
Type string `json:"type,omitempty"`
Time int `json:"time,omitempty"`
Status bool `json:"status,omitempty"`
Rate int `json:"rate,omitempty"`
Whitelist []string `json:"whitelist,omitempty"`
Userpass string `json:"userpass,omitempty"`
AutoEdgeConfig AutoEdgeConfig `json:"auto_edge_config,omitempty"`
Port int `json:"port"`
Edge *[]string `json:"edge,omitempty"`
Type string `json:"type,omitempty"`
Time int `json:"time,omitempty"`
Status bool `json:"status"`
Rate int `json:"rate,omitempty"`
Whitelist *[]string `json:"whitelist,omitempty"`
Userpass *string `json:"userpass,omitempty"`
AutoEdgeConfig *AutoEdgeConfig `json:"auto_edge_config,omitempty"`
}
type AutoEdgeConfig struct {
Province string `json:"province,omitempty"`
City string `json:"city,omitempty"`
Isp string `json:"isp,omitempty"`
Count int `json:"count,omitempty"`
Count *int `json:"count,omitempty"`
PacketLoss int `json:"packet_loss,omitempty"`
}
@@ -332,8 +352,8 @@ func (c *Gateway) GatewayPortConfigs(params []PortConfigsReq) error {
type PortActiveReq struct {
Port string `json:"port"`
Active bool `json:"active"`
Status bool `json:"status"`
Active *bool `json:"active"`
Status *bool `json:"status"`
}
type PortActiveResp struct {
@@ -352,22 +372,34 @@ type PortData struct {
Userpass string `json:"userpass"`
}
func (c *Gateway) GatewayPortActive(param PortActiveReq) (*PortActiveResp, error) {
url := strings.Builder{}
url.WriteString("/port/active")
if param.Port != "" {
url.WriteString("/")
url.WriteString(param.Port)
func (c *Gateway) GatewayPortActive(param ...PortActiveReq) (map[string]PortData, error) {
_param := PortActiveReq{}
if len(param) != 0 {
_param = param[0]
}
url.WriteString("?active=")
url.WriteString(strconv.FormatBool(param.Active))
url.WriteString("&status=")
url.WriteString(strconv.FormatBool(param.Status))
path := strings.Builder{}
path.WriteString("/port/active")
resp, err := c.requestGateway("POST", url.String(), "")
if _param.Port != "" {
path.WriteString("/")
path.WriteString(_param.Port)
}
values := url.Values{}
if _param.Active != nil {
values.Set("active", strconv.FormatBool(*_param.Active))
}
if _param.Status != nil {
values.Set("status", strconv.FormatBool(*_param.Status))
}
if len(values) > 0 {
path.WriteString("?")
path.WriteString(values.Encode())
}
resp, err := c.requestGateway("GET", path.String(), "")
if err != nil {
return nil, err
}
@@ -390,7 +422,11 @@ func (c *Gateway) GatewayPortActive(param PortActiveReq) (*PortActiveResp, error
return nil, err
}
return &result, nil
if result.Code != 0 {
return nil, errors.New(result.Msg)
}
return result.Data, nil
}
// endregion
@@ -404,10 +440,28 @@ func (c *Gateway) requestGateway(method string, url string, data string) (*http.
req.Header.Set("Content-Type", "application/json")
if env.DebugHttpDump {
str, err := httputil.DumpRequest(req, true)
if err != nil {
return nil, err
}
fmt.Println("==============================")
fmt.Println(string(str))
}
resp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
}
if env.DebugHttpDump {
str, err := httputil.DumpResponse(resp, true)
if err != nil {
return nil, err
}
fmt.Println("==============================")
fmt.Println(string(str))
}
return resp, nil
}

6
pkg/v/v.go Normal file
View File

@@ -0,0 +1,6 @@
package v
// P 是一个工具函数,用于在表达式内原地创建一个指针
func P[T any](v T) *T {
return &v
}