From 55033404d44b66b1d1ff49d38435ebc9be06bfcb Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 20 Mar 2020 23:01:15 +0100 Subject: [PATCH] Rename intel to resolver --- {intel => resolver}/clients.go | 2 +- {intel => resolver}/config.go | 2 +- {intel => resolver}/doc.go | 4 +- {intel => resolver}/ipinfo.go | 2 +- {intel => resolver}/ipinfo_test.go | 2 +- {intel => resolver}/main.go | 7 +- resolver/main_test.go | 6 + {intel => resolver}/mdns.go | 4 +- {intel => resolver}/namerecord.go | 2 +- {intel => resolver}/resolve.go | 2 +- {intel => resolver}/resolve_test.go | 2 +- {intel => resolver}/resolver-scopes.go | 2 +- resolver/resolver.go | 153 +++++++++++++++++++++++++ {intel => resolver}/resolvers.go | 2 +- {intel => resolver}/resolvers_test.go | 2 +- {intel => resolver}/reverse.go | 2 +- {intel => resolver}/reverse_test.go | 2 +- {intel => resolver}/rrcache.go | 2 +- 18 files changed, 181 insertions(+), 19 deletions(-) rename {intel => resolver}/clients.go (99%) rename {intel => resolver}/config.go (99%) rename {intel => resolver}/doc.go (92%) rename {intel => resolver}/ipinfo.go (99%) rename {intel => resolver}/ipinfo_test.go (97%) rename {intel => resolver}/main.go (80%) create mode 100644 resolver/main_test.go rename {intel => resolver}/mdns.go (99%) rename {intel => resolver}/namerecord.go (98%) rename {intel => resolver}/resolve.go (99%) rename {intel => resolver}/resolve_test.go (94%) rename {intel => resolver}/resolver-scopes.go (99%) create mode 100644 resolver/resolver.go rename {intel => resolver}/resolvers.go (99%) rename {intel => resolver}/resolvers_test.go (97%) rename {intel => resolver}/reverse.go (99%) rename {intel => resolver}/reverse_test.go (98%) rename {intel => resolver}/rrcache.go (99%) diff --git a/intel/clients.go b/resolver/clients.go similarity index 99% rename from intel/clients.go rename to resolver/clients.go index 38880eb5..4166381f 100644 --- a/intel/clients.go +++ b/resolver/clients.go @@ -1,4 +1,4 @@ -package intel +package resolver import ( "crypto/tls" diff --git a/intel/config.go b/resolver/config.go similarity index 99% rename from intel/config.go rename to resolver/config.go index ef697d0e..7fd154ec 100644 --- a/intel/config.go +++ b/resolver/config.go @@ -1,4 +1,4 @@ -package intel +package resolver import ( "fmt" diff --git a/intel/doc.go b/resolver/doc.go similarity index 92% rename from intel/doc.go rename to resolver/doc.go index ffa1f767..c125d3b1 100644 --- a/intel/doc.go +++ b/resolver/doc.go @@ -1,5 +1,5 @@ /* -Package intel is responsible for fetching intelligence data, including DNS, on remote entities. +package resolver is responsible for fetching intelligence data, including DNS, on remote entities. DNS Servers @@ -27,4 +27,4 @@ All other domains are resolved using search scopes and all available resolvers. */ -package intel +package resolver diff --git a/intel/ipinfo.go b/resolver/ipinfo.go similarity index 99% rename from intel/ipinfo.go rename to resolver/ipinfo.go index 583e34f4..760b25f3 100644 --- a/intel/ipinfo.go +++ b/resolver/ipinfo.go @@ -1,4 +1,4 @@ -package intel +package resolver import ( "fmt" diff --git a/intel/ipinfo_test.go b/resolver/ipinfo_test.go similarity index 97% rename from intel/ipinfo_test.go rename to resolver/ipinfo_test.go index f778c82f..07561821 100644 --- a/intel/ipinfo_test.go +++ b/resolver/ipinfo_test.go @@ -1,4 +1,4 @@ -package intel +package resolver import "testing" diff --git a/intel/main.go b/resolver/main.go similarity index 80% rename from intel/main.go rename to resolver/main.go index 2d84b1c8..2f29bba2 100644 --- a/intel/main.go +++ b/resolver/main.go @@ -1,4 +1,4 @@ -package intel +package resolver import ( "context" @@ -6,6 +6,7 @@ import ( "github.com/safing/portbase/log" "github.com/safing/portbase/modules" + "github.com/safing/portmaster/intel" // module dependencies _ "github.com/safing/portmaster/core" @@ -16,10 +17,12 @@ var ( ) func init() { - module = modules.Register("intel", prep, start, nil, "core", "network") + module = modules.Register("resolver", prep, start, nil, "core", "network") } func prep() error { + intel.SetReverseResolver(ResolveIPAndValidate) + return prepConfig() } diff --git a/resolver/main_test.go b/resolver/main_test.go new file mode 100644 index 00000000..f6501648 --- /dev/null +++ b/resolver/main_test.go @@ -0,0 +1,6 @@ +package resolver + +import ( + // portmaster tests helper + _ "github.com/safing/portmaster/core/pmtesting" +) diff --git a/intel/mdns.go b/resolver/mdns.go similarity index 99% rename from intel/mdns.go rename to resolver/mdns.go index 7f1672ed..3b686e66 100644 --- a/intel/mdns.go +++ b/resolver/mdns.go @@ -1,4 +1,4 @@ -package intel +package resolver import ( "context" @@ -313,7 +313,7 @@ func listenForDNSPackets(conn *net.UDPConn, messages chan *dns.Msg) error { for { n, err := conn.Read(buf) if err != nil { - if module.ShutdownInProgress() { + if module.IsStopping() { return nil } log.Debugf("intel: failed to read packet: %s", err) diff --git a/intel/namerecord.go b/resolver/namerecord.go similarity index 98% rename from intel/namerecord.go rename to resolver/namerecord.go index 54163ad9..d94beaaa 100644 --- a/intel/namerecord.go +++ b/resolver/namerecord.go @@ -1,4 +1,4 @@ -package intel +package resolver import ( "errors" diff --git a/intel/resolve.go b/resolver/resolve.go similarity index 99% rename from intel/resolve.go rename to resolver/resolve.go index e8c4dddc..d5e94f55 100644 --- a/intel/resolve.go +++ b/resolver/resolve.go @@ -1,4 +1,4 @@ -package intel +package resolver import ( "context" diff --git a/intel/resolve_test.go b/resolver/resolve_test.go similarity index 94% rename from intel/resolve_test.go rename to resolver/resolve_test.go index 4a57d114..f621a635 100644 --- a/intel/resolve_test.go +++ b/resolver/resolve_test.go @@ -1,4 +1,4 @@ -package intel +package resolver // DISABLE TESTING FOR NOW: find a way to have tests with the module system diff --git a/intel/resolver-scopes.go b/resolver/resolver-scopes.go similarity index 99% rename from intel/resolver-scopes.go rename to resolver/resolver-scopes.go index 2da53b38..c003e364 100644 --- a/intel/resolver-scopes.go +++ b/resolver/resolver-scopes.go @@ -1,4 +1,4 @@ -package intel +package resolver import ( "context" diff --git a/resolver/resolver.go b/resolver/resolver.go new file mode 100644 index 00000000..7bc8c8fb --- /dev/null +++ b/resolver/resolver.go @@ -0,0 +1,153 @@ +package resolver + +import ( + "context" + "net" + "sync" + "time" + + "github.com/miekg/dns" + "github.com/safing/portbase/log" + "github.com/safing/portmaster/network/environment" +) + +// DNS Resolver Attributes +const ( + ServerTypeDNS = "dns" + ServerTypeTCP = "tcp" + ServerTypeDoT = "dot" + ServerTypeDoH = "doh" + + ServerSourceConfigured = "config" + ServerSourceAssigned = "dhcp" + ServerSourceMDNS = "mdns" +) + +// Resolver holds information about an active resolver. +type Resolver struct { + // Server config url (and ID) + Server string + + // Parsed config + ServerType string + ServerAddress string + ServerIP net.IP + ServerIPScope int8 + ServerPort uint16 + + // Special Options + VerifyDomain string + Search []string + SkipFQDN string + + Source string + + // logic interface + Conn ResolverConn +} + +// String returns the URL representation of the resolver. +func (resolver *Resolver) String() string { + return resolver.Server +} + +// ResolverConn is an interface to implement different types of query backends. +type ResolverConn interface { + Query(ctx context.Context, q *Query) (*RRCache, error) + MarkFailed() + LastFail() time.Time +} + +// BasicResolverConn implements ResolverConn for standard dns clients. +type BasicResolverConn struct { + sync.Mutex // for lastFail + + resolver *Resolver + clientManager *clientManager + lastFail time.Time +} + +// MarkFailed marks the resolver as failed. +func (brc *BasicResolverConn) MarkFailed() { + if !environment.Online() { + // don't mark failed if we are offline + return + } + + brc.Lock() + defer brc.Unlock() + brc.lastFail = time.Now() +} + +// LastFail returns the internal lastfail value while locking the Resolver. +func (brc *BasicResolverConn) LastFail() time.Time { + brc.Lock() + defer brc.Unlock() + return brc.lastFail +} + +// Query executes the given query against the resolver. +func (brc *BasicResolverConn) Query(ctx context.Context, q *Query) (*RRCache, error) { + // convenience + resolver := brc.resolver + + // create query + dnsQuery := new(dns.Msg) + dnsQuery.SetQuestion(q.FQDN, uint16(q.QType)) + + // start + var reply *dns.Msg + var err error + for i := 0; i < 3; i++ { + + // log query time + // qStart := time.Now() + reply, _, err = brc.clientManager.getDNSClient().Exchange(dnsQuery, resolver.ServerAddress) + // log.Tracef("intel: query to %s took %s", resolver.Server, time.Now().Sub(qStart)) + + // error handling + if err != nil { + log.Tracer(ctx).Tracef("intel: query to %s encountered error: %s", resolver.Server, err) + + // TODO: handle special cases + // 1. connect: network is unreachable + // 2. timeout + + // hint network environment at failed connection + environment.ReportFailedConnection() + + // temporary error + if nerr, ok := err.(net.Error); ok && nerr.Timeout() { + log.Tracer(ctx).Tracef("intel: retrying to resolve %s%s with %s, error is temporary", q.FQDN, q.QType, resolver.Server) + continue + } + + // permanent error + break + } + + // no error + break + } + + if err != nil { + return nil, err + // FIXME: mark as failed + } + + // hint network environment at successful connection + environment.ReportSuccessfulConnection() + + new := &RRCache{ + Domain: q.FQDN, + Question: q.QType, + Answer: reply.Answer, + Ns: reply.Ns, + Extra: reply.Extra, + Server: resolver.Server, + ServerScope: resolver.ServerIPScope, + } + + // TODO: check if reply.Answer is valid + return new, nil +} diff --git a/intel/resolvers.go b/resolver/resolvers.go similarity index 99% rename from intel/resolvers.go rename to resolver/resolvers.go index 9185c8e6..cd7c630a 100644 --- a/intel/resolvers.go +++ b/resolver/resolvers.go @@ -1,4 +1,4 @@ -package intel +package resolver import ( "errors" diff --git a/intel/resolvers_test.go b/resolver/resolvers_test.go similarity index 97% rename from intel/resolvers_test.go rename to resolver/resolvers_test.go index 877c03aa..c40e6464 100644 --- a/intel/resolvers_test.go +++ b/resolver/resolvers_test.go @@ -1,4 +1,4 @@ -package intel +package resolver import "testing" diff --git a/intel/reverse.go b/resolver/reverse.go similarity index 99% rename from intel/reverse.go rename to resolver/reverse.go index 85be2230..4d0ca215 100644 --- a/intel/reverse.go +++ b/resolver/reverse.go @@ -1,4 +1,4 @@ -package intel +package resolver import ( "context" diff --git a/intel/reverse_test.go b/resolver/reverse_test.go similarity index 98% rename from intel/reverse_test.go rename to resolver/reverse_test.go index 533edd5d..a17f11b9 100644 --- a/intel/reverse_test.go +++ b/resolver/reverse_test.go @@ -1,4 +1,4 @@ -package intel +package resolver import ( "context" diff --git a/intel/rrcache.go b/resolver/rrcache.go similarity index 99% rename from intel/rrcache.go rename to resolver/rrcache.go index c828433b..cf0ff51f 100644 --- a/intel/rrcache.go +++ b/resolver/rrcache.go @@ -1,4 +1,4 @@ -package intel +package resolver import ( "fmt"