mirror of
				https://github.com/TeaOSLab/EdgeAdmin.git
				synced 2025-11-04 13:10:26 +08:00 
			
		
		
		
	集群设置--DNS设置中增加”解析记录“页面
This commit is contained in:
		@@ -14,7 +14,7 @@ type IndexAction struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (this *IndexAction) Init() {
 | 
					func (this *IndexAction) Init() {
 | 
				
			||||||
	this.Nav("", "setting", "")
 | 
						this.Nav("", "setting", "index")
 | 
				
			||||||
	this.SecondMenu("dns")
 | 
						this.SecondMenu("dns")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,303 @@
 | 
				
			|||||||
 | 
					// Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn .
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package dns
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/utils"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/maps"
 | 
				
			||||||
 | 
						timeutil "github.com/iwind/TeaGo/utils/time"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RecordsAction struct {
 | 
				
			||||||
 | 
						actionutils.ParentAction
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *RecordsAction) Init() {
 | 
				
			||||||
 | 
						this.Nav("", "setting", "records")
 | 
				
			||||||
 | 
						this.SecondMenu("dns")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *RecordsAction) RunGet(params struct {
 | 
				
			||||||
 | 
						ClusterId int64
 | 
				
			||||||
 | 
					}) {
 | 
				
			||||||
 | 
						// 集群信息
 | 
				
			||||||
 | 
						clusterResp, err := this.RPC().NodeClusterRPC().FindEnabledNodeCluster(this.AdminContext(), &pb.FindEnabledNodeClusterRequest{NodeClusterId: params.ClusterId})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							this.ErrorPage(err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var cluster = clusterResp.NodeCluster
 | 
				
			||||||
 | 
						if cluster == nil {
 | 
				
			||||||
 | 
							this.NotFound("nodeCluster", params.ClusterId)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						this.Data["cluster"] = maps.Map{
 | 
				
			||||||
 | 
							"id":   cluster.Id,
 | 
				
			||||||
 | 
							"name": cluster.Name,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// DNS信息
 | 
				
			||||||
 | 
						dnsResp, err := this.RPC().NodeClusterRPC().FindEnabledNodeClusterDNS(this.AdminContext(), &pb.FindEnabledNodeClusterDNSRequest{NodeClusterId: params.ClusterId})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							this.ErrorPage(err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var defaultRoute = dnsResp.DefaultRoute
 | 
				
			||||||
 | 
						var domainName = ""
 | 
				
			||||||
 | 
						var dnsMap = maps.Map{
 | 
				
			||||||
 | 
							"dnsName":          dnsResp.Name,
 | 
				
			||||||
 | 
							"domainId":         0,
 | 
				
			||||||
 | 
							"domainName":       "",
 | 
				
			||||||
 | 
							"providerId":       0,
 | 
				
			||||||
 | 
							"providerName":     "",
 | 
				
			||||||
 | 
							"providerTypeName": "",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if dnsResp.Domain != nil {
 | 
				
			||||||
 | 
							domainName = dnsResp.Domain.Name
 | 
				
			||||||
 | 
							dnsMap["domainId"] = dnsResp.Domain.Id
 | 
				
			||||||
 | 
							dnsMap["domainName"] = dnsResp.Domain.Name
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if dnsResp.Provider != nil {
 | 
				
			||||||
 | 
							dnsMap["providerId"] = dnsResp.Provider.Id
 | 
				
			||||||
 | 
							dnsMap["providerName"] = dnsResp.Provider.Name
 | 
				
			||||||
 | 
							dnsMap["providerTypeName"] = dnsResp.Provider.TypeName
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(dnsResp.CnameRecords) > 0 {
 | 
				
			||||||
 | 
							dnsMap["cnameRecords"] = dnsResp.CnameRecords
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							dnsMap["cnameRecords"] = []string{}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this.Data["dnsInfo"] = dnsMap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 未安装的节点
 | 
				
			||||||
 | 
						notInstalledNodesResp, err := this.RPC().NodeRPC().FindAllEnabledNodesDNSWithNodeClusterId(this.AdminContext(), &pb.FindAllEnabledNodesDNSWithNodeClusterIdRequest{
 | 
				
			||||||
 | 
							NodeClusterId: params.ClusterId,
 | 
				
			||||||
 | 
							IsInstalled:   false,
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							this.ErrorPage(err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var allNodes = notInstalledNodesResp.Nodes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 节点DNS解析记录
 | 
				
			||||||
 | 
						nodesResp, err := this.RPC().NodeRPC().FindAllEnabledNodesDNSWithNodeClusterId(this.AdminContext(), &pb.FindAllEnabledNodesDNSWithNodeClusterIdRequest{
 | 
				
			||||||
 | 
							NodeClusterId: params.ClusterId,
 | 
				
			||||||
 | 
							IsInstalled:   true,
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							this.ErrorPage(err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var installedNodeIdsMap = map[int64]bool{}
 | 
				
			||||||
 | 
						for _, node := range nodesResp.Nodes {
 | 
				
			||||||
 | 
							installedNodeIdsMap[node.Id] = true
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						allNodes = append(allNodes, nodesResp.Nodes...)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var nodeMaps = []maps.Map{}
 | 
				
			||||||
 | 
						for _, node := range allNodes {
 | 
				
			||||||
 | 
							var isInstalled = installedNodeIdsMap[node.Id]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if len(node.Routes) > 0 {
 | 
				
			||||||
 | 
								for _, route := range node.Routes {
 | 
				
			||||||
 | 
									// 检查是否已解析
 | 
				
			||||||
 | 
									var isResolved = false
 | 
				
			||||||
 | 
									if isInstalled && cluster.DnsDomainId > 0 && len(cluster.DnsName) > 0 && len(node.IpAddr) > 0 {
 | 
				
			||||||
 | 
										var recordType = "A"
 | 
				
			||||||
 | 
										if utils.IsIPv6(node.IpAddr) {
 | 
				
			||||||
 | 
											recordType = "AAAA"
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										checkResp, err := this.RPC().DNSDomainRPC().ExistDNSDomainRecord(this.AdminContext(), &pb.ExistDNSDomainRecordRequest{
 | 
				
			||||||
 | 
											DnsDomainId: cluster.DnsDomainId,
 | 
				
			||||||
 | 
											Name:        cluster.DnsName,
 | 
				
			||||||
 | 
											Type:        recordType,
 | 
				
			||||||
 | 
											Route:       route.Code,
 | 
				
			||||||
 | 
											Value:       node.IpAddr,
 | 
				
			||||||
 | 
										})
 | 
				
			||||||
 | 
										if err != nil {
 | 
				
			||||||
 | 
											this.ErrorPage(err)
 | 
				
			||||||
 | 
											return
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										isResolved = checkResp.IsOk
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									nodeMaps = append(nodeMaps, maps.Map{
 | 
				
			||||||
 | 
										"id":       node.Id,
 | 
				
			||||||
 | 
										"name":     node.Name,
 | 
				
			||||||
 | 
										"ipAddr":   node.IpAddr,
 | 
				
			||||||
 | 
										"ipAddrId": node.NodeIPAddressId,
 | 
				
			||||||
 | 
										"route": maps.Map{
 | 
				
			||||||
 | 
											"name": route.Name,
 | 
				
			||||||
 | 
											"code": route.Code,
 | 
				
			||||||
 | 
										},
 | 
				
			||||||
 | 
										"clusterId":   node.NodeClusterId,
 | 
				
			||||||
 | 
										"isResolved":  isResolved,
 | 
				
			||||||
 | 
										"isInstalled": isInstalled,
 | 
				
			||||||
 | 
										"isBackup":    node.IsBackupForCluster || node.IsBackupForGroup,
 | 
				
			||||||
 | 
										"isOffline":   node.IsOffline,
 | 
				
			||||||
 | 
									})
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								// 默认线路
 | 
				
			||||||
 | 
								var isResolved = false
 | 
				
			||||||
 | 
								if isInstalled && len(defaultRoute) > 0 {
 | 
				
			||||||
 | 
									var recordType = "A"
 | 
				
			||||||
 | 
									if utils.IsIPv6(node.IpAddr) {
 | 
				
			||||||
 | 
										recordType = "AAAA"
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									checkResp, err := this.RPC().DNSDomainRPC().ExistDNSDomainRecord(this.AdminContext(), &pb.ExistDNSDomainRecordRequest{
 | 
				
			||||||
 | 
										DnsDomainId: cluster.DnsDomainId,
 | 
				
			||||||
 | 
										Name:        cluster.DnsName,
 | 
				
			||||||
 | 
										Type:        recordType,
 | 
				
			||||||
 | 
										Route:       defaultRoute,
 | 
				
			||||||
 | 
										Value:       node.IpAddr,
 | 
				
			||||||
 | 
									})
 | 
				
			||||||
 | 
									if err != nil {
 | 
				
			||||||
 | 
										this.ErrorPage(err)
 | 
				
			||||||
 | 
										return
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									isResolved = checkResp.IsOk
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								nodeMaps = append(nodeMaps, maps.Map{
 | 
				
			||||||
 | 
									"id":       node.Id,
 | 
				
			||||||
 | 
									"name":     node.Name,
 | 
				
			||||||
 | 
									"ipAddr":   node.IpAddr,
 | 
				
			||||||
 | 
									"ipAddrId": node.NodeIPAddressId,
 | 
				
			||||||
 | 
									"route": maps.Map{
 | 
				
			||||||
 | 
										"name": "",
 | 
				
			||||||
 | 
										"code": "",
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									"clusterId":   node.NodeClusterId,
 | 
				
			||||||
 | 
									"isResolved":  isResolved,
 | 
				
			||||||
 | 
									"isInstalled": isInstalled,
 | 
				
			||||||
 | 
									"isBackup":    node.IsBackupForCluster || node.IsBackupForGroup,
 | 
				
			||||||
 | 
									"isOffline":   node.IsOffline,
 | 
				
			||||||
 | 
								})
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						this.Data["nodes"] = nodeMaps
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 代理服务解析记录
 | 
				
			||||||
 | 
						serversResp, err := this.RPC().ServerRPC().FindAllEnabledServersDNSWithNodeClusterId(this.AdminContext(), &pb.FindAllEnabledServersDNSWithNodeClusterIdRequest{NodeClusterId: params.ClusterId})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							this.ErrorPage(err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var serverMaps = []maps.Map{}
 | 
				
			||||||
 | 
						for _, server := range serversResp.Servers {
 | 
				
			||||||
 | 
							// 检查是否已解析
 | 
				
			||||||
 | 
							isResolved := false
 | 
				
			||||||
 | 
							if cluster.DnsDomainId > 0 && len(cluster.DnsName) > 0 && len(server.DnsName) > 0 && len(domainName) > 0 {
 | 
				
			||||||
 | 
								checkResp, err := this.RPC().DNSDomainRPC().ExistDNSDomainRecord(this.AdminContext(), &pb.ExistDNSDomainRecordRequest{
 | 
				
			||||||
 | 
									DnsDomainId: cluster.DnsDomainId,
 | 
				
			||||||
 | 
									Name:        server.DnsName,
 | 
				
			||||||
 | 
									Type:        "CNAME",
 | 
				
			||||||
 | 
									Value:       cluster.DnsName + "." + domainName,
 | 
				
			||||||
 | 
								})
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									this.ErrorPage(err)
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								isResolved = checkResp.IsOk
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							serverMaps = append(serverMaps, maps.Map{
 | 
				
			||||||
 | 
								"id":         server.Id,
 | 
				
			||||||
 | 
								"name":       server.Name,
 | 
				
			||||||
 | 
								"dnsName":    server.DnsName,
 | 
				
			||||||
 | 
								"isResolved": isResolved,
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						this.Data["servers"] = serverMaps
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 检查解析记录是否有变化
 | 
				
			||||||
 | 
						checkChangesResp, err := this.RPC().NodeClusterRPC().CheckNodeClusterDNSChanges(this.AdminContext(), &pb.CheckNodeClusterDNSChangesRequest{NodeClusterId: params.ClusterId})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							this.ErrorPage(err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						this.Data["dnsHasChanges"] = checkChangesResp.IsChanged
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 需要解决的问题
 | 
				
			||||||
 | 
						issuesResp, err := this.RPC().DNSRPC().FindAllDNSIssues(this.AdminContext(), &pb.FindAllDNSIssuesRequest{
 | 
				
			||||||
 | 
							NodeClusterId: params.ClusterId,
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							this.ErrorPage(err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var issueMaps = []maps.Map{}
 | 
				
			||||||
 | 
						for _, issue := range issuesResp.Issues {
 | 
				
			||||||
 | 
							issueMaps = append(issueMaps, maps.Map{
 | 
				
			||||||
 | 
								"target":      issue.Target,
 | 
				
			||||||
 | 
								"targetId":    issue.TargetId,
 | 
				
			||||||
 | 
								"type":        issue.Type,
 | 
				
			||||||
 | 
								"description": issue.Description,
 | 
				
			||||||
 | 
								"params":      issue.Params,
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						this.Data["issues"] = issueMaps
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 当前正在执行的任务
 | 
				
			||||||
 | 
						resp, err := this.RPC().DNSTaskRPC().FindAllDoingDNSTasks(this.AdminContext(), &pb.FindAllDoingDNSTasksRequest{
 | 
				
			||||||
 | 
							NodeClusterId: params.ClusterId,
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							this.ErrorPage(err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var taskMaps = []maps.Map{}
 | 
				
			||||||
 | 
						for _, task := range resp.DnsTasks {
 | 
				
			||||||
 | 
							var clusterMap maps.Map = nil
 | 
				
			||||||
 | 
							var nodeMap maps.Map = nil
 | 
				
			||||||
 | 
							var serverMap maps.Map = nil
 | 
				
			||||||
 | 
							var domainMap maps.Map = nil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if task.NodeCluster != nil {
 | 
				
			||||||
 | 
								clusterMap = maps.Map{
 | 
				
			||||||
 | 
									"id":   task.NodeCluster.Id,
 | 
				
			||||||
 | 
									"name": task.NodeCluster.Name,
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if task.Node != nil {
 | 
				
			||||||
 | 
								nodeMap = maps.Map{
 | 
				
			||||||
 | 
									"id":   task.Node.Id,
 | 
				
			||||||
 | 
									"name": task.Node.Name,
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if task.Server != nil {
 | 
				
			||||||
 | 
								serverMap = maps.Map{
 | 
				
			||||||
 | 
									"id":   task.Server.Id,
 | 
				
			||||||
 | 
									"name": task.Server.Name,
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if task.DnsDomain != nil {
 | 
				
			||||||
 | 
								domainMap = maps.Map{
 | 
				
			||||||
 | 
									"id":   task.DnsDomain.Id,
 | 
				
			||||||
 | 
									"name": task.DnsDomain.Name,
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							taskMaps = append(taskMaps, maps.Map{
 | 
				
			||||||
 | 
								"id":          task.Id,
 | 
				
			||||||
 | 
								"type":        task.Type,
 | 
				
			||||||
 | 
								"isDone":      task.IsDone,
 | 
				
			||||||
 | 
								"isOk":        task.IsOk,
 | 
				
			||||||
 | 
								"error":       task.Error,
 | 
				
			||||||
 | 
								"updatedTime": timeutil.FormatTime("Y-m-d H:i:s", task.UpdatedAt),
 | 
				
			||||||
 | 
								"cluster":     clusterMap,
 | 
				
			||||||
 | 
								"node":        nodeMap,
 | 
				
			||||||
 | 
								"server":      serverMap,
 | 
				
			||||||
 | 
								"domain":      domainMap,
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						this.Data["tasks"] = taskMaps
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this.Show()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -40,6 +40,7 @@ func init() {
 | 
				
			|||||||
			// DNS
 | 
								// DNS
 | 
				
			||||||
			Prefix("/clusters/cluster/settings/dns").
 | 
								Prefix("/clusters/cluster/settings/dns").
 | 
				
			||||||
			GetPost("", new(dns.IndexAction)).
 | 
								GetPost("", new(dns.IndexAction)).
 | 
				
			||||||
 | 
								Get("/records", new(dns.RecordsAction)).
 | 
				
			||||||
			Post("/randomName", new(dns.RandomNameAction)).
 | 
								Post("/randomName", new(dns.RandomNameAction)).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// 系统服务设置
 | 
								// 系统服务设置
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					<first-menu>
 | 
				
			||||||
 | 
					    <menu-item :href="'.?clusterId=' + clusterId" code="index">DNS设置</menu-item>
 | 
				
			||||||
 | 
					    <menu-item :href="'.records?clusterId=' + clusterId" code="records">解析记录</menu-item>
 | 
				
			||||||
 | 
					</first-menu>
 | 
				
			||||||
@@ -3,7 +3,8 @@
 | 
				
			|||||||
{$template "/left_menu_with_menu"}
 | 
					{$template "/left_menu_with_menu"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<div class="right-box with-menu">
 | 
					<div class="right-box with-menu">
 | 
				
			||||||
	<p class="comment"><a :href="'/dns/clusters/cluster?clusterId=' + clusterId">查看DNS解析记录 »</a></p>
 | 
					    {$template "menu"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	<form method="post" class="ui form" data-tea-action="$" data-tea-success="success">
 | 
						<form method="post" class="ui form" data-tea-action="$" data-tea-success="success">
 | 
				
			||||||
		<input type="hidden" name="clusterId" :value="clusterId"/>
 | 
							<input type="hidden" name="clusterId" :value="clusterId"/>
 | 
				
			||||||
		<csrf-token></csrf-token>
 | 
							<csrf-token></csrf-token>
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										203
									
								
								web/views/@default/clusters/cluster/settings/dns/records.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										203
									
								
								web/views/@default/clusters/cluster/settings/dns/records.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,203 @@
 | 
				
			|||||||
 | 
					{$layout}
 | 
				
			||||||
 | 
					{$template "../menu"}
 | 
				
			||||||
 | 
					{$template "/left_menu_with_menu"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="right-box with-menu">
 | 
				
			||||||
 | 
					    {$template "menu"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <!-- 基本信息 -->
 | 
				
			||||||
 | 
					    <table class="ui table definition selectable">
 | 
				
			||||||
 | 
					        <tr>
 | 
				
			||||||
 | 
					            <td class="title">DNS子域名</td>
 | 
				
			||||||
 | 
					            <td>
 | 
				
			||||||
 | 
					                <span v-if="dnsInfo.domainName.length > 0"><var>{{dnsInfo.dnsName}}</var>.{{dnsInfo.domainName}}</span>
 | 
				
			||||||
 | 
					                <span v-else class="disabled">没有设置</span>
 | 
				
			||||||
 | 
					            </td>
 | 
				
			||||||
 | 
					        </tr>
 | 
				
			||||||
 | 
					        <tr>
 | 
				
			||||||
 | 
					            <td>DNS服务商</td>
 | 
				
			||||||
 | 
					            <td>
 | 
				
			||||||
 | 
					                <div v-if="dnsInfo.providerName.length > 0">
 | 
				
			||||||
 | 
					                    <link-icon :href="'/dns/providers/provider?providerId=' + dnsInfo.providerId">{{dnsInfo.providerTypeName}} - {{dnsInfo.providerName}}</link-icon>
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					                <span v-else-if="dnsInfo.domainName.length == 0" class="disabled">请先设置域名</span>
 | 
				
			||||||
 | 
					                <span v-else class="disabled">没有设置</span>
 | 
				
			||||||
 | 
					            </td>
 | 
				
			||||||
 | 
					        </tr>
 | 
				
			||||||
 | 
					        <tr>
 | 
				
			||||||
 | 
					            <td>自动设置CNAME记录</td>
 | 
				
			||||||
 | 
					            <td>
 | 
				
			||||||
 | 
					                <span v-if="dnsInfo.cnameRecords.length == 0" class="disabled">暂时还没有设置。</span>
 | 
				
			||||||
 | 
					                <div v-else>
 | 
				
			||||||
 | 
					                    <span v-for="record in dnsInfo.cnameRecords" class="ui label basic small">{{record}}</span>
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					            </td>
 | 
				
			||||||
 | 
					        </tr>
 | 
				
			||||||
 | 
					        <tr v-if="dnsInfo.domainName.length > 0">
 | 
				
			||||||
 | 
					            <td>操作</td>
 | 
				
			||||||
 | 
					            <td>
 | 
				
			||||||
 | 
					                <div v-if="!isSyncing">
 | 
				
			||||||
 | 
					                    <link-red v-if="dnsHasChanges" @click.prevent="syncCluster(cluster.id)">检测到解析记录有变化,需要同步</link-red>
 | 
				
			||||||
 | 
					                    <a href="" @click.prevent="syncCluster(cluster.id)" v-else>DNS服务商同步</a>
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					                <span v-else>DNS服务商同步中...</span>
 | 
				
			||||||
 | 
					            </td>
 | 
				
			||||||
 | 
					        </tr>
 | 
				
			||||||
 | 
					    </table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <!-- 当前任务 -->
 | 
				
			||||||
 | 
					    <div v-if="tasks.length > 0">
 | 
				
			||||||
 | 
					        <h3>正在执行的任务</h3>
 | 
				
			||||||
 | 
					        <table class="ui table selectable celled">
 | 
				
			||||||
 | 
					            <thead>
 | 
				
			||||||
 | 
					            <tr>
 | 
				
			||||||
 | 
					                <th>对象</th>
 | 
				
			||||||
 | 
					                <th>任务</th>
 | 
				
			||||||
 | 
					                <th>状态</th>
 | 
				
			||||||
 | 
					                <th>触发时间</th>
 | 
				
			||||||
 | 
					                <th></th>
 | 
				
			||||||
 | 
					            </tr>
 | 
				
			||||||
 | 
					            </thead>
 | 
				
			||||||
 | 
					            <tr v-for="task in tasks">
 | 
				
			||||||
 | 
					                <td>
 | 
				
			||||||
 | 
					                <span v-if="(task.type == 'clusterChange' || task.type == 'clusterNodesChange') && task.cluster != null">{{task.cluster.name}}
 | 
				
			||||||
 | 
					                    <link-icon :href="'/dns/clusters/cluster?clusterId=' + task.cluster.id" target="_top"></link-icon>
 | 
				
			||||||
 | 
					                </span>
 | 
				
			||||||
 | 
					                    <span v-if="task.type == 'nodeChange'">{{task.node.name}}</span>
 | 
				
			||||||
 | 
					                    <span v-if="task.type == 'serverChange'">{{task.server.name}}</span>
 | 
				
			||||||
 | 
					                    <span v-if="task.type == 'domainChange'">{{task.domain.name}}</span>
 | 
				
			||||||
 | 
					                </td>
 | 
				
			||||||
 | 
					                <td>
 | 
				
			||||||
 | 
					                    <span v-if="task.type == 'clusterChange' || task.type == 'clusterNodesChange'">集群</span>
 | 
				
			||||||
 | 
					                    <span v-if="task.type == 'nodeChange'">节点</span>
 | 
				
			||||||
 | 
					                    <span v-if="task.type == 'serverChange'">网站</span>
 | 
				
			||||||
 | 
					                    <span v-if="task.type == 'domainChange'">域名</span>
 | 
				
			||||||
 | 
					                </td>
 | 
				
			||||||
 | 
					                <td style="word-break: break-word; width: 26em">
 | 
				
			||||||
 | 
					                    <span v-if="task.isDone" class="red">{{task.error}}</span>
 | 
				
			||||||
 | 
					                    <span v-else>正在同步...</span>
 | 
				
			||||||
 | 
					                </td>
 | 
				
			||||||
 | 
					                <td>{{task.updatedTime}}</td>
 | 
				
			||||||
 | 
					                <td>
 | 
				
			||||||
 | 
					                    <a href="" title="删除" class="remove-btn" @click.prevent="deleteTask(task.id)"><i class="icon remove small grey"></i></a>
 | 
				
			||||||
 | 
					                </td>
 | 
				
			||||||
 | 
					            </tr>
 | 
				
			||||||
 | 
					        </table>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <!-- 问题合集 -->
 | 
				
			||||||
 | 
					    <div v-if="issues.length > 0">
 | 
				
			||||||
 | 
					        <h3>需要修复的问题</h3>
 | 
				
			||||||
 | 
					        <table class="ui table selectable celled" v-if="issues.length > 0">
 | 
				
			||||||
 | 
					            <thead>
 | 
				
			||||||
 | 
					            <tr>
 | 
				
			||||||
 | 
					                <th style="width: 50%">问题对象</th>
 | 
				
			||||||
 | 
					                <th>问题描述</th>
 | 
				
			||||||
 | 
					                <th class="two op">操作</th>
 | 
				
			||||||
 | 
					            </tr>
 | 
				
			||||||
 | 
					            </thead>
 | 
				
			||||||
 | 
					            <tr v-for="issue in issues">
 | 
				
			||||||
 | 
					                <td>
 | 
				
			||||||
 | 
					                    <div v-if="issue.type == 'cluster'">
 | 
				
			||||||
 | 
					                        集群 "{{issue.target}}" <link-icon :href="'/clusters/cluster?clusterId=' + issue.targetId"></link-icon>
 | 
				
			||||||
 | 
					                    </div>
 | 
				
			||||||
 | 
					                    <div v-if="issue.type == 'node'">
 | 
				
			||||||
 | 
					                        集群 "{{issue.params.clusterName}}" 节点 "{{issue.target}}" <link-icon :href="'/clusters/cluster/node?clusterId=' + issue.params.clusterId + '&nodeId=' + issue.targetId"></link-icon>
 | 
				
			||||||
 | 
					                    </div>
 | 
				
			||||||
 | 
					                </td>
 | 
				
			||||||
 | 
					                <td>
 | 
				
			||||||
 | 
					                    <span>{{issue.description}}</span>
 | 
				
			||||||
 | 
					                </td>
 | 
				
			||||||
 | 
					                <td>
 | 
				
			||||||
 | 
					                    <div v-if="issue.type == 'cluster'">
 | 
				
			||||||
 | 
					                        <link-red @click.prevent="updateCluster(issue.targetId)">修复</link-red>
 | 
				
			||||||
 | 
					                    </div>
 | 
				
			||||||
 | 
					                    <div v-if="issue.type == 'node'">
 | 
				
			||||||
 | 
					                        <link-red @click.prevent="updateNode(issue.params.clusterId, issue.targetId)">修复</link-red>
 | 
				
			||||||
 | 
					                    </div>
 | 
				
			||||||
 | 
					                </td>
 | 
				
			||||||
 | 
					            </tr>
 | 
				
			||||||
 | 
					        </table>
 | 
				
			||||||
 | 
					        <div class="margin"></div>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <p class="comment">下面的DNS解析记录也可以手工在DNS服务商提供的管理平台添加。</p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <!-- 节点DNS解析记录 -->
 | 
				
			||||||
 | 
					    <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>
 | 
				
			||||||
 | 
					        <tr>
 | 
				
			||||||
 | 
					            <th>节点</th>
 | 
				
			||||||
 | 
					            <th>子域名</th>
 | 
				
			||||||
 | 
					            <th>记录类型</th>
 | 
				
			||||||
 | 
					            <th>记录值</th>
 | 
				
			||||||
 | 
					            <th>线路</th>
 | 
				
			||||||
 | 
					            <th>状态</th>
 | 
				
			||||||
 | 
					            <th class="two op">操作</th>
 | 
				
			||||||
 | 
					        </tr>
 | 
				
			||||||
 | 
					        </thead>
 | 
				
			||||||
 | 
					        <tr v-for="node in nodes">
 | 
				
			||||||
 | 
					            <td><link-icon :href="'/clusters/cluster/node?clusterId=' + node.clusterId + '&nodeId=' + node.id">{{node.name}}</link-icon></td>
 | 
				
			||||||
 | 
					            <td>
 | 
				
			||||||
 | 
					                <span v-if="dnsInfo.dnsName.length > 0">{{dnsInfo.dnsName}}</span>
 | 
				
			||||||
 | 
					                <link-red v-else @click.prevent="updateCluster(cluster.id)">没有设置</link-red>
 | 
				
			||||||
 | 
					            </td>
 | 
				
			||||||
 | 
					            <td>
 | 
				
			||||||
 | 
					                <span v-if="node.ipAddr.indexOf(':') > -1">AAAA</span>
 | 
				
			||||||
 | 
					                <span v-else>A</span>
 | 
				
			||||||
 | 
					            </td>
 | 
				
			||||||
 | 
					            <td>
 | 
				
			||||||
 | 
					                <span v-if="node.ipAddr.length > 0">{{node.ipAddr}}</span>
 | 
				
			||||||
 | 
					                <link-red title="点击设置" v-else @click.prevent="updateNode(node.clusterId, node.id, node.ipAddrId)">没有设置</link-red>
 | 
				
			||||||
 | 
					            </td>
 | 
				
			||||||
 | 
					            <td>
 | 
				
			||||||
 | 
					                <span v-if="node.route.code.length > 0">{{node.route.name}}</span>
 | 
				
			||||||
 | 
					                <link-red v-else title="点击设置" @click.prevent="updateNode(node.clusterId, node.id, node.ipAddrId)">没有设置</link-red>
 | 
				
			||||||
 | 
					            </td>
 | 
				
			||||||
 | 
					            <td>
 | 
				
			||||||
 | 
					                <span v-if="node.isBackup" class="red">备用节点</span>
 | 
				
			||||||
 | 
					                <span v-else-if="node.isOffline" class="red">已下线</span>
 | 
				
			||||||
 | 
					                <div v-else="">
 | 
				
			||||||
 | 
					                <span v-if="node.isInstalled">
 | 
				
			||||||
 | 
					                    <span class="green" v-if="node.isResolved">已解析</span>
 | 
				
			||||||
 | 
					                    <span v-else class="red">未解析</span>
 | 
				
			||||||
 | 
					                </span>
 | 
				
			||||||
 | 
					                    <link-red :href="'/clusters/cluster/node/install?clusterId=' + cluster.id + '&nodeId=' + node.id" v-if="!node.isInstalled" title="节点未安装"><span class="red">未安装</span></link-red>
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					            </td>
 | 
				
			||||||
 | 
					            <td>
 | 
				
			||||||
 | 
					                <link-popup @click.prevent="updateNode(node.clusterId, node.id, node.ipAddrId)">修改</link-popup>
 | 
				
			||||||
 | 
					            </td>
 | 
				
			||||||
 | 
					        </tr>
 | 
				
			||||||
 | 
					    </table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <!-- 网站解析记录 -->
 | 
				
			||||||
 | 
					    <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>
 | 
				
			||||||
 | 
					        <tr>
 | 
				
			||||||
 | 
					            <th>网站</th>
 | 
				
			||||||
 | 
					            <th>子域名</th>
 | 
				
			||||||
 | 
					            <th>记录类型</th>
 | 
				
			||||||
 | 
					            <th>记录值</th>
 | 
				
			||||||
 | 
					            <th>状态</th>
 | 
				
			||||||
 | 
					        </tr>
 | 
				
			||||||
 | 
					        </thead>
 | 
				
			||||||
 | 
					        <tr v-for="server in servers">
 | 
				
			||||||
 | 
					            <td><link-icon :href="'/servers/server?serverId=' + server.id">{{server.name}}</link-icon> </td>
 | 
				
			||||||
 | 
					            <td>{{server.dnsName}}</td>
 | 
				
			||||||
 | 
					            <td>CNAME</td>
 | 
				
			||||||
 | 
					            <td>
 | 
				
			||||||
 | 
					                <span v-if="dnsInfo.domainName.length > 0"><var>{{dnsInfo.dnsName}}</var>.{{dnsInfo.domainName}}.</span>
 | 
				
			||||||
 | 
					                <link-red title="点击设置"  v-else @click.prevent="updateCluster(cluster.id)">没有设置</link-red>
 | 
				
			||||||
 | 
					            </td>
 | 
				
			||||||
 | 
					            <td>
 | 
				
			||||||
 | 
					                <span class="green" v-if="server.isResolved">已解析</span>
 | 
				
			||||||
 | 
					                <span v-else class="red">未解析</span>
 | 
				
			||||||
 | 
					            </td>
 | 
				
			||||||
 | 
					        </tr>
 | 
				
			||||||
 | 
					    </table>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
							
								
								
									
										56
									
								
								web/views/@default/clusters/cluster/settings/dns/records.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								web/views/@default/clusters/cluster/settings/dns/records.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,56 @@
 | 
				
			|||||||
 | 
					Tea.context(function () {
 | 
				
			||||||
 | 
						this.updateCluster = function (clusterId) {
 | 
				
			||||||
 | 
							teaweb.popup("/dns/updateClusterPopup?clusterId=" + clusterId, {
 | 
				
			||||||
 | 
								height: "25em",
 | 
				
			||||||
 | 
								callback: function () {
 | 
				
			||||||
 | 
									teaweb.success("保存成功", function () {
 | 
				
			||||||
 | 
										teaweb.reload()
 | 
				
			||||||
 | 
									})
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this.updateNode = function (clusterId, nodeId, ipAddrId) {
 | 
				
			||||||
 | 
							teaweb.popup("/dns/issues/updateNodePopup?clusterId=" + clusterId + "&nodeId=" + nodeId + "&ipAddrId=" + (ipAddrId ? ipAddrId : 0), {
 | 
				
			||||||
 | 
								width: "46em",
 | 
				
			||||||
 | 
								height: "26em",
 | 
				
			||||||
 | 
								callback: function () {
 | 
				
			||||||
 | 
									teaweb.success("保存成功", function () {
 | 
				
			||||||
 | 
										teaweb.reload()
 | 
				
			||||||
 | 
									})
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this.isSyncing = false
 | 
				
			||||||
 | 
						this.syncCluster = function (clusterId) {
 | 
				
			||||||
 | 
							let that = this
 | 
				
			||||||
 | 
							teaweb.confirm("确定要执行数据同步吗?", function () {
 | 
				
			||||||
 | 
								that.isSyncing = true
 | 
				
			||||||
 | 
								that.$post("/dns/clusters/sync")
 | 
				
			||||||
 | 
									.params({clusterId: clusterId})
 | 
				
			||||||
 | 
									.done(function () {
 | 
				
			||||||
 | 
										that.isSyncing = false
 | 
				
			||||||
 | 
										that.dnsHasChanges = false
 | 
				
			||||||
 | 
									})
 | 
				
			||||||
 | 
									.success(function () {
 | 
				
			||||||
 | 
										teaweb.success("同步成功", function () {
 | 
				
			||||||
 | 
											teaweb.reload()
 | 
				
			||||||
 | 
										})
 | 
				
			||||||
 | 
									})
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this.deleteTask = function (taskId) {
 | 
				
			||||||
 | 
							let that = this
 | 
				
			||||||
 | 
							teaweb.confirm("确定要删除这个任务吗?", function () {
 | 
				
			||||||
 | 
								that.$post("/dns/tasks/delete")
 | 
				
			||||||
 | 
									.params({
 | 
				
			||||||
 | 
										taskId: taskId
 | 
				
			||||||
 | 
									})
 | 
				
			||||||
 | 
									.success(function () {
 | 
				
			||||||
 | 
										teaweb.reload()
 | 
				
			||||||
 | 
									})
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
@@ -13,7 +13,7 @@
 | 
				
			|||||||
		<td><link-icon :href="'/clusters/cluster?clusterId=' + cluster.id">{{cluster.name}}</link-icon></td>
 | 
							<td><link-icon :href="'/clusters/cluster?clusterId=' + cluster.id">{{cluster.name}}</link-icon></td>
 | 
				
			||||||
	</tr>
 | 
						</tr>
 | 
				
			||||||
	<tr>
 | 
						<tr>
 | 
				
			||||||
		<td>子域名</td>
 | 
							<td>DNS子域名</td>
 | 
				
			||||||
		<td>
 | 
							<td>
 | 
				
			||||||
			<span v-if="dnsInfo.domainName.length > 0"><var>{{dnsInfo.dnsName}}</var>.{{dnsInfo.domainName}}</span>
 | 
								<span v-if="dnsInfo.domainName.length > 0"><var>{{dnsInfo.dnsName}}</var>.{{dnsInfo.domainName}}</span>
 | 
				
			||||||
			<span v-else class="disabled">没有设置</span>
 | 
								<span v-else class="disabled">没有设置</span>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user