From f3dd470d45cdea5edabf3e423769e856f5acba25 Mon Sep 17 00:00:00 2001 From: GoEdgeLab Date: Mon, 7 Jun 2021 10:02:07 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BE=B9=E7=BC=98=E8=8A=82=E7=82=B9IP=E6=94=AF?= =?UTF-8?q?=E6=8C=81IPV6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/dnsclients/dnstypes/record.go | 1 + internal/rpc/services/service_dns.go | 27 ++++++++++++----- internal/rpc/services/service_dns_domain.go | 33 ++++++++++++--------- internal/tasks/dns_task_executor.go | 11 +++++-- internal/utils/ip.go | 7 ++++- 5 files changed, 53 insertions(+), 26 deletions(-) diff --git a/internal/dnsclients/dnstypes/record.go b/internal/dnsclients/dnstypes/record.go index b9a517a4..e2fd4dc0 100644 --- a/internal/dnsclients/dnstypes/record.go +++ b/internal/dnsclients/dnstypes/record.go @@ -4,6 +4,7 @@ type RecordType = string const ( RecordTypeA RecordType = "A" + RecordTypeAAAA RecordType = "AAAA" RecordTypeCNAME RecordType = "CNAME" RecordTypeTXT RecordType = "TXT" ) diff --git a/internal/rpc/services/service_dns.go b/internal/rpc/services/service_dns.go index 76b654ed..c6b7b977 100644 --- a/internal/rpc/services/service_dns.go +++ b/internal/rpc/services/service_dns.go @@ -7,12 +7,12 @@ import ( "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" ) -// DNS相关服务 +// DNSService DNS相关服务 type DNSService struct { BaseService } -// 查找问题 +// FindAllDNSIssues 查找问题 func (this *DNSService) FindAllDNSIssues(ctx context.Context, req *pb.FindAllDNSIssuesRequest) (*pb.FindAllDNSIssuesResponse, error) { // 校验请求 _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) @@ -20,13 +20,24 @@ func (this *DNSService) FindAllDNSIssues(ctx context.Context, req *pb.FindAllDNS return nil, err } - result := []*pb.DNSIssue{} + var result = []*pb.DNSIssue{} + var tx = this.NullTx() + var clusters []*models.NodeCluster - tx := this.NullTx() - - clusters, err := models.SharedNodeClusterDAO.FindAllEnabledClustersHaveDNSDomain(tx) - if err != nil { - return nil, err + if req.NodeClusterId <= 0 { + clusters, err = models.SharedNodeClusterDAO.FindAllEnabledClustersHaveDNSDomain(tx) + if err != nil { + return nil, err + } + } else { + cluster, err := models.SharedNodeClusterDAO.FindEnabledNodeCluster(tx, req.NodeClusterId) + if err != nil { + return nil, err + } + if cluster == nil { + return &pb.FindAllDNSIssuesResponse{Issues: nil}, nil + } + clusters = []*models.NodeCluster{cluster} } for _, cluster := range clusters { issues, err := models.SharedNodeClusterDAO.CheckClusterDNS(tx, cluster) diff --git a/internal/rpc/services/service_dns_domain.go b/internal/rpc/services/service_dns_domain.go index 3d668b40..e7d98140 100644 --- a/internal/rpc/services/service_dns_domain.go +++ b/internal/rpc/services/service_dns_domain.go @@ -9,6 +9,7 @@ import ( "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" "github.com/TeaOSLab/EdgeAPI/internal/errors" rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils" + "github.com/TeaOSLab/EdgeAPI/internal/utils" "github.com/TeaOSLab/EdgeAPI/internal/utils/numberutils" "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" @@ -17,12 +18,12 @@ import ( "net" ) -// DNS域名相关服务 +// DNSDomainService DNS域名相关服务 type DNSDomainService struct { BaseService } -// 创建域名 +// CreateDNSDomain 创建域名 func (this *DNSDomainService) CreateDNSDomain(ctx context.Context, req *pb.CreateDNSDomainRequest) (*pb.CreateDNSDomainResponse, error) { // 校验请求 adminId, userId, err := this.ValidateAdminAndUser(ctx, 0, 0) @@ -93,7 +94,7 @@ func (this *DNSDomainService) CreateDNSDomain(ctx context.Context, req *pb.Creat return &pb.CreateDNSDomainResponse{DnsDomainId: domainId}, nil } -// 修改域名 +// UpdateDNSDomain 修改域名 func (this *DNSDomainService) UpdateDNSDomain(ctx context.Context, req *pb.UpdateDNSDomainRequest) (*pb.RPCSuccess, error) { // 校验请求 _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) @@ -110,7 +111,7 @@ func (this *DNSDomainService) UpdateDNSDomain(ctx context.Context, req *pb.Updat return this.Success() } -// 删除域名 +// DeleteDNSDomain 删除域名 func (this *DNSDomainService) DeleteDNSDomain(ctx context.Context, req *pb.DeleteDNSDomainRequest) (*pb.RPCSuccess, error) { // 校验请求 _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) @@ -127,7 +128,7 @@ func (this *DNSDomainService) DeleteDNSDomain(ctx context.Context, req *pb.Delet return this.Success() } -// 查询单个域名完整信息 +// FindEnabledDNSDomain 查询单个域名完整信息 func (this *DNSDomainService) FindEnabledDNSDomain(ctx context.Context, req *pb.FindEnabledDNSDomainRequest) (*pb.FindEnabledDNSDomainResponse, error) { // 校验请求 _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) @@ -149,7 +150,7 @@ func (this *DNSDomainService) FindEnabledDNSDomain(ctx context.Context, req *pb. return &pb.FindEnabledDNSDomainResponse{DnsDomain: pbDomain}, nil } -// 查询单个域名基础信息 +// FindEnabledBasicDNSDomain 查询单个域名基础信息 func (this *DNSDomainService) FindEnabledBasicDNSDomain(ctx context.Context, req *pb.FindEnabledBasicDNSDomainRequest) (*pb.FindEnabledBasicDNSDomainResponse, error) { // 校验请求 _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) @@ -175,7 +176,7 @@ func (this *DNSDomainService) FindEnabledBasicDNSDomain(ctx context.Context, req }}, nil } -// 计算服务商下的域名数量 +// CountAllEnabledDNSDomainsWithDNSProviderId 计算服务商下的域名数量 func (this *DNSDomainService) CountAllEnabledDNSDomainsWithDNSProviderId(ctx context.Context, req *pb.CountAllEnabledDNSDomainsWithDNSProviderIdRequest) (*pb.RPCCountResponse, error) { // 校验请求 _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) @@ -192,7 +193,7 @@ func (this *DNSDomainService) CountAllEnabledDNSDomainsWithDNSProviderId(ctx con return this.SuccessCount(count) } -// 列出服务商下的所有域名 +// FindAllEnabledDNSDomainsWithDNSProviderId 列出服务商下的所有域名 func (this *DNSDomainService) FindAllEnabledDNSDomainsWithDNSProviderId(ctx context.Context, req *pb.FindAllEnabledDNSDomainsWithDNSProviderIdRequest) (*pb.FindAllEnabledDNSDomainsWithDNSProviderIdResponse, error) { // 校验请求 _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) @@ -219,7 +220,7 @@ func (this *DNSDomainService) FindAllEnabledDNSDomainsWithDNSProviderId(ctx cont return &pb.FindAllEnabledDNSDomainsWithDNSProviderIdResponse{DnsDomains: result}, nil } -// 列出服务商下的所有域名基本信息 +// FindAllEnabledBasicDNSDomainsWithDNSProviderId 列出服务商下的所有域名基本信息 func (this *DNSDomainService) FindAllEnabledBasicDNSDomainsWithDNSProviderId(ctx context.Context, req *pb.FindAllEnabledBasicDNSDomainsWithDNSProviderIdRequest) (*pb.FindAllEnabledBasicDNSDomainsWithDNSProviderIdResponse, error) { // 校验请求 _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) @@ -246,7 +247,7 @@ func (this *DNSDomainService) FindAllEnabledBasicDNSDomainsWithDNSProviderId(ctx return &pb.FindAllEnabledBasicDNSDomainsWithDNSProviderIdResponse{DnsDomains: result}, nil } -// 同步域名数据 +// SyncDNSDomainData 同步域名数据 func (this *DNSDomainService) SyncDNSDomainData(ctx context.Context, req *pb.SyncDNSDomainDataRequest) (*pb.SyncDNSDomainDataResponse, error) { // 校验请求 _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) @@ -256,7 +257,7 @@ func (this *DNSDomainService) SyncDNSDomainData(ctx context.Context, req *pb.Syn return this.syncClusterDNS(req) } -// 查看支持的线路 +// FindAllDNSDomainRoutes 查看支持的线路 func (this *DNSDomainService) FindAllDNSDomainRoutes(ctx context.Context, req *pb.FindAllDNSDomainRoutesRequest) (*pb.FindAllDNSDomainRoutesResponse, error) { // 校验请求 _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) @@ -282,7 +283,7 @@ func (this *DNSDomainService) FindAllDNSDomainRoutes(ctx context.Context, req *p return &pb.FindAllDNSDomainRoutesResponse{Routes: pbRoutes}, nil } -// 判断是否有域名可选 +// ExistAvailableDomains 判断是否有域名可选 func (this *DNSDomainService) ExistAvailableDomains(ctx context.Context, req *pb.ExistAvailableDomainsRequest) (*pb.ExistAvailableDomainsResponse, error) { // 校验请求 _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) @@ -404,7 +405,7 @@ func (this *DNSDomainService) findClusterDNSChanges(cluster *models.NodeCluster, nodeRecords := []*dnstypes.Record{} // 之所以用数组再存一遍,是因为dnsName可能会重复 nodeRecordMapping := map[string]*dnstypes.Record{} // value_route => *Record for _, record := range records { - if record.Type == dnstypes.RecordTypeA && record.Name == clusterDnsName { + if (record.Type == dnstypes.RecordTypeA || record.Type == dnstypes.RecordTypeAAAA) && record.Name == clusterDnsName { nodeRecords = append(nodeRecords, record) nodeRecordMapping[record.Value+"_"+record.Route] = record } @@ -440,12 +441,16 @@ func (this *DNSDomainService) findClusterDNSChanges(cluster *models.NodeCluster, nodeKeys = append(nodeKeys, key) record, ok := nodeRecordMapping[key] if !ok { + recordType := dnstypes.RecordTypeA + if utils.IsIPv6(ip) { + recordType = dnstypes.RecordTypeAAAA + } result = append(result, maps.Map{ "action": "create", "record": &dnstypes.Record{ Id: "", Name: clusterDnsName, - Type: dnstypes.RecordTypeA, + Type: recordType, Value: ip, Route: route, }, diff --git a/internal/tasks/dns_task_executor.go b/internal/tasks/dns_task_executor.go index 9167b636..3f44d761 100644 --- a/internal/tasks/dns_task_executor.go +++ b/internal/tasks/dns_task_executor.go @@ -7,6 +7,7 @@ import ( "github.com/TeaOSLab/EdgeAPI/internal/dnsclients" "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" "github.com/TeaOSLab/EdgeAPI/internal/remotelogs" + "github.com/TeaOSLab/EdgeAPI/internal/utils" "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" "github.com/iwind/TeaGo/dbs" "github.com/iwind/TeaGo/lists" @@ -278,7 +279,7 @@ func (this *DNSTaskExecutor) doCluster(taskId int64, clusterId int64) error { } oldRecordsMap := map[string]*dnstypes.Record{} // route@value => record for _, record := range records { - if record.Type == dnstypes.RecordTypeA && record.Name == clusterDNSName { + if (record.Type == dnstypes.RecordTypeA || record.Type == dnstypes.RecordTypeAAAA) && record.Name == clusterDNSName { key := record.Route + "@" + record.Value oldRecordsMap[key] = record } @@ -310,7 +311,7 @@ func (this *DNSTaskExecutor) doCluster(taskId int64, clusterId int64) error { } for _, ipAddress := range ipAddresses { ip := ipAddress.Ip - if len(ip) == 0 { + if len(ip) == 0 || ipAddress.CanAccess == 0 { continue } if net.ParseIP(ip) == nil { @@ -324,10 +325,14 @@ func (this *DNSTaskExecutor) doCluster(taskId int64, clusterId int64) error { continue } + recordType := dnstypes.RecordTypeA + if utils.IsIPv6(ip) { + recordType = dnstypes.RecordTypeAAAA + } err = manager.AddRecord(domain, &dnstypes.Record{ Id: "", Name: clusterDNSName, - Type: dnstypes.RecordTypeA, + Type: recordType, Value: ip, Route: route, }) diff --git a/internal/utils/ip.go b/internal/utils/ip.go index 99a36746..b4fa31db 100644 --- a/internal/utils/ip.go +++ b/internal/utils/ip.go @@ -8,7 +8,7 @@ import ( "strings" ) -// 将IP转换为整型 +// IP2Long 将IP转换为整型 // 注意IPv6没有顺序 func IP2Long(ip string) uint64 { if len(ip) == 0 { @@ -24,3 +24,8 @@ func IP2Long(ip string) uint64 { } return uint64(binary.BigEndian.Uint32(s.To4())) } + +// IsIPv6 判断是否为IPv6 +func IsIPv6(ip string) bool { + return strings.Contains(ip, ":") +}