81 lines
2.0 KiB
Go
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)
|
|
}
|
|
}
|