mirror of
https://github.com/TeaOSLab/EdgeAPI.git
synced 2025-11-05 01:20:25 +08:00
增加简化版的创建TCP网站API
This commit is contained in:
@@ -231,10 +231,21 @@ func (this *ServerService) CreateBasicHTTPServer(ctx context.Context, req *pb.Cr
|
|||||||
}
|
}
|
||||||
var serverNames = []*serverconfigs.ServerNameConfig{}
|
var serverNames = []*serverconfigs.ServerNameConfig{}
|
||||||
for _, domain := range req.Domains {
|
for _, domain := range req.Domains {
|
||||||
|
domain = strings.ToLower(domain)
|
||||||
if !domainutils.ValidateDomainFormat(domain) {
|
if !domainutils.ValidateDomainFormat(domain) {
|
||||||
return nil, errors.New("invalid domain format '" + domain + "'")
|
return nil, errors.New("invalid domain format '" + domain + "'")
|
||||||
}
|
}
|
||||||
serverNames = append(serverNames, &serverconfigs.ServerNameConfig{Name: strings.ToLower(domain)})
|
|
||||||
|
// 检查域名是否已存在
|
||||||
|
existServerName, err := models.SharedServerDAO.ExistServerNameInCluster(tx, req.NodeClusterId, domain, 0, true)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if existServerName {
|
||||||
|
return nil, errors.New("domain '" + domain + "' already created by other server")
|
||||||
|
}
|
||||||
|
|
||||||
|
serverNames = append(serverNames, &serverconfigs.ServerNameConfig{Name: domain})
|
||||||
}
|
}
|
||||||
serverNamesJSON, err := json.Marshal(serverNames)
|
serverNamesJSON, err := json.Marshal(serverNames)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -443,6 +454,239 @@ func (this *ServerService) CreateBasicHTTPServer(ctx context.Context, req *pb.Cr
|
|||||||
return &pb.CreateBasicHTTPServerResponse{ServerId: serverId}, nil
|
return &pb.CreateBasicHTTPServerResponse{ServerId: serverId}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CreateBasicTCPServer 快速创建基本的TCP网站
|
||||||
|
func (this *ServerService) CreateBasicTCPServer(ctx context.Context, req *pb.CreateBasicTCPServerRequest) (*pb.CreateBasicTCPServerResponse, error) {
|
||||||
|
adminId, userId, err := this.ValidateAdminAndUser(ctx, true)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 集群
|
||||||
|
var tx = this.NullTx()
|
||||||
|
if userId > 0 {
|
||||||
|
req.UserId = userId
|
||||||
|
|
||||||
|
nodeClusterId, err := models.SharedUserDAO.FindUserClusterId(tx, userId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
req.NodeClusterId = nodeClusterId
|
||||||
|
} else if adminId > 0 && req.UserId > 0 && req.NodeClusterId <= 0 {
|
||||||
|
// check user
|
||||||
|
existUser, err := models.SharedUserDAO.Exist(tx, req.UserId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if !existUser {
|
||||||
|
return nil, errors.New("user id '" + types.String(req.UserId) + "' not found")
|
||||||
|
}
|
||||||
|
|
||||||
|
nodeClusterId, err := models.SharedUserDAO.FindUserClusterId(tx, userId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
req.NodeClusterId = nodeClusterId
|
||||||
|
}
|
||||||
|
|
||||||
|
if req.NodeClusterId <= 0 {
|
||||||
|
return nil, errors.New("invalid 'nodeClusterId'")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查用户权限
|
||||||
|
if userId > 0 {
|
||||||
|
features, err := models.SharedUserDAO.FindUserFeatures(tx, userId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var canSpecifyTCPPort = false
|
||||||
|
for _, feature := range features {
|
||||||
|
if feature.Code == "server.tcp.port" {
|
||||||
|
canSpecifyTCPPort = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !canSpecifyTCPPort {
|
||||||
|
if len(req.TcpPorts) > 0 || len(req.TlsPorts) > 0 {
|
||||||
|
return nil, errors.New("no permission to specify tcp/tls ports")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(req.TcpPorts) == 0 || len(req.TlsPorts) == 0 {
|
||||||
|
// TODO 未来支持自动创建端口
|
||||||
|
return nil, errors.New("no ports valid")
|
||||||
|
}
|
||||||
|
|
||||||
|
// TCP
|
||||||
|
var tcpConfig = &serverconfigs.HTTPProtocolConfig{
|
||||||
|
BaseProtocol: serverconfigs.BaseProtocol{
|
||||||
|
IsOn: true,
|
||||||
|
Listen: []*serverconfigs.NetworkAddressConfig{},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, port := range req.TcpPorts {
|
||||||
|
existPort, err := models.SharedServerDAO.CheckPortIsUsing(tx, req.NodeClusterId, "tcp", int(port), 0, "")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if existPort {
|
||||||
|
return nil, errors.New("port '" + types.String(port) + "' already used by other server")
|
||||||
|
}
|
||||||
|
|
||||||
|
tcpConfig.BaseProtocol.Listen = append(tcpConfig.BaseProtocol.Listen, &serverconfigs.NetworkAddressConfig{
|
||||||
|
Protocol: "tcp",
|
||||||
|
PortRange: types.String(port),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
tcpJSON, err := json.Marshal(tcpConfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// TLS
|
||||||
|
var tlsConfig = &serverconfigs.HTTPSProtocolConfig{
|
||||||
|
BaseProtocol: serverconfigs.BaseProtocol{
|
||||||
|
IsOn: true,
|
||||||
|
Listen: []*serverconfigs.NetworkAddressConfig{},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, port := range req.TlsPorts {
|
||||||
|
existPort, err := models.SharedServerDAO.CheckPortIsUsing(tx, req.NodeClusterId, "tcp", int(port), 0, "")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if existPort {
|
||||||
|
return nil, errors.New("port '" + types.String(port) + "' already used by other server")
|
||||||
|
}
|
||||||
|
|
||||||
|
tlsConfig.BaseProtocol.Listen = append(tlsConfig.BaseProtocol.Listen, &serverconfigs.NetworkAddressConfig{
|
||||||
|
Protocol: "tls",
|
||||||
|
PortRange: types.String(port),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
var certRefs = []*sslconfigs.SSLCertRef{}
|
||||||
|
for _, certId := range req.SslCertIds {
|
||||||
|
// 检查所有权
|
||||||
|
if userId > 0 {
|
||||||
|
err = models.SharedSSLCertDAO.CheckUserCert(tx, certId, userId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New("check cert permission failed: " + err.Error())
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
existCert, err := models.SharedSSLCertDAO.Exist(tx, certId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if !existCert {
|
||||||
|
return nil, errors.New("cert '" + types.String(certId) + "' not found")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
certRefs = append(certRefs, &sslconfigs.SSLCertRef{
|
||||||
|
IsOn: true,
|
||||||
|
CertId: certId,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
certRefsJSON, err := json.Marshal(certRefs)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
sslPolicyId, err := models.SharedSSLPolicyDAO.CreatePolicy(tx, adminId, req.UserId, false, false, "TLS 1.0", certRefsJSON, nil, false, 0, nil, false, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
tlsConfig.SSLPolicyRef = &sslconfigs.SSLPolicyRef{
|
||||||
|
IsOn: true,
|
||||||
|
SSLPolicyId: sslPolicyId,
|
||||||
|
}
|
||||||
|
|
||||||
|
tlsJSON, err := json.Marshal(tlsConfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reverse Proxy
|
||||||
|
var reverseProxyScheduleConfig = &serverconfigs.SchedulingConfig{
|
||||||
|
Code: "random",
|
||||||
|
Options: nil,
|
||||||
|
}
|
||||||
|
reverseProxyScheduleJSON, err := json.Marshal(reverseProxyScheduleConfig)
|
||||||
|
|
||||||
|
var primaryOrigins = []*serverconfigs.OriginRef{}
|
||||||
|
for _, originAddr := range req.OriginAddrs {
|
||||||
|
u, err := url.Parse(originAddr)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New("parse origin address '" + originAddr + "' failed: " + err.Error())
|
||||||
|
}
|
||||||
|
if len(u.Scheme) == 0 || (u.Scheme != "tcp" && u.Scheme != "tls" && u.Scheme != "ssl" /** 特意不支持大写形式 **/) {
|
||||||
|
return nil, errors.New("invalid scheme in origin address '" + originAddr + "'")
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(u.Host) == 0 {
|
||||||
|
return nil, errors.New("invalid host address '" + originAddr + "', contains no host")
|
||||||
|
}
|
||||||
|
|
||||||
|
host, port, err := net.SplitHostPort(u.Host)
|
||||||
|
if err != nil || len(host) == 0 || len(port) == 0 {
|
||||||
|
err = nil // ignore error
|
||||||
|
|
||||||
|
return nil, errors.New("invalid host address '" + originAddr + "', invalid host format")
|
||||||
|
}
|
||||||
|
|
||||||
|
if u.Scheme == "ssl" {
|
||||||
|
u.Scheme = "tls"
|
||||||
|
}
|
||||||
|
|
||||||
|
var addr = &serverconfigs.NetworkAddressConfig{
|
||||||
|
Protocol: serverconfigs.Protocol(u.Scheme),
|
||||||
|
Host: host,
|
||||||
|
PortRange: port,
|
||||||
|
}
|
||||||
|
addrJSON, err := json.Marshal(addr)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
originId, err := models.SharedOriginDAO.CreateOrigin(tx, adminId, req.UserId, "", addrJSON, nil, "", 10, true, nil, nil, nil, 0, 0, nil, nil, "", false)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
primaryOrigins = append(primaryOrigins, &serverconfigs.OriginRef{
|
||||||
|
IsOn: true,
|
||||||
|
OriginId: originId,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
primaryOriginsJSON, err := json.Marshal(primaryOrigins)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
reverseProxyId, err := models.SharedReverseProxyDAO.CreateReverseProxy(tx, adminId, req.UserId, reverseProxyScheduleJSON, primaryOriginsJSON, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
reverseProxyJSON, err := json.Marshal(&serverconfigs.ReverseProxyRef{
|
||||||
|
IsPrior: false,
|
||||||
|
IsOn: true,
|
||||||
|
ReverseProxyId: reverseProxyId,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// finally, we create ...
|
||||||
|
serverId, err := models.SharedServerDAO.CreateServer(tx, adminId, req.UserId, serverconfigs.ServerTypeTCPProxy, "TCP Service", "", nil, false, nil, nil, nil, tcpJSON, tlsJSON, nil, nil, 0, reverseProxyJSON, req.NodeClusterId, nil, nil, nil, 0)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &pb.CreateBasicTCPServerResponse{ServerId: serverId}, nil
|
||||||
|
}
|
||||||
|
|
||||||
// UpdateServerBasic 修改服务基本信息
|
// UpdateServerBasic 修改服务基本信息
|
||||||
func (this *ServerService) UpdateServerBasic(ctx context.Context, req *pb.UpdateServerBasicRequest) (*pb.RPCSuccess, error) {
|
func (this *ServerService) UpdateServerBasic(ctx context.Context, req *pb.UpdateServerBasicRequest) (*pb.RPCSuccess, error) {
|
||||||
// 校验请求
|
// 校验请求
|
||||||
|
|||||||
Reference in New Issue
Block a user