mirror of
				https://github.com/TeaOSLab/EdgeAdmin.git
				synced 2025-11-04 05:00:25 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			188 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			188 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package servers
 | 
						||
 | 
						||
import (
 | 
						||
	"encoding/json"
 | 
						||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
						||
	"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
 | 
						||
	"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
 | 
						||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
						||
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
 | 
						||
	"github.com/iwind/TeaGo/actions"
 | 
						||
	"github.com/iwind/TeaGo/maps"
 | 
						||
	"github.com/iwind/TeaGo/types"
 | 
						||
	"net/url"
 | 
						||
	"regexp"
 | 
						||
	"strings"
 | 
						||
)
 | 
						||
 | 
						||
type AddOriginPopupAction struct {
 | 
						||
	actionutils.ParentAction
 | 
						||
}
 | 
						||
 | 
						||
func (this *AddOriginPopupAction) Init() {
 | 
						||
	this.Nav("", "", "")
 | 
						||
}
 | 
						||
 | 
						||
func (this *AddOriginPopupAction) RunGet(params struct {
 | 
						||
	ServerType string
 | 
						||
}) {
 | 
						||
	this.Data["serverType"] = params.ServerType
 | 
						||
 | 
						||
	this.getOSSHook()
 | 
						||
 | 
						||
	this.Show()
 | 
						||
}
 | 
						||
 | 
						||
func (this *AddOriginPopupAction) RunPost(params struct {
 | 
						||
	Protocol string
 | 
						||
	Addr     string
 | 
						||
 | 
						||
	DomainsJSON  []byte
 | 
						||
	Host         string
 | 
						||
	FollowPort   bool
 | 
						||
	Http2Enabled bool
 | 
						||
 | 
						||
	Must *actions.Must
 | 
						||
}) {
 | 
						||
	ossConfig, goNext, err := this.postOSSHook(params.Protocol)
 | 
						||
	if err != nil {
 | 
						||
		this.ErrorPage(err)
 | 
						||
		return
 | 
						||
	}
 | 
						||
	if !goNext {
 | 
						||
		return
 | 
						||
	}
 | 
						||
 | 
						||
	// 初始化
 | 
						||
	var pbAddr = &pb.NetworkAddress{
 | 
						||
		Protocol: params.Protocol,
 | 
						||
	}
 | 
						||
	var addrConfig = &serverconfigs.NetworkAddressConfig{
 | 
						||
		Protocol: serverconfigs.Protocol(params.Protocol),
 | 
						||
	}
 | 
						||
	var ossJSON []byte
 | 
						||
 | 
						||
	if ossConfig != nil { // OSS
 | 
						||
		ossJSON, err = json.Marshal(ossConfig)
 | 
						||
		if err != nil {
 | 
						||
			this.ErrorPage(err)
 | 
						||
			return
 | 
						||
		}
 | 
						||
		err = ossConfig.Init()
 | 
						||
		if err != nil {
 | 
						||
			this.Fail("校验OSS配置时出错:" + err.Error())
 | 
						||
			return
 | 
						||
		}
 | 
						||
	} else { // 普通源站
 | 
						||
		params.Must.
 | 
						||
			Field("addr", params.Addr).
 | 
						||
			Require("请输入源站地址")
 | 
						||
 | 
						||
		var addr = params.Addr
 | 
						||
 | 
						||
		// 是否是完整的地址
 | 
						||
		if (params.Protocol == "http" || params.Protocol == "https") && regexp.MustCompile(`^(http|https)://`).MatchString(addr) {
 | 
						||
			u, err := url.Parse(addr)
 | 
						||
			if err == nil {
 | 
						||
				addr = u.Host
 | 
						||
			}
 | 
						||
		}
 | 
						||
 | 
						||
		addr = regexp.MustCompile(`\s+`).ReplaceAllString(addr, "")
 | 
						||
		var portIndex = strings.LastIndex(addr, ":")
 | 
						||
		if portIndex < 0 {
 | 
						||
			if params.Protocol == "http" {
 | 
						||
				addr += ":80"
 | 
						||
			} else if params.Protocol == "https" {
 | 
						||
				addr += ":443"
 | 
						||
			} else {
 | 
						||
				this.Fail("地址中需要带有端口")
 | 
						||
			}
 | 
						||
			portIndex = strings.LastIndex(addr, ":")
 | 
						||
		}
 | 
						||
		var host = addr[:portIndex]
 | 
						||
		var port = addr[portIndex+1:]
 | 
						||
 | 
						||
		// 检查端口号
 | 
						||
		if port == "0" {
 | 
						||
			this.Fail("端口号不能为0")
 | 
						||
		}
 | 
						||
		if !configutils.HasVariables(port) {
 | 
						||
			// 必须是整数
 | 
						||
			if !regexp.MustCompile(`^\d+$`).MatchString(port) {
 | 
						||
				this.Fail("端口号只能为整数")
 | 
						||
			}
 | 
						||
			var portInt = types.Int(port)
 | 
						||
			if portInt == 0 {
 | 
						||
				this.Fail("端口号不能为0")
 | 
						||
			}
 | 
						||
			if portInt > 65535 {
 | 
						||
				this.Fail("端口号不能大于65535")
 | 
						||
			}
 | 
						||
		}
 | 
						||
 | 
						||
		pbAddr = &pb.NetworkAddress{
 | 
						||
			Protocol:  params.Protocol,
 | 
						||
			Host:      host,
 | 
						||
			PortRange: port,
 | 
						||
		}
 | 
						||
 | 
						||
		addrConfig = &serverconfigs.NetworkAddressConfig{
 | 
						||
			Protocol:  serverconfigs.Protocol(params.Protocol),
 | 
						||
			Host:      host,
 | 
						||
			PortRange: port,
 | 
						||
		}
 | 
						||
	}
 | 
						||
 | 
						||
	// 专属域名
 | 
						||
	var domains = []string{}
 | 
						||
	if len(params.DomainsJSON) > 0 {
 | 
						||
		err := json.Unmarshal(params.DomainsJSON, &domains)
 | 
						||
		if err != nil {
 | 
						||
			this.ErrorPage(err)
 | 
						||
			return
 | 
						||
		}
 | 
						||
 | 
						||
		// 去除可能误加的斜杠
 | 
						||
		for index, domain := range domains {
 | 
						||
			domains[index] = strings.TrimSuffix(domain, "/")
 | 
						||
		}
 | 
						||
	}
 | 
						||
 | 
						||
	resp, err := this.RPC().OriginRPC().CreateOrigin(this.AdminContext(), &pb.CreateOriginRequest{
 | 
						||
		Name:         "",
 | 
						||
		Addr:         pbAddr,
 | 
						||
		OssJSON:      ossJSON,
 | 
						||
		Description:  "",
 | 
						||
		Weight:       10,
 | 
						||
		IsOn:         true,
 | 
						||
		Domains:      domains,
 | 
						||
		Host:         params.Host,
 | 
						||
		FollowPort:   params.FollowPort,
 | 
						||
		Http2Enabled: params.Http2Enabled,
 | 
						||
	})
 | 
						||
	if err != nil {
 | 
						||
		this.ErrorPage(err)
 | 
						||
		return
 | 
						||
	}
 | 
						||
 | 
						||
	var origin = &serverconfigs.OriginConfig{
 | 
						||
		Id:   resp.OriginId,
 | 
						||
		IsOn: true,
 | 
						||
		Addr: addrConfig,
 | 
						||
		OSS:  ossConfig,
 | 
						||
	}
 | 
						||
 | 
						||
	this.Data["origin"] = maps.Map{
 | 
						||
		"id":          resp.OriginId,
 | 
						||
		"isOn":        true,
 | 
						||
		"addr":        addrConfig,
 | 
						||
		"addrSummary": origin.AddrSummary(),
 | 
						||
	}
 | 
						||
 | 
						||
	// 创建日志
 | 
						||
	defer this.CreateLogInfo(codes.ServerOrigin_LogCreateOrigin, resp.OriginId)
 | 
						||
 | 
						||
	this.Success()
 | 
						||
}
 |