Files
waf-platform/EdgeDNS/internal/models/records_domain.go
2026-02-04 20:27:13 +08:00

81 lines
2.0 KiB
Go

// 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)
}
}