mirror of
				https://github.com/TeaOSLab/EdgeAPI.git
				synced 2025-11-04 16:00:24 +08:00 
			
		
		
		
	阶段性提交
This commit is contained in:
		@@ -59,6 +59,8 @@ func (this *APINode) listenRPC() error {
 | 
				
			|||||||
	pb.RegisterNodeIPAddressServiceServer(rpcServer, &services.NodeIPAddressService{})
 | 
						pb.RegisterNodeIPAddressServiceServer(rpcServer, &services.NodeIPAddressService{})
 | 
				
			||||||
	pb.RegisterAPINodeServiceServer(rpcServer, &services.APINodeService{})
 | 
						pb.RegisterAPINodeServiceServer(rpcServer, &services.APINodeService{})
 | 
				
			||||||
	pb.RegisterOriginServerServiceServer(rpcServer, &services.OriginServerService{})
 | 
						pb.RegisterOriginServerServiceServer(rpcServer, &services.OriginServerService{})
 | 
				
			||||||
 | 
						pb.RegisterHTTPWebServiceServer(rpcServer, &services.HTTPWebService{})
 | 
				
			||||||
 | 
						pb.RegisterReverseProxyServiceServer(rpcServer, &services.ReverseProxyService{})
 | 
				
			||||||
	err = rpcServer.Serve(listener)
 | 
						err = rpcServer.Serve(listener)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return errors.New("[API]start rpc failed: " + err.Error())
 | 
							return errors.New("[API]start rpc failed: " + err.Error())
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,7 @@ type HTTPCachePolicy struct {
 | 
				
			|||||||
	Id                       uint32 `field:"id"`                       // ID
 | 
						Id                       uint32 `field:"id"`                       // ID
 | 
				
			||||||
	AdminId                  uint32 `field:"adminId"`                  // 管理员ID
 | 
						AdminId                  uint32 `field:"adminId"`                  // 管理员ID
 | 
				
			||||||
	UserId                   uint32 `field:"userId"`                   // 用户ID
 | 
						UserId                   uint32 `field:"userId"`                   // 用户ID
 | 
				
			||||||
 | 
						TemplateId               uint32 `field:"templateId"`               // 模版ID
 | 
				
			||||||
	IsOn                     uint8  `field:"isOn"`                     // 是否启用
 | 
						IsOn                     uint8  `field:"isOn"`                     // 是否启用
 | 
				
			||||||
	Name                     string `field:"name"`                     // 名称
 | 
						Name                     string `field:"name"`                     // 名称
 | 
				
			||||||
	Key                      string `field:"key"`                      // 缓存Key规则
 | 
						Key                      string `field:"key"`                      // 缓存Key规则
 | 
				
			||||||
@@ -24,6 +25,7 @@ type HTTPCachePolicyOperator struct {
 | 
				
			|||||||
	Id                       interface{} // ID
 | 
						Id                       interface{} // ID
 | 
				
			||||||
	AdminId                  interface{} // 管理员ID
 | 
						AdminId                  interface{} // 管理员ID
 | 
				
			||||||
	UserId                   interface{} // 用户ID
 | 
						UserId                   interface{} // 用户ID
 | 
				
			||||||
 | 
						TemplateId               interface{} // 模版ID
 | 
				
			||||||
	IsOn                     interface{} // 是否启用
 | 
						IsOn                     interface{} // 是否启用
 | 
				
			||||||
	Name                     interface{} // 名称
 | 
						Name                     interface{} // 名称
 | 
				
			||||||
	Key                      interface{} // 缓存Key规则
 | 
						Key                      interface{} // 缓存Key规则
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,7 @@ type HTTPHeader struct {
 | 
				
			|||||||
	Id         uint32 `field:"id"`         // ID
 | 
						Id         uint32 `field:"id"`         // ID
 | 
				
			||||||
	AdminId    uint32 `field:"adminId"`    // 管理员ID
 | 
						AdminId    uint32 `field:"adminId"`    // 管理员ID
 | 
				
			||||||
	UserId     uint32 `field:"userId"`     // 用户ID
 | 
						UserId     uint32 `field:"userId"`     // 用户ID
 | 
				
			||||||
 | 
						TemplateId uint32 `field:"templateId"` // 模版ID
 | 
				
			||||||
	IsOn       uint8  `field:"isOn"`       // 是否启用
 | 
						IsOn       uint8  `field:"isOn"`       // 是否启用
 | 
				
			||||||
	Name       string `field:"name"`       // 名称
 | 
						Name       string `field:"name"`       // 名称
 | 
				
			||||||
	Value      string `field:"value"`      // 值
 | 
						Value      string `field:"value"`      // 值
 | 
				
			||||||
@@ -18,6 +19,7 @@ type HTTPHeaderOperator struct {
 | 
				
			|||||||
	Id         interface{} // ID
 | 
						Id         interface{} // ID
 | 
				
			||||||
	AdminId    interface{} // 管理员ID
 | 
						AdminId    interface{} // 管理员ID
 | 
				
			||||||
	UserId     interface{} // 用户ID
 | 
						UserId     interface{} // 用户ID
 | 
				
			||||||
 | 
						TemplateId interface{} // 模版ID
 | 
				
			||||||
	IsOn       interface{} // 是否启用
 | 
						IsOn       interface{} // 是否启用
 | 
				
			||||||
	Name       interface{} // 名称
 | 
						Name       interface{} // 名称
 | 
				
			||||||
	Value      interface{} // 值
 | 
						Value      interface{} // 值
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										102
									
								
								internal/db/models/http_web_dao.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								internal/db/models/http_web_dao.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,102 @@
 | 
				
			|||||||
 | 
					package models
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"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/types"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						HTTPWebStateEnabled  = 1 // 已启用
 | 
				
			||||||
 | 
						HTTPWebStateDisabled = 0 // 已禁用
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type HTTPWebDAO dbs.DAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewHTTPWebDAO() *HTTPWebDAO {
 | 
				
			||||||
 | 
						return dbs.NewDAO(&HTTPWebDAO{
 | 
				
			||||||
 | 
							DAOObject: dbs.DAOObject{
 | 
				
			||||||
 | 
								DB:     Tea.Env,
 | 
				
			||||||
 | 
								Table:  "edgeHTTPWebs",
 | 
				
			||||||
 | 
								Model:  new(HTTPWeb),
 | 
				
			||||||
 | 
								PkName: "id",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}).(*HTTPWebDAO)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var SharedHTTPWebDAO = NewHTTPWebDAO()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 启用条目
 | 
				
			||||||
 | 
					func (this *HTTPWebDAO) EnableHTTPWeb(id int64) error {
 | 
				
			||||||
 | 
						_, err := this.Query().
 | 
				
			||||||
 | 
							Pk(id).
 | 
				
			||||||
 | 
							Set("state", HTTPWebStateEnabled).
 | 
				
			||||||
 | 
							Update()
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 禁用条目
 | 
				
			||||||
 | 
					func (this *HTTPWebDAO) DisableHTTPWeb(id int64) error {
 | 
				
			||||||
 | 
						_, err := this.Query().
 | 
				
			||||||
 | 
							Pk(id).
 | 
				
			||||||
 | 
							Set("state", HTTPWebStateDisabled).
 | 
				
			||||||
 | 
							Update()
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 查找启用中的条目
 | 
				
			||||||
 | 
					func (this *HTTPWebDAO) FindEnabledHTTPWeb(id int64) (*HTTPWeb, error) {
 | 
				
			||||||
 | 
						result, err := this.Query().
 | 
				
			||||||
 | 
							Pk(id).
 | 
				
			||||||
 | 
							Attr("state", HTTPWebStateEnabled).
 | 
				
			||||||
 | 
							Find()
 | 
				
			||||||
 | 
						if result == nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return result.(*HTTPWeb), err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 组合配置
 | 
				
			||||||
 | 
					func (this *HTTPWebDAO) ComposeWebConfig(webId int64) (*serverconfigs.WebConfig, error) {
 | 
				
			||||||
 | 
						web, err := SharedHTTPWebDAO.FindEnabledHTTPWeb(webId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if web == nil {
 | 
				
			||||||
 | 
							return nil, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						config := &serverconfigs.WebConfig{}
 | 
				
			||||||
 | 
						config.IsOn = web.IsOn == 1
 | 
				
			||||||
 | 
						config.Root = web.Root
 | 
				
			||||||
 | 
						return config, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 创建Web配置
 | 
				
			||||||
 | 
					func (this *HTTPWebDAO) CreateWeb(root string) (int64, error) {
 | 
				
			||||||
 | 
						op := NewHTTPWebOperator()
 | 
				
			||||||
 | 
						op.State = HTTPWebStateEnabled
 | 
				
			||||||
 | 
						op.Root = root
 | 
				
			||||||
 | 
						_, err := this.Save(op)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return types.Int64(op.Id), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改Web配置
 | 
				
			||||||
 | 
					func (this *HTTPWebDAO) UpdateWeb(webId int64, root string) error {
 | 
				
			||||||
 | 
						if webId <= 0 {
 | 
				
			||||||
 | 
							return errors.New("invalid webId")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						op := NewHTTPWebOperator()
 | 
				
			||||||
 | 
						op.Id = webId
 | 
				
			||||||
 | 
						op.Root = root
 | 
				
			||||||
 | 
						_, err := this.Save(op)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// TODO 更新所有使用此Web配置的服务
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										5
									
								
								internal/db/models/http_web_dao_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								internal/db/models/http_web_dao_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					package models
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						_ "github.com/go-sql-driver/mysql"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
							
								
								
									
										28
									
								
								internal/db/models/http_web_model.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								internal/db/models/http_web_model.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					package models
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					type HTTPWeb struct {
 | 
				
			||||||
 | 
						Id         uint32 `field:"id"`         // ID
 | 
				
			||||||
 | 
						IsOn       uint8  `field:"isOn"`       // 是否启用
 | 
				
			||||||
 | 
						TemplateId uint32 `field:"templateId"` // 模版ID
 | 
				
			||||||
 | 
						AdminId    uint32 `field:"adminId"`    // 管理员ID
 | 
				
			||||||
 | 
						UserId     uint32 `field:"userId"`     // 用户ID
 | 
				
			||||||
 | 
						State      uint8  `field:"state"`      // 状态
 | 
				
			||||||
 | 
						CreatedAt  uint32 `field:"createdAt"`  // 创建时间
 | 
				
			||||||
 | 
						Root       string `field:"root"`       // 资源根目录
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type HTTPWebOperator struct {
 | 
				
			||||||
 | 
						Id         interface{} // ID
 | 
				
			||||||
 | 
						IsOn       interface{} // 是否启用
 | 
				
			||||||
 | 
						TemplateId interface{} // 模版ID
 | 
				
			||||||
 | 
						AdminId    interface{} // 管理员ID
 | 
				
			||||||
 | 
						UserId     interface{} // 用户ID
 | 
				
			||||||
 | 
						State      interface{} // 状态
 | 
				
			||||||
 | 
						CreatedAt  interface{} // 创建时间
 | 
				
			||||||
 | 
						Root       interface{} // 资源根目录
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewHTTPWebOperator() *HTTPWebOperator {
 | 
				
			||||||
 | 
						return &HTTPWebOperator{}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										1
									
								
								internal/db/models/http_web_model_ext.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								internal/db/models/http_web_model_ext.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					package models
 | 
				
			||||||
@@ -3,25 +3,29 @@ package models
 | 
				
			|||||||
// 节点集群
 | 
					// 节点集群
 | 
				
			||||||
type NodeCluster struct {
 | 
					type NodeCluster struct {
 | 
				
			||||||
	Id             uint32 `field:"id"`             // ID
 | 
						Id             uint32 `field:"id"`             // ID
 | 
				
			||||||
 | 
						AdminId        uint32 `field:"adminId"`        // 管理员ID
 | 
				
			||||||
 | 
						UserId         uint32 `field:"userId"`         // 用户ID
 | 
				
			||||||
	Name           string `field:"name"`           // 名称
 | 
						Name           string `field:"name"`           // 名称
 | 
				
			||||||
	InstallDir     string `field:"installDir"`     // 安装目录
 | 
					 | 
				
			||||||
	GrantId        uint32 `field:"grantId"`        // 默认认证方式
 | 
					 | 
				
			||||||
	UseAllAPINodes uint8  `field:"useAllAPINodes"` // 是否使用所有API节点
 | 
						UseAllAPINodes uint8  `field:"useAllAPINodes"` // 是否使用所有API节点
 | 
				
			||||||
	ApiNodes       string `field:"apiNodes"`       // 使用的API节点
 | 
						ApiNodes       string `field:"apiNodes"`       // 使用的API节点
 | 
				
			||||||
 | 
						InstallDir     string `field:"installDir"`     // 安装目录
 | 
				
			||||||
	Order          uint32 `field:"order"`          // 排序
 | 
						Order          uint32 `field:"order"`          // 排序
 | 
				
			||||||
	CreatedAt      uint32 `field:"createdAt"`      // 创建时间
 | 
						CreatedAt      uint32 `field:"createdAt"`      // 创建时间
 | 
				
			||||||
 | 
						GrantId        uint32 `field:"grantId"`        // 默认认证方式
 | 
				
			||||||
	State          uint8  `field:"state"`          // 状态
 | 
						State          uint8  `field:"state"`          // 状态
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type NodeClusterOperator struct {
 | 
					type NodeClusterOperator struct {
 | 
				
			||||||
	Id             interface{} // ID
 | 
						Id             interface{} // ID
 | 
				
			||||||
 | 
						AdminId        interface{} // 管理员ID
 | 
				
			||||||
 | 
						UserId         interface{} // 用户ID
 | 
				
			||||||
	Name           interface{} // 名称
 | 
						Name           interface{} // 名称
 | 
				
			||||||
	InstallDir     interface{} // 安装目录
 | 
					 | 
				
			||||||
	GrantId        interface{} // 默认认证方式
 | 
					 | 
				
			||||||
	UseAllAPINodes interface{} // 是否使用所有API节点
 | 
						UseAllAPINodes interface{} // 是否使用所有API节点
 | 
				
			||||||
	ApiNodes       interface{} // 使用的API节点
 | 
						ApiNodes       interface{} // 使用的API节点
 | 
				
			||||||
 | 
						InstallDir     interface{} // 安装目录
 | 
				
			||||||
	Order          interface{} // 排序
 | 
						Order          interface{} // 排序
 | 
				
			||||||
	CreatedAt      interface{} // 创建时间
 | 
						CreatedAt      interface{} // 创建时间
 | 
				
			||||||
 | 
						GrantId        interface{} // 默认认证方式
 | 
				
			||||||
	State          interface{} // 状态
 | 
						State          interface{} // 状态
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								internal/db/models/node_cluster_model_ext.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								internal/db/models/node_cluster_model_ext.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					package models
 | 
				
			||||||
@@ -3,6 +3,8 @@ package models
 | 
				
			|||||||
// 节点
 | 
					// 节点
 | 
				
			||||||
type Node struct {
 | 
					type Node struct {
 | 
				
			||||||
	Id            uint32 `field:"id"`            // ID
 | 
						Id            uint32 `field:"id"`            // ID
 | 
				
			||||||
 | 
						AdminId       uint32 `field:"adminId"`       // 管理员ID
 | 
				
			||||||
 | 
						UserId        uint32 `field:"userId"`        // 用户ID
 | 
				
			||||||
	IsOn          uint8  `field:"isOn"`          // 是否启用
 | 
						IsOn          uint8  `field:"isOn"`          // 是否启用
 | 
				
			||||||
	UniqueId      string `field:"uniqueId"`      // 节点ID
 | 
						UniqueId      string `field:"uniqueId"`      // 节点ID
 | 
				
			||||||
	Secret        string `field:"secret"`        // 密钥
 | 
						Secret        string `field:"secret"`        // 密钥
 | 
				
			||||||
@@ -23,6 +25,8 @@ type Node struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
type NodeOperator struct {
 | 
					type NodeOperator struct {
 | 
				
			||||||
	Id            interface{} // ID
 | 
						Id            interface{} // ID
 | 
				
			||||||
 | 
						AdminId       interface{} // 管理员ID
 | 
				
			||||||
 | 
						UserId        interface{} // 用户ID
 | 
				
			||||||
	IsOn          interface{} // 是否启用
 | 
						IsOn          interface{} // 是否启用
 | 
				
			||||||
	UniqueId      interface{} // 节点ID
 | 
						UniqueId      interface{} // 节点ID
 | 
				
			||||||
	Secret        interface{} // 密钥
 | 
						Secret        interface{} // 密钥
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,11 @@
 | 
				
			|||||||
package models
 | 
					package models
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/sslconfigs"
 | 
				
			||||||
	_ "github.com/go-sql-driver/mysql"
 | 
						_ "github.com/go-sql-driver/mysql"
 | 
				
			||||||
	"github.com/iwind/TeaGo/Tea"
 | 
						"github.com/iwind/TeaGo/Tea"
 | 
				
			||||||
	"github.com/iwind/TeaGo/dbs"
 | 
						"github.com/iwind/TeaGo/dbs"
 | 
				
			||||||
@@ -95,3 +99,110 @@ func (this *OriginServerDAO) UpdateOriginServer(originId int64, name string, add
 | 
				
			|||||||
	_, err := this.Save(op)
 | 
						_, err := this.Save(op)
 | 
				
			||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 将源站信息转换为配置
 | 
				
			||||||
 | 
					func (this *OriginServerDAO) ComposeOriginConfig(originId int64) (*serverconfigs.OriginServerConfig, error) {
 | 
				
			||||||
 | 
						origin, err := this.FindEnabledOriginServer(originId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if origin == nil {
 | 
				
			||||||
 | 
							return nil, errors.New("not found")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						addr := &serverconfigs.NetworkAddressConfig{}
 | 
				
			||||||
 | 
						if len(origin.Addr) > 0 && origin.Addr != "null" {
 | 
				
			||||||
 | 
							err = json.Unmarshal([]byte(origin.Addr), addr)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						connTimeout := shared.TimeDuration{}
 | 
				
			||||||
 | 
						if len(origin.ConnTimeout) > 0 && origin.ConnTimeout != "null" {
 | 
				
			||||||
 | 
							err = json.Unmarshal([]byte(origin.ConnTimeout), &connTimeout)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						readTimeout := shared.TimeDuration{}
 | 
				
			||||||
 | 
						if len(origin.ReadTimeout) > 0 && origin.ReadTimeout != "null" {
 | 
				
			||||||
 | 
							err = json.Unmarshal([]byte(origin.ReadTimeout), &readTimeout)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						idleTimeout := shared.TimeDuration{}
 | 
				
			||||||
 | 
						if len(origin.IdleTimeout) > 0 && origin.IdleTimeout != "null" {
 | 
				
			||||||
 | 
							err = json.Unmarshal([]byte(origin.IdleTimeout), &idleTimeout)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						requestHeaders := &shared.HTTPHeadersConfig{}
 | 
				
			||||||
 | 
						if len(origin.HttpRequestHeaders) > 0 && origin.HttpRequestHeaders != "null" {
 | 
				
			||||||
 | 
							err = json.Unmarshal([]byte(origin.HttpRequestHeaders), requestHeaders)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						responseHeaders := &shared.HTTPHeadersConfig{}
 | 
				
			||||||
 | 
						if len(origin.HttpResponseHeaders) > 0 && origin.HttpResponseHeaders != "null" {
 | 
				
			||||||
 | 
							err = json.Unmarshal([]byte(origin.HttpResponseHeaders), responseHeaders)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						healthCheck := &serverconfigs.HealthCheckConfig{}
 | 
				
			||||||
 | 
						if len(origin.HealthCheck) > 0 && origin.HealthCheck != "null" {
 | 
				
			||||||
 | 
							err = json.Unmarshal([]byte(origin.HealthCheck), healthCheck)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cert := &sslconfigs.SSLCertConfig{}
 | 
				
			||||||
 | 
						if len(origin.Cert) > 0 && origin.Cert != "null" {
 | 
				
			||||||
 | 
							err = json.Unmarshal([]byte(origin.Cert), cert)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ftp := &serverconfigs.OriginServerFTPConfig{}
 | 
				
			||||||
 | 
						if len(origin.Ftp) > 0 && origin.Ftp != "null" {
 | 
				
			||||||
 | 
							err = json.Unmarshal([]byte(origin.Ftp), ftp)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &serverconfigs.OriginServerConfig{
 | 
				
			||||||
 | 
							Id:              int64(origin.Id),
 | 
				
			||||||
 | 
							IsOn:            origin.IsOn == 1,
 | 
				
			||||||
 | 
							Version:         int(origin.Version),
 | 
				
			||||||
 | 
							Name:            origin.Name,
 | 
				
			||||||
 | 
							Addr:            addr,
 | 
				
			||||||
 | 
							Description:     origin.Description,
 | 
				
			||||||
 | 
							Code:            origin.Code,
 | 
				
			||||||
 | 
							Weight:          uint(origin.Weight),
 | 
				
			||||||
 | 
							ConnTimeout:     connTimeout,
 | 
				
			||||||
 | 
							ReadTimeout:     readTimeout,
 | 
				
			||||||
 | 
							IdleTimeout:     idleTimeout,
 | 
				
			||||||
 | 
							MaxFails:        int(origin.MaxFails),
 | 
				
			||||||
 | 
							MaxConns:        int(origin.MaxConns),
 | 
				
			||||||
 | 
							MaxIdleConns:    int(origin.MaxIdleConns),
 | 
				
			||||||
 | 
							RequestURI:      origin.HttpRequestURI,
 | 
				
			||||||
 | 
							Host:            origin.Host,
 | 
				
			||||||
 | 
							RequestHeaders:  requestHeaders,
 | 
				
			||||||
 | 
							ResponseHeaders: responseHeaders,
 | 
				
			||||||
 | 
							HealthCheck:     healthCheck,
 | 
				
			||||||
 | 
							Cert:            cert,
 | 
				
			||||||
 | 
							FTP:             ftp,
 | 
				
			||||||
 | 
						}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,6 +3,8 @@ package models
 | 
				
			|||||||
// 源站
 | 
					// 源站
 | 
				
			||||||
type OriginServer struct {
 | 
					type OriginServer struct {
 | 
				
			||||||
	Id                  uint32 `field:"id"`                  // ID
 | 
						Id                  uint32 `field:"id"`                  // ID
 | 
				
			||||||
 | 
						AdminId             uint32 `field:"adminId"`             // 管理员ID
 | 
				
			||||||
 | 
						UserId              uint32 `field:"userId"`              // 用户ID
 | 
				
			||||||
	IsOn                uint8  `field:"isOn"`                // 是否启用
 | 
						IsOn                uint8  `field:"isOn"`                // 是否启用
 | 
				
			||||||
	Name                string `field:"name"`                // 名称
 | 
						Name                string `field:"name"`                // 名称
 | 
				
			||||||
	Version             uint32 `field:"version"`             // 版本
 | 
						Version             uint32 `field:"version"`             // 版本
 | 
				
			||||||
@@ -21,7 +23,6 @@ type OriginServer struct {
 | 
				
			|||||||
	HttpResponseHeaders string `field:"httpResponseHeaders"` // 响应Headers配置
 | 
						HttpResponseHeaders string `field:"httpResponseHeaders"` // 响应Headers配置
 | 
				
			||||||
	Host                string `field:"host"`                // 自定义主机名
 | 
						Host                string `field:"host"`                // 自定义主机名
 | 
				
			||||||
	HealthCheck         string `field:"healthCheck"`         // 健康检查设置
 | 
						HealthCheck         string `field:"healthCheck"`         // 健康检查设置
 | 
				
			||||||
	IsDown              uint8  `field:"isDown"`              // 是否处于健康检查失败状态
 | 
					 | 
				
			||||||
	Cert                string `field:"cert"`                // 证书设置
 | 
						Cert                string `field:"cert"`                // 证书设置
 | 
				
			||||||
	Ftp                 string `field:"ftp"`                 // FTP相关设置
 | 
						Ftp                 string `field:"ftp"`                 // FTP相关设置
 | 
				
			||||||
	CreatedAt           uint32 `field:"createdAt"`           // 创建时间
 | 
						CreatedAt           uint32 `field:"createdAt"`           // 创建时间
 | 
				
			||||||
@@ -30,6 +31,8 @@ type OriginServer struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
type OriginServerOperator struct {
 | 
					type OriginServerOperator struct {
 | 
				
			||||||
	Id                  interface{} // ID
 | 
						Id                  interface{} // ID
 | 
				
			||||||
 | 
						AdminId             interface{} // 管理员ID
 | 
				
			||||||
 | 
						UserId              interface{} // 用户ID
 | 
				
			||||||
	IsOn                interface{} // 是否启用
 | 
						IsOn                interface{} // 是否启用
 | 
				
			||||||
	Name                interface{} // 名称
 | 
						Name                interface{} // 名称
 | 
				
			||||||
	Version             interface{} // 版本
 | 
						Version             interface{} // 版本
 | 
				
			||||||
@@ -48,7 +51,6 @@ type OriginServerOperator struct {
 | 
				
			|||||||
	HttpResponseHeaders interface{} // 响应Headers配置
 | 
						HttpResponseHeaders interface{} // 响应Headers配置
 | 
				
			||||||
	Host                interface{} // 自定义主机名
 | 
						Host                interface{} // 自定义主机名
 | 
				
			||||||
	HealthCheck         interface{} // 健康检查设置
 | 
						HealthCheck         interface{} // 健康检查设置
 | 
				
			||||||
	IsDown              interface{} // 是否处于健康检查失败状态
 | 
					 | 
				
			||||||
	Cert                interface{} // 证书设置
 | 
						Cert                interface{} // 证书设置
 | 
				
			||||||
	Ftp                 interface{} // FTP相关设置
 | 
						Ftp                 interface{} // FTP相关设置
 | 
				
			||||||
	CreatedAt           interface{} // 创建时间
 | 
						CreatedAt           interface{} // 创建时间
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										197
									
								
								internal/db/models/reverse_proxy_dao.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										197
									
								
								internal/db/models/reverse_proxy_dao.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,197 @@
 | 
				
			|||||||
 | 
					package models
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						"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/types"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						ReverseProxyStateEnabled  = 1 // 已启用
 | 
				
			||||||
 | 
						ReverseProxyStateDisabled = 0 // 已禁用
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ReverseProxyDAO dbs.DAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewReverseProxyDAO() *ReverseProxyDAO {
 | 
				
			||||||
 | 
						return dbs.NewDAO(&ReverseProxyDAO{
 | 
				
			||||||
 | 
							DAOObject: dbs.DAOObject{
 | 
				
			||||||
 | 
								DB:     Tea.Env,
 | 
				
			||||||
 | 
								Table:  "edgeReverseProxies",
 | 
				
			||||||
 | 
								Model:  new(ReverseProxy),
 | 
				
			||||||
 | 
								PkName: "id",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}).(*ReverseProxyDAO)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var SharedReverseProxyDAO = NewReverseProxyDAO()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 启用条目
 | 
				
			||||||
 | 
					func (this *ReverseProxyDAO) EnableReverseProxy(id int64) error {
 | 
				
			||||||
 | 
						_, err := this.Query().
 | 
				
			||||||
 | 
							Pk(id).
 | 
				
			||||||
 | 
							Set("state", ReverseProxyStateEnabled).
 | 
				
			||||||
 | 
							Update()
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 禁用条目
 | 
				
			||||||
 | 
					func (this *ReverseProxyDAO) DisableReverseProxy(id int64) error {
 | 
				
			||||||
 | 
						_, err := this.Query().
 | 
				
			||||||
 | 
							Pk(id).
 | 
				
			||||||
 | 
							Set("state", ReverseProxyStateDisabled).
 | 
				
			||||||
 | 
							Update()
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 查找启用中的条目
 | 
				
			||||||
 | 
					func (this *ReverseProxyDAO) FindEnabledReverseProxy(id int64) (*ReverseProxy, error) {
 | 
				
			||||||
 | 
						result, err := this.Query().
 | 
				
			||||||
 | 
							Pk(id).
 | 
				
			||||||
 | 
							Attr("state", ReverseProxyStateEnabled).
 | 
				
			||||||
 | 
							Find()
 | 
				
			||||||
 | 
						if result == nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return result.(*ReverseProxy), err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 根据iD组合配置
 | 
				
			||||||
 | 
					func (this *ReverseProxyDAO) ComposeReverseProxyConfig(reverseProxyId int64) (*serverconfigs.ReverseProxyConfig, error) {
 | 
				
			||||||
 | 
						reverseProxy, err := this.FindEnabledReverseProxy(reverseProxyId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if reverseProxy == nil {
 | 
				
			||||||
 | 
							return nil, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						config := &serverconfigs.ReverseProxyConfig{}
 | 
				
			||||||
 | 
						config.IsOn = reverseProxy.IsOn == 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						schedulingConfig := &serverconfigs.SchedulingConfig{}
 | 
				
			||||||
 | 
						if len(reverseProxy.Scheduling) > 0 && reverseProxy.Scheduling != "null" {
 | 
				
			||||||
 | 
							err = json.Unmarshal([]byte(reverseProxy.Scheduling), schedulingConfig)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							config.Scheduling = schedulingConfig
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(reverseProxy.PrimaryOrigins) > 0 && reverseProxy.PrimaryOrigins != "null" {
 | 
				
			||||||
 | 
							originConfigs := []*serverconfigs.OriginServerConfig{}
 | 
				
			||||||
 | 
							err = json.Unmarshal([]byte(reverseProxy.PrimaryOrigins), &originConfigs)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							for _, originConfig := range originConfigs {
 | 
				
			||||||
 | 
								newOriginConfig, err := SharedOriginServerDAO.ComposeOriginConfig(int64(originConfig.Id))
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return nil, err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if newOriginConfig != nil {
 | 
				
			||||||
 | 
									config.AddPrimaryOrigin(newOriginConfig)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(reverseProxy.BackupOrigins) > 0 && reverseProxy.BackupOrigins != "null" {
 | 
				
			||||||
 | 
							originConfigs := []*OriginServer{}
 | 
				
			||||||
 | 
							err = json.Unmarshal([]byte(reverseProxy.BackupOrigins), &originConfigs)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							for _, originConfig := range originConfigs {
 | 
				
			||||||
 | 
								newOriginConfig, err := SharedOriginServerDAO.ComposeOriginConfig(int64(originConfig.Id))
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return nil, err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if newOriginConfig != nil {
 | 
				
			||||||
 | 
									config.AddBackupOrigin(newOriginConfig)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return config, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 创建反向代理
 | 
				
			||||||
 | 
					func (this *ReverseProxyDAO) CreateReverseProxy(schedulingJSON []byte, primaryOriginsJSON []byte, backupOriginsJSON []byte) (int64, error) {
 | 
				
			||||||
 | 
						op := NewReverseProxyOperator()
 | 
				
			||||||
 | 
						op.State = ReverseProxyStateEnabled
 | 
				
			||||||
 | 
						if len(schedulingJSON) > 0 {
 | 
				
			||||||
 | 
							op.Scheduling = string(schedulingJSON)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(primaryOriginsJSON) > 0 {
 | 
				
			||||||
 | 
							op.PrimaryOrigins = string(primaryOriginsJSON)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(backupOriginsJSON) > 0 {
 | 
				
			||||||
 | 
							op.BackupOrigins = string(backupOriginsJSON)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_, err := this.Save(op)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return types.Int64(op.Id), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改反向代理调度算法
 | 
				
			||||||
 | 
					func (this *ReverseProxyDAO) UpdateReverseProxyScheduling(reverseProxyId int64, schedulingJSON []byte) error {
 | 
				
			||||||
 | 
						if reverseProxyId <= 0 {
 | 
				
			||||||
 | 
							return errors.New("invalid reverseProxyId")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						op := NewReverseProxyOperator()
 | 
				
			||||||
 | 
						op.Id = reverseProxyId
 | 
				
			||||||
 | 
						if len(schedulingJSON) > 0 {
 | 
				
			||||||
 | 
							op.Scheduling = string(schedulingJSON)
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							op.Scheduling = "null"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_, err := this.Save(op)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// TODO 更新所有使用此反向代理的服务
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改主要源站
 | 
				
			||||||
 | 
					func (this *ReverseProxyDAO) UpdateReverseProxyPrimaryOrigins(reverseProxyId int64, origins []byte) error {
 | 
				
			||||||
 | 
						if reverseProxyId <= 0 {
 | 
				
			||||||
 | 
							return errors.New("invalid reverseProxyId")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						op := NewReverseProxyOperator()
 | 
				
			||||||
 | 
						op.Id = reverseProxyId
 | 
				
			||||||
 | 
						if len(origins) > 0 {
 | 
				
			||||||
 | 
							op.PrimaryOrigins = origins
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							op.PrimaryOrigins = "[]"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_, err := this.Save(op)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// TODO 更新所有使用此反向代理的服务
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改备用源站
 | 
				
			||||||
 | 
					func (this *ReverseProxyDAO) UpdateReverseProxyBackupOrigins(reverseProxyId int64, origins []byte) error {
 | 
				
			||||||
 | 
						if reverseProxyId <= 0 {
 | 
				
			||||||
 | 
							return errors.New("invalid reverseProxyId")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						op := NewReverseProxyOperator()
 | 
				
			||||||
 | 
						op.Id = reverseProxyId
 | 
				
			||||||
 | 
						if len(origins) > 0 {
 | 
				
			||||||
 | 
							op.BackupOrigins = origins
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							op.BackupOrigins = "[]"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_, err := this.Save(op)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// TODO 更新所有使用此反向代理的服务
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										14
									
								
								internal/db/models/reverse_proxy_dao_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								internal/db/models/reverse_proxy_dao_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					package models
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						_ "github.com/go-sql-driver/mysql"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestReverseProxyDAO_ComposeReverseProxyConfig(t *testing.T) {
 | 
				
			||||||
 | 
						config, err := SharedReverseProxyDAO.ComposeReverseProxyConfig(1)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Fatal(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						t.Log(config)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										32
									
								
								internal/db/models/reverse_proxy_model.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								internal/db/models/reverse_proxy_model.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
				
			|||||||
 | 
					package models
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 反向代理配置
 | 
				
			||||||
 | 
					type ReverseProxy struct {
 | 
				
			||||||
 | 
						Id             uint32 `field:"id"`             // ID
 | 
				
			||||||
 | 
						AdminId        uint32 `field:"adminId"`        // 管理员ID
 | 
				
			||||||
 | 
						UserId         uint32 `field:"userId"`         // 用户ID
 | 
				
			||||||
 | 
						TemplateId     uint32 `field:"templateId"`     // 模版ID
 | 
				
			||||||
 | 
						IsOn           uint8  `field:"isOn"`           // 是否启用
 | 
				
			||||||
 | 
						Scheduling     string `field:"scheduling"`     // 调度算法
 | 
				
			||||||
 | 
						PrimaryOrigins string `field:"primaryOrigins"` // 主要源站
 | 
				
			||||||
 | 
						BackupOrigins  string `field:"backupOrigins"`  // 备用源站
 | 
				
			||||||
 | 
						State          uint8  `field:"state"`          // 状态
 | 
				
			||||||
 | 
						CreatedAt      uint32 `field:"createdAt"`      // 创建时间
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ReverseProxyOperator struct {
 | 
				
			||||||
 | 
						Id             interface{} // ID
 | 
				
			||||||
 | 
						AdminId        interface{} // 管理员ID
 | 
				
			||||||
 | 
						UserId         interface{} // 用户ID
 | 
				
			||||||
 | 
						TemplateId     interface{} // 模版ID
 | 
				
			||||||
 | 
						IsOn           interface{} // 是否启用
 | 
				
			||||||
 | 
						Scheduling     interface{} // 调度算法
 | 
				
			||||||
 | 
						PrimaryOrigins interface{} // 主要源站
 | 
				
			||||||
 | 
						BackupOrigins  interface{} // 备用源站
 | 
				
			||||||
 | 
						State          interface{} // 状态
 | 
				
			||||||
 | 
						CreatedAt      interface{} // 创建时间
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewReverseProxyOperator() *ReverseProxyOperator {
 | 
				
			||||||
 | 
						return &ReverseProxyOperator{}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										1
									
								
								internal/db/models/reverse_proxy_model_ext.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								internal/db/models/reverse_proxy_model_ext.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					package models
 | 
				
			||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
package models
 | 
					package models
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
 | 
				
			||||||
	_ "github.com/go-sql-driver/mysql"
 | 
						_ "github.com/go-sql-driver/mysql"
 | 
				
			||||||
@@ -59,8 +60,16 @@ func (this *ServerDAO) FindEnabledServer(id int64) (*Server, error) {
 | 
				
			|||||||
	return result.(*Server), err
 | 
						return result.(*Server), err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 查找服务类型
 | 
				
			||||||
 | 
					func (this *ServerDAO) FindEnabledServerType(serverId int64) (string, error) {
 | 
				
			||||||
 | 
						return this.Query().
 | 
				
			||||||
 | 
							Pk(serverId).
 | 
				
			||||||
 | 
							Result("type").
 | 
				
			||||||
 | 
							FindStringCol("")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 创建服务
 | 
					// 创建服务
 | 
				
			||||||
func (this *ServerDAO) CreateServer(adminId int64, userId int64, serverType serverconfigs.ServerType, name string, description string, clusterId int64, configJSON string, includeNodesJSON string, excludeNodesJSON string) (serverId int64, err error) {
 | 
					func (this *ServerDAO) CreateServer(adminId int64, userId int64, serverType serverconfigs.ServerType, name string, description string, serverNamesJSON string, httpJSON string, httpsJSON string, tcpJSON string, tlsJSON string, unixJSON string, udpJSON string, webId int64, reverseProxyId int64, clusterId int64, includeNodesJSON string, excludeNodesJSON string) (serverId int64, err error) {
 | 
				
			||||||
	uniqueId, err := this.genUniqueId()
 | 
						uniqueId, err := this.genUniqueId()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return 0, err
 | 
							return 0, err
 | 
				
			||||||
@@ -73,10 +82,32 @@ func (this *ServerDAO) CreateServer(adminId int64, userId int64, serverType serv
 | 
				
			|||||||
	op.Name = name
 | 
						op.Name = name
 | 
				
			||||||
	op.Type = serverType
 | 
						op.Type = serverType
 | 
				
			||||||
	op.Description = description
 | 
						op.Description = description
 | 
				
			||||||
	op.ClusterId = clusterId
 | 
					
 | 
				
			||||||
	if len(configJSON) > 0 {
 | 
						if len(serverNamesJSON) > 0 {
 | 
				
			||||||
		op.Config = configJSON
 | 
							op.ServerNames = serverNamesJSON
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if len(httpJSON) > 0 {
 | 
				
			||||||
 | 
							op.Http = httpJSON
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(httpsJSON) > 0 {
 | 
				
			||||||
 | 
							op.Https = httpsJSON
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(tcpJSON) > 0 {
 | 
				
			||||||
 | 
							op.Tcp = tcpJSON
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(tlsJSON) > 0 {
 | 
				
			||||||
 | 
							op.Tls = tlsJSON
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(unixJSON) > 0 {
 | 
				
			||||||
 | 
							op.Unix = unixJSON
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(udpJSON) > 0 {
 | 
				
			||||||
 | 
							op.Udp = udpJSON
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						op.WebId = webId
 | 
				
			||||||
 | 
						op.ReverseProxyId = reverseProxyId
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						op.ClusterId = clusterId
 | 
				
			||||||
	if len(includeNodesJSON) > 0 {
 | 
						if len(includeNodesJSON) > 0 {
 | 
				
			||||||
		op.IncludeNodes = includeNodesJSON
 | 
							op.IncludeNodes = includeNodesJSON
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -88,7 +119,14 @@ func (this *ServerDAO) CreateServer(adminId int64, userId int64, serverType serv
 | 
				
			|||||||
	op.IsOn = 1
 | 
						op.IsOn = 1
 | 
				
			||||||
	op.State = ServerStateEnabled
 | 
						op.State = ServerStateEnabled
 | 
				
			||||||
	_, err = this.Save(op)
 | 
						_, err = this.Save(op)
 | 
				
			||||||
	return types.Int64(op.Id), err
 | 
					
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						serverId = types.Int64(op.Id)
 | 
				
			||||||
 | 
						err = this.RenewServerConfig(serverId)
 | 
				
			||||||
 | 
						return serverId, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 修改服务基本信息
 | 
					// 修改服务基本信息
 | 
				
			||||||
@@ -111,13 +149,173 @@ func (this *ServerDAO) UpdateServerConfig(serverId int64, config []byte) error {
 | 
				
			|||||||
	if serverId <= 0 {
 | 
						if serverId <= 0 {
 | 
				
			||||||
		return errors.New("serverId should not be smaller than 0")
 | 
							return errors.New("serverId should not be smaller than 0")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if len(config) == 0 {
 | 
				
			||||||
 | 
							config = []byte("null")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	_, err := this.Query().
 | 
						_, err := this.Query().
 | 
				
			||||||
		Pk(serverId).
 | 
							Pk(serverId).
 | 
				
			||||||
		Set("config", string(config)).
 | 
							Set("config", string(config)).
 | 
				
			||||||
 | 
							Set("version", dbs.SQL("version+1")).
 | 
				
			||||||
		Update()
 | 
							Update()
 | 
				
			||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改HTTP配置
 | 
				
			||||||
 | 
					func (this *ServerDAO) UpdateServerHTTP(serverId int64, config []byte) error {
 | 
				
			||||||
 | 
						if serverId <= 0 {
 | 
				
			||||||
 | 
							return errors.New("serverId should not be smaller than 0")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(config) == 0 {
 | 
				
			||||||
 | 
							config = []byte("null")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_, err := this.Query().
 | 
				
			||||||
 | 
							Pk(serverId).
 | 
				
			||||||
 | 
							Set("http", string(config)).
 | 
				
			||||||
 | 
							Update()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return this.RenewServerConfig(serverId)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改HTTPS配置
 | 
				
			||||||
 | 
					func (this *ServerDAO) UpdateServerHTTPS(serverId int64, config []byte) error {
 | 
				
			||||||
 | 
						if serverId <= 0 {
 | 
				
			||||||
 | 
							return errors.New("serverId should not be smaller than 0")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(config) == 0 {
 | 
				
			||||||
 | 
							config = []byte("null")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_, err := this.Query().
 | 
				
			||||||
 | 
							Pk(serverId).
 | 
				
			||||||
 | 
							Set("https", string(config)).
 | 
				
			||||||
 | 
							Update()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return this.RenewServerConfig(serverId)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改TCP配置
 | 
				
			||||||
 | 
					func (this *ServerDAO) UpdateServerTCP(serverId int64, config []byte) error {
 | 
				
			||||||
 | 
						if serverId <= 0 {
 | 
				
			||||||
 | 
							return errors.New("serverId should not be smaller than 0")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(config) == 0 {
 | 
				
			||||||
 | 
							config = []byte("null")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_, err := this.Query().
 | 
				
			||||||
 | 
							Pk(serverId).
 | 
				
			||||||
 | 
							Set("tcp", string(config)).
 | 
				
			||||||
 | 
							Update()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return this.RenewServerConfig(serverId)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改TLS配置
 | 
				
			||||||
 | 
					func (this *ServerDAO) UpdateServerTLS(serverId int64, config []byte) error {
 | 
				
			||||||
 | 
						if serverId <= 0 {
 | 
				
			||||||
 | 
							return errors.New("serverId should not be smaller than 0")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(config) == 0 {
 | 
				
			||||||
 | 
							config = []byte("null")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_, err := this.Query().
 | 
				
			||||||
 | 
							Pk(serverId).
 | 
				
			||||||
 | 
							Set("tls", string(config)).
 | 
				
			||||||
 | 
							Update()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return this.RenewServerConfig(serverId)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改Unix配置
 | 
				
			||||||
 | 
					func (this *ServerDAO) UpdateServerUnix(serverId int64, config []byte) error {
 | 
				
			||||||
 | 
						if serverId <= 0 {
 | 
				
			||||||
 | 
							return errors.New("serverId should not be smaller than 0")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(config) == 0 {
 | 
				
			||||||
 | 
							config = []byte("null")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_, err := this.Query().
 | 
				
			||||||
 | 
							Pk(serverId).
 | 
				
			||||||
 | 
							Set("unix", string(config)).
 | 
				
			||||||
 | 
							Update()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return this.RenewServerConfig(serverId)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改UDP配置
 | 
				
			||||||
 | 
					func (this *ServerDAO) UpdateServerUDP(serverId int64, config []byte) error {
 | 
				
			||||||
 | 
						if serverId <= 0 {
 | 
				
			||||||
 | 
							return errors.New("serverId should not be smaller than 0")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(config) == 0 {
 | 
				
			||||||
 | 
							config = []byte("null")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_, err := this.Query().
 | 
				
			||||||
 | 
							Pk(serverId).
 | 
				
			||||||
 | 
							Set("udp", string(config)).
 | 
				
			||||||
 | 
							Update()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return this.RenewServerConfig(serverId)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改Web配置
 | 
				
			||||||
 | 
					func (this *ServerDAO) UpdateServerWeb(serverId int64, webId int64) error {
 | 
				
			||||||
 | 
						if serverId <= 0 {
 | 
				
			||||||
 | 
							return errors.New("serverId should not be smaller than 0")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_, err := this.Query().
 | 
				
			||||||
 | 
							Pk(serverId).
 | 
				
			||||||
 | 
							Set("webId", webId).
 | 
				
			||||||
 | 
							Update()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return this.RenewServerConfig(serverId)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改ServerNames配置
 | 
				
			||||||
 | 
					func (this *ServerDAO) UpdateServerNames(serverId int64, config []byte) error {
 | 
				
			||||||
 | 
						if serverId <= 0 {
 | 
				
			||||||
 | 
							return errors.New("serverId should not be smaller than 0")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(config) == 0 {
 | 
				
			||||||
 | 
							config = []byte("null")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_, err := this.Query().
 | 
				
			||||||
 | 
							Pk(serverId).
 | 
				
			||||||
 | 
							Set("serverNames", string(config)).
 | 
				
			||||||
 | 
							Update()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return this.RenewServerConfig(serverId)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改反向代理配置
 | 
				
			||||||
 | 
					func (this *ServerDAO) UpdateServerReverseProxy(serverId int64, reverseProxyId int64) error {
 | 
				
			||||||
 | 
						if serverId <= 0 {
 | 
				
			||||||
 | 
							return errors.New("serverId should not be smaller than 0")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_, err := this.Query().
 | 
				
			||||||
 | 
							Pk(serverId).
 | 
				
			||||||
 | 
							Set("reverseProxyId", reverseProxyId).
 | 
				
			||||||
 | 
							Update()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return this.RenewServerConfig(serverId)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 计算所有可用服务数量
 | 
					// 计算所有可用服务数量
 | 
				
			||||||
func (this *ServerDAO) CountAllEnabledServers() (int64, error) {
 | 
					func (this *ServerDAO) CountAllEnabledServers() (int64, error) {
 | 
				
			||||||
	return this.Query().
 | 
						return this.Query().
 | 
				
			||||||
@@ -157,6 +355,153 @@ func (this *ServerDAO) FindAllEnabledServersWithNode(nodeId int64) (result []*Se
 | 
				
			|||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 构造服务的Config
 | 
				
			||||||
 | 
					func (this *ServerDAO) ComposeServerConfig(serverId int64) (*serverconfigs.ServerConfig, error) {
 | 
				
			||||||
 | 
						server, err := this.FindEnabledServer(serverId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if server == nil {
 | 
				
			||||||
 | 
							return nil, errors.New("server not found")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						config := &serverconfigs.ServerConfig{}
 | 
				
			||||||
 | 
						config.Id = serverId
 | 
				
			||||||
 | 
						config.Type = server.Type
 | 
				
			||||||
 | 
						config.IsOn = server.IsOn == 1
 | 
				
			||||||
 | 
						config.Name = server.Name
 | 
				
			||||||
 | 
						config.Description = server.Description
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Components
 | 
				
			||||||
 | 
						// TODO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Filters
 | 
				
			||||||
 | 
						// TODO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// ServerNames
 | 
				
			||||||
 | 
						if len(server.ServerNames) > 0 && server.ServerNames != "null" {
 | 
				
			||||||
 | 
							serverNames := []*serverconfigs.ServerNameConfig{}
 | 
				
			||||||
 | 
							err = json.Unmarshal([]byte(server.ServerNames), &serverNames)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							config.ServerNames = serverNames
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// HTTP
 | 
				
			||||||
 | 
						if len(server.Http) > 0 && server.Http != "null" {
 | 
				
			||||||
 | 
							httpConfig := &serverconfigs.HTTPProtocolConfig{}
 | 
				
			||||||
 | 
							err = json.Unmarshal([]byte(server.Http), httpConfig)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							config.HTTP = httpConfig
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// HTTPS
 | 
				
			||||||
 | 
						if len(server.Https) > 0 && server.Https != "null" {
 | 
				
			||||||
 | 
							httpsConfig := &serverconfigs.HTTPSProtocolConfig{}
 | 
				
			||||||
 | 
							err = json.Unmarshal([]byte(server.Https), httpsConfig)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							config.HTTPS = httpsConfig
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// TCP
 | 
				
			||||||
 | 
						if len(server.Tcp) > 0 && server.Tcp != "null" {
 | 
				
			||||||
 | 
							tcpConfig := &serverconfigs.TCPProtocolConfig{}
 | 
				
			||||||
 | 
							err = json.Unmarshal([]byte(server.Tcp), tcpConfig)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							config.TCP = tcpConfig
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// TLS
 | 
				
			||||||
 | 
						if len(server.Tls) > 0 && server.Tls != "null" {
 | 
				
			||||||
 | 
							tlsConfig := &serverconfigs.TLSProtocolConfig{}
 | 
				
			||||||
 | 
							err = json.Unmarshal([]byte(server.Tls), tlsConfig)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							config.TLS = tlsConfig
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Unix
 | 
				
			||||||
 | 
						if len(server.Unix) > 0 && server.Unix != "null" {
 | 
				
			||||||
 | 
							unixConfig := &serverconfigs.UnixProtocolConfig{}
 | 
				
			||||||
 | 
							err = json.Unmarshal([]byte(server.Unix), unixConfig)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							config.Unix = unixConfig
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// UDP
 | 
				
			||||||
 | 
						if len(server.Udp) > 0 && server.Udp != "null" {
 | 
				
			||||||
 | 
							udpConfig := &serverconfigs.UDPProtocolConfig{}
 | 
				
			||||||
 | 
							err = json.Unmarshal([]byte(server.Udp), udpConfig)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							config.UDP = udpConfig
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Web
 | 
				
			||||||
 | 
						if server.WebId > 0 {
 | 
				
			||||||
 | 
							webConfig, err := SharedHTTPWebDAO.ComposeWebConfig(int64(server.WebId))
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if webConfig != nil {
 | 
				
			||||||
 | 
								config.Web = webConfig
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// ReverseProxy
 | 
				
			||||||
 | 
						if server.ReverseProxyId > 0 {
 | 
				
			||||||
 | 
							reverseProxyConfig, err := SharedReverseProxyDAO.ComposeReverseProxyConfig(int64(server.ReverseProxyId))
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if reverseProxyConfig != nil {
 | 
				
			||||||
 | 
								config.ReverseProxy = reverseProxyConfig
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return config, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 更新服务的Config配置
 | 
				
			||||||
 | 
					func (this *ServerDAO) RenewServerConfig(serverId int64) error {
 | 
				
			||||||
 | 
						serverConfig, err := this.ComposeServerConfig(serverId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						data, err := serverConfig.AsJSON()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return this.UpdateServerConfig(serverId, data)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 根据条件获取反向代理配置
 | 
				
			||||||
 | 
					func (this *ServerDAO) FindReverseProxyConfig(serverId int64) (*serverconfigs.ReverseProxyConfig, error) {
 | 
				
			||||||
 | 
						reverseProxy, err := this.Query().
 | 
				
			||||||
 | 
							Pk(serverId).
 | 
				
			||||||
 | 
							Result("reverseProxy").
 | 
				
			||||||
 | 
							FindStringCol("")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(reverseProxy) == 0 || reverseProxy == "null" {
 | 
				
			||||||
 | 
							return nil, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						config := &serverconfigs.ReverseProxyConfig{}
 | 
				
			||||||
 | 
						err = json.Unmarshal([]byte(reverseProxy), config)
 | 
				
			||||||
 | 
						return config, err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 生成唯一ID
 | 
					// 生成唯一ID
 | 
				
			||||||
func (this *ServerDAO) genUniqueId() (string, error) {
 | 
					func (this *ServerDAO) genUniqueId() (string, error) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,4 +2,14 @@ package models
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	_ "github.com/go-sql-driver/mysql"
 | 
						_ "github.com/go-sql-driver/mysql"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/logs"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestServerDAO_ComposeServerConfig(t *testing.T) {
 | 
				
			||||||
 | 
						config, err := SharedServerDAO.ComposeServerConfig(1)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Fatal(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						logs.PrintAsJSON(config, t)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,6 +10,15 @@ type Server struct {
 | 
				
			|||||||
	Type           string `field:"type"`           // 服务类型
 | 
						Type           string `field:"type"`           // 服务类型
 | 
				
			||||||
	Name           string `field:"name"`           // 名称
 | 
						Name           string `field:"name"`           // 名称
 | 
				
			||||||
	Description    string `field:"description"`    // 描述
 | 
						Description    string `field:"description"`    // 描述
 | 
				
			||||||
 | 
						ServerNames    string `field:"serverNames"`    // 域名列表
 | 
				
			||||||
 | 
						Http           string `field:"http"`           // HTTP配置
 | 
				
			||||||
 | 
						Https          string `field:"https"`          // HTTPS配置
 | 
				
			||||||
 | 
						Tcp            string `field:"tcp"`            // TCP配置
 | 
				
			||||||
 | 
						Tls            string `field:"tls"`            // TLS配置
 | 
				
			||||||
 | 
						Unix           string `field:"unix"`           // Unix配置
 | 
				
			||||||
 | 
						Udp            string `field:"udp"`            // UDP配置
 | 
				
			||||||
 | 
						WebId          uint32 `field:"webId"`          // WEB配置
 | 
				
			||||||
 | 
						ReverseProxyId uint32 `field:"reverseProxyId"` // 反向代理配置
 | 
				
			||||||
	GroupIds       string `field:"groupIds"`       // 分组ID列表
 | 
						GroupIds       string `field:"groupIds"`       // 分组ID列表
 | 
				
			||||||
	Config         string `field:"config"`         // 服务配置,自动生成
 | 
						Config         string `field:"config"`         // 服务配置,自动生成
 | 
				
			||||||
	ClusterId      uint32 `field:"clusterId"`      // 集群ID
 | 
						ClusterId      uint32 `field:"clusterId"`      // 集群ID
 | 
				
			||||||
@@ -29,6 +38,15 @@ type ServerOperator struct {
 | 
				
			|||||||
	Type           interface{} // 服务类型
 | 
						Type           interface{} // 服务类型
 | 
				
			||||||
	Name           interface{} // 名称
 | 
						Name           interface{} // 名称
 | 
				
			||||||
	Description    interface{} // 描述
 | 
						Description    interface{} // 描述
 | 
				
			||||||
 | 
						ServerNames    interface{} // 域名列表
 | 
				
			||||||
 | 
						Http           interface{} // HTTP配置
 | 
				
			||||||
 | 
						Https          interface{} // HTTPS配置
 | 
				
			||||||
 | 
						Tcp            interface{} // TCP配置
 | 
				
			||||||
 | 
						Tls            interface{} // TLS配置
 | 
				
			||||||
 | 
						Unix           interface{} // Unix配置
 | 
				
			||||||
 | 
						Udp            interface{} // UDP配置
 | 
				
			||||||
 | 
						WebId          interface{} // WEB配置
 | 
				
			||||||
 | 
						ReverseProxyId interface{} // 反向代理配置
 | 
				
			||||||
	GroupIds       interface{} // 分组ID列表
 | 
						GroupIds       interface{} // 分组ID列表
 | 
				
			||||||
	Config         interface{} // 服务配置,自动生成
 | 
						Config         interface{} // 服务配置,自动生成
 | 
				
			||||||
	ClusterId      interface{} // 集群ID
 | 
						ClusterId      interface{} // 集群ID
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										66
									
								
								internal/rpc/services/service_http_web.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								internal/rpc/services/service_http_web.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,66 @@
 | 
				
			|||||||
 | 
					package services
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/db/models"
 | 
				
			||||||
 | 
						rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type HTTPWebService struct {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 创建Web配置
 | 
				
			||||||
 | 
					func (this *HTTPWebService) CreateHTTPWeb(ctx context.Context, req *pb.CreateHTTPWebRequest) (*pb.CreateHTTPWebResponse, error) {
 | 
				
			||||||
 | 
						// 校验请求
 | 
				
			||||||
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						webId, err := models.SharedHTTPWebDAO.CreateWeb(req.Root)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &pb.CreateHTTPWebResponse{WebId: webId}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 查找Web配置
 | 
				
			||||||
 | 
					func (this *HTTPWebService) FindEnabledHTTPWeb(ctx context.Context, req *pb.FindEnabledHTTPWebRequest) (*pb.FindEnabledHTTPWebResponse, error) {
 | 
				
			||||||
 | 
						// 校验请求
 | 
				
			||||||
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						web, err := models.SharedHTTPWebDAO.FindEnabledHTTPWeb(req.WebId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if web == nil {
 | 
				
			||||||
 | 
							return &pb.FindEnabledHTTPWebResponse{Web: nil}, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						result := &pb.HTTPWeb{}
 | 
				
			||||||
 | 
						result.Id = int64(web.Id)
 | 
				
			||||||
 | 
						result.Root = web.Root
 | 
				
			||||||
 | 
						return &pb.FindEnabledHTTPWebResponse{Web: result}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改Web配置
 | 
				
			||||||
 | 
					func (this *HTTPWebService) UpdateHTTPWeb(ctx context.Context, req *pb.UpdateHTTPWebRequest) (*pb.UpdateHTTPWebResponse, error) {
 | 
				
			||||||
 | 
						// 校验请求
 | 
				
			||||||
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = models.SharedHTTPWebDAO.UpdateWeb(req.WebId, req.Root)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &pb.UpdateHTTPWebResponse{}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -2,6 +2,7 @@ package services
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/db/models"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/db/models"
 | 
				
			||||||
	rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
 | 
						rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
 | 
				
			||||||
@@ -85,7 +86,7 @@ func (this *OriginServerService) FindEnabledOriginServer(ctx context.Context, re
 | 
				
			|||||||
		IsOn: origin.IsOn == 1,
 | 
							IsOn: origin.IsOn == 1,
 | 
				
			||||||
		Name: origin.Name,
 | 
							Name: origin.Name,
 | 
				
			||||||
		Addr: &pb.NetworkAddress{
 | 
							Addr: &pb.NetworkAddress{
 | 
				
			||||||
			Protocol:  addr.Protocol,
 | 
								Protocol:  addr.Protocol.String(),
 | 
				
			||||||
			Host:      addr.Host,
 | 
								Host:      addr.Host,
 | 
				
			||||||
			PortRange: addr.PortRange,
 | 
								PortRange: addr.PortRange,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@@ -93,3 +94,23 @@ func (this *OriginServerService) FindEnabledOriginServer(ctx context.Context, re
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	return &pb.FindEnabledOriginServerResponse{Origin: result}, nil
 | 
						return &pb.FindEnabledOriginServerResponse{Origin: result}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 查找源站配置
 | 
				
			||||||
 | 
					func (this *OriginServerService) FindEnabledOriginServerConfig(ctx context.Context, req *pb.FindEnabledOriginServerConfigRequest) (*pb.FindEnabledOriginServerConfigResponse, error) {
 | 
				
			||||||
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						config, err := models.SharedOriginServerDAO.ComposeOriginConfig(req.OriginId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						configData, err := json.Marshal(config)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &pb.FindEnabledOriginServerConfigResponse{Config: configData}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										122
									
								
								internal/rpc/services/service_reverse_proxy.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								internal/rpc/services/service_reverse_proxy.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,122 @@
 | 
				
			|||||||
 | 
					package services
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/db/models"
 | 
				
			||||||
 | 
						rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ReverseProxyService struct {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 创建反向代理
 | 
				
			||||||
 | 
					func (this *ReverseProxyService) CreateReverseProxy(ctx context.Context, req *pb.CreateReverseProxyRequest) (*pb.CreateReverseProxyResponse, error) {
 | 
				
			||||||
 | 
						// 校验请求
 | 
				
			||||||
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						reverseProxyId, err := models.SharedReverseProxyDAO.CreateReverseProxy(req.SchedulingJSON, req.PrimaryOriginsJSON, req.BackupOriginsJSON)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &pb.CreateReverseProxyResponse{ReverseProxyId: reverseProxyId}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 查找反向代理
 | 
				
			||||||
 | 
					func (this *ReverseProxyService) FindEnabledReverseProxy(ctx context.Context, req *pb.FindEnabledReverseProxyRequest) (*pb.FindEnabledReverseProxyResponse, error) {
 | 
				
			||||||
 | 
						// 校验请求
 | 
				
			||||||
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						reverseProxy, err := models.SharedReverseProxyDAO.FindEnabledReverseProxy(req.ReverseProxyId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if reverseProxy == nil {
 | 
				
			||||||
 | 
							return &pb.FindEnabledReverseProxyResponse{ReverseProxy: nil}, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						result := &pb.ReverseProxy{
 | 
				
			||||||
 | 
							Id:                 int64(reverseProxy.Id),
 | 
				
			||||||
 | 
							SchedulingJSON:     []byte(reverseProxy.Scheduling),
 | 
				
			||||||
 | 
							PrimaryOriginsJSON: []byte(reverseProxy.PrimaryOrigins),
 | 
				
			||||||
 | 
							BackupOriginsJSON:  []byte(reverseProxy.BackupOrigins),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return &pb.FindEnabledReverseProxyResponse{ReverseProxy: result}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 查找反向代理配置
 | 
				
			||||||
 | 
					func (this *ReverseProxyService) FindEnabledReverseProxyConfig(ctx context.Context, req *pb.FindEnabledReverseProxyConfigRequest) (*pb.FindEnabledReverseProxyConfigResponse, error) {
 | 
				
			||||||
 | 
						// 校验请求
 | 
				
			||||||
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						config, err := models.SharedReverseProxyDAO.ComposeReverseProxyConfig(req.ReverseProxyId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						configData, err := json.Marshal(config)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &pb.FindEnabledReverseProxyConfigResponse{Config: configData}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改反向代理调度算法
 | 
				
			||||||
 | 
					func (this *ReverseProxyService) UpdateReverseProxyScheduling(ctx context.Context, req *pb.UpdateReverseProxySchedulingRequest) (*pb.UpdateReverseProxySchedulingResponse, error) {
 | 
				
			||||||
 | 
						// 校验请求
 | 
				
			||||||
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = models.SharedReverseProxyDAO.UpdateReverseProxyScheduling(req.ReverseProxyId, req.SchedulingJSON)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &pb.UpdateReverseProxySchedulingResponse{}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改主要源站信息
 | 
				
			||||||
 | 
					func (this *ReverseProxyService) UpdateReverseProxyPrimaryOrigins(ctx context.Context, req *pb.UpdateReverseProxyPrimaryOriginsRequest) (*pb.UpdateReverseProxyPrimaryOriginsResponse, error) {
 | 
				
			||||||
 | 
						// 校验请求
 | 
				
			||||||
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = models.SharedReverseProxyDAO.UpdateReverseProxyPrimaryOrigins(req.ReverseProxyId, req.OriginsJSON)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &pb.UpdateReverseProxyPrimaryOriginsResponse{}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改备用源站信息
 | 
				
			||||||
 | 
					func (this *ReverseProxyService) UpdateReverseProxyBackupOrigins(ctx context.Context, req *pb.UpdateReverseProxyBackupOriginsRequest) (*pb.UpdateReverseProxyBackupOriginsResponse, error) {
 | 
				
			||||||
 | 
						// 校验请求
 | 
				
			||||||
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = models.SharedReverseProxyDAO.UpdateReverseProxyBackupOrigins(req.ReverseProxyId, req.OriginsJSON)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &pb.UpdateReverseProxyBackupOriginsResponse{}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -2,6 +2,7 @@ package services
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/db/models"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/db/models"
 | 
				
			||||||
	rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
 | 
						rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
 | 
				
			||||||
@@ -17,7 +18,7 @@ func (this *ServerService) CreateServer(ctx context.Context, req *pb.CreateServe
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	serverId, err := models.SharedServerDAO.CreateServer(req.AdminId, req.UserId, req.Type, req.Name, req.Description, req.ClusterId, string(req.Config), string(req.IncludeNodesJSON), string(req.ExcludeNodesJSON))
 | 
						serverId, err := models.SharedServerDAO.CreateServer(req.AdminId, req.UserId, req.Type, req.Name, req.Description, string(req.ServerNamesJON), string(req.HttpJSON), string(req.HttpsJSON), string(req.TcpJSON), string(req.TlsJSON), string(req.UnixJSON), string(req.UdpJSON), req.WebId, req.ReverseProxyId, req.ClusterId, string(req.IncludeNodesJSON), string(req.ExcludeNodesJSON))
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -73,8 +74,8 @@ func (this *ServerService) UpdateServerBasic(ctx context.Context, req *pb.Update
 | 
				
			|||||||
	return &pb.UpdateServerBasicResponse{}, nil
 | 
						return &pb.UpdateServerBasicResponse{}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 修改服务配置
 | 
					// 修改HTTP服务
 | 
				
			||||||
func (this *ServerService) UpdateServerConfig(ctx context.Context, req *pb.UpdateServerConfigRequest) (*pb.UpdateServerConfigResponse, error) {
 | 
					func (this *ServerService) UpdateServerHTTP(ctx context.Context, req *pb.UpdateServerHTTPRequest) (*pb.UpdateServerHTTPResponse, error) {
 | 
				
			||||||
	_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@@ -84,17 +85,17 @@ func (this *ServerService) UpdateServerConfig(ctx context.Context, req *pb.Updat
 | 
				
			|||||||
		return nil, errors.New("invalid serverId")
 | 
							return nil, errors.New("invalid serverId")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 查找Server
 | 
						// 查询老的节点信息
 | 
				
			||||||
	server, err := models.SharedServerDAO.FindEnabledServer(req.ServerId)
 | 
						server, err := models.SharedServerDAO.FindEnabledServer(req.ServerId)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if server == nil {
 | 
						if server == nil {
 | 
				
			||||||
		return &pb.UpdateServerConfigResponse{}, nil
 | 
							return nil, errors.New("can not find server")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 修改
 | 
						// 修改配置
 | 
				
			||||||
	err = models.SharedServerDAO.UpdateServerConfig(req.ServerId, req.Config)
 | 
						err = models.SharedServerDAO.UpdateServerHTTP(req.ServerId, req.Config)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -105,7 +106,287 @@ func (this *ServerService) UpdateServerConfig(ctx context.Context, req *pb.Updat
 | 
				
			|||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &pb.UpdateServerConfigResponse{}, nil
 | 
						return &pb.UpdateServerHTTPResponse{}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改HTTPS服务
 | 
				
			||||||
 | 
					func (this *ServerService) UpdateServerHTTPS(ctx context.Context, req *pb.UpdateServerHTTPSRequest) (*pb.UpdateServerHTTPSResponse, error) {
 | 
				
			||||||
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if req.ServerId <= 0 {
 | 
				
			||||||
 | 
							return nil, errors.New("invalid serverId")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 查询老的节点信息
 | 
				
			||||||
 | 
						server, err := models.SharedServerDAO.FindEnabledServer(req.ServerId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if server == nil {
 | 
				
			||||||
 | 
							return nil, errors.New("can not find server")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 修改配置
 | 
				
			||||||
 | 
						err = models.SharedServerDAO.UpdateServerHTTPS(req.ServerId, req.Config)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 更新新的节点版本
 | 
				
			||||||
 | 
						err = models.SharedNodeDAO.UpdateAllNodesLatestVersionMatch(int64(server.ClusterId))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &pb.UpdateServerHTTPSResponse{}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改TCP服务
 | 
				
			||||||
 | 
					func (this *ServerService) UpdateServerTCP(ctx context.Context, req *pb.UpdateServerTCPRequest) (*pb.UpdateServerTCPResponse, error) {
 | 
				
			||||||
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if req.ServerId <= 0 {
 | 
				
			||||||
 | 
							return nil, errors.New("invalid serverId")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 查询老的节点信息
 | 
				
			||||||
 | 
						server, err := models.SharedServerDAO.FindEnabledServer(req.ServerId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if server == nil {
 | 
				
			||||||
 | 
							return nil, errors.New("can not find server")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 修改配置
 | 
				
			||||||
 | 
						err = models.SharedServerDAO.UpdateServerTCP(req.ServerId, req.Config)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 更新新的节点版本
 | 
				
			||||||
 | 
						err = models.SharedNodeDAO.UpdateAllNodesLatestVersionMatch(int64(server.ClusterId))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &pb.UpdateServerTCPResponse{}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改TLS服务
 | 
				
			||||||
 | 
					func (this *ServerService) UpdateServerTLS(ctx context.Context, req *pb.UpdateServerTLSRequest) (*pb.UpdateServerTLSResponse, error) {
 | 
				
			||||||
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if req.ServerId <= 0 {
 | 
				
			||||||
 | 
							return nil, errors.New("invalid serverId")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 查询老的节点信息
 | 
				
			||||||
 | 
						server, err := models.SharedServerDAO.FindEnabledServer(req.ServerId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if server == nil {
 | 
				
			||||||
 | 
							return nil, errors.New("can not find server")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 修改配置
 | 
				
			||||||
 | 
						err = models.SharedServerDAO.UpdateServerTLS(req.ServerId, req.Config)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 更新新的节点版本
 | 
				
			||||||
 | 
						err = models.SharedNodeDAO.UpdateAllNodesLatestVersionMatch(int64(server.ClusterId))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &pb.UpdateServerTLSResponse{}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改Unix服务
 | 
				
			||||||
 | 
					func (this *ServerService) UpdateServerUnix(ctx context.Context, req *pb.UpdateServerUnixRequest) (*pb.UpdateServerUnixResponse, error) {
 | 
				
			||||||
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if req.ServerId <= 0 {
 | 
				
			||||||
 | 
							return nil, errors.New("invalid serverId")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 查询老的节点信息
 | 
				
			||||||
 | 
						server, err := models.SharedServerDAO.FindEnabledServer(req.ServerId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if server == nil {
 | 
				
			||||||
 | 
							return nil, errors.New("can not find server")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 修改配置
 | 
				
			||||||
 | 
						err = models.SharedServerDAO.UpdateServerUnix(req.ServerId, req.Config)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 更新新的节点版本
 | 
				
			||||||
 | 
						err = models.SharedNodeDAO.UpdateAllNodesLatestVersionMatch(int64(server.ClusterId))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &pb.UpdateServerUnixResponse{}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改UDP服务
 | 
				
			||||||
 | 
					func (this *ServerService) UpdateServerUDP(ctx context.Context, req *pb.UpdateServerUDPRequest) (*pb.UpdateServerUDPResponse, error) {
 | 
				
			||||||
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if req.ServerId <= 0 {
 | 
				
			||||||
 | 
							return nil, errors.New("invalid serverId")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 查询老的节点信息
 | 
				
			||||||
 | 
						server, err := models.SharedServerDAO.FindEnabledServer(req.ServerId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if server == nil {
 | 
				
			||||||
 | 
							return nil, errors.New("can not find server")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 修改配置
 | 
				
			||||||
 | 
						err = models.SharedServerDAO.UpdateServerUDP(req.ServerId, req.Config)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 更新新的节点版本
 | 
				
			||||||
 | 
						err = models.SharedNodeDAO.UpdateAllNodesLatestVersionMatch(int64(server.ClusterId))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &pb.UpdateServerUDPResponse{}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改Web服务
 | 
				
			||||||
 | 
					func (this *ServerService) UpdateServerWeb(ctx context.Context, req *pb.UpdateServerWebRequest) (*pb.UpdateServerWebResponse, error) {
 | 
				
			||||||
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if req.ServerId <= 0 {
 | 
				
			||||||
 | 
							return nil, errors.New("invalid serverId")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 查询老的节点信息
 | 
				
			||||||
 | 
						server, err := models.SharedServerDAO.FindEnabledServer(req.ServerId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if server == nil {
 | 
				
			||||||
 | 
							return nil, errors.New("can not find server")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 修改配置
 | 
				
			||||||
 | 
						err = models.SharedServerDAO.UpdateServerWeb(req.ServerId, req.WebId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 更新新的节点版本
 | 
				
			||||||
 | 
						err = models.SharedNodeDAO.UpdateAllNodesLatestVersionMatch(int64(server.ClusterId))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &pb.UpdateServerWebResponse{}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改反向代理服务
 | 
				
			||||||
 | 
					func (this *ServerService) UpdateServerReverseProxy(ctx context.Context, req *pb.UpdateServerReverseProxyRequest) (*pb.UpdateServerReverseProxyResponse, error) {
 | 
				
			||||||
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if req.ServerId <= 0 {
 | 
				
			||||||
 | 
							return nil, errors.New("invalid serverId")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 查询老的节点信息
 | 
				
			||||||
 | 
						server, err := models.SharedServerDAO.FindEnabledServer(req.ServerId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if server == nil {
 | 
				
			||||||
 | 
							return nil, errors.New("can not find server")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 修改配置
 | 
				
			||||||
 | 
						err = models.SharedServerDAO.UpdateServerReverseProxy(req.ServerId, req.ReverseProxyId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 更新新的节点版本
 | 
				
			||||||
 | 
						err = models.SharedNodeDAO.UpdateAllNodesLatestVersionMatch(int64(server.ClusterId))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &pb.UpdateServerReverseProxyResponse{}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改域名服务
 | 
				
			||||||
 | 
					func (this *ServerService) UpdateServerNames(ctx context.Context, req *pb.UpdateServerNamesRequest) (*pb.UpdateServerNamesResponse, error) {
 | 
				
			||||||
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if req.ServerId <= 0 {
 | 
				
			||||||
 | 
							return nil, errors.New("invalid serverId")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 查询老的节点信息
 | 
				
			||||||
 | 
						server, err := models.SharedServerDAO.FindEnabledServer(req.ServerId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if server == nil {
 | 
				
			||||||
 | 
							return nil, errors.New("can not find server")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 修改配置
 | 
				
			||||||
 | 
						err = models.SharedServerDAO.UpdateServerNames(req.ServerId, req.Config)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 更新新的节点版本
 | 
				
			||||||
 | 
						err = models.SharedNodeDAO.UpdateAllNodesLatestVersionMatch(int64(server.ClusterId))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &pb.UpdateServerNamesResponse{}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 计算服务数量
 | 
					// 计算服务数量
 | 
				
			||||||
@@ -142,9 +423,9 @@ func (this *ServerService) ListEnabledServers(ctx context.Context, req *pb.ListE
 | 
				
			|||||||
		result = append(result, &pb.Server{
 | 
							result = append(result, &pb.Server{
 | 
				
			||||||
			Id:           int64(server.Id),
 | 
								Id:           int64(server.Id),
 | 
				
			||||||
			Type:         server.Type,
 | 
								Type:         server.Type,
 | 
				
			||||||
 | 
								Config:       []byte(server.Config),
 | 
				
			||||||
			Name:         server.Name,
 | 
								Name:         server.Name,
 | 
				
			||||||
			Description:  server.Description,
 | 
								Description:  server.Description,
 | 
				
			||||||
			Config:       []byte(server.Config),
 | 
					 | 
				
			||||||
			IncludeNodes: []byte(server.IncludeNodes),
 | 
								IncludeNodes: []byte(server.IncludeNodes),
 | 
				
			||||||
			ExcludeNodes: []byte(server.ExcludeNodes),
 | 
								ExcludeNodes: []byte(server.ExcludeNodes),
 | 
				
			||||||
			CreatedAt:    int64(server.CreatedAt),
 | 
								CreatedAt:    int64(server.CreatedAt),
 | 
				
			||||||
@@ -216,6 +497,15 @@ func (this *ServerService) FindEnabledServer(ctx context.Context, req *pb.FindEn
 | 
				
			|||||||
		Name:           server.Name,
 | 
							Name:           server.Name,
 | 
				
			||||||
		Description:    server.Description,
 | 
							Description:    server.Description,
 | 
				
			||||||
		Config:         []byte(server.Config),
 | 
							Config:         []byte(server.Config),
 | 
				
			||||||
 | 
							HttpJSON:       []byte(server.Http),
 | 
				
			||||||
 | 
							HttpsJSON:      []byte(server.Https),
 | 
				
			||||||
 | 
							TcpJSON:        []byte(server.Tcp),
 | 
				
			||||||
 | 
							TlsJSON:        []byte(server.Tls),
 | 
				
			||||||
 | 
							UnixJSON:       []byte(server.Unix),
 | 
				
			||||||
 | 
							UdpJSON:        []byte(server.Udp),
 | 
				
			||||||
 | 
							WebId:          int64(server.WebId),
 | 
				
			||||||
 | 
							ReverseProxyId: int64(server.ReverseProxyId),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		IncludeNodes: []byte(server.IncludeNodes),
 | 
							IncludeNodes: []byte(server.IncludeNodes),
 | 
				
			||||||
		ExcludeNodes: []byte(server.ExcludeNodes),
 | 
							ExcludeNodes: []byte(server.ExcludeNodes),
 | 
				
			||||||
		CreatedAt:    int64(server.CreatedAt),
 | 
							CreatedAt:    int64(server.CreatedAt),
 | 
				
			||||||
@@ -225,3 +515,41 @@ func (this *ServerService) FindEnabledServer(ctx context.Context, req *pb.FindEn
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
	}}, nil
 | 
						}}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					func (this *ServerService) FindEnabledServerType(ctx context.Context, req *pb.FindEnabledServerTypeRequest) (*pb.FindEnabledServerTypeResponse, error) {
 | 
				
			||||||
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						serverType, err := models.SharedServerDAO.FindEnabledServerType(req.ServerId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &pb.FindEnabledServerTypeResponse{Type: serverType}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 查找反向代理设置
 | 
				
			||||||
 | 
					func (this *ServerService) FindServerReverseProxy(ctx context.Context, req *pb.FindServerReverseProxyRequest) (*pb.FindServerReverseProxyResponse, error) {
 | 
				
			||||||
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						reverseProxy, err := models.SharedServerDAO.FindReverseProxyConfig(req.ServerId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if reverseProxy == nil {
 | 
				
			||||||
 | 
							return &pb.FindServerReverseProxyResponse{Config: nil}, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						configData, err := json.Marshal(reverseProxy)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return &pb.FindServerReverseProxyResponse{Config: configData}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user