mirror of
				https://github.com/TeaOSLab/EdgeAPI.git
				synced 2025-11-04 16:00:24 +08:00 
			
		
		
		
	可以修改节点的DNS设置
This commit is contained in:
		@@ -598,6 +598,52 @@ func (this *NodeDAO) CountAllEnabledNodesWithGroupId(groupId int64) (int64, erro
 | 
				
			|||||||
		Count()
 | 
							Count()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 获取一个集群的节点DNS信息
 | 
				
			||||||
 | 
					func (this *NodeDAO) FindAllEnabledNodesDNSWithClusterId(clusterId int64) (result []*Node, err error) {
 | 
				
			||||||
 | 
						_, err = this.Query().
 | 
				
			||||||
 | 
							State(NodeStateEnabled).
 | 
				
			||||||
 | 
							Attr("clusterId", clusterId).
 | 
				
			||||||
 | 
							Attr("isOn", true).
 | 
				
			||||||
 | 
							Result("id", "name", "dnsRoutes").
 | 
				
			||||||
 | 
							DescPk().
 | 
				
			||||||
 | 
							Slice(&result).
 | 
				
			||||||
 | 
							FindAll()
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 获取单个节点的DNS信息
 | 
				
			||||||
 | 
					func (this *NodeDAO) FindEnabledNodeDNS(nodeId int64) (*Node, error) {
 | 
				
			||||||
 | 
						one, err := this.Query().
 | 
				
			||||||
 | 
							State(NodeStateEnabled).
 | 
				
			||||||
 | 
							Pk(nodeId).
 | 
				
			||||||
 | 
							Attr("isOn", true).
 | 
				
			||||||
 | 
							Result("id", "name", "dnsRoutes", "clusterId").
 | 
				
			||||||
 | 
							Find()
 | 
				
			||||||
 | 
						if err != nil || one == nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return one.(*Node), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改节点的DNS信息
 | 
				
			||||||
 | 
					func (this *NodeDAO) UpdateNodeDNS(nodeId int64, routes map[int64]string) error {
 | 
				
			||||||
 | 
						if nodeId <= 0 {
 | 
				
			||||||
 | 
							return errors.New("invalid nodeId")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if routes == nil {
 | 
				
			||||||
 | 
							routes = map[int64]string{}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						routesJSON, err := json.Marshal(routes)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						op := NewNodeOperator()
 | 
				
			||||||
 | 
						op.Id = nodeId
 | 
				
			||||||
 | 
						op.DnsRoutes = routesJSON
 | 
				
			||||||
 | 
						_, err = this.Save(op)
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 生成唯一ID
 | 
					// 生成唯一ID
 | 
				
			||||||
func (this *NodeDAO) genUniqueId() (string, error) {
 | 
					func (this *NodeDAO) genUniqueId() (string, error) {
 | 
				
			||||||
	for {
 | 
						for {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -115,6 +115,18 @@ func (this *NodeIPAddressDAO) UpdateAddress(addressId int64, name string, ip str
 | 
				
			|||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改IP地址中的IP
 | 
				
			||||||
 | 
					func (this *NodeIPAddressDAO) UpdateAddressIP(addressId int64, ip string) error {
 | 
				
			||||||
 | 
						if addressId <= 0 {
 | 
				
			||||||
 | 
							return errors.New("invalid addressId")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						op := NewNodeIPAddressOperator()
 | 
				
			||||||
 | 
						op.Id = addressId
 | 
				
			||||||
 | 
						op.Ip = ip
 | 
				
			||||||
 | 
						_, err := this.Save(op)
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 修改IP地址所属节点
 | 
					// 修改IP地址所属节点
 | 
				
			||||||
func (this *NodeIPAddressDAO) UpdateAddressNodeId(addressId int64, nodeId int64) error {
 | 
					func (this *NodeIPAddressDAO) UpdateAddressNodeId(addressId int64, nodeId int64) error {
 | 
				
			||||||
	_, err := this.Query().
 | 
						_, err := this.Query().
 | 
				
			||||||
@@ -148,3 +160,15 @@ func (this *NodeIPAddressDAO) FindFirstNodeIPAddress(nodeId int64) (string, erro
 | 
				
			|||||||
		Result("ip").
 | 
							Result("ip").
 | 
				
			||||||
		FindStringCol("")
 | 
							FindStringCol("")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 查找节点的第一个可访问的IP地址ID
 | 
				
			||||||
 | 
					func (this *NodeIPAddressDAO) FindFirstNodeIPAddressId(nodeId int64) (int64, error) {
 | 
				
			||||||
 | 
						return this.Query().
 | 
				
			||||||
 | 
							Attr("nodeId", nodeId).
 | 
				
			||||||
 | 
							State(NodeIPAddressStateEnabled).
 | 
				
			||||||
 | 
							Attr("canAccess", true).
 | 
				
			||||||
 | 
							Desc("order").
 | 
				
			||||||
 | 
							AscPk().
 | 
				
			||||||
 | 
							Result("id").
 | 
				
			||||||
 | 
							FindInt64Col(0)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -40,6 +40,19 @@ func (this *Node) DecodeStatus() (*nodeconfigs.NodeStatus, error) {
 | 
				
			|||||||
	return status, nil
 | 
						return status, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 所有的DNS线路
 | 
				
			||||||
 | 
					func (this *Node) DNSRoutes() (map[int64]string, error) {
 | 
				
			||||||
 | 
						routes := map[int64]string{} // domainId => route
 | 
				
			||||||
 | 
						if len(this.DnsRoutes) == 0 || this.DnsRoutes == "null" {
 | 
				
			||||||
 | 
							return routes, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						err := json.Unmarshal([]byte(this.DnsRoutes), &routes)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return map[int64]string{}, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return routes, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DNS线路
 | 
					// DNS线路
 | 
				
			||||||
func (this *Node) DNSRoute(dnsDomainId int64) (string, error) {
 | 
					func (this *Node) DNSRoute(dnsDomainId int64) (string, error) {
 | 
				
			||||||
	routes := map[int64]string{} // domainId => route
 | 
						routes := map[int64]string{} // domainId => route
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,6 +7,7 @@ import (
 | 
				
			|||||||
	"github.com/TeaOSLab/EdgeAPI/internal/errors"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/errors"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/installers"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/installers"
 | 
				
			||||||
	rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
 | 
						rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/utils/numberutils"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
				
			||||||
	"github.com/iwind/TeaGo/logs"
 | 
						"github.com/iwind/TeaGo/logs"
 | 
				
			||||||
@@ -837,3 +838,151 @@ func (this *NodeService) CountAllEnabledNodesWithGroupId(ctx context.Context, re
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	return &pb.RPCCountResponse{Count: count}, nil
 | 
						return &pb.RPCCountResponse{Count: count}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 取得某个集群下的所有节点
 | 
				
			||||||
 | 
					func (this *NodeService) FindAllEnabledNodesDNSWithClusterId(ctx context.Context, req *pb.FindAllEnabledNodesDNSWithClusterIdRequest) (*pb.FindAllEnabledNodesDNSWithClusterIdResponse, error) {
 | 
				
			||||||
 | 
						// 校验请求
 | 
				
			||||||
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						clusterDNS, err := models.SharedNodeClusterDAO.FindClusterDNSInfo(req.NodeClusterId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if clusterDNS == nil {
 | 
				
			||||||
 | 
							return nil, errors.New("not found clusterId '" + numberutils.FormatInt64(req.NodeClusterId) + "'")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						dnsDomainId := int64(clusterDNS.DnsDomainId)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						nodes, err := models.SharedNodeDAO.FindAllEnabledNodesDNSWithClusterId(req.NodeClusterId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						result := []*pb.NodeDNSInfo{}
 | 
				
			||||||
 | 
						for _, node := range nodes {
 | 
				
			||||||
 | 
							ipAddr, err := models.SharedNodeIPAddressDAO.FindFirstNodeIPAddress(int64(node.Id))
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							route, err := node.DNSRoute(dnsDomainId)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							result = append(result, &pb.NodeDNSInfo{
 | 
				
			||||||
 | 
								Id:     int64(node.Id),
 | 
				
			||||||
 | 
								Name:   node.Name,
 | 
				
			||||||
 | 
								IpAddr: ipAddr,
 | 
				
			||||||
 | 
								Route:  route,
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return &pb.FindAllEnabledNodesDNSWithClusterIdResponse{Nodes: result}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 查找单个节点的域名解析信息
 | 
				
			||||||
 | 
					func (this *NodeService) FindEnabledNodeDNS(ctx context.Context, req *pb.FindEnabledNodeDNSRequest) (*pb.FindEnabledNodeDNSResponse, error) {
 | 
				
			||||||
 | 
						// 校验请求
 | 
				
			||||||
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						node, err := models.SharedNodeDAO.FindEnabledNodeDNS(req.NodeId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if node == nil {
 | 
				
			||||||
 | 
							return &pb.FindEnabledNodeDNSResponse{Node: nil}, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						clusterId := int64(node.ClusterId)
 | 
				
			||||||
 | 
						clusterDNS, err := models.SharedNodeClusterDAO.FindClusterDNSInfo(clusterId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if clusterDNS == nil {
 | 
				
			||||||
 | 
							return &pb.FindEnabledNodeDNSResponse{Node: nil}, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dnsDomainId := int64(clusterDNS.DnsDomainId)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var route = ""
 | 
				
			||||||
 | 
						if dnsDomainId > 0 {
 | 
				
			||||||
 | 
							route, err = node.DNSRoute(dnsDomainId)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ipAddr, err := models.SharedNodeIPAddressDAO.FindFirstNodeIPAddress(int64(node.Id))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &pb.FindEnabledNodeDNSResponse{
 | 
				
			||||||
 | 
							Node: &pb.NodeDNSInfo{
 | 
				
			||||||
 | 
								Id:          int64(node.Id),
 | 
				
			||||||
 | 
								Name:        node.Name,
 | 
				
			||||||
 | 
								IpAddr:      ipAddr,
 | 
				
			||||||
 | 
								Route:       route,
 | 
				
			||||||
 | 
								ClusterId:   clusterId,
 | 
				
			||||||
 | 
								DnsDomainId: dnsDomainId,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 修改节点的DNS解析信息
 | 
				
			||||||
 | 
					func (this *NodeService) UpdateNodeDNS(ctx context.Context, req *pb.UpdateNodeDNSRequest) (*pb.RPCSuccess, error) {
 | 
				
			||||||
 | 
						// 校验请求
 | 
				
			||||||
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						node, err := models.SharedNodeDAO.FindEnabledNodeDNS(req.NodeId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if node == nil {
 | 
				
			||||||
 | 
							return nil, errors.New("node not found")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						routes, err := node.DNSRoutes()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if req.DnsDomainId > 0 && len(req.Route) > 0 {
 | 
				
			||||||
 | 
							routes[req.DnsDomainId] = req.Route
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = models.SharedNodeDAO.UpdateNodeDNS(req.NodeId, routes)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 修改IP
 | 
				
			||||||
 | 
						if len(req.IpAddr) > 0 {
 | 
				
			||||||
 | 
							ipAddrId, err := models.SharedNodeIPAddressDAO.FindFirstNodeIPAddressId(req.NodeId)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if ipAddrId > 0 {
 | 
				
			||||||
 | 
								err = models.SharedNodeIPAddressDAO.UpdateAddressIP(ipAddrId, req.IpAddr)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return nil, err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								_, err = models.SharedNodeIPAddressDAO.CreateAddress(req.NodeId, "DNS IP", req.IpAddr, true)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return nil, err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return rpcutils.Success()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -407,6 +407,7 @@ func (this *NodeClusterService) FindEnabledNodeClusterDNS(ctx context.Context, r
 | 
				
			|||||||
	if provider != nil {
 | 
						if provider != nil {
 | 
				
			||||||
		pbProvider = &pb.DNSProvider{
 | 
							pbProvider = &pb.DNSProvider{
 | 
				
			||||||
			Id:       int64(provider.Id),
 | 
								Id:       int64(provider.Id),
 | 
				
			||||||
 | 
								Name:     provider.Name,
 | 
				
			||||||
			Type:     provider.Type,
 | 
								Type:     provider.Type,
 | 
				
			||||||
			TypeName: dnsclients.FindProviderTypeName(provider.Type),
 | 
								TypeName: dnsclients.FindProviderTypeName(provider.Type),
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user