1.4.5.2
This commit is contained in:
80
EdgeDNS/internal/models/records_domain.go
Normal file
80
EdgeDNS/internal/models/records_domain.go
Normal file
@@ -0,0 +1,80 @@
|
||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||
//go:build plus
|
||||
|
||||
package models
|
||||
|
||||
import (
|
||||
"github.com/TeaOSLab/EdgeCommon/pkg/dnsconfigs"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type DomainRecords struct {
|
||||
RecordsMap map[RecordKey]*RouteRecords // key => records
|
||||
Keys map[int64]RecordKey // recordId => key
|
||||
}
|
||||
|
||||
func NewDomainRecords() *DomainRecords {
|
||||
return &DomainRecords{
|
||||
RecordsMap: map[RecordKey]*RouteRecords{},
|
||||
Keys: map[int64]RecordKey{},
|
||||
}
|
||||
}
|
||||
|
||||
func (this *DomainRecords) Add(record *NSRecord) {
|
||||
var key = NewRecordKey(record.Name, record.Type)
|
||||
records, ok := this.RecordsMap[key]
|
||||
if !ok {
|
||||
records = NewRouteRecords()
|
||||
this.RecordsMap[key] = records
|
||||
}
|
||||
records.Add(record)
|
||||
|
||||
this.Keys[record.Id] = key
|
||||
}
|
||||
|
||||
func (this *DomainRecords) Find(routeCodes []string, recordName string, recordType string, config *dnsconfigs.NSAnswerConfig, strictMode bool) (record []*NSRecord, routeCode string) {
|
||||
// NAME.example.com
|
||||
var key = NewRecordKey(recordName, recordType)
|
||||
records, ok := this.RecordsMap[key]
|
||||
if ok {
|
||||
return records.Find(routeCodes, config, strictMode)
|
||||
}
|
||||
|
||||
// @.example.com
|
||||
if len(recordName) == 0 {
|
||||
records, ok = this.RecordsMap[NewRecordKey("@", recordType)]
|
||||
if ok {
|
||||
return records.Find(routeCodes, config, strictMode)
|
||||
}
|
||||
|
||||
return nil, ""
|
||||
}
|
||||
|
||||
// *.NAME.example.com
|
||||
var dotIndex = strings.Index(recordName, ".")
|
||||
var wildcardNames = []string{}
|
||||
if dotIndex > 0 {
|
||||
wildcardNames = append(wildcardNames, "*."+recordName[dotIndex+1:])
|
||||
}
|
||||
wildcardNames = append(wildcardNames, "*")
|
||||
for _, wildcardName := range wildcardNames {
|
||||
records, ok = this.RecordsMap[NewRecordKey(wildcardName, recordType)]
|
||||
if ok {
|
||||
return records.Find(routeCodes, config, strictMode)
|
||||
}
|
||||
}
|
||||
|
||||
return nil, ""
|
||||
}
|
||||
|
||||
func (this *DomainRecords) Remove(recordId int64) {
|
||||
key, ok := this.Keys[recordId]
|
||||
if ok {
|
||||
var recordsMap = this.RecordsMap[key]
|
||||
recordsMap.Remove(recordId)
|
||||
if recordsMap.IsEmpty() {
|
||||
delete(this.RecordsMap, key)
|
||||
}
|
||||
delete(this.Keys, recordId)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user