From b602beda0fe766d78dc68aa9ff1a9a24e8736226 Mon Sep 17 00:00:00 2001 From: Karan Sharma Date: Fri, 11 Dec 2020 16:48:54 +0530 Subject: [PATCH] chore: Create a resolver package --- cmd/cli.go | 6 +++++ cmd/hub.go | 8 ++++-- cmd/parse.go | 21 --------------- cmd/resolver.go | 27 +++++++++++++++++++ .../resolver.go => resolvers/classic.go} | 24 ++++++++++------- pkg/resolvers/doh.go | 1 + pkg/resolvers/dot.go | 1 + pkg/resolvers/resolver.go | 8 ++++++ 8 files changed, 63 insertions(+), 33 deletions(-) create mode 100644 cmd/resolver.go rename pkg/{resolve/resolver.go => resolvers/classic.go} (80%) create mode 100644 pkg/resolvers/doh.go create mode 100644 pkg/resolvers/dot.go create mode 100644 pkg/resolvers/resolver.go diff --git a/cmd/cli.go b/cmd/cli.go index 2694765..60afc22 100644 --- a/cmd/cli.go +++ b/cmd/cli.go @@ -67,6 +67,12 @@ func main() { Usage: "Network class of the DNS record to be queried (IN, CH, HS etc)", Destination: qFlags.QClasses, }, + &cli.BoolFlag{ + Name: "https", + Usage: "Use the DNS-over-HTTPS protocol", + Destination: &qFlags.IsDOH, + DefaultText: "udp", + }, &cli.BoolFlag{ Name: "verbose", Usage: "Enable verbose logging", diff --git a/cmd/hub.go b/cmd/hub.go index beeea5b..1512f72 100644 --- a/cmd/hub.go +++ b/cmd/hub.go @@ -2,7 +2,7 @@ package main import ( "github.com/miekg/dns" - "github.com/mr-karan/doggo/pkg/resolve" + "github.com/mr-karan/doggo/pkg/resolvers" "github.com/sirupsen/logrus" "github.com/urfave/cli/v2" ) @@ -13,7 +13,7 @@ type Hub struct { Version string QueryFlags QueryFlags Questions []dns.Question - Resolver *resolve.Resolver + Resolver resolvers.Resolver } // QueryFlags is used store the value of CLI flags. @@ -22,6 +22,10 @@ type QueryFlags struct { QTypes *cli.StringSlice QClasses *cli.StringSlice Nameservers *cli.StringSlice + IsDOH bool + IsDOT bool + IsUDP bool + IsTLS bool } // NewHub initializes an instance of Hub which holds app wide configuration. diff --git a/cmd/parse.go b/cmd/parse.go index 5b6d791..0a22935 100644 --- a/cmd/parse.go +++ b/cmd/parse.go @@ -1,11 +1,9 @@ package main import ( - "runtime" "strings" "github.com/miekg/dns" - "github.com/mr-karan/doggo/pkg/resolve" "github.com/urfave/cli/v2" ) @@ -55,22 +53,3 @@ func (hub *Hub) loadFallbacks(c *cli.Context) { hub.QueryFlags.QClasses.Set("IN") } } - -// loadResolver checks -func (hub *Hub) loadResolver(c *cli.Context) error { - if len(hub.QueryFlags.Nameservers.Value()) == 0 { - if runtime.GOOS == "windows" { - // TODO: Add a method for reading system default nameserver in windows. - } else { - rslvr, err := resolve.NewResolverFromResolvFile(resolve.DefaultResolvConfPath) - if err != nil { - return err - } - hub.Resolver = rslvr - } - } else { - rslvr := resolve.NewResolver(hub.QueryFlags.Nameservers.Value()) - hub.Resolver = rslvr - } - return nil -} diff --git a/cmd/resolver.go b/cmd/resolver.go new file mode 100644 index 0000000..a69036e --- /dev/null +++ b/cmd/resolver.go @@ -0,0 +1,27 @@ +package main + +import ( + "runtime" + + "github.com/mr-karan/doggo/pkg/resolvers" + "github.com/urfave/cli/v2" +) + +// loadResolver checks +func (hub *Hub) loadResolver(c *cli.Context) error { + if len(hub.QueryFlags.Nameservers.Value()) == 0 { + if runtime.GOOS == "windows" { + // TODO: Add a method for reading system default nameserver in windows. + } else { + rslvr, err := resolvers.NewResolverFromResolvFile(resolvers.DefaultResolvConfPath) + if err != nil { + return err + } + hub.Resolver = rslvr + } + } else { + rslvr := resolvers.NewResolver(hub.QueryFlags.Nameservers.Value()) + hub.Resolver = rslvr + } + return nil +} diff --git a/pkg/resolve/resolver.go b/pkg/resolvers/classic.go similarity index 80% rename from pkg/resolve/resolver.go rename to pkg/resolvers/classic.go index 6aa9a00..4bd22b6 100644 --- a/pkg/resolve/resolver.go +++ b/pkg/resolvers/classic.go @@ -1,4 +1,4 @@ -package resolve +package resolvers import ( "fmt" @@ -7,8 +7,8 @@ import ( "github.com/miekg/dns" ) -// Resolver holds the configuration for a dns.Client -type Resolver struct { +// Manager represents the config options for setting up a Resolver. +type Manager struct { client *dns.Client servers []string } @@ -17,7 +17,7 @@ type Resolver struct { const DefaultResolvConfPath = "/etc/resolv.conf" // NewResolver accepts a list of nameservers and configures a DNS resolver. -func NewResolver(servers []string) *Resolver { +func NewResolver(servers []string) Resolver { client := &dns.Client{} var nameservers []string for _, srv := range servers { @@ -27,7 +27,7 @@ func NewResolver(servers []string) *Resolver { nameservers = append(nameservers, dns.Fqdn(srv)+":"+"53") } } - return &Resolver{ + return &Manager{ client: client, servers: nameservers, } @@ -35,7 +35,7 @@ func NewResolver(servers []string) *Resolver { // NewResolverFromResolvFile loads the configuration from resolv config file // and initialises a DNS resolver. -func NewResolverFromResolvFile(resolvFilePath string) (*Resolver, error) { +func NewResolverFromResolvFile(resolvFilePath string) (Resolver, error) { if resolvFilePath == "" { resolvFilePath = DefaultResolvConfPath } @@ -56,7 +56,7 @@ func NewResolverFromResolvFile(resolvFilePath string) (*Resolver, error) { } client := &dns.Client{} - return &Resolver{ + return &Manager{ client: client, servers: servers, }, nil @@ -65,7 +65,7 @@ func NewResolverFromResolvFile(resolvFilePath string) (*Resolver, error) { // Lookup prepare a list of DNS messages to be sent to the server. // It's possible to send multiple question in one message // but some nameservers are not able to -func (r *Resolver) Lookup(questions []dns.Question) error { +func (m *Manager) Lookup(questions []dns.Question) error { var messages = make([]dns.Msg, 0, len(questions)) for _, q := range questions { msg := dns.Msg{} @@ -76,8 +76,8 @@ func (r *Resolver) Lookup(questions []dns.Question) error { messages = append(messages, msg) } for _, msg := range messages { - for _, srv := range r.servers { - in, rtt, err := r.client.Exchange(&msg, srv) + for _, srv := range m.servers { + in, rtt, err := m.client.Exchange(&msg, srv) if err != nil { return err } @@ -91,3 +91,7 @@ func (r *Resolver) Lookup(questions []dns.Question) error { } return nil } + +func (m *Manager) Name() string { + return "classic" +} diff --git a/pkg/resolvers/doh.go b/pkg/resolvers/doh.go new file mode 100644 index 0000000..91fea07 --- /dev/null +++ b/pkg/resolvers/doh.go @@ -0,0 +1 @@ +package resolvers diff --git a/pkg/resolvers/dot.go b/pkg/resolvers/dot.go new file mode 100644 index 0000000..91fea07 --- /dev/null +++ b/pkg/resolvers/dot.go @@ -0,0 +1 @@ +package resolvers diff --git a/pkg/resolvers/resolver.go b/pkg/resolvers/resolver.go new file mode 100644 index 0000000..8c40d8e --- /dev/null +++ b/pkg/resolvers/resolver.go @@ -0,0 +1,8 @@ +package resolvers + +import "github.com/miekg/dns" + +type Resolver interface { + Name() string + Lookup([]dns.Question) error +}