diff --git a/internal/db/models/http_location_dao.go b/internal/db/models/http_location_dao.go index 26938fa0..710f2d9c 100644 --- a/internal/db/models/http_location_dao.go +++ b/internal/db/models/http_location_dao.go @@ -287,7 +287,7 @@ func (this *HTTPLocationDAO) FindEnabledLocationIdWithWebId(tx *dbs.Tx, webId in FindInt64Col(0) } -// FindEnabledLocationIdWithReverseProxyId 查找包含某个反向代理的Server +// FindEnabledLocationIdWithReverseProxyId 查找包含某个反向代理的路由规则 func (this *HTTPLocationDAO) FindEnabledLocationIdWithReverseProxyId(tx *dbs.Tx, reverseProxyId int64) (serverId int64, err error) { return this.Query(tx). State(ServerStateEnabled). diff --git a/internal/db/models/reverse_proxy_dao.go b/internal/db/models/reverse_proxy_dao.go index f9327c7e..94ca1bb5 100644 --- a/internal/db/models/reverse_proxy_dao.go +++ b/internal/db/models/reverse_proxy_dao.go @@ -406,5 +406,14 @@ func (this *ReverseProxyDAO) NotifyUpdate(tx *dbs.Tx, reverseProxyId int64) erro return SharedHTTPLocationDAO.NotifyUpdate(tx, locationId) } + // group + groupId, err := SharedServerGroupDAO.FindEnabledGroupIdWithReverseProxyId(tx, reverseProxyId) + if err != nil { + return err + } + if groupId > 0 { + return SharedServerGroupDAO.NotifyUpdate(tx, groupId) + } + return nil } diff --git a/internal/db/models/server_dao.go b/internal/db/models/server_dao.go index e6e8b402..f347dbee 100644 --- a/internal/db/models/server_dao.go +++ b/internal/db/models/server_dao.go @@ -713,6 +713,44 @@ func (this *ServerDAO) FindAllEnabledServerIdsWithUserId(tx *dbs.Tx, userId int6 return } +// FindAllEnabledServerIdsWithGroupId 获取某个分组下的所有的服务ID +func (this *ServerDAO) FindAllEnabledServerIdsWithGroupId(tx *dbs.Tx, groupId int64) (serverIds []int64, err error) { + ones, err := this.Query(tx). + State(ServerStateEnabled). + Where("JSON_CONTAINS(groupIds, :groupId)"). + Param("groupId", numberutils.FormatInt64(groupId)). + AscPk(). + ResultPk(). + FindAll() + for _, one := range ones { + serverIds = append(serverIds, int64(one.(*Server).Id)) + } + return +} + +// FindServerGroupIds 获取服务的分组ID +func (this *ServerDAO) FindServerGroupIds(tx *dbs.Tx, serverId int64) ([]int64, error) { + if serverId <= 0 { + return nil, nil + } + groupIdsString, err := this.Query(tx). + Pk(serverId). + Result("groupIds"). + FindStringCol("") + if err != nil { + return nil, err + } + if len(groupIdsString) == 0 { + return nil, nil + } + var result = []int64{} + err = json.Unmarshal([]byte(groupIdsString), &result) + if err != nil { + return result, err + } + return result, nil +} + // FindServerNodeFilters 查找服务的搜索条件 func (this *ServerDAO) FindServerNodeFilters(tx *dbs.Tx, serverId int64) (isOk bool, clusterId int64, err error) { one, err := this.Query(tx). @@ -760,6 +798,20 @@ func (this *ServerDAO) ComposeServerConfig(tx *dbs.Tx, server *Server, cacheMap config.Name = server.Name config.Description = server.Description + var groupConfig *serverconfigs.ServerGroupConfig + for _, groupId := range server.DecodeGroupIds() { + groupConfig1, err := SharedServerGroupDAO.ComposeGroupConfig(tx, groupId, cacheMap) + if err != nil { + return nil, err + } + if groupConfig1 == nil { + continue + } + groupConfig = groupConfig1 + break + } + config.Group = groupConfig + // ServerNames if len(server.ServerNames) > 0 && server.ServerNames != "null" { serverNames := []*serverconfigs.ServerNameConfig{} diff --git a/internal/db/models/server_group_dao.go b/internal/db/models/server_group_dao.go index 77e6e5bf..4019483d 100644 --- a/internal/db/models/server_group_dao.go +++ b/internal/db/models/server_group_dao.go @@ -1,10 +1,13 @@ package models import ( + "encoding/json" "github.com/TeaOSLab/EdgeAPI/internal/errors" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" _ "github.com/go-sql-driver/mysql" "github.com/iwind/TeaGo/Tea" "github.com/iwind/TeaGo/dbs" + "github.com/iwind/TeaGo/maps" "github.com/iwind/TeaGo/types" ) @@ -34,7 +37,7 @@ func init() { }) } -// 启用条目 +// EnableServerGroup 启用条目 func (this *ServerGroupDAO) EnableServerGroup(tx *dbs.Tx, id int64) error { _, err := this.Query(tx). Pk(id). @@ -43,7 +46,7 @@ func (this *ServerGroupDAO) EnableServerGroup(tx *dbs.Tx, id int64) error { return err } -// 禁用条目 +// DisableServerGroup 禁用条目 func (this *ServerGroupDAO) DisableServerGroup(tx *dbs.Tx, id int64) error { _, err := this.Query(tx). Pk(id). @@ -52,7 +55,7 @@ func (this *ServerGroupDAO) DisableServerGroup(tx *dbs.Tx, id int64) error { return err } -// 查找启用中的条目 +// FindEnabledServerGroup 查找启用中的条目 func (this *ServerGroupDAO) FindEnabledServerGroup(tx *dbs.Tx, id int64) (*ServerGroup, error) { result, err := this.Query(tx). Pk(id). @@ -64,7 +67,7 @@ func (this *ServerGroupDAO) FindEnabledServerGroup(tx *dbs.Tx, id int64) (*Serve return result.(*ServerGroup), err } -// 根据主键查找名称 +// FindServerGroupName 根据主键查找名称 func (this *ServerGroupDAO) FindServerGroupName(tx *dbs.Tx, id int64) (string, error) { return this.Query(tx). Pk(id). @@ -72,11 +75,12 @@ func (this *ServerGroupDAO) FindServerGroupName(tx *dbs.Tx, id int64) (string, e FindStringCol("") } -// 创建分组 +// CreateGroup 创建分组 func (this *ServerGroupDAO) CreateGroup(tx *dbs.Tx, name string) (groupId int64, err error) { op := NewServerGroupOperator() op.State = ServerGroupStateEnabled op.Name = name + op.IsOn = true err = this.Save(tx, op) if err != nil { return 0, err @@ -84,7 +88,7 @@ func (this *ServerGroupDAO) CreateGroup(tx *dbs.Tx, name string) (groupId int64, return types.Int64(op.Id), nil } -// 修改分组 +// UpdateGroup 修改分组 func (this *ServerGroupDAO) UpdateGroup(tx *dbs.Tx, groupId int64, name string) error { if groupId <= 0 { return errors.New("invalid groupId") @@ -96,7 +100,7 @@ func (this *ServerGroupDAO) UpdateGroup(tx *dbs.Tx, groupId int64, name string) return err } -// 查找所有分组 +// FindAllEnabledGroups 查找所有分组 func (this *ServerGroupDAO) FindAllEnabledGroups(tx *dbs.Tx) (result []*ServerGroup, err error) { _, err = this.Query(tx). State(ServerGroupStateEnabled). @@ -107,7 +111,7 @@ func (this *ServerGroupDAO) FindAllEnabledGroups(tx *dbs.Tx) (result []*ServerGr return } -// 修改分组排序 +// UpdateGroupOrders 修改分组排序 func (this *ServerGroupDAO) UpdateGroupOrders(tx *dbs.Tx, groupIds []int64) error { for index, groupId := range groupIds { _, err := this.Query(tx). @@ -120,3 +124,221 @@ func (this *ServerGroupDAO) UpdateGroupOrders(tx *dbs.Tx, groupIds []int64) erro } return nil } + +// FindHTTPReverseProxyRef 根据条件获取HTTP反向代理配置 +func (this *ServerGroupDAO) FindHTTPReverseProxyRef(tx *dbs.Tx, groupId int64) (*serverconfigs.ReverseProxyRef, error) { + reverseProxy, err := this.Query(tx). + Pk(groupId). + Result("httpReverseProxy"). + FindStringCol("") + if err != nil { + return nil, err + } + if len(reverseProxy) == 0 || reverseProxy == "null" { + return nil, nil + } + config := &serverconfigs.ReverseProxyRef{} + err = json.Unmarshal([]byte(reverseProxy), config) + return config, err +} + +// FindTCPReverseProxyRef 根据条件获取TCP反向代理配置 +func (this *ServerGroupDAO) FindTCPReverseProxyRef(tx *dbs.Tx, groupId int64) (*serverconfigs.ReverseProxyRef, error) { + reverseProxy, err := this.Query(tx). + Pk(groupId). + Result("tcpReverseProxy"). + FindStringCol("") + if err != nil { + return nil, err + } + if len(reverseProxy) == 0 || reverseProxy == "null" { + return nil, nil + } + config := &serverconfigs.ReverseProxyRef{} + err = json.Unmarshal([]byte(reverseProxy), config) + return config, err +} + +// FindUDPReverseProxyRef 根据条件获取UDP反向代理配置 +func (this *ServerGroupDAO) FindUDPReverseProxyRef(tx *dbs.Tx, groupId int64) (*serverconfigs.ReverseProxyRef, error) { + reverseProxy, err := this.Query(tx). + Pk(groupId). + Result("udpReverseProxy"). + FindStringCol("") + if err != nil { + return nil, err + } + if len(reverseProxy) == 0 || reverseProxy == "null" { + return nil, nil + } + config := &serverconfigs.ReverseProxyRef{} + err = json.Unmarshal([]byte(reverseProxy), config) + return config, err +} + +// UpdateHTTPReverseProxy 修改HTTP反向代理配置 +func (this *ServerGroupDAO) UpdateHTTPReverseProxy(tx *dbs.Tx, groupId int64, config []byte) error { + if groupId <= 0 { + return errors.New("groupId should not be smaller than 0") + } + op := NewServerGroupOperator() + op.Id = groupId + op.HttpReverseProxy = JSONBytes(config) + err := this.Save(tx, op) + if err != nil { + return err + } + + return this.NotifyUpdate(tx, groupId) +} + +// UpdateTCPReverseProxy 修改TCP反向代理配置 +func (this *ServerGroupDAO) UpdateTCPReverseProxy(tx *dbs.Tx, groupId int64, config []byte) error { + if groupId <= 0 { + return errors.New("groupId should not be smaller than 0") + } + op := NewServerGroupOperator() + op.Id = groupId + op.TcpReverseProxy = JSONBytes(config) + err := this.Save(tx, op) + if err != nil { + return err + } + + return this.NotifyUpdate(tx, groupId) +} + +// UpdateUDPReverseProxy 修改UDP反向代理配置 +func (this *ServerGroupDAO) UpdateUDPReverseProxy(tx *dbs.Tx, groupId int64, config []byte) error { + if groupId <= 0 { + return errors.New("groupId should not be smaller than 0") + } + op := NewServerGroupOperator() + op.Id = groupId + op.UdpReverseProxy = JSONBytes(config) + err := this.Save(tx, op) + if err != nil { + return err + } + + return this.NotifyUpdate(tx, groupId) +} + +// ComposeGroupConfig 组合配置 +func (this *ServerGroupDAO) ComposeGroupConfig(tx *dbs.Tx, groupId int64, cacheMap maps.Map) (*serverconfigs.ServerGroupConfig, error) { + if cacheMap == nil { + cacheMap = maps.Map{} + } + + var cacheKey = this.Table + ":config:" + types.String(groupId) + var cacheConfig = cacheMap.Get(cacheKey) + if cacheConfig != nil { + // 克隆,防止分解后的Server配置相互受到影响 + configJSON, err := json.Marshal(cacheConfig) + if err != nil { + return nil, err + } + + var clonedConfig = &serverconfigs.ServerGroupConfig{} + err = json.Unmarshal(configJSON, clonedConfig) + if err != nil { + return nil, err + } + return clonedConfig, nil + } + + group, err := this.FindEnabledServerGroup(tx, groupId) + if err != nil { + return nil, err + } + if group == nil { + return nil, nil + } + + var config = &serverconfigs.ServerGroupConfig{ + Id: int64(group.Id), + Name: group.Name, + IsOn: group.IsOn == 1, + } + + if len(group.HttpReverseProxy) > 0 { + reverseProxyRef := &serverconfigs.ReverseProxyRef{} + err := json.Unmarshal([]byte(group.HttpReverseProxy), reverseProxyRef) + if err != nil { + return nil, err + } + config.HTTPReverseProxyRef = reverseProxyRef + + reverseProxyConfig, err := SharedReverseProxyDAO.ComposeReverseProxyConfig(tx, reverseProxyRef.ReverseProxyId, cacheMap) + if err != nil { + return nil, err + } + if reverseProxyConfig != nil { + config.HTTPReverseProxy = reverseProxyConfig + } + } + + if len(group.TcpReverseProxy) > 0 { + reverseProxyRef := &serverconfigs.ReverseProxyRef{} + err := json.Unmarshal([]byte(group.TcpReverseProxy), reverseProxyRef) + if err != nil { + return nil, err + } + config.TCPReverseProxyRef = reverseProxyRef + + reverseProxyConfig, err := SharedReverseProxyDAO.ComposeReverseProxyConfig(tx, reverseProxyRef.ReverseProxyId, cacheMap) + if err != nil { + return nil, err + } + if reverseProxyConfig != nil { + config.TCPReverseProxy = reverseProxyConfig + } + } + + if len(group.UdpReverseProxy) > 0 { + reverseProxyRef := &serverconfigs.ReverseProxyRef{} + err := json.Unmarshal([]byte(group.UdpReverseProxy), reverseProxyRef) + if err != nil { + return nil, err + } + config.UDPReverseProxyRef = reverseProxyRef + + reverseProxyConfig, err := SharedReverseProxyDAO.ComposeReverseProxyConfig(tx, reverseProxyRef.ReverseProxyId, cacheMap) + if err != nil { + return nil, err + } + if reverseProxyConfig != nil { + config.UDPReverseProxy = reverseProxyConfig + } + } + + cacheMap[cacheKey] = config + + return config, nil +} + +// FindEnabledGroupIdWithReverseProxyId 查找包含某个反向代理的服务分组 +func (this *ServerGroupDAO) FindEnabledGroupIdWithReverseProxyId(tx *dbs.Tx, reverseProxyId int64) (serverId int64, err error) { + return this.Query(tx). + State(ServerStateEnabled). + Where("(JSON_CONTAINS(httpReverseProxy, :jsonQuery) OR JSON_CONTAINS(tcpReverseProxy, :jsonQuery) OR JSON_CONTAINS(udpReverseProxy, :jsonQuery))"). + Param("jsonQuery", maps.Map{"reverseProxyId": reverseProxyId}.AsJSON()). + ResultPk(). + FindInt64Col(0) +} + + +// NotifyUpdate 通知更新 +func (this *ServerGroupDAO) NotifyUpdate(tx *dbs.Tx, groupId int64) error { + serverIds, err := SharedServerDAO.FindAllEnabledServerIdsWithGroupId(tx, groupId) + if err != nil { + return err + } + for _, serverId := range serverIds { + err = SharedServerDAO.NotifyUpdate(tx, serverId) + if err != nil { + return err + } + } + return nil +} diff --git a/internal/db/models/server_group_model.go b/internal/db/models/server_group_model.go index 573aff58..4f0a83aa 100644 --- a/internal/db/models/server_group_model.go +++ b/internal/db/models/server_group_model.go @@ -1,24 +1,34 @@ package models -// 服务分组 +// ServerGroup 服务分组 type ServerGroup struct { - Id uint32 `field:"id"` // ID - AdminId uint32 `field:"adminId"` // 管理员ID - UserId uint32 `field:"userId"` // 用户ID - Name string `field:"name"` // 名称 - Order uint32 `field:"order"` // 排序 - CreatedAt uint64 `field:"createdAt"` // 创建时间 - State uint8 `field:"state"` // 状态 + Id uint32 `field:"id"` // ID + AdminId uint32 `field:"adminId"` // 管理员ID + UserId uint32 `field:"userId"` // 用户ID + IsOn uint8 `field:"isOn"` // 是否启用 + Name string `field:"name"` // 名称 + Order uint32 `field:"order"` // 排序 + CreatedAt uint64 `field:"createdAt"` // 创建时间 + State uint8 `field:"state"` // 状态 + HttpReverseProxy string `field:"httpReverseProxy"` // 反向代理设置 + TcpReverseProxy string `field:"tcpReverseProxy"` // TCP反向代理 + UdpReverseProxy string `field:"udpReverseProxy"` // UDP反向代理 + WebId uint32 `field:"webId"` // Web配置ID } type ServerGroupOperator struct { - Id interface{} // ID - AdminId interface{} // 管理员ID - UserId interface{} // 用户ID - Name interface{} // 名称 - Order interface{} // 排序 - CreatedAt interface{} // 创建时间 - State interface{} // 状态 + Id interface{} // ID + AdminId interface{} // 管理员ID + UserId interface{} // 用户ID + IsOn interface{} // 是否启用 + Name interface{} // 名称 + Order interface{} // 排序 + CreatedAt interface{} // 创建时间 + State interface{} // 状态 + HttpReverseProxy interface{} // 反向代理设置 + TcpReverseProxy interface{} // TCP反向代理 + UdpReverseProxy interface{} // UDP反向代理 + WebId interface{} // Web配置ID } func NewServerGroupOperator() *ServerGroupOperator { diff --git a/internal/db/models/server_model_ext.go b/internal/db/models/server_model_ext.go index 2640e7f9..911b493f 100644 --- a/internal/db/models/server_model_ext.go +++ b/internal/db/models/server_model_ext.go @@ -1 +1,21 @@ package models + +import ( + "encoding/json" + "github.com/TeaOSLab/EdgeAPI/internal/remotelogs" +) + +// DecodeGroupIds 解析服务所属分组ID +func (this *Server) DecodeGroupIds() []int64 { + if len(this.GroupIds) == 0 { + return []int64{} + } + + var result = []int64{} + err := json.Unmarshal([]byte(this.GroupIds), &result) + if err != nil { + remotelogs.Error("Server.DecodeGroupIds", err.Error()) + // 忽略错误 + } + return result +} diff --git a/internal/rpc/services/service_server_group.go b/internal/rpc/services/service_server_group.go index 9565cf8d..a5f972e8 100644 --- a/internal/rpc/services/service_server_group.go +++ b/internal/rpc/services/service_server_group.go @@ -2,8 +2,10 @@ package services import ( "context" + "encoding/json" "github.com/TeaOSLab/EdgeAPI/internal/db/models" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" ) // ServerGroupService 服务分组相关服务 @@ -132,3 +134,293 @@ func (this *ServerGroupService) FindEnabledServerGroup(ctx context.Context, req }, }, nil } + +// FindAndInitServerGroupHTTPReverseProxyConfig 查找HTTP反向代理设置 +func (this *ServerGroupService) FindAndInitServerGroupHTTPReverseProxyConfig(ctx context.Context, req *pb.FindAndInitServerGroupHTTPReverseProxyConfigRequest) (*pb.FindAndInitServerGroupHTTPReverseProxyConfigResponse, error) { + // 校验请求 + adminId, err := this.ValidateAdmin(ctx, 0) + if err != nil { + return nil, err + } + + tx := this.NullTx() + + reverseProxyRef, err := models.SharedServerGroupDAO.FindHTTPReverseProxyRef(tx, req.ServerGroupId) + if err != nil { + return nil, err + } + + if reverseProxyRef == nil { + reverseProxyId, err := models.SharedReverseProxyDAO.CreateReverseProxy(tx, adminId, 0, nil, nil, nil) + if err != nil { + return nil, err + } + + reverseProxyRef = &serverconfigs.ReverseProxyRef{ + IsOn: false, + ReverseProxyId: reverseProxyId, + } + refJSON, err := json.Marshal(reverseProxyRef) + if err != nil { + return nil, err + } + err = models.SharedServerGroupDAO.UpdateHTTPReverseProxy(tx, req.ServerGroupId, refJSON) + if err != nil { + return nil, err + } + } + + reverseProxyConfig, err := models.SharedReverseProxyDAO.ComposeReverseProxyConfig(tx, reverseProxyRef.ReverseProxyId, nil) + if err != nil { + return nil, err + } + + configJSON, err := json.Marshal(reverseProxyConfig) + if err != nil { + return nil, err + } + + refJSON, err := json.Marshal(reverseProxyRef) + if err != nil { + return nil, err + } + + return &pb.FindAndInitServerGroupHTTPReverseProxyConfigResponse{ReverseProxyJSON: configJSON, ReverseProxyRefJSON: refJSON}, nil +} + +// FindAndInitServerGroupTCPReverseProxyConfig 查找反向代理设置 +func (this *ServerGroupService) FindAndInitServerGroupTCPReverseProxyConfig(ctx context.Context, req *pb.FindAndInitServerGroupTCPReverseProxyConfigRequest) (*pb.FindAndInitServerGroupTCPReverseProxyConfigResponse, error) { + // 校验请求 + adminId, err := this.ValidateAdmin(ctx, 0) + if err != nil { + return nil, err + } + + tx := this.NullTx() + + reverseProxyRef, err := models.SharedServerGroupDAO.FindTCPReverseProxyRef(tx, req.ServerGroupId) + if err != nil { + return nil, err + } + + if reverseProxyRef == nil { + reverseProxyId, err := models.SharedReverseProxyDAO.CreateReverseProxy(tx, adminId, 0, nil, nil, nil) + if err != nil { + return nil, err + } + + reverseProxyRef = &serverconfigs.ReverseProxyRef{ + IsOn: false, + ReverseProxyId: reverseProxyId, + } + refJSON, err := json.Marshal(reverseProxyRef) + if err != nil { + return nil, err + } + err = models.SharedServerGroupDAO.UpdateTCPReverseProxy(tx, req.ServerGroupId, refJSON) + if err != nil { + return nil, err + } + } + + reverseProxyConfig, err := models.SharedReverseProxyDAO.ComposeReverseProxyConfig(tx, reverseProxyRef.ReverseProxyId, nil) + if err != nil { + return nil, err + } + + configJSON, err := json.Marshal(reverseProxyConfig) + if err != nil { + return nil, err + } + + refJSON, err := json.Marshal(reverseProxyRef) + if err != nil { + return nil, err + } + + return &pb.FindAndInitServerGroupTCPReverseProxyConfigResponse{ReverseProxyJSON: configJSON, ReverseProxyRefJSON: refJSON}, nil +} + +// FindAndInitServerGroupUDPReverseProxyConfig 查找反向代理设置 +func (this *ServerGroupService) FindAndInitServerGroupUDPReverseProxyConfig(ctx context.Context, req *pb.FindAndInitServerGroupUDPReverseProxyConfigRequest) (*pb.FindAndInitServerGroupUDPReverseProxyConfigResponse, error) { + // 校验请求 + adminId, err := this.ValidateAdmin(ctx, 0) + if err != nil { + return nil, err + } + + tx := this.NullTx() + + reverseProxyRef, err := models.SharedServerGroupDAO.FindUDPReverseProxyRef(tx, req.ServerGroupId) + if err != nil { + return nil, err + } + + if reverseProxyRef == nil { + reverseProxyId, err := models.SharedReverseProxyDAO.CreateReverseProxy(tx, adminId, 0, nil, nil, nil) + if err != nil { + return nil, err + } + + reverseProxyRef = &serverconfigs.ReverseProxyRef{ + IsOn: false, + ReverseProxyId: reverseProxyId, + } + refJSON, err := json.Marshal(reverseProxyRef) + if err != nil { + return nil, err + } + err = models.SharedServerGroupDAO.UpdateUDPReverseProxy(tx, req.ServerGroupId, refJSON) + if err != nil { + return nil, err + } + } + + reverseProxyConfig, err := models.SharedReverseProxyDAO.ComposeReverseProxyConfig(tx, reverseProxyRef.ReverseProxyId, nil) + if err != nil { + return nil, err + } + + configJSON, err := json.Marshal(reverseProxyConfig) + if err != nil { + return nil, err + } + + refJSON, err := json.Marshal(reverseProxyRef) + if err != nil { + return nil, err + } + + return &pb.FindAndInitServerGroupUDPReverseProxyConfigResponse{ReverseProxyJSON: configJSON, ReverseProxyRefJSON: refJSON}, nil +} + +// UpdateServerGroupHTTPReverseProxy 修改服务的反向代理设置 +func (this *ServerGroupService) UpdateServerGroupHTTPReverseProxy(ctx context.Context, req *pb.UpdateServerGroupHTTPReverseProxyRequest) (*pb.RPCSuccess, error) { + // 校验请求 + _, err := this.ValidateAdmin(ctx, 0) + if err != nil { + return nil, err + } + + tx := this.NullTx() + + // 修改配置 + err = models.SharedServerGroupDAO.UpdateHTTPReverseProxy(tx, req.ServerGroupId, req.ReverseProxyJSON) + if err != nil { + return nil, err + } + + return this.Success() +} + +// UpdateServerGroupTCPReverseProxy 修改服务的反向代理设置 +func (this *ServerGroupService) UpdateServerGroupTCPReverseProxy(ctx context.Context, req *pb.UpdateServerGroupTCPReverseProxyRequest) (*pb.RPCSuccess, error) { + // 校验请求 + _, err := this.ValidateAdmin(ctx, 0) + if err != nil { + return nil, err + } + + tx := this.NullTx() + + // 修改配置 + err = models.SharedServerGroupDAO.UpdateTCPReverseProxy(tx, req.ServerGroupId, req.ReverseProxyJSON) + if err != nil { + return nil, err + } + + return this.Success() +} + +// UpdateServerGroupUDPReverseProxy 修改服务的反向代理设置 +func (this *ServerGroupService) UpdateServerGroupUDPReverseProxy(ctx context.Context, req *pb.UpdateServerGroupUDPReverseProxyRequest) (*pb.RPCSuccess, error) { + // 校验请求 + _, err := this.ValidateAdmin(ctx, 0) + if err != nil { + return nil, err + } + + tx := this.NullTx() + + // 修改配置 + err = models.SharedServerGroupDAO.UpdateUDPReverseProxy(tx, req.ServerGroupId, req.ReverseProxyJSON) + if err != nil { + return nil, err + } + + return this.Success() +} + +// FindEnabledServerGroupConfigInfo 取得分组的配置概要信息 +func (this *ServerGroupService) FindEnabledServerGroupConfigInfo(ctx context.Context, req *pb.FindEnabledServerGroupConfigInfoRequest) (*pb.FindEnabledServerGroupConfigInfoResponse, error) { + // 校验请求 + _, err := this.ValidateAdmin(ctx, 0) + if err != nil { + return nil, err + } + + tx := this.NullTx() + + var group *models.ServerGroup + if req.ServerGroupId > 0 { + group, err = models.SharedServerGroupDAO.FindEnabledServerGroup(tx, req.ServerGroupId) + if err != nil { + return nil, err + } + } else if req.ServerId > 0 { + groupIds, err := models.SharedServerDAO.FindServerGroupIds(tx, req.ServerId) + if err != nil { + return nil, err + } + if len(groupIds) > 0 { + for _, groupId := range groupIds { + group, err = models.SharedServerGroupDAO.FindEnabledServerGroup(tx, groupId) + if err != nil { + return nil, err + } + if group != nil { + break + } + } + } + } + + if group == nil { + return &pb.FindEnabledServerGroupConfigInfoResponse{ + HasHTTPReverseProxy: false, + HasTCPReverseProxy: false, + HasUDPReverseProxy: false, + }, nil + } + + var result = &pb.FindEnabledServerGroupConfigInfoResponse{} + + if len(group.HttpReverseProxy) > 0 { + var ref = &serverconfigs.ReverseProxyRef{} + err = json.Unmarshal([]byte(group.HttpReverseProxy), ref) + if err != nil { + return nil, err + } + result.HasHTTPReverseProxy = ref.IsPrior + } + + if len(group.TcpReverseProxy) > 0 { + var ref = &serverconfigs.ReverseProxyRef{} + err = json.Unmarshal([]byte(group.TcpReverseProxy), ref) + if err != nil { + return nil, err + } + result.HasTCPReverseProxy = ref.IsPrior + } + + if len(group.UdpReverseProxy) > 0 { + var ref = &serverconfigs.ReverseProxyRef{} + err = json.Unmarshal([]byte(group.UdpReverseProxy), ref) + if err != nil { + return nil, err + } + result.HasUDPReverseProxy = ref.IsPrior + } + + return result, nil +}