mirror of
				https://github.com/TeaOSLab/EdgeAdmin.git
				synced 2025-11-04 13:10:26 +08:00 
			
		
		
		
	可以在分组中设置一些全局配置选项
This commit is contained in:
		@@ -1,4 +1,4 @@
 | 
			
		||||
package groups
 | 
			
		||||
package group
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/oplogs"
 | 
			
		||||
							
								
								
									
										193
									
								
								internal/web/actions/default/servers/groups/group/index.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										193
									
								
								internal/web/actions/default/servers/groups/group/index.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,193 @@
 | 
			
		||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
 | 
			
		||||
 | 
			
		||||
package group
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/servergrouputils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type IndexAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *IndexAction) Init() {
 | 
			
		||||
	this.Nav("", "", "group.index")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *IndexAction) RunGet(params struct {
 | 
			
		||||
	GroupId int64
 | 
			
		||||
	Keyword string
 | 
			
		||||
}) {
 | 
			
		||||
	this.Data["keyword"] = params.Keyword
 | 
			
		||||
 | 
			
		||||
	group, err := servergrouputils.InitGroup(this.Parent(), params.GroupId, "")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Data["group"] = maps.Map{
 | 
			
		||||
		"id":   group.Id,
 | 
			
		||||
		"name": group.Name,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 是否有用户管理权限
 | 
			
		||||
	this.Data["canVisitUser"] = configloaders.AllowModule(this.AdminId(), configloaders.AdminModuleCodeUser)
 | 
			
		||||
 | 
			
		||||
	// 服务列表
 | 
			
		||||
	countResp, err := this.RPC().ServerRPC().CountAllEnabledServersMatch(this.AdminContext(), &pb.CountAllEnabledServersMatchRequest{
 | 
			
		||||
		ServerGroupId: params.GroupId,
 | 
			
		||||
		Keyword:       params.Keyword,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	count := countResp.Count
 | 
			
		||||
	page := this.NewPage(count)
 | 
			
		||||
	this.Data["page"] = page.AsHTML()
 | 
			
		||||
 | 
			
		||||
	// 服务列表
 | 
			
		||||
	serversResp, err := this.RPC().ServerRPC().ListEnabledServersMatch(this.AdminContext(), &pb.ListEnabledServersMatchRequest{
 | 
			
		||||
		Offset:        page.Offset,
 | 
			
		||||
		Size:          page.Size,
 | 
			
		||||
		ServerGroupId: params.GroupId,
 | 
			
		||||
		Keyword:       params.Keyword,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	serverMaps := []maps.Map{}
 | 
			
		||||
	for _, server := range serversResp.Servers {
 | 
			
		||||
		config := &serverconfigs.ServerConfig{}
 | 
			
		||||
		err = json.Unmarshal(server.Config, config)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			this.ErrorPage(err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 端口列表
 | 
			
		||||
		portMaps := []maps.Map{}
 | 
			
		||||
		if len(server.HttpJSON) > 0 && config.HTTP.IsOn {
 | 
			
		||||
			for _, listen := range config.HTTP.Listen {
 | 
			
		||||
				portMaps = append(portMaps, maps.Map{
 | 
			
		||||
					"protocol":  listen.Protocol,
 | 
			
		||||
					"portRange": listen.PortRange,
 | 
			
		||||
				})
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if config.HTTPS != nil && config.HTTPS.IsOn {
 | 
			
		||||
			for _, listen := range config.HTTPS.Listen {
 | 
			
		||||
				portMaps = append(portMaps, maps.Map{
 | 
			
		||||
					"protocol":  listen.Protocol,
 | 
			
		||||
					"portRange": listen.PortRange,
 | 
			
		||||
				})
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if config.TCP != nil && config.TCP.IsOn {
 | 
			
		||||
			for _, listen := range config.TCP.Listen {
 | 
			
		||||
				portMaps = append(portMaps, maps.Map{
 | 
			
		||||
					"protocol":  listen.Protocol,
 | 
			
		||||
					"portRange": listen.PortRange,
 | 
			
		||||
				})
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if config.TLS != nil && config.TLS.IsOn {
 | 
			
		||||
			for _, listen := range config.TLS.Listen {
 | 
			
		||||
				portMaps = append(portMaps, maps.Map{
 | 
			
		||||
					"protocol":  listen.Protocol,
 | 
			
		||||
					"portRange": listen.PortRange,
 | 
			
		||||
				})
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if config.Unix != nil && config.Unix.IsOn {
 | 
			
		||||
			for _, listen := range config.Unix.Listen {
 | 
			
		||||
				portMaps = append(portMaps, maps.Map{
 | 
			
		||||
					"protocol":  listen.Protocol,
 | 
			
		||||
					"portRange": listen.Host,
 | 
			
		||||
				})
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if config.UDP != nil && config.UDP.IsOn {
 | 
			
		||||
			for _, listen := range config.UDP.Listen {
 | 
			
		||||
				portMaps = append(portMaps, maps.Map{
 | 
			
		||||
					"protocol":  listen.Protocol,
 | 
			
		||||
					"portRange": listen.PortRange,
 | 
			
		||||
				})
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 分组
 | 
			
		||||
		groupMaps := []maps.Map{}
 | 
			
		||||
		if len(server.ServerGroups) > 0 {
 | 
			
		||||
			for _, group := range server.ServerGroups {
 | 
			
		||||
				groupMaps = append(groupMaps, maps.Map{
 | 
			
		||||
					"id":   group.Id,
 | 
			
		||||
					"name": group.Name,
 | 
			
		||||
				})
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 域名列表
 | 
			
		||||
		serverNames := []*serverconfigs.ServerNameConfig{}
 | 
			
		||||
		if server.IsAuditing || (server.AuditingResult != nil && !server.AuditingResult.IsOk) {
 | 
			
		||||
			server.ServerNamesJSON = server.AuditingServerNamesJSON
 | 
			
		||||
		}
 | 
			
		||||
		auditingIsOk := true
 | 
			
		||||
		if !server.IsAuditing && server.AuditingResult != nil && !server.AuditingResult.IsOk {
 | 
			
		||||
			auditingIsOk = false
 | 
			
		||||
		}
 | 
			
		||||
		if len(server.ServerNamesJSON) > 0 {
 | 
			
		||||
			err = json.Unmarshal(server.ServerNamesJSON, &serverNames)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				this.ErrorPage(err)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		countServerNames := 0
 | 
			
		||||
		for _, serverName := range serverNames {
 | 
			
		||||
			if len(serverName.SubNames) == 0 {
 | 
			
		||||
				countServerNames++
 | 
			
		||||
			} else {
 | 
			
		||||
				countServerNames += len(serverName.SubNames)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 用户
 | 
			
		||||
		var userMap maps.Map = nil
 | 
			
		||||
		if server.User != nil {
 | 
			
		||||
			userMap = maps.Map{
 | 
			
		||||
				"id":       server.User.Id,
 | 
			
		||||
				"fullname": server.User.Fullname,
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		serverMaps = append(serverMaps, maps.Map{
 | 
			
		||||
			"id":   server.Id,
 | 
			
		||||
			"isOn": server.IsOn,
 | 
			
		||||
			"name": server.Name,
 | 
			
		||||
			"cluster": maps.Map{
 | 
			
		||||
				"id":   server.NodeCluster.Id,
 | 
			
		||||
				"name": server.NodeCluster.Name,
 | 
			
		||||
			},
 | 
			
		||||
			"ports":            portMaps,
 | 
			
		||||
			"serverTypeName":   serverconfigs.FindServerType(server.Type).GetString("name"),
 | 
			
		||||
			"groups":           groupMaps,
 | 
			
		||||
			"serverNames":      serverNames,
 | 
			
		||||
			"countServerNames": countServerNames,
 | 
			
		||||
			"isAuditing":       server.IsAuditing,
 | 
			
		||||
			"auditingIsOk":     auditingIsOk,
 | 
			
		||||
			"user":             userMap,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["servers"] = serverMaps
 | 
			
		||||
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,110 @@
 | 
			
		||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
 | 
			
		||||
 | 
			
		||||
package servergrouputils
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
	"github.com/iwind/TeaGo/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// InitGroup 初始化分组信息
 | 
			
		||||
func InitGroup(parent *actionutils.ParentAction, groupId int64, menuItem string) (*pb.ServerGroup, error) {
 | 
			
		||||
	groupResp, err := parent.RPC().ServerGroupRPC().FindEnabledServerGroup(parent.AdminContext(), &pb.FindEnabledServerGroupRequest{ServerGroupId: groupId})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	var group = groupResp.ServerGroup
 | 
			
		||||
	if group == nil {
 | 
			
		||||
		return nil, errors.New("group with id '" + types.String(groupId) + "' not found")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	parent.Data["group"] = maps.Map{
 | 
			
		||||
		"id":   group.Id,
 | 
			
		||||
		"name": group.Name,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 初始化设置菜单
 | 
			
		||||
	if len(menuItem) > 0 {
 | 
			
		||||
		// 获取设置概要信息
 | 
			
		||||
		configInfoResp, err := parent.RPC().ServerGroupRPC().FindEnabledServerGroupConfigInfo(parent.AdminContext(), &pb.FindEnabledServerGroupConfigInfoRequest{ServerGroupId: groupId})
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return group, err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		var urlPrefix = "/servers/groups/group/settings"
 | 
			
		||||
		parent.Data["leftMenuItems"] = []maps.Map{
 | 
			
		||||
			/**{
 | 
			
		||||
				"name":     "Web设置",
 | 
			
		||||
				"url":      urlPrefix + "/web?groupId=" + types.String(groupId),
 | 
			
		||||
				"isActive": menuItem == "web",
 | 
			
		||||
			},**/
 | 
			
		||||
			{
 | 
			
		||||
				"name":     "HTTP反向代理",
 | 
			
		||||
				"url":      urlPrefix + "/httpReverseProxy?groupId=" + types.String(groupId),
 | 
			
		||||
				"isActive": menuItem == "httpReverseProxy",
 | 
			
		||||
				"isOn":     configInfoResp.HasHTTPReverseProxy,
 | 
			
		||||
			},
 | 
			
		||||
			{
 | 
			
		||||
				"name":     "TCP反向代理",
 | 
			
		||||
				"url":      urlPrefix + "/tcpReverseProxy?groupId=" + types.String(groupId),
 | 
			
		||||
				"isActive": menuItem == "tcpReverseProxy",
 | 
			
		||||
				"isOn":     configInfoResp.HasTCPReverseProxy,
 | 
			
		||||
			},
 | 
			
		||||
			{
 | 
			
		||||
				"name":     "UDP反向代理",
 | 
			
		||||
				"url":      urlPrefix + "/udpReverseProxy?groupId=" + types.String(groupId),
 | 
			
		||||
				"isActive": menuItem == "udpReverseProxy",
 | 
			
		||||
				"isOn":     configInfoResp.HasUDPReverseProxy,
 | 
			
		||||
			},
 | 
			
		||||
			/**{
 | 
			
		||||
				"name": "-",
 | 
			
		||||
				"url":  "",
 | 
			
		||||
			},
 | 
			
		||||
			{
 | 
			
		||||
				"name":     "WAF",
 | 
			
		||||
				"url":      urlPrefix + "/waf?groupId=" + types.String(groupId),
 | 
			
		||||
				"isActive": menuItem == "waf",
 | 
			
		||||
			},
 | 
			
		||||
			{
 | 
			
		||||
				"name":     "缓存",
 | 
			
		||||
				"url":      urlPrefix + "/cache?groupId=" + types.String(groupId),
 | 
			
		||||
				"isActive": menuItem == "cache",
 | 
			
		||||
			},
 | 
			
		||||
			{
 | 
			
		||||
				"name":     "访问日志",
 | 
			
		||||
				"url":      urlPrefix + "/accessLog?groupId=" + types.String(groupId),
 | 
			
		||||
				"isActive": menuItem == "accessLog",
 | 
			
		||||
			},
 | 
			
		||||
			{
 | 
			
		||||
				"name":     "统计",
 | 
			
		||||
				"url":      urlPrefix + "/stat?groupId=" + types.String(groupId),
 | 
			
		||||
				"isActive": menuItem == "stat",
 | 
			
		||||
			},
 | 
			
		||||
			{
 | 
			
		||||
				"name":     "Gzip压缩",
 | 
			
		||||
				"url":      urlPrefix + "/gzip?groupId=" + types.String(groupId),
 | 
			
		||||
				"isActive": menuItem == "gzip",
 | 
			
		||||
			},
 | 
			
		||||
			{
 | 
			
		||||
				"name":     "特殊页面",
 | 
			
		||||
				"url":      urlPrefix + "/pages?groupId=" + types.String(groupId),
 | 
			
		||||
				"isActive": menuItem == "page",
 | 
			
		||||
			},
 | 
			
		||||
			{
 | 
			
		||||
				"name":     "HTTP Header",
 | 
			
		||||
				"url":      urlPrefix + "/headers?groupId=" + types.String(groupId),
 | 
			
		||||
				"isActive": menuItem == "header",
 | 
			
		||||
			},
 | 
			
		||||
			{
 | 
			
		||||
				"name":     "Websocket",
 | 
			
		||||
				"url":      urlPrefix + "/websocket?groupId=" + types.String(groupId),
 | 
			
		||||
				"isActive": menuItem == "websocket",
 | 
			
		||||
			},**/
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return group, nil
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,87 @@
 | 
			
		||||
package httpReverseProxy
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/servergrouputils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// IndexAction 源站列表
 | 
			
		||||
type IndexAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *IndexAction) Init() {
 | 
			
		||||
	this.FirstMenu("index")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *IndexAction) RunGet(params struct {
 | 
			
		||||
	GroupId int64
 | 
			
		||||
}) {
 | 
			
		||||
	_, err := servergrouputils.InitGroup(this.Parent(), params.GroupId, "httpReverseProxy")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Data["serverType"] = "httpProxy"
 | 
			
		||||
 | 
			
		||||
	reverseProxyResp, err := this.RPC().ServerGroupRPC().FindAndInitServerGroupHTTPReverseProxyConfig(this.AdminContext(), &pb.FindAndInitServerGroupHTTPReverseProxyConfigRequest{ServerGroupId: params.GroupId})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reverseProxyRef := &serverconfigs.ReverseProxyRef{}
 | 
			
		||||
	err = json.Unmarshal(reverseProxyResp.ReverseProxyRefJSON, reverseProxyRef)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["reverseProxyRef"] = reverseProxyRef
 | 
			
		||||
 | 
			
		||||
	reverseProxy := &serverconfigs.ReverseProxyConfig{}
 | 
			
		||||
	err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["reverseProxyConfig"] = reverseProxy
 | 
			
		||||
 | 
			
		||||
	primaryOriginMaps := []maps.Map{}
 | 
			
		||||
	backupOriginMaps := []maps.Map{}
 | 
			
		||||
	for _, originConfig := range reverseProxy.PrimaryOrigins {
 | 
			
		||||
		if len(originConfig.Domains) == 0 {
 | 
			
		||||
			originConfig.Domains = []string{}
 | 
			
		||||
		}
 | 
			
		||||
		m := maps.Map{
 | 
			
		||||
			"id":      originConfig.Id,
 | 
			
		||||
			"weight":  originConfig.Weight,
 | 
			
		||||
			"addr":    originConfig.Addr.Protocol.String() + "://" + originConfig.Addr.Host + ":" + originConfig.Addr.PortRange,
 | 
			
		||||
			"name":    originConfig.Name,
 | 
			
		||||
			"isOn":    originConfig.IsOn,
 | 
			
		||||
			"domains": originConfig.Domains,
 | 
			
		||||
		}
 | 
			
		||||
		primaryOriginMaps = append(primaryOriginMaps, m)
 | 
			
		||||
	}
 | 
			
		||||
	for _, originConfig := range reverseProxy.BackupOrigins {
 | 
			
		||||
		if len(originConfig.Domains) == 0 {
 | 
			
		||||
			originConfig.Domains = []string{}
 | 
			
		||||
		}
 | 
			
		||||
		m := maps.Map{
 | 
			
		||||
			"id":      originConfig.Id,
 | 
			
		||||
			"weight":  originConfig.Weight,
 | 
			
		||||
			"addr":    originConfig.Addr.Protocol.String() + "://" + originConfig.Addr.Host + ":" + originConfig.Addr.PortRange,
 | 
			
		||||
			"name":    originConfig.Name,
 | 
			
		||||
			"isOn":    originConfig.IsOn,
 | 
			
		||||
			"domains": originConfig.Domains,
 | 
			
		||||
		}
 | 
			
		||||
		backupOriginMaps = append(backupOriginMaps, m)
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["primaryOrigins"] = primaryOriginMaps
 | 
			
		||||
	this.Data["backupOrigins"] = backupOriginMaps
 | 
			
		||||
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,21 @@
 | 
			
		||||
package httpReverseProxy
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
 | 
			
		||||
	"github.com/iwind/TeaGo"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	TeaGo.BeforeStart(func(server *TeaGo.Server) {
 | 
			
		||||
		server.
 | 
			
		||||
			Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeServer)).
 | 
			
		||||
			Data("teaMenu", "servers").
 | 
			
		||||
			Data("teaSubMenu", "group").
 | 
			
		||||
			Prefix("/servers/groups/group/settings/httpReverseProxy").
 | 
			
		||||
			Get("", new(IndexAction)).
 | 
			
		||||
			GetPost("/scheduling", new(SchedulingAction)).
 | 
			
		||||
			GetPost("/setting", new(SettingAction)).
 | 
			
		||||
			EndAll()
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,54 @@
 | 
			
		||||
package httpReverseProxy
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/servergrouputils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/schedulingconfigs"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type SchedulingAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *SchedulingAction) Init() {
 | 
			
		||||
	this.FirstMenu("scheduling")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *SchedulingAction) RunGet(params struct {
 | 
			
		||||
	GroupId int64
 | 
			
		||||
}) {
 | 
			
		||||
	_, err := servergrouputils.InitGroup(this.Parent(), params.GroupId, "httpReverseProxy")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Data["family"] = "http"
 | 
			
		||||
 | 
			
		||||
	reverseProxyResp, err := this.RPC().ServerGroupRPC().FindAndInitServerGroupHTTPReverseProxyConfig(this.AdminContext(), &pb.FindAndInitServerGroupHTTPReverseProxyConfigRequest{ServerGroupId: params.GroupId})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reverseProxy := &serverconfigs.ReverseProxyConfig{}
 | 
			
		||||
	err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["reverseProxyId"] = reverseProxy.Id
 | 
			
		||||
 | 
			
		||||
	schedulingCode := reverseProxy.FindSchedulingConfig().Code
 | 
			
		||||
	schedulingMap := schedulingconfigs.FindSchedulingType(schedulingCode)
 | 
			
		||||
	if schedulingMap == nil {
 | 
			
		||||
		this.ErrorPage(errors.New("invalid scheduling code '" + schedulingCode + "'"))
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["scheduling"] = schedulingMap
 | 
			
		||||
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,102 @@
 | 
			
		||||
package httpReverseProxy
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/servergrouputils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
 | 
			
		||||
	"github.com/iwind/TeaGo/actions"
 | 
			
		||||
	"github.com/iwind/TeaGo/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type SettingAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *SettingAction) Init() {
 | 
			
		||||
	this.FirstMenu("setting")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *SettingAction) RunGet(params struct {
 | 
			
		||||
	GroupId int64
 | 
			
		||||
}) {
 | 
			
		||||
	_, err := servergrouputils.InitGroup(this.Parent(), params.GroupId, "httpReverseProxy")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Data["family"] = "http"
 | 
			
		||||
 | 
			
		||||
	reverseProxyResp, err := this.RPC().ServerGroupRPC().FindAndInitServerGroupHTTPReverseProxyConfig(this.AdminContext(), &pb.FindAndInitServerGroupHTTPReverseProxyConfigRequest{ServerGroupId: params.GroupId})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reverseProxyRef := &serverconfigs.ReverseProxyRef{}
 | 
			
		||||
	err = json.Unmarshal(reverseProxyResp.ReverseProxyRefJSON, reverseProxyRef)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	reverseProxy := &serverconfigs.ReverseProxyConfig{}
 | 
			
		||||
	err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Data["reverseProxyRef"] = reverseProxyRef
 | 
			
		||||
	this.Data["reverseProxyConfig"] = reverseProxy
 | 
			
		||||
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *SettingAction) RunPost(params struct {
 | 
			
		||||
	GroupId             int64
 | 
			
		||||
	ReverseProxyRefJSON []byte
 | 
			
		||||
	ReverseProxyJSON    []byte
 | 
			
		||||
 | 
			
		||||
	Must *actions.Must
 | 
			
		||||
}) {
 | 
			
		||||
	defer this.CreateLogInfo("修改分组 %d 的反向代理设置", params.GroupId)
 | 
			
		||||
 | 
			
		||||
	// TODO 校验配置
 | 
			
		||||
 | 
			
		||||
	reverseProxyConfig := &serverconfigs.ReverseProxyConfig{}
 | 
			
		||||
	err := json.Unmarshal(params.ReverseProxyJSON, reverseProxyConfig)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = reverseProxyConfig.Init()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.Fail("配置校验失败:" + err.Error())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 设置是否启用
 | 
			
		||||
	_, err = this.RPC().ServerGroupRPC().UpdateServerGroupHTTPReverseProxy(this.AdminContext(), &pb.UpdateServerGroupHTTPReverseProxyRequest{
 | 
			
		||||
		ServerGroupId:    params.GroupId,
 | 
			
		||||
		ReverseProxyJSON: params.ReverseProxyRefJSON,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 设置反向代理相关信息
 | 
			
		||||
	_, err = this.RPC().ReverseProxyRPC().UpdateReverseProxy(this.AdminContext(), &pb.UpdateReverseProxyRequest{
 | 
			
		||||
		ReverseProxyId:  reverseProxyConfig.Id,
 | 
			
		||||
		RequestHostType: types.Int32(reverseProxyConfig.RequestHostType),
 | 
			
		||||
		RequestHost:     reverseProxyConfig.RequestHost,
 | 
			
		||||
		RequestURI:      reverseProxyConfig.RequestURI,
 | 
			
		||||
		StripPrefix:     reverseProxyConfig.StripPrefix,
 | 
			
		||||
		AutoFlush:       reverseProxyConfig.AutoFlush,
 | 
			
		||||
		AddHeaders:      reverseProxyConfig.AddHeaders,
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	this.Success()
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,23 @@
 | 
			
		||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
 | 
			
		||||
 | 
			
		||||
package reverseProxy
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/iwind/TeaGo/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type IndexAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *IndexAction) Init() {
 | 
			
		||||
	this.Nav("", "", "")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *IndexAction) RunGet(params struct {
 | 
			
		||||
	GroupId int64
 | 
			
		||||
}) {
 | 
			
		||||
	this.RedirectURL("/servers/groups/group/settings/httpReverseProxy?groupId=" + types.String(params.GroupId))
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,22 @@
 | 
			
		||||
package reverseProxy
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/locations/locationutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/serverutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
 | 
			
		||||
	"github.com/iwind/TeaGo"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	TeaGo.BeforeStart(func(server *TeaGo.Server) {
 | 
			
		||||
		server.
 | 
			
		||||
			Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeServer)).
 | 
			
		||||
			Helper(locationutils.NewLocationHelper()).
 | 
			
		||||
			Helper(serverutils.NewServerHelper()).
 | 
			
		||||
			Data("mainTab", "setting").
 | 
			
		||||
			Prefix("/servers/groups/group/settings").
 | 
			
		||||
			Get("", new(IndexAction)).
 | 
			
		||||
			EndAll()
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,87 @@
 | 
			
		||||
package tcpReverseProxy
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/servergrouputils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// IndexAction 源站列表
 | 
			
		||||
type IndexAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *IndexAction) Init() {
 | 
			
		||||
	this.FirstMenu("index")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *IndexAction) RunGet(params struct {
 | 
			
		||||
	GroupId int64
 | 
			
		||||
}) {
 | 
			
		||||
	_, err := servergrouputils.InitGroup(this.Parent(), params.GroupId, "tcpReverseProxy")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Data["serverType"] = "tcpProxy"
 | 
			
		||||
 | 
			
		||||
	reverseProxyResp, err := this.RPC().ServerGroupRPC().FindAndInitServerGroupTCPReverseProxyConfig(this.AdminContext(), &pb.FindAndInitServerGroupTCPReverseProxyConfigRequest{ServerGroupId: params.GroupId})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reverseProxyRef := &serverconfigs.ReverseProxyRef{}
 | 
			
		||||
	err = json.Unmarshal(reverseProxyResp.ReverseProxyRefJSON, reverseProxyRef)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["reverseProxyRef"] = reverseProxyRef
 | 
			
		||||
 | 
			
		||||
	reverseProxy := &serverconfigs.ReverseProxyConfig{}
 | 
			
		||||
	err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["reverseProxyConfig"] = reverseProxy
 | 
			
		||||
 | 
			
		||||
	primaryOriginMaps := []maps.Map{}
 | 
			
		||||
	backupOriginMaps := []maps.Map{}
 | 
			
		||||
	for _, originConfig := range reverseProxy.PrimaryOrigins {
 | 
			
		||||
		if len(originConfig.Domains) == 0 {
 | 
			
		||||
			originConfig.Domains = []string{}
 | 
			
		||||
		}
 | 
			
		||||
		m := maps.Map{
 | 
			
		||||
			"id":      originConfig.Id,
 | 
			
		||||
			"weight":  originConfig.Weight,
 | 
			
		||||
			"addr":    originConfig.Addr.Protocol.String() + "://" + originConfig.Addr.Host + ":" + originConfig.Addr.PortRange,
 | 
			
		||||
			"name":    originConfig.Name,
 | 
			
		||||
			"isOn":    originConfig.IsOn,
 | 
			
		||||
			"domains": originConfig.Domains,
 | 
			
		||||
		}
 | 
			
		||||
		primaryOriginMaps = append(primaryOriginMaps, m)
 | 
			
		||||
	}
 | 
			
		||||
	for _, originConfig := range reverseProxy.BackupOrigins {
 | 
			
		||||
		if len(originConfig.Domains) == 0 {
 | 
			
		||||
			originConfig.Domains = []string{}
 | 
			
		||||
		}
 | 
			
		||||
		m := maps.Map{
 | 
			
		||||
			"id":      originConfig.Id,
 | 
			
		||||
			"weight":  originConfig.Weight,
 | 
			
		||||
			"addr":    originConfig.Addr.Protocol.String() + "://" + originConfig.Addr.Host + ":" + originConfig.Addr.PortRange,
 | 
			
		||||
			"name":    originConfig.Name,
 | 
			
		||||
			"isOn":    originConfig.IsOn,
 | 
			
		||||
			"domains": originConfig.Domains,
 | 
			
		||||
		}
 | 
			
		||||
		backupOriginMaps = append(backupOriginMaps, m)
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["primaryOrigins"] = primaryOriginMaps
 | 
			
		||||
	this.Data["backupOrigins"] = backupOriginMaps
 | 
			
		||||
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,21 @@
 | 
			
		||||
package tcpReverseProxy
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
 | 
			
		||||
	"github.com/iwind/TeaGo"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	TeaGo.BeforeStart(func(server *TeaGo.Server) {
 | 
			
		||||
		server.
 | 
			
		||||
			Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeServer)).
 | 
			
		||||
			Data("teaMenu", "servers").
 | 
			
		||||
			Data("teaSubMenu", "group").
 | 
			
		||||
			Prefix("/servers/groups/group/settings/tcpReverseProxy").
 | 
			
		||||
			Get("", new(IndexAction)).
 | 
			
		||||
			GetPost("/scheduling", new(SchedulingAction)).
 | 
			
		||||
			GetPost("/setting", new(SettingAction)).
 | 
			
		||||
			EndAll()
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,54 @@
 | 
			
		||||
package tcpReverseProxy
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/servergrouputils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/schedulingconfigs"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type SchedulingAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *SchedulingAction) Init() {
 | 
			
		||||
	this.FirstMenu("scheduling")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *SchedulingAction) RunGet(params struct {
 | 
			
		||||
	GroupId int64
 | 
			
		||||
}) {
 | 
			
		||||
	_, err := servergrouputils.InitGroup(this.Parent(), params.GroupId, "tcpReverseProxy")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Data["family"] = "tcp"
 | 
			
		||||
 | 
			
		||||
	reverseProxyResp, err := this.RPC().ServerGroupRPC().FindAndInitServerGroupTCPReverseProxyConfig(this.AdminContext(), &pb.FindAndInitServerGroupTCPReverseProxyConfigRequest{ServerGroupId: params.GroupId})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reverseProxy := &serverconfigs.ReverseProxyConfig{}
 | 
			
		||||
	err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["reverseProxyId"] = reverseProxy.Id
 | 
			
		||||
 | 
			
		||||
	schedulingCode := reverseProxy.FindSchedulingConfig().Code
 | 
			
		||||
	schedulingMap := schedulingconfigs.FindSchedulingType(schedulingCode)
 | 
			
		||||
	if schedulingMap == nil {
 | 
			
		||||
		this.ErrorPage(errors.New("invalid scheduling code '" + schedulingCode + "'"))
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["scheduling"] = schedulingMap
 | 
			
		||||
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,102 @@
 | 
			
		||||
package tcpReverseProxy
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/servergrouputils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
 | 
			
		||||
	"github.com/iwind/TeaGo/actions"
 | 
			
		||||
	"github.com/iwind/TeaGo/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type SettingAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *SettingAction) Init() {
 | 
			
		||||
	this.FirstMenu("setting")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *SettingAction) RunGet(params struct {
 | 
			
		||||
	GroupId int64
 | 
			
		||||
}) {
 | 
			
		||||
	_, err := servergrouputils.InitGroup(this.Parent(), params.GroupId, "tcpReverseProxy")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Data["family"] = "tcp"
 | 
			
		||||
 | 
			
		||||
	reverseProxyResp, err := this.RPC().ServerGroupRPC().FindAndInitServerGroupTCPReverseProxyConfig(this.AdminContext(), &pb.FindAndInitServerGroupTCPReverseProxyConfigRequest{ServerGroupId: params.GroupId})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reverseProxyRef := &serverconfigs.ReverseProxyRef{}
 | 
			
		||||
	err = json.Unmarshal(reverseProxyResp.ReverseProxyRefJSON, reverseProxyRef)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	reverseProxy := &serverconfigs.ReverseProxyConfig{}
 | 
			
		||||
	err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Data["reverseProxyRef"] = reverseProxyRef
 | 
			
		||||
	this.Data["reverseProxyConfig"] = reverseProxy
 | 
			
		||||
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *SettingAction) RunPost(params struct {
 | 
			
		||||
	GroupId             int64
 | 
			
		||||
	ReverseProxyRefJSON []byte
 | 
			
		||||
	ReverseProxyJSON    []byte
 | 
			
		||||
 | 
			
		||||
	Must *actions.Must
 | 
			
		||||
}) {
 | 
			
		||||
	defer this.CreateLogInfo("修改分组 %d 的反向代理设置", params.GroupId)
 | 
			
		||||
 | 
			
		||||
	// TODO 校验配置
 | 
			
		||||
 | 
			
		||||
	reverseProxyConfig := &serverconfigs.ReverseProxyConfig{}
 | 
			
		||||
	err := json.Unmarshal(params.ReverseProxyJSON, reverseProxyConfig)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = reverseProxyConfig.Init()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.Fail("配置校验失败:" + err.Error())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 设置是否启用
 | 
			
		||||
	_, err = this.RPC().ServerGroupRPC().UpdateServerGroupTCPReverseProxy(this.AdminContext(), &pb.UpdateServerGroupTCPReverseProxyRequest{
 | 
			
		||||
		ServerGroupId:    params.GroupId,
 | 
			
		||||
		ReverseProxyJSON: params.ReverseProxyRefJSON,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 设置反向代理相关信息
 | 
			
		||||
	_, err = this.RPC().ReverseProxyRPC().UpdateReverseProxy(this.AdminContext(), &pb.UpdateReverseProxyRequest{
 | 
			
		||||
		ReverseProxyId:  reverseProxyConfig.Id,
 | 
			
		||||
		RequestHostType: types.Int32(reverseProxyConfig.RequestHostType),
 | 
			
		||||
		RequestHost:     reverseProxyConfig.RequestHost,
 | 
			
		||||
		RequestURI:      reverseProxyConfig.RequestURI,
 | 
			
		||||
		StripPrefix:     reverseProxyConfig.StripPrefix,
 | 
			
		||||
		AutoFlush:       reverseProxyConfig.AutoFlush,
 | 
			
		||||
		AddHeaders:      reverseProxyConfig.AddHeaders,
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	this.Success()
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,87 @@
 | 
			
		||||
package udpReverseProxy
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/servergrouputils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// IndexAction 源站列表
 | 
			
		||||
type IndexAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *IndexAction) Init() {
 | 
			
		||||
	this.FirstMenu("index")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *IndexAction) RunGet(params struct {
 | 
			
		||||
	GroupId int64
 | 
			
		||||
}) {
 | 
			
		||||
	_, err := servergrouputils.InitGroup(this.Parent(), params.GroupId, "udpReverseProxy")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Data["serverType"] = "udpProxy"
 | 
			
		||||
 | 
			
		||||
	reverseProxyResp, err := this.RPC().ServerGroupRPC().FindAndInitServerGroupUDPReverseProxyConfig(this.AdminContext(), &pb.FindAndInitServerGroupUDPReverseProxyConfigRequest{ServerGroupId: params.GroupId})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reverseProxyRef := &serverconfigs.ReverseProxyRef{}
 | 
			
		||||
	err = json.Unmarshal(reverseProxyResp.ReverseProxyRefJSON, reverseProxyRef)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["reverseProxyRef"] = reverseProxyRef
 | 
			
		||||
 | 
			
		||||
	reverseProxy := &serverconfigs.ReverseProxyConfig{}
 | 
			
		||||
	err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["reverseProxyConfig"] = reverseProxy
 | 
			
		||||
 | 
			
		||||
	primaryOriginMaps := []maps.Map{}
 | 
			
		||||
	backupOriginMaps := []maps.Map{}
 | 
			
		||||
	for _, originConfig := range reverseProxy.PrimaryOrigins {
 | 
			
		||||
		if len(originConfig.Domains) == 0 {
 | 
			
		||||
			originConfig.Domains = []string{}
 | 
			
		||||
		}
 | 
			
		||||
		m := maps.Map{
 | 
			
		||||
			"id":      originConfig.Id,
 | 
			
		||||
			"weight":  originConfig.Weight,
 | 
			
		||||
			"addr":    originConfig.Addr.Protocol.String() + "://" + originConfig.Addr.Host + ":" + originConfig.Addr.PortRange,
 | 
			
		||||
			"name":    originConfig.Name,
 | 
			
		||||
			"isOn":    originConfig.IsOn,
 | 
			
		||||
			"domains": originConfig.Domains,
 | 
			
		||||
		}
 | 
			
		||||
		primaryOriginMaps = append(primaryOriginMaps, m)
 | 
			
		||||
	}
 | 
			
		||||
	for _, originConfig := range reverseProxy.BackupOrigins {
 | 
			
		||||
		if len(originConfig.Domains) == 0 {
 | 
			
		||||
			originConfig.Domains = []string{}
 | 
			
		||||
		}
 | 
			
		||||
		m := maps.Map{
 | 
			
		||||
			"id":      originConfig.Id,
 | 
			
		||||
			"weight":  originConfig.Weight,
 | 
			
		||||
			"addr":    originConfig.Addr.Protocol.String() + "://" + originConfig.Addr.Host + ":" + originConfig.Addr.PortRange,
 | 
			
		||||
			"name":    originConfig.Name,
 | 
			
		||||
			"isOn":    originConfig.IsOn,
 | 
			
		||||
			"domains": originConfig.Domains,
 | 
			
		||||
		}
 | 
			
		||||
		backupOriginMaps = append(backupOriginMaps, m)
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["primaryOrigins"] = primaryOriginMaps
 | 
			
		||||
	this.Data["backupOrigins"] = backupOriginMaps
 | 
			
		||||
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,21 @@
 | 
			
		||||
package udpReverseProxy
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
 | 
			
		||||
	"github.com/iwind/TeaGo"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	TeaGo.BeforeStart(func(server *TeaGo.Server) {
 | 
			
		||||
		server.
 | 
			
		||||
			Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeServer)).
 | 
			
		||||
			Data("teaMenu", "servers").
 | 
			
		||||
			Data("teaSubMenu", "group").
 | 
			
		||||
			Prefix("/servers/groups/group/settings/udpReverseProxy").
 | 
			
		||||
			Get("", new(IndexAction)).
 | 
			
		||||
			GetPost("/scheduling", new(SchedulingAction)).
 | 
			
		||||
			GetPost("/setting", new(SettingAction)).
 | 
			
		||||
			EndAll()
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,54 @@
 | 
			
		||||
package udpReverseProxy
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/servergrouputils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/schedulingconfigs"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type SchedulingAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *SchedulingAction) Init() {
 | 
			
		||||
	this.FirstMenu("scheduling")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *SchedulingAction) RunGet(params struct {
 | 
			
		||||
	GroupId int64
 | 
			
		||||
}) {
 | 
			
		||||
	_, err := servergrouputils.InitGroup(this.Parent(), params.GroupId, "udpReverseProxy")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Data["family"] = "udp"
 | 
			
		||||
 | 
			
		||||
	reverseProxyResp, err := this.RPC().ServerGroupRPC().FindAndInitServerGroupUDPReverseProxyConfig(this.AdminContext(), &pb.FindAndInitServerGroupUDPReverseProxyConfigRequest{ServerGroupId: params.GroupId})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reverseProxy := &serverconfigs.ReverseProxyConfig{}
 | 
			
		||||
	err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["reverseProxyId"] = reverseProxy.Id
 | 
			
		||||
 | 
			
		||||
	schedulingCode := reverseProxy.FindSchedulingConfig().Code
 | 
			
		||||
	schedulingMap := schedulingconfigs.FindSchedulingType(schedulingCode)
 | 
			
		||||
	if schedulingMap == nil {
 | 
			
		||||
		this.ErrorPage(errors.New("invalid scheduling code '" + schedulingCode + "'"))
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["scheduling"] = schedulingMap
 | 
			
		||||
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,102 @@
 | 
			
		||||
package udpReverseProxy
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/servergrouputils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
 | 
			
		||||
	"github.com/iwind/TeaGo/actions"
 | 
			
		||||
	"github.com/iwind/TeaGo/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type SettingAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *SettingAction) Init() {
 | 
			
		||||
	this.FirstMenu("setting")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *SettingAction) RunGet(params struct {
 | 
			
		||||
	GroupId int64
 | 
			
		||||
}) {
 | 
			
		||||
	_, err := servergrouputils.InitGroup(this.Parent(), params.GroupId, "udpReverseProxy")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Data["family"] = "udp"
 | 
			
		||||
 | 
			
		||||
	reverseProxyResp, err := this.RPC().ServerGroupRPC().FindAndInitServerGroupUDPReverseProxyConfig(this.AdminContext(), &pb.FindAndInitServerGroupUDPReverseProxyConfigRequest{ServerGroupId: params.GroupId})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reverseProxyRef := &serverconfigs.ReverseProxyRef{}
 | 
			
		||||
	err = json.Unmarshal(reverseProxyResp.ReverseProxyRefJSON, reverseProxyRef)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	reverseProxy := &serverconfigs.ReverseProxyConfig{}
 | 
			
		||||
	err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Data["reverseProxyRef"] = reverseProxyRef
 | 
			
		||||
	this.Data["reverseProxyConfig"] = reverseProxy
 | 
			
		||||
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *SettingAction) RunPost(params struct {
 | 
			
		||||
	GroupId             int64
 | 
			
		||||
	ReverseProxyRefJSON []byte
 | 
			
		||||
	ReverseProxyJSON    []byte
 | 
			
		||||
 | 
			
		||||
	Must *actions.Must
 | 
			
		||||
}) {
 | 
			
		||||
	defer this.CreateLogInfo("修改分组 %d 的反向代理设置", params.GroupId)
 | 
			
		||||
 | 
			
		||||
	// TODO 校验配置
 | 
			
		||||
 | 
			
		||||
	reverseProxyConfig := &serverconfigs.ReverseProxyConfig{}
 | 
			
		||||
	err := json.Unmarshal(params.ReverseProxyJSON, reverseProxyConfig)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = reverseProxyConfig.Init()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.Fail("配置校验失败:" + err.Error())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 设置是否启用
 | 
			
		||||
	_, err = this.RPC().ServerGroupRPC().UpdateServerGroupUDPReverseProxy(this.AdminContext(), &pb.UpdateServerGroupUDPReverseProxyRequest{
 | 
			
		||||
		ServerGroupId:    params.GroupId,
 | 
			
		||||
		ReverseProxyJSON: params.ReverseProxyRefJSON,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 设置反向代理相关信息
 | 
			
		||||
	_, err = this.RPC().ReverseProxyRPC().UpdateReverseProxy(this.AdminContext(), &pb.UpdateReverseProxyRequest{
 | 
			
		||||
		ReverseProxyId:  reverseProxyConfig.Id,
 | 
			
		||||
		RequestHostType: types.Int32(reverseProxyConfig.RequestHostType),
 | 
			
		||||
		RequestHost:     reverseProxyConfig.RequestHost,
 | 
			
		||||
		RequestURI:      reverseProxyConfig.RequestURI,
 | 
			
		||||
		StripPrefix:     reverseProxyConfig.StripPrefix,
 | 
			
		||||
		AutoFlush:       reverseProxyConfig.AutoFlush,
 | 
			
		||||
		AddHeaders:      reverseProxyConfig.AddHeaders,
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	this.Success()
 | 
			
		||||
}
 | 
			
		||||
@@ -1,34 +1,30 @@
 | 
			
		||||
package groups
 | 
			
		||||
package group
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/oplogs"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/servergrouputils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/iwind/TeaGo/actions"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type UpdatePopupAction struct {
 | 
			
		||||
type UpdateAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *UpdatePopupAction) Init() {
 | 
			
		||||
	this.Nav("", "", "")
 | 
			
		||||
func (this *UpdateAction) Init() {
 | 
			
		||||
	this.Nav("", "", "group.update")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *UpdatePopupAction) RunGet(params struct {
 | 
			
		||||
func (this *UpdateAction) RunGet(params struct {
 | 
			
		||||
	GroupId int64
 | 
			
		||||
}) {
 | 
			
		||||
	groupResp, err := this.RPC().ServerGroupRPC().FindEnabledServerGroup(this.AdminContext(), &pb.FindEnabledServerGroupRequest{ServerGroupId: params.GroupId})
 | 
			
		||||
	group, err := servergrouputils.InitGroup(this.Parent(), params.GroupId, "")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	group := groupResp.ServerGroup
 | 
			
		||||
	if group == nil {
 | 
			
		||||
		this.NotFound("serverGroup", params.GroupId)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Data["group"] = maps.Map{
 | 
			
		||||
		"id":   group.Id,
 | 
			
		||||
@@ -38,7 +34,7 @@ func (this *UpdatePopupAction) RunGet(params struct {
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *UpdatePopupAction) RunPost(params struct {
 | 
			
		||||
func (this *UpdateAction) RunPost(params struct {
 | 
			
		||||
	GroupId int64
 | 
			
		||||
	Name    string
 | 
			
		||||
 | 
			
		||||
@@ -2,6 +2,7 @@ package groups
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
 | 
			
		||||
	"github.com/iwind/TeaGo"
 | 
			
		||||
)
 | 
			
		||||
@@ -12,13 +13,17 @@ func init() {
 | 
			
		||||
			Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeServer)).
 | 
			
		||||
			Helper(NewHelper()).
 | 
			
		||||
			Data("teaSubMenu", "group").
 | 
			
		||||
			Prefix("/servers/components/groups").
 | 
			
		||||
			Prefix("/servers/groups").
 | 
			
		||||
			Get("", new(IndexAction)).
 | 
			
		||||
			GetPost("/createPopup", new(CreatePopupAction)).
 | 
			
		||||
			GetPost("/updatePopup", new(UpdatePopupAction)).
 | 
			
		||||
			GetPost("/selectPopup", new(SelectPopupAction)).
 | 
			
		||||
			Post("/delete", new(DeleteAction)).
 | 
			
		||||
			Post("/sort", new(SortAction)).
 | 
			
		||||
 | 
			
		||||
			// 详情
 | 
			
		||||
			Prefix("/servers/groups/group").
 | 
			
		||||
			Get("", new(group.IndexAction)).
 | 
			
		||||
			Post("/delete", new(group.DeleteAction)).
 | 
			
		||||
			GetPost("/update", new(group.UpdateAction)).
 | 
			
		||||
			EndAll()
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
@@ -21,18 +21,24 @@ type AddPopupAction struct {
 | 
			
		||||
 | 
			
		||||
func (this *AddPopupAction) RunGet(params struct {
 | 
			
		||||
	ServerId       int64
 | 
			
		||||
	ServerType     string
 | 
			
		||||
	ReverseProxyId int64
 | 
			
		||||
	OriginType     string
 | 
			
		||||
}) {
 | 
			
		||||
	this.Data["reverseProxyId"] = params.ReverseProxyId
 | 
			
		||||
	this.Data["originType"] = params.OriginType
 | 
			
		||||
 | 
			
		||||
	serverTypeResp, err := this.RPC().ServerRPC().FindEnabledServerType(this.AdminContext(), &pb.FindEnabledServerTypeRequest{ServerId: params.ServerId})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	var serverType = ""
 | 
			
		||||
	if params.ServerId > 0 {
 | 
			
		||||
		serverTypeResp, err := this.RPC().ServerRPC().FindEnabledServerType(this.AdminContext(), &pb.FindEnabledServerTypeRequest{ServerId: params.ServerId})
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			this.ErrorPage(err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		serverType = serverTypeResp.Type
 | 
			
		||||
	} else {
 | 
			
		||||
		serverType = params.ServerType
 | 
			
		||||
	}
 | 
			
		||||
	serverType := serverTypeResp.Type
 | 
			
		||||
	this.Data["serverType"] = serverType
 | 
			
		||||
 | 
			
		||||
	// 是否为HTTP
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,7 @@ func (this *UpdatePopupAction) Init() {
 | 
			
		||||
 | 
			
		||||
func (this *UpdatePopupAction) RunGet(params struct {
 | 
			
		||||
	ServerId       int64
 | 
			
		||||
	ServerType     string
 | 
			
		||||
	ReverseProxyId int64
 | 
			
		||||
	OriginType     string
 | 
			
		||||
	OriginId       int64
 | 
			
		||||
@@ -34,15 +35,20 @@ func (this *UpdatePopupAction) RunGet(params struct {
 | 
			
		||||
	this.Data["reverseProxyId"] = params.ReverseProxyId
 | 
			
		||||
	this.Data["originId"] = params.OriginId
 | 
			
		||||
 | 
			
		||||
	serverTypeResp, err := this.RPC().ServerRPC().FindEnabledServerType(this.AdminContext(), &pb.FindEnabledServerTypeRequest{
 | 
			
		||||
		ServerId: params.ServerId,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	var serverType = ""
 | 
			
		||||
	if params.ServerId > 0 {
 | 
			
		||||
		serverTypeResp, err := this.RPC().ServerRPC().FindEnabledServerType(this.AdminContext(), &pb.FindEnabledServerTypeRequest{
 | 
			
		||||
			ServerId: params.ServerId,
 | 
			
		||||
		})
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			this.ErrorPage(err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		serverType = serverTypeResp.Type
 | 
			
		||||
	} else {
 | 
			
		||||
		serverType = params.ServerType
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["serverType"] = serverTypeResp.Type
 | 
			
		||||
	serverType := serverTypeResp.Type
 | 
			
		||||
	this.Data["serverType"] = serverType
 | 
			
		||||
 | 
			
		||||
	// 是否为HTTP
 | 
			
		||||
	this.Data["isHTTP"] = serverType == "httpProxy" || serverType == "httpWeb"
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@ import (
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// 源站列表
 | 
			
		||||
// IndexAction 源站列表
 | 
			
		||||
type IndexAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
@@ -27,6 +27,23 @@ func (this *IndexAction) RunGet(params struct {
 | 
			
		||||
	}
 | 
			
		||||
	serverType := serverTypeResp.Type
 | 
			
		||||
 | 
			
		||||
	// 当前是否有分组设置
 | 
			
		||||
	groupResp, err := this.RPC().ServerGroupRPC().FindEnabledServerGroupConfigInfo(this.AdminContext(), &pb.FindEnabledServerGroupConfigInfoRequest{ServerId: params.ServerId})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["hasGroupConfig"] = false
 | 
			
		||||
	switch serverType {
 | 
			
		||||
	case serverconfigs.ServerTypeHTTPWeb, serverconfigs.ServerTypeHTTPProxy:
 | 
			
		||||
		this.Data["hasGroupConfig"] = groupResp.HasHTTPReverseProxy
 | 
			
		||||
	case serverconfigs.ServerTypeTCPProxy:
 | 
			
		||||
		this.Data["hasGroupConfig"] = groupResp.HasTCPReverseProxy
 | 
			
		||||
	case serverconfigs.ServerTypeUDPProxy:
 | 
			
		||||
		this.Data["hasGroupConfig"] = groupResp.HasUDPReverseProxy
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 当前服务的配置
 | 
			
		||||
	reverseProxyResp, err := this.RPC().ServerRPC().FindAndInitServerReverseProxyConfig(this.AdminContext(), &pb.FindAndInitServerReverseProxyConfigRequest{ServerId: params.ServerId})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@ import (
 | 
			
		||||
	"github.com/iwind/TeaGo/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// 修改调度算法
 | 
			
		||||
// UpdateSchedulingPopupAction 修改调度算法
 | 
			
		||||
type UpdateSchedulingPopupAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
@@ -24,17 +24,15 @@ func (this *UpdateSchedulingPopupAction) Init() {
 | 
			
		||||
func (this *UpdateSchedulingPopupAction) RunGet(params struct {
 | 
			
		||||
	Type           string
 | 
			
		||||
	ServerId       int64
 | 
			
		||||
	GroupId        int64
 | 
			
		||||
	ReverseProxyId int64
 | 
			
		||||
	Family         string
 | 
			
		||||
}) {
 | 
			
		||||
	this.Data["dataType"] = params.Type
 | 
			
		||||
	this.Data["serverId"] = params.ServerId
 | 
			
		||||
	this.Data["groupId"] = params.GroupId
 | 
			
		||||
	this.Data["reverseProxyId"] = params.ReverseProxyId
 | 
			
		||||
 | 
			
		||||
	_, serverConfig, isOk := serverutils.FindServer(this.Parent(), params.ServerId)
 | 
			
		||||
	if !isOk {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	reverseProxyResp, err := this.RPC().ReverseProxyRPC().FindEnabledReverseProxyConfig(this.AdminContext(), &pb.FindEnabledReverseProxyConfigRequest{
 | 
			
		||||
		ReverseProxyId: params.ReverseProxyId,
 | 
			
		||||
	})
 | 
			
		||||
@@ -62,6 +60,33 @@ func (this *UpdateSchedulingPopupAction) RunGet(params struct {
 | 
			
		||||
 | 
			
		||||
	// 调度类型
 | 
			
		||||
	schedulingTypes := []maps.Map{}
 | 
			
		||||
 | 
			
		||||
	var isHTTPFamily = false
 | 
			
		||||
	var isTCPFamily = false
 | 
			
		||||
	var isUDPFamily = false
 | 
			
		||||
	var isUnixFamily = false
 | 
			
		||||
	if params.ServerId > 0 {
 | 
			
		||||
		_, serverConfig, isOk := serverutils.FindServer(this.Parent(), params.ServerId)
 | 
			
		||||
		if !isOk {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		isHTTPFamily = serverConfig.IsHTTPFamily()
 | 
			
		||||
		isTCPFamily = serverConfig.IsTCPFamily()
 | 
			
		||||
		isUDPFamily = serverConfig.IsUDPFamily()
 | 
			
		||||
		isUnixFamily = serverConfig.IsUnixFamily()
 | 
			
		||||
	} else {
 | 
			
		||||
		switch params.Family {
 | 
			
		||||
		case "http":
 | 
			
		||||
			isHTTPFamily = true
 | 
			
		||||
		case "tcp":
 | 
			
		||||
			isTCPFamily = true
 | 
			
		||||
		case "udp":
 | 
			
		||||
			isUDPFamily = true
 | 
			
		||||
		case "unix":
 | 
			
		||||
			isUnixFamily = true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, m := range schedulingconfigs.AllSchedulingTypes() {
 | 
			
		||||
		networks, ok := m["networks"]
 | 
			
		||||
		if !ok {
 | 
			
		||||
@@ -70,10 +95,10 @@ func (this *UpdateSchedulingPopupAction) RunGet(params struct {
 | 
			
		||||
		if !types.IsSlice(networks) {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if (serverConfig.IsHTTPFamily() && lists.Contains(networks, "http")) ||
 | 
			
		||||
			(serverConfig.IsTCPFamily() && lists.Contains(networks, "tcp")) ||
 | 
			
		||||
			(serverConfig.IsUDPFamily() && lists.Contains(networks, "udp")) ||
 | 
			
		||||
			(serverConfig.IsUnixFamily() && lists.Contains(networks, "unix")) {
 | 
			
		||||
		if (isHTTPFamily && lists.Contains(networks, "http")) ||
 | 
			
		||||
			(isTCPFamily && lists.Contains(networks, "tcp")) ||
 | 
			
		||||
			(isUDPFamily && lists.Contains(networks, "udp")) ||
 | 
			
		||||
			(isUnixFamily && lists.Contains(networks, "unix")) {
 | 
			
		||||
			schedulingTypes = append(schedulingTypes, m)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -180,6 +180,11 @@ func (this *userMustAuth) modules(adminId int64) []maps.Map {
 | 
			
		||||
			"subtitle": "服务列表",
 | 
			
		||||
			"icon":     "clone outsize",
 | 
			
		||||
			"subItems": []maps.Map{
 | 
			
		||||
				{
 | 
			
		||||
					"name": "服务分组",
 | 
			
		||||
					"url":  "/servers/groups",
 | 
			
		||||
					"code": "group",
 | 
			
		||||
				},
 | 
			
		||||
				{
 | 
			
		||||
					"name": "证书管理",
 | 
			
		||||
					"url":  "/servers/certs",
 | 
			
		||||
@@ -216,11 +221,6 @@ func (this *userMustAuth) modules(adminId int64) []maps.Map {
 | 
			
		||||
					"url":  "/servers/metrics",
 | 
			
		||||
					"code": "metric",
 | 
			
		||||
				},
 | 
			
		||||
				{
 | 
			
		||||
					"name": "服务分组",
 | 
			
		||||
					"url":  "/servers/components/groups",
 | 
			
		||||
					"code": "group",
 | 
			
		||||
				},
 | 
			
		||||
				{
 | 
			
		||||
					"name": "通用设置",
 | 
			
		||||
					"url":  "/servers/components",
 | 
			
		||||
 
 | 
			
		||||
@@ -41,9 +41,13 @@ import (
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/certs"
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/components"
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/components/cache"
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/components/groups"
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/components/log"
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/components/waf"
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups"
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/settings/httpReverseProxy"
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/settings/index"
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/settings/tcpReverseProxy"
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/settings/udpReverseProxy"
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/logs"
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/metrics"
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/metrics/charts"
 | 
			
		||||
 
 | 
			
		||||
@@ -85,7 +85,7 @@ Vue.component("origin-list-table", {
 | 
			
		||||
		</tr>	
 | 
			
		||||
	</thead>
 | 
			
		||||
	<tr v-for="origin in vOrigins">
 | 
			
		||||
		<td :class="{disabled:!origin.isOn}">{{origin.addr}}
 | 
			
		||||
		<td :class="{disabled:!origin.isOn}"><a href="" @click.prevent="updateOrigin(origin.id)">{{origin.addr}}  <i class="icon clone outline small"></i></a>
 | 
			
		||||
			<div v-if="origin.name.length > 0" style="margin-top: 0.5em">
 | 
			
		||||
				<tiny-basic-label>{{origin.name}}</tiny-basic-label>
 | 
			
		||||
			</div>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,143 +1,146 @@
 | 
			
		||||
Vue.component("reverse-proxy-box", {
 | 
			
		||||
    props: ["v-reverse-proxy-ref", "v-reverse-proxy-config", "v-is-location", "v-family"],
 | 
			
		||||
    data: function () {
 | 
			
		||||
        let reverseProxyRef = this.vReverseProxyRef
 | 
			
		||||
        if (reverseProxyRef == null) {
 | 
			
		||||
            reverseProxyRef = {
 | 
			
		||||
                isPrior: false,
 | 
			
		||||
                isOn: false,
 | 
			
		||||
                reverseProxyId: 0
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
	props: ["v-reverse-proxy-ref", "v-reverse-proxy-config", "v-is-location", "v-is-group", "v-family"],
 | 
			
		||||
	data: function () {
 | 
			
		||||
		let reverseProxyRef = this.vReverseProxyRef
 | 
			
		||||
		if (reverseProxyRef == null) {
 | 
			
		||||
			reverseProxyRef = {
 | 
			
		||||
				isPrior: false,
 | 
			
		||||
				isOn: false,
 | 
			
		||||
				reverseProxyId: 0
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
        let reverseProxyConfig = this.vReverseProxyConfig
 | 
			
		||||
        if (reverseProxyConfig == null) {
 | 
			
		||||
            reverseProxyConfig = {
 | 
			
		||||
                requestPath: "",
 | 
			
		||||
                stripPrefix: "",
 | 
			
		||||
                requestURI: "",
 | 
			
		||||
                requestHost: "",
 | 
			
		||||
                requestHostType: 0,
 | 
			
		||||
                addHeaders: [],
 | 
			
		||||
                connTimeout: {count: 0, unit: "second"},
 | 
			
		||||
                readTimeout: {count: 0, unit: "second"},
 | 
			
		||||
                idleTimeout: {count: 0, unit: "second"},
 | 
			
		||||
                maxConns: 0,
 | 
			
		||||
                maxIdleConns: 0
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (reverseProxyConfig.addHeaders == null) {
 | 
			
		||||
            reverseProxyConfig.addHeaders = []
 | 
			
		||||
        }
 | 
			
		||||
        if (reverseProxyConfig.connTimeout == null) {
 | 
			
		||||
            reverseProxyConfig.connTimeout = {count: 0, unit: "second"}
 | 
			
		||||
        }
 | 
			
		||||
        if (reverseProxyConfig.readTimeout == null) {
 | 
			
		||||
            reverseProxyConfig.readTimeout = {count: 0, unit: "second"}
 | 
			
		||||
        }
 | 
			
		||||
        if (reverseProxyConfig.idleTimeout == null) {
 | 
			
		||||
            reverseProxyConfig.idleTimeout = {count: 0, unit: "second"}
 | 
			
		||||
        }
 | 
			
		||||
		let reverseProxyConfig = this.vReverseProxyConfig
 | 
			
		||||
		if (reverseProxyConfig == null) {
 | 
			
		||||
			reverseProxyConfig = {
 | 
			
		||||
				requestPath: "",
 | 
			
		||||
				stripPrefix: "",
 | 
			
		||||
				requestURI: "",
 | 
			
		||||
				requestHost: "",
 | 
			
		||||
				requestHostType: 0,
 | 
			
		||||
				addHeaders: [],
 | 
			
		||||
				connTimeout: {count: 0, unit: "second"},
 | 
			
		||||
				readTimeout: {count: 0, unit: "second"},
 | 
			
		||||
				idleTimeout: {count: 0, unit: "second"},
 | 
			
		||||
				maxConns: 0,
 | 
			
		||||
				maxIdleConns: 0
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if (reverseProxyConfig.addHeaders == null) {
 | 
			
		||||
			reverseProxyConfig.addHeaders = []
 | 
			
		||||
		}
 | 
			
		||||
		if (reverseProxyConfig.connTimeout == null) {
 | 
			
		||||
			reverseProxyConfig.connTimeout = {count: 0, unit: "second"}
 | 
			
		||||
		}
 | 
			
		||||
		if (reverseProxyConfig.readTimeout == null) {
 | 
			
		||||
			reverseProxyConfig.readTimeout = {count: 0, unit: "second"}
 | 
			
		||||
		}
 | 
			
		||||
		if (reverseProxyConfig.idleTimeout == null) {
 | 
			
		||||
			reverseProxyConfig.idleTimeout = {count: 0, unit: "second"}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
        let forwardHeaders = [
 | 
			
		||||
            {
 | 
			
		||||
                name: "X-Real-IP",
 | 
			
		||||
                isChecked: false
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                name: "X-Forwarded-For",
 | 
			
		||||
                isChecked: false
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                name: "X-Forwarded-By",
 | 
			
		||||
                isChecked: false
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                name: "X-Forwarded-Host",
 | 
			
		||||
                isChecked: false
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                name: "X-Forwarded-Proto",
 | 
			
		||||
                isChecked: false
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
        forwardHeaders.forEach(function (v) {
 | 
			
		||||
            v.isChecked = reverseProxyConfig.addHeaders.$contains(v.name)
 | 
			
		||||
        })
 | 
			
		||||
		let forwardHeaders = [
 | 
			
		||||
			{
 | 
			
		||||
				name: "X-Real-IP",
 | 
			
		||||
				isChecked: false
 | 
			
		||||
			},
 | 
			
		||||
			{
 | 
			
		||||
				name: "X-Forwarded-For",
 | 
			
		||||
				isChecked: false
 | 
			
		||||
			},
 | 
			
		||||
			{
 | 
			
		||||
				name: "X-Forwarded-By",
 | 
			
		||||
				isChecked: false
 | 
			
		||||
			},
 | 
			
		||||
			{
 | 
			
		||||
				name: "X-Forwarded-Host",
 | 
			
		||||
				isChecked: false
 | 
			
		||||
			},
 | 
			
		||||
			{
 | 
			
		||||
				name: "X-Forwarded-Proto",
 | 
			
		||||
				isChecked: false
 | 
			
		||||
			}
 | 
			
		||||
		]
 | 
			
		||||
		forwardHeaders.forEach(function (v) {
 | 
			
		||||
			v.isChecked = reverseProxyConfig.addHeaders.$contains(v.name)
 | 
			
		||||
		})
 | 
			
		||||
 | 
			
		||||
        return {
 | 
			
		||||
            reverseProxyRef: reverseProxyRef,
 | 
			
		||||
            reverseProxyConfig: reverseProxyConfig,
 | 
			
		||||
            advancedVisible: false,
 | 
			
		||||
            family: this.vFamily,
 | 
			
		||||
            forwardHeaders: forwardHeaders
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    watch: {
 | 
			
		||||
        "reverseProxyConfig.requestHostType": function (v) {
 | 
			
		||||
            let requestHostType = parseInt(v)
 | 
			
		||||
            if (isNaN(requestHostType)) {
 | 
			
		||||
                requestHostType = 0
 | 
			
		||||
            }
 | 
			
		||||
            this.reverseProxyConfig.requestHostType = requestHostType
 | 
			
		||||
        },
 | 
			
		||||
        "reverseProxyConfig.connTimeout.count": function (v) {
 | 
			
		||||
            let count = parseInt(v)
 | 
			
		||||
            if (isNaN(count) || count < 0) {
 | 
			
		||||
                count = 0
 | 
			
		||||
            }
 | 
			
		||||
            this.reverseProxyConfig.connTimeout.count = count
 | 
			
		||||
        },
 | 
			
		||||
        "reverseProxyConfig.readTimeout.count": function (v) {
 | 
			
		||||
            let count = parseInt(v)
 | 
			
		||||
            if (isNaN(count) || count < 0) {
 | 
			
		||||
                count = 0
 | 
			
		||||
            }
 | 
			
		||||
            this.reverseProxyConfig.readTimeout.count = count
 | 
			
		||||
        },
 | 
			
		||||
        "reverseProxyConfig.idleTimeout.count": function (v) {
 | 
			
		||||
            let count = parseInt(v)
 | 
			
		||||
            if (isNaN(count) || count < 0) {
 | 
			
		||||
                count = 0
 | 
			
		||||
            }
 | 
			
		||||
            this.reverseProxyConfig.idleTimeout.count = count
 | 
			
		||||
        },
 | 
			
		||||
        "reverseProxyConfig.maxConns": function (v) {
 | 
			
		||||
            let maxConns = parseInt(v)
 | 
			
		||||
            if (isNaN(maxConns) || maxConns < 0) {
 | 
			
		||||
                maxConns = 0
 | 
			
		||||
            }
 | 
			
		||||
            this.reverseProxyConfig.maxConns = maxConns
 | 
			
		||||
        },
 | 
			
		||||
        "reverseProxyConfig.maxIdleConns": function (v) {
 | 
			
		||||
            let maxIdleConns = parseInt(v)
 | 
			
		||||
            if (isNaN(maxIdleConns) || maxIdleConns < 0) {
 | 
			
		||||
                maxIdleConns = 0
 | 
			
		||||
            }
 | 
			
		||||
            this.reverseProxyConfig.maxIdleConns = maxIdleConns
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    methods: {
 | 
			
		||||
        isOn: function () {
 | 
			
		||||
            return (!this.vIsLocation || this.reverseProxyRef.isPrior) && this.reverseProxyRef.isOn
 | 
			
		||||
        },
 | 
			
		||||
        changeAdvancedVisible: function (v) {
 | 
			
		||||
            this.advancedVisible = v
 | 
			
		||||
        },
 | 
			
		||||
        changeAddHeader: function () {
 | 
			
		||||
            this.reverseProxyConfig.addHeaders = this.forwardHeaders.filter(function (v) {
 | 
			
		||||
                return v.isChecked
 | 
			
		||||
            }).map(function (v) {
 | 
			
		||||
                return v.name
 | 
			
		||||
            })
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    template: `<div>
 | 
			
		||||
		return {
 | 
			
		||||
			reverseProxyRef: reverseProxyRef,
 | 
			
		||||
			reverseProxyConfig: reverseProxyConfig,
 | 
			
		||||
			advancedVisible: false,
 | 
			
		||||
			family: this.vFamily,
 | 
			
		||||
			forwardHeaders: forwardHeaders
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	watch: {
 | 
			
		||||
		"reverseProxyConfig.requestHostType": function (v) {
 | 
			
		||||
			let requestHostType = parseInt(v)
 | 
			
		||||
			if (isNaN(requestHostType)) {
 | 
			
		||||
				requestHostType = 0
 | 
			
		||||
			}
 | 
			
		||||
			this.reverseProxyConfig.requestHostType = requestHostType
 | 
			
		||||
		},
 | 
			
		||||
		"reverseProxyConfig.connTimeout.count": function (v) {
 | 
			
		||||
			let count = parseInt(v)
 | 
			
		||||
			if (isNaN(count) || count < 0) {
 | 
			
		||||
				count = 0
 | 
			
		||||
			}
 | 
			
		||||
			this.reverseProxyConfig.connTimeout.count = count
 | 
			
		||||
		},
 | 
			
		||||
		"reverseProxyConfig.readTimeout.count": function (v) {
 | 
			
		||||
			let count = parseInt(v)
 | 
			
		||||
			if (isNaN(count) || count < 0) {
 | 
			
		||||
				count = 0
 | 
			
		||||
			}
 | 
			
		||||
			this.reverseProxyConfig.readTimeout.count = count
 | 
			
		||||
		},
 | 
			
		||||
		"reverseProxyConfig.idleTimeout.count": function (v) {
 | 
			
		||||
			let count = parseInt(v)
 | 
			
		||||
			if (isNaN(count) || count < 0) {
 | 
			
		||||
				count = 0
 | 
			
		||||
			}
 | 
			
		||||
			this.reverseProxyConfig.idleTimeout.count = count
 | 
			
		||||
		},
 | 
			
		||||
		"reverseProxyConfig.maxConns": function (v) {
 | 
			
		||||
			let maxConns = parseInt(v)
 | 
			
		||||
			if (isNaN(maxConns) || maxConns < 0) {
 | 
			
		||||
				maxConns = 0
 | 
			
		||||
			}
 | 
			
		||||
			this.reverseProxyConfig.maxConns = maxConns
 | 
			
		||||
		},
 | 
			
		||||
		"reverseProxyConfig.maxIdleConns": function (v) {
 | 
			
		||||
			let maxIdleConns = parseInt(v)
 | 
			
		||||
			if (isNaN(maxIdleConns) || maxIdleConns < 0) {
 | 
			
		||||
				maxIdleConns = 0
 | 
			
		||||
			}
 | 
			
		||||
			this.reverseProxyConfig.maxIdleConns = maxIdleConns
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
	methods: {
 | 
			
		||||
		isOn: function () {
 | 
			
		||||
			if (this.vIsLocation || this.vIsGroup) {
 | 
			
		||||
				return this.reverseProxyRef.isPrior && this.reverseProxyRef.isOn
 | 
			
		||||
			}
 | 
			
		||||
			return this.reverseProxyRef.isOn
 | 
			
		||||
		},
 | 
			
		||||
		changeAdvancedVisible: function (v) {
 | 
			
		||||
			this.advancedVisible = v
 | 
			
		||||
		},
 | 
			
		||||
		changeAddHeader: function () {
 | 
			
		||||
			this.reverseProxyConfig.addHeaders = this.forwardHeaders.filter(function (v) {
 | 
			
		||||
				return v.isChecked
 | 
			
		||||
			}).map(function (v) {
 | 
			
		||||
				return v.name
 | 
			
		||||
			})
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	template: `<div>
 | 
			
		||||
	<input type="hidden" name="reverseProxyRefJSON" :value="JSON.stringify(reverseProxyRef)"/>
 | 
			
		||||
	<input type="hidden" name="reverseProxyJSON" :value="JSON.stringify(reverseProxyConfig)"/>
 | 
			
		||||
	<table class="ui table selectable definition">
 | 
			
		||||
		<prior-checkbox :v-config="reverseProxyRef" v-if="vIsLocation"></prior-checkbox>
 | 
			
		||||
		<tbody v-show="!vIsLocation || reverseProxyRef.isPrior">
 | 
			
		||||
		<prior-checkbox :v-config="reverseProxyRef" v-if="vIsLocation || vIsGroup"></prior-checkbox>
 | 
			
		||||
		<tbody v-show="(!vIsLocation && !vIsGroup) || reverseProxyRef.isPrior">
 | 
			
		||||
			<tr>
 | 
			
		||||
				<td class="title">是否启用反向代理</td>
 | 
			
		||||
				<td>
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,7 @@ Vue.component("server-group-selector", {
 | 
			
		||||
			let groupIds = this.groups.map(function (v) {
 | 
			
		||||
				return v.id.toString()
 | 
			
		||||
			}).join(",")
 | 
			
		||||
			teaweb.popup("/servers/components/groups/selectPopup?selectedGroupIds=" + groupIds, {
 | 
			
		||||
			teaweb.popup("/servers/groups/selectPopup?selectedGroupIds=" + groupIds, {
 | 
			
		||||
				callback: function (resp) {
 | 
			
		||||
					that.groups.push(resp.data.group)
 | 
			
		||||
				}
 | 
			
		||||
@@ -23,7 +23,7 @@ Vue.component("server-group-selector", {
 | 
			
		||||
		},
 | 
			
		||||
		addGroup: function () {
 | 
			
		||||
			let that = this
 | 
			
		||||
			teaweb.popup("/servers/components/groups/createPopup", {
 | 
			
		||||
			teaweb.popup("/servers/groups/createPopup", {
 | 
			
		||||
				callback: function (resp) {
 | 
			
		||||
					that.groups.push(resp.data.group)
 | 
			
		||||
				}
 | 
			
		||||
 
 | 
			
		||||
@@ -60,6 +60,9 @@
 | 
			
		||||
.left-box.with-menu {
 | 
			
		||||
  top: 10em;
 | 
			
		||||
}
 | 
			
		||||
.left-box.without-menu {
 | 
			
		||||
  top: 6em;
 | 
			
		||||
}
 | 
			
		||||
.right-box {
 | 
			
		||||
  position: fixed;
 | 
			
		||||
  top: 7.5em;
 | 
			
		||||
@@ -86,6 +89,9 @@ body.expanded .right-box {
 | 
			
		||||
.right-box.with-menu {
 | 
			
		||||
  top: 10em;
 | 
			
		||||
}
 | 
			
		||||
.right-box.without-menu {
 | 
			
		||||
  top: 6em;
 | 
			
		||||
}
 | 
			
		||||
.main.without-footer .left-box {
 | 
			
		||||
  bottom: 0.2em;
 | 
			
		||||
}
 | 
			
		||||
@@ -180,6 +186,9 @@ div.margin,
 | 
			
		||||
p.margin {
 | 
			
		||||
  margin-top: 1em;
 | 
			
		||||
}
 | 
			
		||||
.opacity-mask {
 | 
			
		||||
  opacity: 0.6;
 | 
			
		||||
}
 | 
			
		||||
/** 操作按钮容器 **/
 | 
			
		||||
.op.one {
 | 
			
		||||
  width: 4em;
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@@ -103,6 +103,10 @@ div.margin, p.margin {
 | 
			
		||||
	margin-top: 1em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.opacity-mask {
 | 
			
		||||
	opacity: 0.6;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 操作按钮容器 **/
 | 
			
		||||
.op.one {
 | 
			
		||||
	width: 4em;
 | 
			
		||||
@@ -799,4 +803,4 @@ td {
 | 
			
		||||
// input
 | 
			
		||||
input.error {
 | 
			
		||||
	border: 1px #e0b4b4 solid !important;
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -83,6 +83,10 @@
 | 
			
		||||
	top: 10em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.left-box.without-menu {
 | 
			
		||||
	top: 6em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.right-box {
 | 
			
		||||
	position: fixed;
 | 
			
		||||
	top: 7.5em;
 | 
			
		||||
@@ -115,6 +119,10 @@ body.expanded .right-box {
 | 
			
		||||
	top: 10em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.right-box.without-menu {
 | 
			
		||||
	top: 6em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// main
 | 
			
		||||
.main.without-footer .left-box {
 | 
			
		||||
	bottom: 0.2em;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										9
									
								
								web/views/@default/@left_menu_without_menu.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								web/views/@default/@left_menu_without_menu.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
<div class="margin"></div>
 | 
			
		||||
 | 
			
		||||
<div class="left-box without-menu" :class="{disabled:leftMenuItemIsDisabled}">
 | 
			
		||||
	<div class="ui menu text blue vertical small">
 | 
			
		||||
		<a class="item" v-for="item in leftMenuItems" :href="item.url" :class="{active:item.isActive, separator:item.name == '-', on:item.isOn, off:item.isOff}">
 | 
			
		||||
			<span v-if="item.name != '-'"><i class="icon play tiny" :style="{'visibility':item.isActive ? 'visible' : 'hidden'}"></i>{{item.name}}<var v-if="item.isOff">关</var></span>
 | 
			
		||||
		</a>
 | 
			
		||||
	</div>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -54,7 +54,7 @@
 | 
			
		||||
 | 
			
		||||
<!-- 当前任务 -->
 | 
			
		||||
<div v-if="tasks.length > 0">
 | 
			
		||||
    <h4>正在执行的任务</h4>
 | 
			
		||||
    <h3>正在执行的任务</h3>
 | 
			
		||||
    <table class="ui table selectable celled">
 | 
			
		||||
        <thead>
 | 
			
		||||
        <tr>
 | 
			
		||||
@@ -94,7 +94,7 @@
 | 
			
		||||
 | 
			
		||||
<!-- 问题合集 -->
 | 
			
		||||
<div v-if="issues.length > 0">
 | 
			
		||||
    <h4>需要修复的问题</h4>
 | 
			
		||||
    <h3>需要修复的问题</h3>
 | 
			
		||||
    <table class="ui table selectable celled" v-if="issues.length > 0">
 | 
			
		||||
        <thead>
 | 
			
		||||
        <tr>
 | 
			
		||||
@@ -131,7 +131,7 @@
 | 
			
		||||
<p class="comment">下面的DNS解析记录也可以手工在DNS服务商提供的管理平台添加。</p>
 | 
			
		||||
 | 
			
		||||
<!-- 节点DNS解析记录 -->
 | 
			
		||||
<h4>节点DNS解析记录 <span>  ({{nodes.length}}个)</span></h4>
 | 
			
		||||
<h3>节点DNS解析记录 <span>  ({{nodes.length}}个)</span></h3>
 | 
			
		||||
<p class="comment" v-if="nodes.length == 0">暂时没有需要设置的DNS记录。</p>
 | 
			
		||||
<table class="ui table selectable celled" v-if="nodes.length > 0">
 | 
			
		||||
	<thead>
 | 
			
		||||
@@ -174,7 +174,7 @@
 | 
			
		||||
</table>
 | 
			
		||||
 | 
			
		||||
<!-- 网站服务解析记录 -->
 | 
			
		||||
<h4>网站服务解析记录 <span>  ({{servers.length}}个)</span></h4>
 | 
			
		||||
<h3>网站服务解析记录 <span>  ({{servers.length}}个)</span></h3>
 | 
			
		||||
<p class="comment" v-if="servers.length == 0">暂时没有需要设置的DNS记录。</p>
 | 
			
		||||
<table class="ui table selectable celled" v-if="servers.length > 0">
 | 
			
		||||
	<thead>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										7
									
								
								web/views/@default/servers/groups/group/@menu.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								web/views/@default/servers/groups/group/@menu.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
<first-menu>
 | 
			
		||||
    <menu-item href="/servers/groups">分组列表</menu-item>
 | 
			
		||||
    <span class="item disabled">|</span>
 | 
			
		||||
    <menu-item :href="'/servers/groups/group?groupId=' + group.id" code="group.index">"{{group.name}}"详情</menu-item>
 | 
			
		||||
    <menu-item :href="'/servers/groups/group/settings?groupId=' + group.id" :active="!firstMenuItem.startsWith('group.')">全局设置  <tip-icon content="这里添加的设置将会自动应用到当前分组下的所有服务。"></tip-icon></menu-item>
 | 
			
		||||
    <menu-item :href="'/servers/groups/group/update?groupId=' + group.id" code="group.update">修改</menu-item>
 | 
			
		||||
</first-menu>
 | 
			
		||||
							
								
								
									
										84
									
								
								web/views/@default/servers/groups/group/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								web/views/@default/servers/groups/group/index.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,84 @@
 | 
			
		||||
{$layout}
 | 
			
		||||
{$template "menu"}
 | 
			
		||||
 | 
			
		||||
<table class="ui table definition selectable">
 | 
			
		||||
    <tr>
 | 
			
		||||
        <td class="title">分组名称</td>
 | 
			
		||||
        <td>
 | 
			
		||||
            {{group.name}}
 | 
			
		||||
        </td>
 | 
			
		||||
    </tr>
 | 
			
		||||
</table>
 | 
			
		||||
 | 
			
		||||
<h3>服务</h3>
 | 
			
		||||
 | 
			
		||||
<p class="comment" v-if="servers.length == 0">暂时还没有服务。</p>
 | 
			
		||||
 | 
			
		||||
<table class="ui table selectable celled" v-if="servers.length > 0">
 | 
			
		||||
    <thead>
 | 
			
		||||
    <tr>
 | 
			
		||||
        <th>服务名称</th>
 | 
			
		||||
        <th>所属用户</th>
 | 
			
		||||
        <th>部署集群</th>
 | 
			
		||||
        <th>域名</th>
 | 
			
		||||
        <th>端口</th>
 | 
			
		||||
        <th class="two wide center">状态</th>
 | 
			
		||||
        <th class="two op">操作</th>
 | 
			
		||||
    </tr>
 | 
			
		||||
    </thead>
 | 
			
		||||
    <tr v-for="server in servers">
 | 
			
		||||
        <td><a :href="'/servers/server?serverId=' + server.id"><keyword :v-word="keyword">{{server.name}}</keyword></a>
 | 
			
		||||
            <div style="margin-top:0.4em">
 | 
			
		||||
                <grey-label>{{server.serverTypeName}}</grey-label>
 | 
			
		||||
            </div>
 | 
			
		||||
        </td>
 | 
			
		||||
        <td>
 | 
			
		||||
            <span v-if="server.user != null">{{server.user.fullname}}<link-icon v-if="canVisitUser" :href="'/users/user?userId=' + server.user.id"></link-icon></span>
 | 
			
		||||
            <span v-else>-</span>
 | 
			
		||||
        </td>
 | 
			
		||||
        <td>{{server.cluster.name}}</td>
 | 
			
		||||
        <td>
 | 
			
		||||
			<span v-if="server.serverNames.length > 0">
 | 
			
		||||
                <span v-if="server.serverNames[0].subNames == null || server.serverNames[0].subNames.length == 0"><keyword :v-word="keyword">{{server.serverNames[0].name}}</keyword></span>
 | 
			
		||||
                <span v-else><keyword :v-word="keyword">{{server.serverNames[0].subNames[0]}}</keyword></span>
 | 
			
		||||
				<span v-if="server.countServerNames > 1">等{{server.countServerNames}}个域名 <popup-icon :href="'/servers/serverNamesPopup?serverId=' + server.id" height="20em"></popup-icon></span>
 | 
			
		||||
			</span>
 | 
			
		||||
            <span v-else class="disabled">-</span>
 | 
			
		||||
 | 
			
		||||
            <!-- 审核中 -->
 | 
			
		||||
            <div v-if="server.isAuditing" style="margin-top: 0.5em">
 | 
			
		||||
                <a class="ui label basic tiny red" title="点击跳到审核页面" :href="'/servers/server/settings/serverNames?serverId=' + server.id">审核中  <i class="icon long arrow right alternate"></i></a>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <!-- 审核失败 -->
 | 
			
		||||
            <div v-if="!server.auditingIsOk" style="margin-top: 0.5em">
 | 
			
		||||
                <a class="ui label basic tiny red" title="点击跳到审核页面" :href="'/servers/server/settings/serverNames?serverId=' + server.id">审核不通过  <i class="icon long arrow right alternate"></i></a>
 | 
			
		||||
            </div>
 | 
			
		||||
        </td>
 | 
			
		||||
        <td>
 | 
			
		||||
            <span v-if="server.ports.length == 0">-</span>
 | 
			
		||||
            <div v-for="port in server.ports">
 | 
			
		||||
                <tiny-basic-label><keyword :v-word="keyword">{{port.portRange}}</keyword><span class="small">({{port.protocol}})</span></tiny-basic-label>
 | 
			
		||||
            </div>
 | 
			
		||||
        </td>
 | 
			
		||||
        <td class="center">
 | 
			
		||||
            <div v-if="!checkDNS">
 | 
			
		||||
                <label-on :v-is-on="server.isOn"></label-on>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div v-else>
 | 
			
		||||
                <span v-if="!server.isOn" class="grey">停用中</span>
 | 
			
		||||
                <span v-else-if="server.status.isOk" class="green">正常</span>
 | 
			
		||||
                <span v-else-if="server.status.message.length == 0">检查中</span>
 | 
			
		||||
                <span v-else class="red">{{server.status.message}}
 | 
			
		||||
                    <tip-icon :content="server.status.todo"></tip-icon>
 | 
			
		||||
                </span>
 | 
			
		||||
            </div>
 | 
			
		||||
        </td>
 | 
			
		||||
        <td>
 | 
			
		||||
            <a :href="'/servers/server?serverId=' + server.id">详情</a>  
 | 
			
		||||
            <a :href="'/servers/server/settings?serverId=' + server.id">设置</a>
 | 
			
		||||
        </td>
 | 
			
		||||
    </tr>
 | 
			
		||||
</table>
 | 
			
		||||
 | 
			
		||||
<div class="page" v-html="page"></div>
 | 
			
		||||
							
								
								
									
										3
									
								
								web/views/@default/servers/groups/group/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								web/views/@default/servers/groups/group/index.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
Tea.context(function () {
 | 
			
		||||
	this.checkDNS = false
 | 
			
		||||
})
 | 
			
		||||
@@ -0,0 +1,5 @@
 | 
			
		||||
<second-menu>
 | 
			
		||||
	<menu-item :href="Tea.url('.', {groupId: group.id})" code="index">源站列表</menu-item>
 | 
			
		||||
	<menu-item :href="Tea.url('.scheduling', {groupId: group.id})" code="scheduling">调度算法</menu-item>
 | 
			
		||||
	<menu-item :href="Tea.url('.setting', {groupId: group.id})" code="setting">更多设置</menu-item>
 | 
			
		||||
</second-menu>
 | 
			
		||||
@@ -0,0 +1,19 @@
 | 
			
		||||
{$layout}
 | 
			
		||||
{$template "/servers/groups/group/menu"}
 | 
			
		||||
{$template "/left_menu_without_menu"}
 | 
			
		||||
 | 
			
		||||
<div class="right-box without-menu">
 | 
			
		||||
	{$template "menu"}
 | 
			
		||||
 | 
			
		||||
	<div v-if="!reverseProxyRef.isPrior || !reverseProxyRef.isOn">
 | 
			
		||||
		<div class="margin"></div>
 | 
			
		||||
        <warning-message>当前代理服务没有开启,可以通过点击 <a :href="Tea.url('.setting', { groupId: group.id })">[更多设置]</a> 开启 。</warning-message>
 | 
			
		||||
	</div>
 | 
			
		||||
 | 
			
		||||
    <div :class="{'opacity-mask': !reverseProxyRef.isPrior || !reverseProxyRef.isOn}">
 | 
			
		||||
	    <origin-list-box :v-primary-origins="primaryOrigins" :v-backup-origins="backupOrigins"
 | 
			
		||||
					 :v-server-type="serverType"
 | 
			
		||||
					 :v-params="'type=group&groupId=' + group.id + '&reverseProxyId=' + reverseProxyConfig.id + '&serverType=' + serverType"
 | 
			
		||||
    :v-is-group="true"></origin-list-box>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -0,0 +1,9 @@
 | 
			
		||||
{$layout}
 | 
			
		||||
{$template "/servers/groups/group/menu"}
 | 
			
		||||
{$template "/left_menu_without_menu"}
 | 
			
		||||
 | 
			
		||||
<div class="right-box without-menu">
 | 
			
		||||
	{$template "menu"}
 | 
			
		||||
 | 
			
		||||
	<origin-scheduling-view-box :v-scheduling="scheduling" :v-params="'type=group&groupId=' + group.id + '&reverseProxyId=' + reverseProxyId + '&family=' + family"></origin-scheduling-view-box>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -0,0 +1,15 @@
 | 
			
		||||
{$layout}
 | 
			
		||||
{$template "/servers/groups/group/menu"}
 | 
			
		||||
{$template "/left_menu_without_menu"}
 | 
			
		||||
 | 
			
		||||
<div class="right-box without-menu">
 | 
			
		||||
	{$template "menu"}
 | 
			
		||||
 | 
			
		||||
	<div class="margin"></div>
 | 
			
		||||
	<form method="post" class="ui form" data-tea-action="$" data-tea-success="success">
 | 
			
		||||
		<input type="hidden" name="groupId" :value="group.id"/>
 | 
			
		||||
		<input type="hidden" name="reverseProxyRefJSON" :value="JSON.stringify(reverseProxyRef)"/>
 | 
			
		||||
		<reverse-proxy-box :v-reverse-proxy-ref="reverseProxyRef" :v-reverse-proxy-config="reverseProxyConfig" :v-family="family" :v-is-group="true"></reverse-proxy-box>
 | 
			
		||||
		<submit-btn></submit-btn>
 | 
			
		||||
	</form>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -0,0 +1,3 @@
 | 
			
		||||
Tea.context(function () {
 | 
			
		||||
	this.success = NotifyReloadSuccess("保存成功")
 | 
			
		||||
})
 | 
			
		||||
@@ -0,0 +1,5 @@
 | 
			
		||||
<second-menu>
 | 
			
		||||
	<menu-item :href="Tea.url('.', {groupId: group.id})" code="index">源站列表</menu-item>
 | 
			
		||||
	<menu-item :href="Tea.url('.scheduling', {groupId: group.id})" code="scheduling">调度算法</menu-item>
 | 
			
		||||
	<menu-item :href="Tea.url('.setting', {groupId: group.id})" code="setting">更多设置</menu-item>
 | 
			
		||||
</second-menu>
 | 
			
		||||
@@ -0,0 +1,19 @@
 | 
			
		||||
{$layout}
 | 
			
		||||
{$template "/servers/groups/group/menu"}
 | 
			
		||||
{$template "/left_menu_without_menu"}
 | 
			
		||||
 | 
			
		||||
<div class="right-box without-menu">
 | 
			
		||||
	{$template "menu"}
 | 
			
		||||
 | 
			
		||||
	<div v-if="!reverseProxyRef.isPrior || !reverseProxyRef.isOn">
 | 
			
		||||
		<div class="margin"></div>
 | 
			
		||||
        <warning-message>当前代理服务没有开启,可以通过点击 <a :href="Tea.url('.setting', { groupId: group.id })">[更多设置]</a> 开启 。</warning-message>
 | 
			
		||||
	</div>
 | 
			
		||||
 | 
			
		||||
    <div :class="{'opacity-mask': !reverseProxyRef.isPrior || !reverseProxyRef.isOn}">
 | 
			
		||||
        <origin-list-box :v-primary-origins="primaryOrigins" :v-backup-origins="backupOrigins"
 | 
			
		||||
                         :v-server-type="serverType"
 | 
			
		||||
                         :v-params="'type=group&groupId=' + group.id + '&reverseProxyId=' + reverseProxyConfig.id + '&serverType=' + serverType"
 | 
			
		||||
        :v-is-group="true"></origin-list-box>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -0,0 +1,9 @@
 | 
			
		||||
{$layout}
 | 
			
		||||
{$template "/servers/groups/group/menu"}
 | 
			
		||||
{$template "/left_menu_without_menu"}
 | 
			
		||||
 | 
			
		||||
<div class="right-box without-menu">
 | 
			
		||||
	{$template "menu"}
 | 
			
		||||
 | 
			
		||||
	<origin-scheduling-view-box :v-scheduling="scheduling" :v-params="'type=group&groupId=' + group.id + '&reverseProxyId=' + reverseProxyId + '&family=' + family"></origin-scheduling-view-box>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -0,0 +1,15 @@
 | 
			
		||||
{$layout}
 | 
			
		||||
{$template "/servers/groups/group/menu"}
 | 
			
		||||
{$template "/left_menu_without_menu"}
 | 
			
		||||
 | 
			
		||||
<div class="right-box without-menu">
 | 
			
		||||
	{$template "menu"}
 | 
			
		||||
 | 
			
		||||
	<div class="margin"></div>
 | 
			
		||||
	<form method="post" class="ui form" data-tea-action="$" data-tea-success="success">
 | 
			
		||||
		<input type="hidden" name="groupId" :value="group.id"/>
 | 
			
		||||
		<input type="hidden" name="reverseProxyRefJSON" :value="JSON.stringify(reverseProxyRef)"/>
 | 
			
		||||
		<reverse-proxy-box :v-reverse-proxy-ref="reverseProxyRef" :v-reverse-proxy-config="reverseProxyConfig" :v-family="family" :v-is-group="true"></reverse-proxy-box>
 | 
			
		||||
		<submit-btn></submit-btn>
 | 
			
		||||
	</form>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -0,0 +1,3 @@
 | 
			
		||||
Tea.context(function () {
 | 
			
		||||
	this.success = NotifyReloadSuccess("保存成功")
 | 
			
		||||
})
 | 
			
		||||
@@ -0,0 +1,5 @@
 | 
			
		||||
<second-menu>
 | 
			
		||||
	<menu-item :href="Tea.url('.', {groupId: group.id})" code="index">源站列表</menu-item>
 | 
			
		||||
	<menu-item :href="Tea.url('.scheduling', {groupId: group.id})" code="scheduling">调度算法</menu-item>
 | 
			
		||||
	<menu-item :href="Tea.url('.setting', {groupId: group.id})" code="setting">更多设置</menu-item>
 | 
			
		||||
</second-menu>
 | 
			
		||||
@@ -0,0 +1,19 @@
 | 
			
		||||
{$layout}
 | 
			
		||||
{$template "/servers/groups/group/menu"}
 | 
			
		||||
{$template "/left_menu_without_menu"}
 | 
			
		||||
 | 
			
		||||
<div class="right-box without-menu">
 | 
			
		||||
	{$template "menu"}
 | 
			
		||||
 | 
			
		||||
	<div v-if="!reverseProxyRef.isPrior || !reverseProxyRef.isOn">
 | 
			
		||||
		<div class="margin"></div>
 | 
			
		||||
        <warning-message>当前代理服务没有开启,可以通过点击 <a :href="Tea.url('.setting', { groupId: group.id })">[更多设置]</a> 开启 。</warning-message>
 | 
			
		||||
	</div>
 | 
			
		||||
 | 
			
		||||
    <div :class="{'opacity-mask': !reverseProxyRef.isPrior || !reverseProxyRef.isOn}">
 | 
			
		||||
        <origin-list-box :v-primary-origins="primaryOrigins" :v-backup-origins="backupOrigins"
 | 
			
		||||
                         :v-server-type="serverType"
 | 
			
		||||
                         :v-params="'type=group&groupId=' + group.id + '&reverseProxyId=' + reverseProxyConfig.id + '&serverType=' + serverType"
 | 
			
		||||
        :v-is-group="true"></origin-list-box>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -0,0 +1,9 @@
 | 
			
		||||
{$layout}
 | 
			
		||||
{$template "/servers/groups/group/menu"}
 | 
			
		||||
{$template "/left_menu_without_menu"}
 | 
			
		||||
 | 
			
		||||
<div class="right-box without-menu">
 | 
			
		||||
	{$template "menu"}
 | 
			
		||||
 | 
			
		||||
	<origin-scheduling-view-box :v-scheduling="scheduling" :v-params="'type=group&groupId=' + group.id + '&reverseProxyId=' + reverseProxyId + '&family=' + family"></origin-scheduling-view-box>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -0,0 +1,15 @@
 | 
			
		||||
{$layout}
 | 
			
		||||
{$template "/servers/groups/group/menu"}
 | 
			
		||||
{$template "/left_menu_without_menu"}
 | 
			
		||||
 | 
			
		||||
<div class="right-box without-menu">
 | 
			
		||||
	{$template "menu"}
 | 
			
		||||
 | 
			
		||||
	<div class="margin"></div>
 | 
			
		||||
	<form method="post" class="ui form" data-tea-action="$" data-tea-success="success">
 | 
			
		||||
		<input type="hidden" name="groupId" :value="group.id"/>
 | 
			
		||||
		<input type="hidden" name="reverseProxyRefJSON" :value="JSON.stringify(reverseProxyRef)"/>
 | 
			
		||||
		<reverse-proxy-box :v-reverse-proxy-ref="reverseProxyRef" :v-reverse-proxy-config="reverseProxyConfig" :v-family="family" :v-is-group="true"></reverse-proxy-box>
 | 
			
		||||
		<submit-btn></submit-btn>
 | 
			
		||||
	</form>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -0,0 +1,3 @@
 | 
			
		||||
Tea.context(function () {
 | 
			
		||||
	this.success = NotifyReloadSuccess("保存成功")
 | 
			
		||||
})
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{$layout "layout_popup"}
 | 
			
		||||
{$layout "layout"}
 | 
			
		||||
{$template "menu"}
 | 
			
		||||
 | 
			
		||||
<h3>修改分组</h3>
 | 
			
		||||
<form method="post" class="ui form" data-tea-action="$" data-tea-success="success">
 | 
			
		||||
	<input type="hidden" name="groupId" :value="group.id"/>
 | 
			
		||||
	<table class="ui table definition selectable">
 | 
			
		||||
							
								
								
									
										5
									
								
								web/views/@default/servers/groups/group/update.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								web/views/@default/servers/groups/group/update.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
Tea.context(function () {
 | 
			
		||||
	this.success = NotifySuccess("保存成功", ".", {
 | 
			
		||||
		groupId: this.group.id
 | 
			
		||||
	})
 | 
			
		||||
})
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
{$layout}
 | 
			
		||||
 | 
			
		||||
	<first-menu>
 | 
			
		||||
		<menu-item href="/servers/components/groups" active="true">列表</menu-item>
 | 
			
		||||
		<menu-item href="/servers/groups" active="true">列表</menu-item>
 | 
			
		||||
		<span class="item">|</span>
 | 
			
		||||
		<a href="" class="item" @click.prevent="createGroup()">[创建]</a>
 | 
			
		||||
	</first-menu>
 | 
			
		||||
@@ -21,13 +21,15 @@
 | 
			
		||||
			<tbody v-for="group in groups" :data-group-id="group.id">
 | 
			
		||||
				<tr>
 | 
			
		||||
					<td style="text-align: center;"><i class="icon bars handle grey"></i> </td>
 | 
			
		||||
					<td>{{group.name}}</td>
 | 
			
		||||
					<td>
 | 
			
		||||
                        <a :href="'/servers/groups/group?groupId=' + group.id">{{group.name}}</a>
 | 
			
		||||
                    </td>
 | 
			
		||||
					<td class="center">
 | 
			
		||||
						<a :href="'/servers?groupId=' + group.id" v-if="group.countServers > 0">{{group.countServers}}</a>
 | 
			
		||||
						<span v-else class="disabled">0</span>
 | 
			
		||||
					</td>
 | 
			
		||||
					<td>
 | 
			
		||||
						<a href="" @click.prevent="updateGroup(group.id)">修改</a>   <a href="" @click.prevent="deleteGroup(group.id)">删除</a>
 | 
			
		||||
						<a :href="'/servers/groups/group?groupId=' + group.id">详情</a>   <a href="" @click.prevent="deleteGroup(group.id)">删除</a>
 | 
			
		||||
					</td>
 | 
			
		||||
				</tr>
 | 
			
		||||
			</tbody>
 | 
			
		||||
@@ -6,7 +6,7 @@ Tea.context(function () {
 | 
			
		||||
			document.querySelectorAll("*[data-group-id]").forEach(function (element) {
 | 
			
		||||
				groupIds.push(element.getAttribute("data-group-id"))
 | 
			
		||||
			})
 | 
			
		||||
			that.$post("/servers/components/groups/sort")
 | 
			
		||||
			that.$post("/servers/groups/sort")
 | 
			
		||||
				.params({
 | 
			
		||||
					groupIds: groupIds
 | 
			
		||||
				})
 | 
			
		||||
@@ -17,17 +17,7 @@ Tea.context(function () {
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	this.createGroup = function () {
 | 
			
		||||
		teaweb.popup("/servers/components/groups/createPopup", {
 | 
			
		||||
			callback: function () {
 | 
			
		||||
				teaweb.success("保存成功", function () {
 | 
			
		||||
					teaweb.reload()
 | 
			
		||||
				})
 | 
			
		||||
			}
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.updateGroup = function (groupId) {
 | 
			
		||||
		teaweb.popup("/servers/components/groups/updatePopup?groupId=" + groupId, {
 | 
			
		||||
		teaweb.popup("/servers/groups/createPopup", {
 | 
			
		||||
			callback: function () {
 | 
			
		||||
				teaweb.success("保存成功", function () {
 | 
			
		||||
					teaweb.reload()
 | 
			
		||||
@@ -39,7 +29,7 @@ Tea.context(function () {
 | 
			
		||||
	this.deleteGroup = function (groupId) {
 | 
			
		||||
		let that = this
 | 
			
		||||
		teaweb.confirm("确定要删除这个分组吗?", function () {
 | 
			
		||||
			that.$post("/servers/components/groups/delete")
 | 
			
		||||
			that.$post("/servers/groups/group/delete")
 | 
			
		||||
				.params({
 | 
			
		||||
					groupId: groupId
 | 
			
		||||
				})
 | 
			
		||||
@@ -129,7 +129,8 @@
 | 
			
		||||
            </div>
 | 
			
		||||
		</td>
 | 
			
		||||
		<td>
 | 
			
		||||
			<a :href="'/servers/server?serverId=' + server.id">详情</a>
 | 
			
		||||
			<a :href="'/servers/server?serverId=' + server.id">详情</a>  
 | 
			
		||||
            <a :href="'/servers/server/settings?serverId=' + server.id">设置</a>
 | 
			
		||||
		</td>
 | 
			
		||||
	</tr>
 | 
			
		||||
</table>
 | 
			
		||||
 
 | 
			
		||||
@@ -4,12 +4,19 @@
 | 
			
		||||
<div class="right-box">
 | 
			
		||||
	{$template "menu"}
 | 
			
		||||
 | 
			
		||||
	<div v-if="!reverseProxyRef.isOn">
 | 
			
		||||
		<div class="margin"></div>
 | 
			
		||||
        <warning-message>当前代理服务没有开启,可以通过点击 <a :href="'/servers/server/settings/reverseProxy/setting?serverId=' + serverId">[更多设置]</a> 开启 。</warning-message>
 | 
			
		||||
	</div>
 | 
			
		||||
    <div v-if="hasGroupConfig">
 | 
			
		||||
        <div class="margin"></div>
 | 
			
		||||
        <warning-message>由于已经在当前服务分组中进行了对应的配置,在这里的配置将不会生效。</warning-message>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
	<origin-list-box :v-primary-origins="primaryOrigins" :v-backup-origins="backupOrigins"
 | 
			
		||||
					 :v-server-type="serverType"
 | 
			
		||||
					 :v-params="'type=server&serverId=' + serverId + '&reverseProxyId=' + reverseProxyConfig.id"></origin-list-box>
 | 
			
		||||
    <div :class="{'opacity-mask': hasGroupConfig}">
 | 
			
		||||
        <div v-if="!reverseProxyRef.isOn">
 | 
			
		||||
            <div class="margin"></div>
 | 
			
		||||
            <warning-message>当前代理服务没有开启,可以通过点击 <a :href="'/servers/server/settings/reverseProxy/setting?serverId=' + serverId">[更多设置]</a> 开启 。</warning-message>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <origin-list-box :v-primary-origins="primaryOrigins" :v-backup-origins="backupOrigins"
 | 
			
		||||
                         :v-server-type="serverType"
 | 
			
		||||
                         :v-params="'type=server&serverId=' + serverId + '&reverseProxyId=' + reverseProxyConfig.id"></origin-list-box>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
		Reference in New Issue
	
	Block a user