1e55db408f
Merge in DNS/adguard-home from 3136-show-default to master
Closes #3136.
Squashed commit of the following:
commit add09a772dddcccd404056e7649c2d3350a79fec
Author: Eugene Burkov <e.burkov@adguard.com>
Date: Tue Jun 1 11:11:24 2021 +0300
openapi: fix typo
commit 69e402c49318d53a0d03b81207644d9fb04a139a
Merge: 76e8492c e17e1f20
Author: Eugene Burkov <e.burkov@adguard.com>
Date: Tue Jun 1 11:09:51 2021 +0300
Merge branch 'master' into 3136-show-default
commit 76e8492c8da679e204ceb7a77f1c6f73a2488040
Author: Ildar Kamalov <ik@adguard.com>
Date: Tue Jun 1 10:55:09 2021 +0300
client: check upstreams
commit 05fe6ea196a1ed9386eec25dbfbe22779fe7bcfd
Author: Vlad <v.abdulmyanov@adguard.com>
Date: Mon May 31 19:23:35 2021 +0300
add defaul resolvers line
commit 8d63c7df9947c9588478d1173834b42569fd8951
Author: Eugene Burkov <e.burkov@adguard.com>
Date: Mon May 31 11:56:08 2021 +0300
all: imp changelog
commit e3912e3b20eca9dcf90ddddaa5edb54d1e0cfe6e
Author: Eugene Burkov <e.burkov@adguard.com>
Date: Fri May 28 20:23:05 2021 +0300
all: add local ptr resolvers addresses output
67 lines
1.8 KiB
Go
67 lines
1.8 KiB
Go
package aghnet
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/AdguardTeam/golibs/log"
|
|
)
|
|
|
|
// DefaultRefreshIvl is the default period of time between refreshing cached
|
|
// addresses.
|
|
// const DefaultRefreshIvl = 5 * time.Minute
|
|
|
|
// HostGenFunc is the signature for functions generating fake hostnames. The
|
|
// implementation must be safe for concurrent use.
|
|
type HostGenFunc func() (host string)
|
|
|
|
// SystemResolvers helps to work with local resolvers' addresses provided by OS.
|
|
type SystemResolvers interface {
|
|
// Get returns the slice of local resolvers' addresses. It should be
|
|
// safe for concurrent use.
|
|
Get() (rs []string)
|
|
// refresh refreshes the local resolvers' addresses cache. It should be
|
|
// safe for concurrent use.
|
|
refresh() (err error)
|
|
}
|
|
|
|
// refreshWithTicker refreshes the cache of sr after each tick form tickCh.
|
|
func refreshWithTicker(sr SystemResolvers, tickCh <-chan time.Time) {
|
|
defer log.OnPanic("systemResolvers")
|
|
|
|
// TODO(e.burkov): Implement a functionality to stop ticker.
|
|
for range tickCh {
|
|
err := sr.refresh()
|
|
if err != nil {
|
|
log.Error("systemResolvers: error in refreshing goroutine: %s", err)
|
|
|
|
continue
|
|
}
|
|
|
|
log.Debug("systemResolvers: local addresses cache is refreshed")
|
|
}
|
|
}
|
|
|
|
// NewSystemResolvers returns a SystemResolvers with the cache refresh rate
|
|
// defined by refreshIvl. It disables auto-resfreshing if refreshIvl is 0. If
|
|
// nil is passed for hostGenFunc, the default generator will be used.
|
|
func NewSystemResolvers(
|
|
refreshIvl time.Duration,
|
|
hostGenFunc HostGenFunc,
|
|
) (sr SystemResolvers, err error) {
|
|
sr = newSystemResolvers(refreshIvl, hostGenFunc)
|
|
|
|
// Fill cache.
|
|
err = sr.refresh()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if refreshIvl > 0 {
|
|
ticker := time.NewTicker(refreshIvl)
|
|
|
|
go refreshWithTicker(sr, ticker.C)
|
|
}
|
|
|
|
return sr, nil
|
|
}
|