阶段性提交

This commit is contained in:
刘祥超
2020-09-15 14:44:11 +08:00
parent 512a1ac013
commit 39fc21cf5b
23 changed files with 1496 additions and 78 deletions

View File

@@ -59,6 +59,8 @@ func (this *APINode) listenRPC() error {
pb.RegisterNodeIPAddressServiceServer(rpcServer, &services.NodeIPAddressService{})
pb.RegisterAPINodeServiceServer(rpcServer, &services.APINodeService{})
pb.RegisterOriginServerServiceServer(rpcServer, &services.OriginServerService{})
pb.RegisterHTTPWebServiceServer(rpcServer, &services.HTTPWebService{})
pb.RegisterReverseProxyServiceServer(rpcServer, &services.ReverseProxyService{})
err = rpcServer.Serve(listener)
if err != nil {
return errors.New("[API]start rpc failed: " + err.Error())

View File

@@ -5,6 +5,7 @@ type HTTPCachePolicy 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"` // 是否启用
Name string `field:"name"` // 名称
Key string `field:"key"` // 缓存Key规则
@@ -24,6 +25,7 @@ type HTTPCachePolicyOperator struct {
Id interface{} // ID
AdminId interface{} // 管理员ID
UserId interface{} // 用户ID
TemplateId interface{} // 模版ID
IsOn interface{} // 是否启用
Name interface{} // 名称
Key interface{} // 缓存Key规则

View File

@@ -5,6 +5,7 @@ type HTTPHeader 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"` // 是否启用
Name string `field:"name"` // 名称
Value string `field:"value"` // 值
@@ -18,6 +19,7 @@ type HTTPHeaderOperator struct {
Id interface{} // ID
AdminId interface{} // 管理员ID
UserId interface{} // 用户ID
TemplateId interface{} // 模版ID
IsOn interface{} // 是否启用
Name interface{} // 名称
Value interface{} // 值

View 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
}

View File

@@ -0,0 +1,5 @@
package models
import (
_ "github.com/go-sql-driver/mysql"
)

View 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{}
}

View File

@@ -0,0 +1 @@
package models

View File

@@ -3,25 +3,29 @@ package models
// 节点集群
type NodeCluster struct {
Id uint32 `field:"id"` // ID
AdminId uint32 `field:"adminId"` // 管理员ID
UserId uint32 `field:"userId"` // 用户ID
Name string `field:"name"` // 名称
InstallDir string `field:"installDir"` // 安装目录
GrantId uint32 `field:"grantId"` // 默认认证方式
UseAllAPINodes uint8 `field:"useAllAPINodes"` // 是否使用所有API节点
ApiNodes string `field:"apiNodes"` // 使用的API节点
InstallDir string `field:"installDir"` // 安装目录
Order uint32 `field:"order"` // 排序
CreatedAt uint32 `field:"createdAt"` // 创建时间
GrantId uint32 `field:"grantId"` // 默认认证方式
State uint8 `field:"state"` // 状态
}
type NodeClusterOperator struct {
Id interface{} // ID
AdminId interface{} // 管理员ID
UserId interface{} // 用户ID
Name interface{} // 名称
InstallDir interface{} // 安装目录
GrantId interface{} // 默认认证方式
UseAllAPINodes interface{} // 是否使用所有API节点
ApiNodes interface{} // 使用的API节点
InstallDir interface{} // 安装目录
Order interface{} // 排序
CreatedAt interface{} // 创建时间
GrantId interface{} // 默认认证方式
State interface{} // 状态
}

View File

@@ -0,0 +1 @@
package models

View File

@@ -3,6 +3,8 @@ package models
// 节点
type Node struct {
Id uint32 `field:"id"` // ID
AdminId uint32 `field:"adminId"` // 管理员ID
UserId uint32 `field:"userId"` // 用户ID
IsOn uint8 `field:"isOn"` // 是否启用
UniqueId string `field:"uniqueId"` // 节点ID
Secret string `field:"secret"` // 密钥
@@ -23,6 +25,8 @@ type Node struct {
type NodeOperator struct {
Id interface{} // ID
AdminId interface{} // 管理员ID
UserId interface{} // 用户ID
IsOn interface{} // 是否启用
UniqueId interface{} // 节点ID
Secret interface{} // 密钥

View File

@@ -1,7 +1,11 @@
package models
import (
"encoding/json"
"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/iwind/TeaGo/Tea"
"github.com/iwind/TeaGo/dbs"
@@ -95,3 +99,110 @@ func (this *OriginServerDAO) UpdateOriginServer(originId int64, name string, add
_, err := this.Save(op)
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
}

View File

@@ -3,6 +3,8 @@ package models
// 源站
type OriginServer struct {
Id uint32 `field:"id"` // ID
AdminId uint32 `field:"adminId"` // 管理员ID
UserId uint32 `field:"userId"` // 用户ID
IsOn uint8 `field:"isOn"` // 是否启用
Name string `field:"name"` // 名称
Version uint32 `field:"version"` // 版本
@@ -21,7 +23,6 @@ type OriginServer struct {
HttpResponseHeaders string `field:"httpResponseHeaders"` // 响应Headers配置
Host string `field:"host"` // 自定义主机名
HealthCheck string `field:"healthCheck"` // 健康检查设置
IsDown uint8 `field:"isDown"` // 是否处于健康检查失败状态
Cert string `field:"cert"` // 证书设置
Ftp string `field:"ftp"` // FTP相关设置
CreatedAt uint32 `field:"createdAt"` // 创建时间
@@ -30,6 +31,8 @@ type OriginServer struct {
type OriginServerOperator struct {
Id interface{} // ID
AdminId interface{} // 管理员ID
UserId interface{} // 用户ID
IsOn interface{} // 是否启用
Name interface{} // 名称
Version interface{} // 版本
@@ -48,7 +51,6 @@ type OriginServerOperator struct {
HttpResponseHeaders interface{} // 响应Headers配置
Host interface{} // 自定义主机名
HealthCheck interface{} // 健康检查设置
IsDown interface{} // 是否处于健康检查失败状态
Cert interface{} // 证书设置
Ftp interface{} // FTP相关设置
CreatedAt interface{} // 创建时间

View 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
}

View 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)
}

View 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{}
}

View File

@@ -0,0 +1 @@
package models

View File

@@ -1,6 +1,7 @@
package models
import (
"encoding/json"
"errors"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
_ "github.com/go-sql-driver/mysql"
@@ -59,8 +60,16 @@ func (this *ServerDAO) FindEnabledServer(id int64) (*Server, error) {
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()
if err != nil {
return 0, err
@@ -73,10 +82,32 @@ func (this *ServerDAO) CreateServer(adminId int64, userId int64, serverType serv
op.Name = name
op.Type = serverType
op.Description = description
op.ClusterId = clusterId
if len(configJSON) > 0 {
op.Config = configJSON
if len(serverNamesJSON) > 0 {
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 {
op.IncludeNodes = includeNodesJSON
}
@@ -88,7 +119,14 @@ func (this *ServerDAO) CreateServer(adminId int64, userId int64, serverType serv
op.IsOn = 1
op.State = ServerStateEnabled
_, 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 {
return errors.New("serverId should not be smaller than 0")
}
if len(config) == 0 {
config = []byte("null")
}
_, err := this.Query().
Pk(serverId).
Set("config", string(config)).
Set("version", dbs.SQL("version+1")).
Update()
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) {
return this.Query().
@@ -157,6 +355,153 @@ func (this *ServerDAO) FindAllEnabledServersWithNode(nodeId int64) (result []*Se
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
func (this *ServerDAO) genUniqueId() (string, error) {

View File

@@ -2,4 +2,14 @@ package models
import (
_ "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)
}

View File

@@ -10,6 +10,15 @@ type Server struct {
Type string `field:"type"` // 服务类型
Name string `field:"name"` // 名称
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列表
Config string `field:"config"` // 服务配置,自动生成
ClusterId uint32 `field:"clusterId"` // 集群ID
@@ -29,6 +38,15 @@ type ServerOperator struct {
Type interface{} // 服务类型
Name 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列表
Config interface{} // 服务配置,自动生成
ClusterId interface{} // 集群ID

View 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
}

View File

@@ -2,6 +2,7 @@ package services
import (
"context"
"encoding/json"
"errors"
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
@@ -85,7 +86,7 @@ func (this *OriginServerService) FindEnabledOriginServer(ctx context.Context, re
IsOn: origin.IsOn == 1,
Name: origin.Name,
Addr: &pb.NetworkAddress{
Protocol: addr.Protocol,
Protocol: addr.Protocol.String(),
Host: addr.Host,
PortRange: addr.PortRange,
},
@@ -93,3 +94,23 @@ func (this *OriginServerService) FindEnabledOriginServer(ctx context.Context, re
}
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
}

View 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
}

View File

@@ -2,6 +2,7 @@ package services
import (
"context"
"encoding/json"
"errors"
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
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 {
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 {
return nil, err
}
@@ -73,8 +74,8 @@ func (this *ServerService) UpdateServerBasic(ctx context.Context, req *pb.Update
return &pb.UpdateServerBasicResponse{}, nil
}
// 修改服务配置
func (this *ServerService) UpdateServerConfig(ctx context.Context, req *pb.UpdateServerConfigRequest) (*pb.UpdateServerConfigResponse, error) {
// 修改HTTP服务
func (this *ServerService) UpdateServerHTTP(ctx context.Context, req *pb.UpdateServerHTTPRequest) (*pb.UpdateServerHTTPResponse, error) {
_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
if err != nil {
return nil, err
@@ -84,17 +85,17 @@ func (this *ServerService) UpdateServerConfig(ctx context.Context, req *pb.Updat
return nil, errors.New("invalid serverId")
}
// 查找Server
// 查询老的节点信息
server, err := models.SharedServerDAO.FindEnabledServer(req.ServerId)
if err != nil {
return nil, err
}
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 {
return nil, err
}
@@ -105,7 +106,287 @@ func (this *ServerService) UpdateServerConfig(ctx context.Context, req *pb.Updat
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{
Id: int64(server.Id),
Type: server.Type,
Config: []byte(server.Config),
Name: server.Name,
Description: server.Description,
Config: []byte(server.Config),
IncludeNodes: []byte(server.IncludeNodes),
ExcludeNodes: []byte(server.ExcludeNodes),
CreatedAt: int64(server.CreatedAt),
@@ -216,6 +497,15 @@ func (this *ServerService) FindEnabledServer(ctx context.Context, req *pb.FindEn
Name: server.Name,
Description: server.Description,
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),
ExcludeNodes: []byte(server.ExcludeNodes),
CreatedAt: int64(server.CreatedAt),
@@ -225,3 +515,41 @@ func (this *ServerService) FindEnabledServer(ctx context.Context, req *pb.FindEn
},
}}, 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
}