边缘节点IP支持IPV6

This commit is contained in:
GoEdgeLab
2021-06-07 10:02:07 +08:00
parent be58189af9
commit f3dd470d45
5 changed files with 53 additions and 26 deletions

View File

@@ -4,6 +4,7 @@ type RecordType = string
const ( const (
RecordTypeA RecordType = "A" RecordTypeA RecordType = "A"
RecordTypeAAAA RecordType = "AAAA"
RecordTypeCNAME RecordType = "CNAME" RecordTypeCNAME RecordType = "CNAME"
RecordTypeTXT RecordType = "TXT" RecordTypeTXT RecordType = "TXT"
) )

View File

@@ -7,12 +7,12 @@ import (
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
) )
// DNS相关服务 // DNSService DNS相关服务
type DNSService struct { type DNSService struct {
BaseService BaseService
} }
// 查找问题 // FindAllDNSIssues 查找问题
func (this *DNSService) FindAllDNSIssues(ctx context.Context, req *pb.FindAllDNSIssuesRequest) (*pb.FindAllDNSIssuesResponse, error) { func (this *DNSService) FindAllDNSIssues(ctx context.Context, req *pb.FindAllDNSIssuesRequest) (*pb.FindAllDNSIssuesResponse, error) {
// 校验请求 // 校验请求
_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
@@ -20,14 +20,25 @@ func (this *DNSService) FindAllDNSIssues(ctx context.Context, req *pb.FindAllDNS
return nil, err return nil, err
} }
result := []*pb.DNSIssue{} var result = []*pb.DNSIssue{}
var tx = this.NullTx()
var clusters []*models.NodeCluster
tx := this.NullTx() if req.NodeClusterId <= 0 {
clusters, err = models.SharedNodeClusterDAO.FindAllEnabledClustersHaveDNSDomain(tx)
clusters, err := models.SharedNodeClusterDAO.FindAllEnabledClustersHaveDNSDomain(tx)
if err != nil { if err != nil {
return nil, err 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 { for _, cluster := range clusters {
issues, err := models.SharedNodeClusterDAO.CheckClusterDNS(tx, cluster) issues, err := models.SharedNodeClusterDAO.CheckClusterDNS(tx, cluster)
if err != nil { if err != nil {

View File

@@ -9,6 +9,7 @@ import (
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
"github.com/TeaOSLab/EdgeAPI/internal/errors" "github.com/TeaOSLab/EdgeAPI/internal/errors"
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils" rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
"github.com/TeaOSLab/EdgeAPI/internal/utils"
"github.com/TeaOSLab/EdgeAPI/internal/utils/numberutils" "github.com/TeaOSLab/EdgeAPI/internal/utils/numberutils"
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
@@ -17,12 +18,12 @@ import (
"net" "net"
) )
// DNS域名相关服务 // DNSDomainService DNS域名相关服务
type DNSDomainService struct { type DNSDomainService struct {
BaseService BaseService
} }
// 创建域名 // CreateDNSDomain 创建域名
func (this *DNSDomainService) CreateDNSDomain(ctx context.Context, req *pb.CreateDNSDomainRequest) (*pb.CreateDNSDomainResponse, error) { func (this *DNSDomainService) CreateDNSDomain(ctx context.Context, req *pb.CreateDNSDomainRequest) (*pb.CreateDNSDomainResponse, error) {
// 校验请求 // 校验请求
adminId, userId, err := this.ValidateAdminAndUser(ctx, 0, 0) 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 return &pb.CreateDNSDomainResponse{DnsDomainId: domainId}, nil
} }
// 修改域名 // UpdateDNSDomain 修改域名
func (this *DNSDomainService) UpdateDNSDomain(ctx context.Context, req *pb.UpdateDNSDomainRequest) (*pb.RPCSuccess, error) { func (this *DNSDomainService) UpdateDNSDomain(ctx context.Context, req *pb.UpdateDNSDomainRequest) (*pb.RPCSuccess, error) {
// 校验请求 // 校验请求
_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
@@ -110,7 +111,7 @@ func (this *DNSDomainService) UpdateDNSDomain(ctx context.Context, req *pb.Updat
return this.Success() return this.Success()
} }
// 删除域名 // DeleteDNSDomain 删除域名
func (this *DNSDomainService) DeleteDNSDomain(ctx context.Context, req *pb.DeleteDNSDomainRequest) (*pb.RPCSuccess, error) { func (this *DNSDomainService) DeleteDNSDomain(ctx context.Context, req *pb.DeleteDNSDomainRequest) (*pb.RPCSuccess, error) {
// 校验请求 // 校验请求
_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
@@ -127,7 +128,7 @@ func (this *DNSDomainService) DeleteDNSDomain(ctx context.Context, req *pb.Delet
return this.Success() return this.Success()
} }
// 查询单个域名完整信息 // FindEnabledDNSDomain 查询单个域名完整信息
func (this *DNSDomainService) FindEnabledDNSDomain(ctx context.Context, req *pb.FindEnabledDNSDomainRequest) (*pb.FindEnabledDNSDomainResponse, error) { func (this *DNSDomainService) FindEnabledDNSDomain(ctx context.Context, req *pb.FindEnabledDNSDomainRequest) (*pb.FindEnabledDNSDomainResponse, error) {
// 校验请求 // 校验请求
_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) _, _, 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 return &pb.FindEnabledDNSDomainResponse{DnsDomain: pbDomain}, nil
} }
// 查询单个域名基础信息 // FindEnabledBasicDNSDomain 查询单个域名基础信息
func (this *DNSDomainService) FindEnabledBasicDNSDomain(ctx context.Context, req *pb.FindEnabledBasicDNSDomainRequest) (*pb.FindEnabledBasicDNSDomainResponse, error) { func (this *DNSDomainService) FindEnabledBasicDNSDomain(ctx context.Context, req *pb.FindEnabledBasicDNSDomainRequest) (*pb.FindEnabledBasicDNSDomainResponse, error) {
// 校验请求 // 校验请求
_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
@@ -175,7 +176,7 @@ func (this *DNSDomainService) FindEnabledBasicDNSDomain(ctx context.Context, req
}}, nil }}, nil
} }
// 计算服务商下的域名数量 // CountAllEnabledDNSDomainsWithDNSProviderId 计算服务商下的域名数量
func (this *DNSDomainService) CountAllEnabledDNSDomainsWithDNSProviderId(ctx context.Context, req *pb.CountAllEnabledDNSDomainsWithDNSProviderIdRequest) (*pb.RPCCountResponse, error) { func (this *DNSDomainService) CountAllEnabledDNSDomainsWithDNSProviderId(ctx context.Context, req *pb.CountAllEnabledDNSDomainsWithDNSProviderIdRequest) (*pb.RPCCountResponse, error) {
// 校验请求 // 校验请求
_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
@@ -192,7 +193,7 @@ func (this *DNSDomainService) CountAllEnabledDNSDomainsWithDNSProviderId(ctx con
return this.SuccessCount(count) return this.SuccessCount(count)
} }
// 列出服务商下的所有域名 // FindAllEnabledDNSDomainsWithDNSProviderId 列出服务商下的所有域名
func (this *DNSDomainService) FindAllEnabledDNSDomainsWithDNSProviderId(ctx context.Context, req *pb.FindAllEnabledDNSDomainsWithDNSProviderIdRequest) (*pb.FindAllEnabledDNSDomainsWithDNSProviderIdResponse, error) { func (this *DNSDomainService) FindAllEnabledDNSDomainsWithDNSProviderId(ctx context.Context, req *pb.FindAllEnabledDNSDomainsWithDNSProviderIdRequest) (*pb.FindAllEnabledDNSDomainsWithDNSProviderIdResponse, error) {
// 校验请求 // 校验请求
_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
@@ -219,7 +220,7 @@ func (this *DNSDomainService) FindAllEnabledDNSDomainsWithDNSProviderId(ctx cont
return &pb.FindAllEnabledDNSDomainsWithDNSProviderIdResponse{DnsDomains: result}, nil return &pb.FindAllEnabledDNSDomainsWithDNSProviderIdResponse{DnsDomains: result}, nil
} }
// 列出服务商下的所有域名基本信息 // FindAllEnabledBasicDNSDomainsWithDNSProviderId 列出服务商下的所有域名基本信息
func (this *DNSDomainService) FindAllEnabledBasicDNSDomainsWithDNSProviderId(ctx context.Context, req *pb.FindAllEnabledBasicDNSDomainsWithDNSProviderIdRequest) (*pb.FindAllEnabledBasicDNSDomainsWithDNSProviderIdResponse, error) { func (this *DNSDomainService) FindAllEnabledBasicDNSDomainsWithDNSProviderId(ctx context.Context, req *pb.FindAllEnabledBasicDNSDomainsWithDNSProviderIdRequest) (*pb.FindAllEnabledBasicDNSDomainsWithDNSProviderIdResponse, error) {
// 校验请求 // 校验请求
_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
@@ -246,7 +247,7 @@ func (this *DNSDomainService) FindAllEnabledBasicDNSDomainsWithDNSProviderId(ctx
return &pb.FindAllEnabledBasicDNSDomainsWithDNSProviderIdResponse{DnsDomains: result}, nil return &pb.FindAllEnabledBasicDNSDomainsWithDNSProviderIdResponse{DnsDomains: result}, nil
} }
// 同步域名数据 // SyncDNSDomainData 同步域名数据
func (this *DNSDomainService) SyncDNSDomainData(ctx context.Context, req *pb.SyncDNSDomainDataRequest) (*pb.SyncDNSDomainDataResponse, error) { func (this *DNSDomainService) SyncDNSDomainData(ctx context.Context, req *pb.SyncDNSDomainDataRequest) (*pb.SyncDNSDomainDataResponse, error) {
// 校验请求 // 校验请求
_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
@@ -256,7 +257,7 @@ func (this *DNSDomainService) SyncDNSDomainData(ctx context.Context, req *pb.Syn
return this.syncClusterDNS(req) return this.syncClusterDNS(req)
} }
// 查看支持的线路 // FindAllDNSDomainRoutes 查看支持的线路
func (this *DNSDomainService) FindAllDNSDomainRoutes(ctx context.Context, req *pb.FindAllDNSDomainRoutesRequest) (*pb.FindAllDNSDomainRoutesResponse, error) { func (this *DNSDomainService) FindAllDNSDomainRoutes(ctx context.Context, req *pb.FindAllDNSDomainRoutesRequest) (*pb.FindAllDNSDomainRoutesResponse, error) {
// 校验请求 // 校验请求
_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) _, _, 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 return &pb.FindAllDNSDomainRoutesResponse{Routes: pbRoutes}, nil
} }
// 判断是否有域名可选 // ExistAvailableDomains 判断是否有域名可选
func (this *DNSDomainService) ExistAvailableDomains(ctx context.Context, req *pb.ExistAvailableDomainsRequest) (*pb.ExistAvailableDomainsResponse, error) { func (this *DNSDomainService) ExistAvailableDomains(ctx context.Context, req *pb.ExistAvailableDomainsRequest) (*pb.ExistAvailableDomainsResponse, error) {
// 校验请求 // 校验请求
_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
@@ -404,7 +405,7 @@ func (this *DNSDomainService) findClusterDNSChanges(cluster *models.NodeCluster,
nodeRecords := []*dnstypes.Record{} // 之所以用数组再存一遍是因为dnsName可能会重复 nodeRecords := []*dnstypes.Record{} // 之所以用数组再存一遍是因为dnsName可能会重复
nodeRecordMapping := map[string]*dnstypes.Record{} // value_route => *Record nodeRecordMapping := map[string]*dnstypes.Record{} // value_route => *Record
for _, record := range records { 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) nodeRecords = append(nodeRecords, record)
nodeRecordMapping[record.Value+"_"+record.Route] = record nodeRecordMapping[record.Value+"_"+record.Route] = record
} }
@@ -440,12 +441,16 @@ func (this *DNSDomainService) findClusterDNSChanges(cluster *models.NodeCluster,
nodeKeys = append(nodeKeys, key) nodeKeys = append(nodeKeys, key)
record, ok := nodeRecordMapping[key] record, ok := nodeRecordMapping[key]
if !ok { if !ok {
recordType := dnstypes.RecordTypeA
if utils.IsIPv6(ip) {
recordType = dnstypes.RecordTypeAAAA
}
result = append(result, maps.Map{ result = append(result, maps.Map{
"action": "create", "action": "create",
"record": &dnstypes.Record{ "record": &dnstypes.Record{
Id: "", Id: "",
Name: clusterDnsName, Name: clusterDnsName,
Type: dnstypes.RecordTypeA, Type: recordType,
Value: ip, Value: ip,
Route: route, Route: route,
}, },

View File

@@ -7,6 +7,7 @@ import (
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients" "github.com/TeaOSLab/EdgeAPI/internal/dnsclients"
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
"github.com/TeaOSLab/EdgeAPI/internal/remotelogs" "github.com/TeaOSLab/EdgeAPI/internal/remotelogs"
"github.com/TeaOSLab/EdgeAPI/internal/utils"
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
"github.com/iwind/TeaGo/dbs" "github.com/iwind/TeaGo/dbs"
"github.com/iwind/TeaGo/lists" "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 oldRecordsMap := map[string]*dnstypes.Record{} // route@value => record
for _, record := range records { 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 key := record.Route + "@" + record.Value
oldRecordsMap[key] = record oldRecordsMap[key] = record
} }
@@ -310,7 +311,7 @@ func (this *DNSTaskExecutor) doCluster(taskId int64, clusterId int64) error {
} }
for _, ipAddress := range ipAddresses { for _, ipAddress := range ipAddresses {
ip := ipAddress.Ip ip := ipAddress.Ip
if len(ip) == 0 { if len(ip) == 0 || ipAddress.CanAccess == 0 {
continue continue
} }
if net.ParseIP(ip) == nil { if net.ParseIP(ip) == nil {
@@ -324,10 +325,14 @@ func (this *DNSTaskExecutor) doCluster(taskId int64, clusterId int64) error {
continue continue
} }
recordType := dnstypes.RecordTypeA
if utils.IsIPv6(ip) {
recordType = dnstypes.RecordTypeAAAA
}
err = manager.AddRecord(domain, &dnstypes.Record{ err = manager.AddRecord(domain, &dnstypes.Record{
Id: "", Id: "",
Name: clusterDNSName, Name: clusterDNSName,
Type: dnstypes.RecordTypeA, Type: recordType,
Value: ip, Value: ip,
Route: route, Route: route,
}) })

View File

@@ -8,7 +8,7 @@ import (
"strings" "strings"
) )
// 将IP转换为整型 // IP2Long 将IP转换为整型
// 注意IPv6没有顺序 // 注意IPv6没有顺序
func IP2Long(ip string) uint64 { func IP2Long(ip string) uint64 {
if len(ip) == 0 { if len(ip) == 0 {
@@ -24,3 +24,8 @@ func IP2Long(ip string) uint64 {
} }
return uint64(binary.BigEndian.Uint32(s.To4())) return uint64(binary.BigEndian.Uint32(s.To4()))
} }
// IsIPv6 判断是否为IPv6
func IsIPv6(ip string) bool {
return strings.Contains(ip, ":")
}