mirror of
https://github.com/hanzozt/zt.git
synced 2026-10-30 15:04:55 +00:00
* don't check interface ips when getting ips from dns pool * assign dns ip range to loopback instead of one-ip-at-a-time * recycle unused dns ips * replace $dst_hostname when calculating dial identity * fall back to dummy resolver if server initialization fails.
63 lines
1.3 KiB
Go
63 lines
1.3 KiB
Go
package dns
|
|
|
|
import (
|
|
cmap "github.com/orcaman/concurrent-map/v2"
|
|
"net"
|
|
)
|
|
|
|
func NewRefCountingResolver(resolver Resolver) Resolver {
|
|
return &RefCountingResolver{
|
|
names: cmap.New[int](),
|
|
wrapped: resolver,
|
|
}
|
|
}
|
|
|
|
type RefCountingResolver struct {
|
|
names cmap.ConcurrentMap[string, int]
|
|
wrapped Resolver
|
|
}
|
|
|
|
func (self *RefCountingResolver) Lookup(ip net.IP) (string, error) {
|
|
return self.wrapped.Lookup(ip)
|
|
}
|
|
|
|
func (self *RefCountingResolver) AddDomain(name string, cb func(string) (net.IP, error)) error {
|
|
return self.wrapped.AddDomain(name, cb)
|
|
}
|
|
|
|
func (self *RefCountingResolver) RemoveDomain(name string) {
|
|
self.wrapped.RemoveDomain(name)
|
|
}
|
|
|
|
func (self *RefCountingResolver) AddHostname(s string, ip net.IP) error {
|
|
err := self.wrapped.AddHostname(s, ip)
|
|
if err != nil {
|
|
self.names.Upsert(s, 1, func(exist bool, valueInMap int, newValue int) int {
|
|
if exist {
|
|
return valueInMap + 1
|
|
}
|
|
return 1
|
|
})
|
|
}
|
|
return err
|
|
}
|
|
|
|
func (self *RefCountingResolver) RemoveHostname(s string) net.IP {
|
|
val := self.names.Upsert(s, 1, func(exist bool, valueInMap int, newValue int) int {
|
|
if exist {
|
|
return valueInMap - 1
|
|
}
|
|
return 0
|
|
})
|
|
|
|
if val == 0 {
|
|
self.names.Remove(s)
|
|
return self.wrapped.RemoveHostname(s)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (self *RefCountingResolver) Cleanup() error {
|
|
return self.wrapped.Cleanup()
|
|
}
|