101 lines
2.3 KiB
Go
101 lines
2.3 KiB
Go
package dnscfg
|
|
|
|
import "strings"
|
|
|
|
type Upstreams struct {
|
|
Default1 string
|
|
Default2 string
|
|
Meta1 string
|
|
Meta2 string
|
|
}
|
|
|
|
type UpstreamPoolItem struct {
|
|
Addr string
|
|
Enabled bool
|
|
}
|
|
|
|
func NormalizeUpstreamPoolItems(items []UpstreamPoolItem, normalizeUpstream func(raw string, defaultPort string) string) []UpstreamPoolItem {
|
|
if len(items) == 0 {
|
|
return nil
|
|
}
|
|
seen := map[string]struct{}{}
|
|
out := make([]UpstreamPoolItem, 0, len(items))
|
|
for _, item := range items {
|
|
addr := strings.TrimSpace(item.Addr)
|
|
if normalizeUpstream != nil {
|
|
addr = normalizeUpstream(addr, "53")
|
|
}
|
|
if addr == "" {
|
|
continue
|
|
}
|
|
if _, ok := seen[addr]; ok {
|
|
continue
|
|
}
|
|
seen[addr] = struct{}{}
|
|
out = append(out, UpstreamPoolItem{
|
|
Addr: addr,
|
|
Enabled: item.Enabled,
|
|
})
|
|
}
|
|
return out
|
|
}
|
|
|
|
func UpstreamPoolFromLegacy(cfg Upstreams, normalizeUpstream func(raw string, defaultPort string) string) []UpstreamPoolItem {
|
|
out := []UpstreamPoolItem{
|
|
{Addr: cfg.Default1, Enabled: true},
|
|
{Addr: cfg.Default2, Enabled: true},
|
|
{Addr: cfg.Meta1, Enabled: true},
|
|
{Addr: cfg.Meta2, Enabled: true},
|
|
}
|
|
return NormalizeUpstreamPoolItems(out, normalizeUpstream)
|
|
}
|
|
|
|
func UpstreamPoolToLegacy(items []UpstreamPoolItem, defaults Upstreams, normalizeUpstream func(raw string, defaultPort string) string) Upstreams {
|
|
items = NormalizeUpstreamPoolItems(items, normalizeUpstream)
|
|
out := defaults
|
|
enabled := make([]string, 0, len(items))
|
|
for _, item := range items {
|
|
if !item.Enabled {
|
|
continue
|
|
}
|
|
addr := strings.TrimSpace(item.Addr)
|
|
if normalizeUpstream != nil {
|
|
addr = normalizeUpstream(addr, "53")
|
|
}
|
|
if addr != "" {
|
|
enabled = append(enabled, addr)
|
|
}
|
|
}
|
|
if len(enabled) > 0 {
|
|
out.Default1 = enabled[0]
|
|
}
|
|
if len(enabled) > 1 {
|
|
out.Default2 = enabled[1]
|
|
}
|
|
if len(enabled) > 2 {
|
|
out.Meta1 = enabled[2]
|
|
}
|
|
if len(enabled) > 3 {
|
|
out.Meta2 = enabled[3]
|
|
}
|
|
return out
|
|
}
|
|
|
|
func EnabledPool(items []UpstreamPoolItem, normalizeUpstream func(raw string, defaultPort string) string) []string {
|
|
items = NormalizeUpstreamPoolItems(items, normalizeUpstream)
|
|
out := make([]string, 0, len(items))
|
|
for _, item := range items {
|
|
if !item.Enabled {
|
|
continue
|
|
}
|
|
addr := strings.TrimSpace(item.Addr)
|
|
if normalizeUpstream != nil {
|
|
addr = normalizeUpstream(addr, "53")
|
|
}
|
|
if addr != "" {
|
|
out = append(out, addr)
|
|
}
|
|
}
|
|
return out
|
|
}
|