platform: modularize api/gui, add docs-tests-web foundation, and refresh root config
This commit is contained in:
88
selective-vpn-api/app/resolver/artifacts.go
Normal file
88
selective-vpn-api/app/resolver/artifacts.go
Normal file
@@ -0,0 +1,88 @@
|
||||
package resolver
|
||||
|
||||
import "sort"
|
||||
|
||||
type ResolverArtifacts struct {
|
||||
IPs []string
|
||||
DirectIPs []string
|
||||
WildcardIPs []string
|
||||
IPMap [][2]string
|
||||
DirectIPMap [][2]string
|
||||
WildcardIPMap [][2]string
|
||||
}
|
||||
|
||||
func BuildResolverArtifacts(resolved map[string][]string, staticLabels map[string][]string, isWildcardHost func(string) bool) ResolverArtifacts {
|
||||
ipSetAll := map[string]struct{}{}
|
||||
ipSetDirect := map[string]struct{}{}
|
||||
ipSetWildcard := map[string]struct{}{}
|
||||
|
||||
ipMapAll := map[string]map[string]struct{}{}
|
||||
ipMapDirect := map[string]map[string]struct{}{}
|
||||
ipMapWildcard := map[string]map[string]struct{}{}
|
||||
|
||||
add := func(set map[string]struct{}, labels map[string]map[string]struct{}, ip, label string) {
|
||||
if ip == "" {
|
||||
return
|
||||
}
|
||||
set[ip] = struct{}{}
|
||||
m := labels[ip]
|
||||
if m == nil {
|
||||
m = map[string]struct{}{}
|
||||
labels[ip] = m
|
||||
}
|
||||
m[label] = struct{}{}
|
||||
}
|
||||
|
||||
for host, ips := range resolved {
|
||||
wildcardHost := false
|
||||
if isWildcardHost != nil {
|
||||
wildcardHost = isWildcardHost(host)
|
||||
}
|
||||
for _, ip := range ips {
|
||||
add(ipSetAll, ipMapAll, ip, host)
|
||||
if wildcardHost {
|
||||
add(ipSetWildcard, ipMapWildcard, ip, host)
|
||||
} else {
|
||||
add(ipSetDirect, ipMapDirect, ip, host)
|
||||
}
|
||||
}
|
||||
}
|
||||
for ipEntry, labels := range staticLabels {
|
||||
for _, lbl := range labels {
|
||||
add(ipSetAll, ipMapAll, ipEntry, lbl)
|
||||
add(ipSetDirect, ipMapDirect, ipEntry, lbl)
|
||||
}
|
||||
}
|
||||
|
||||
var out ResolverArtifacts
|
||||
|
||||
appendMapPairs := func(dst *[][2]string, labelsByIP map[string]map[string]struct{}) {
|
||||
for ip := range labelsByIP {
|
||||
labels := labelsByIP[ip]
|
||||
for lbl := range labels {
|
||||
*dst = append(*dst, [2]string{ip, lbl})
|
||||
}
|
||||
}
|
||||
sort.Slice(*dst, func(i, j int) bool {
|
||||
if (*dst)[i][0] == (*dst)[j][0] {
|
||||
return (*dst)[i][1] < (*dst)[j][1]
|
||||
}
|
||||
return (*dst)[i][0] < (*dst)[j][0]
|
||||
})
|
||||
}
|
||||
appendIPs := func(dst *[]string, set map[string]struct{}) {
|
||||
for ip := range set {
|
||||
*dst = append(*dst, ip)
|
||||
}
|
||||
sort.Strings(*dst)
|
||||
}
|
||||
|
||||
appendMapPairs(&out.IPMap, ipMapAll)
|
||||
appendMapPairs(&out.DirectIPMap, ipMapDirect)
|
||||
appendMapPairs(&out.WildcardIPMap, ipMapWildcard)
|
||||
appendIPs(&out.IPs, ipSetAll)
|
||||
appendIPs(&out.DirectIPs, ipSetDirect)
|
||||
appendIPs(&out.WildcardIPs, ipSetWildcard)
|
||||
|
||||
return out
|
||||
}
|
||||
Reference in New Issue
Block a user