From d9a70daaf867c6fd4f1ef1c9387a950a631f11fc Mon Sep 17 00:00:00 2001 From: Karan Sharma Date: Sun, 13 Dec 2020 08:47:07 +0530 Subject: [PATCH] feat: Add colors and tables --- cmd/cli.go | 23 +++++------------------ cmd/hub.go | 38 ++++++++++++++++++++++++++++---------- cmd/output.go | 18 +++++++++++++++++- go.mod | 3 +++ go.sum | 11 +++++++++++ 5 files changed, 64 insertions(+), 29 deletions(-) diff --git a/cmd/cli.go b/cmd/cli.go index 760295a..c521c04 100644 --- a/cmd/cli.go +++ b/cmd/cli.go @@ -3,7 +3,6 @@ package main import ( "os" - "github.com/sirupsen/logrus" "github.com/urfave/cli/v2" ) @@ -14,23 +13,6 @@ var ( verboseEnabled = false ) -// initLogger initializes logger -func initLogger(verbose bool) *logrus.Logger { - logger := logrus.New() - logger.SetFormatter(&logrus.TextFormatter{ - DisableTimestamp: true, - DisableLevelTruncation: true, - }) - // Set logger level - if verbose { - logger.SetLevel(logrus.DebugLevel) - logger.Debug("verbose logging enabled") - } else { - logger.SetLevel(logrus.InfoLevel) - } - return logger -} - func main() { var ( logger = initLogger(verboseEnabled) @@ -101,6 +83,11 @@ func main() { Usage: "Use IPv4 only", Destination: &hub.QueryFlags.UseIPv4, }, + &cli.BoolFlag{ + Name: "time", + Usage: "Display how long it took for the response to arrive", + Destination: &hub.QueryFlags.DisplayTimeTaken, + }, &cli.BoolFlag{ Name: "verbose", Usage: "Enable verbose logging", diff --git a/cmd/hub.go b/cmd/hub.go index bd648f6..1d3ff48 100644 --- a/cmd/hub.go +++ b/cmd/hub.go @@ -18,16 +18,17 @@ type Hub struct { // QueryFlags is used store the value of CLI flags. type QueryFlags struct { - QNames *cli.StringSlice - QTypes *cli.StringSlice - QClasses *cli.StringSlice - Nameservers *cli.StringSlice - IsDOH bool - IsDOT bool - IsUDP bool - UseTCP bool - UseIPv4 bool - UseIPv6 bool + QNames *cli.StringSlice + QTypes *cli.StringSlice + QClasses *cli.StringSlice + Nameservers *cli.StringSlice + IsDOH bool + IsDOT bool + IsUDP bool + UseTCP bool + UseIPv4 bool + UseIPv6 bool + DisplayTimeTaken bool } // NewHub initializes an instance of Hub which holds app wide configuration. @@ -45,3 +46,20 @@ func NewHub(logger *logrus.Logger, buildVersion string) *Hub { } return hub } + +// initLogger initializes logger +func initLogger(verbose bool) *logrus.Logger { + logger := logrus.New() + logger.SetFormatter(&logrus.TextFormatter{ + DisableTimestamp: true, + DisableLevelTruncation: true, + }) + // Set logger level + if verbose { + logger.SetLevel(logrus.DebugLevel) + logger.Debug("verbose logging enabled") + } else { + logger.SetLevel(logrus.InfoLevel) + } + return logger +} diff --git a/cmd/output.go b/cmd/output.go index 06cec3d..9f90a6e 100644 --- a/cmd/output.go +++ b/cmd/output.go @@ -2,11 +2,13 @@ package main import ( "fmt" + "os" "strconv" "github.com/fatih/color" "github.com/miekg/dns" "github.com/mr-karan/doggo/pkg/resolvers" + "github.com/olekukonko/tablewriter" ) // Output takes a list of `dns.Answers` and based @@ -15,6 +17,14 @@ func (hub *Hub) Output(responses []resolvers.Response) { // Create SprintXxx functions to mix strings with other non-colorized strings: green := color.New(color.FgGreen).SprintFunc() blue := color.New(color.FgBlue).SprintFunc() + + table := tablewriter.NewWriter(os.Stdout) + header := []string{"Name", "Type", "Class", "TTL", "Address"} + if hub.QueryFlags.DisplayTimeTaken { + header = append(header, "Time Taken") + } + table.SetHeader(header) + for _, r := range responses { var res string for _, a := range r.Message.Answer { @@ -27,7 +37,13 @@ func (hub *Hub) Output(responses []resolvers.Response) { qclass := dns.Class(h.Class).String() ttl := strconv.FormatInt(int64(h.Ttl), 10) + "s" qtype := blue(dns.Type(h.Rrtype).String()) - fmt.Printf("%s \t %s \t %s \t %s \t %s\n", qtype, name, qclass, ttl, res) + output := []string{name, qtype, qclass, ttl, res} + // Print how long it took + if hub.QueryFlags.DisplayTimeTaken { + output = append(output, fmt.Sprintf("%dms", r.RTT.Milliseconds())) + } + table.Append(output) } } + table.Render() } diff --git a/go.mod b/go.mod index cb8c193..8ebc757 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,10 @@ go 1.15 require ( github.com/fatih/color v1.10.0 + github.com/mattn/go-runewidth v0.0.9 github.com/miekg/dns v1.1.35 + github.com/olekukonko/tablewriter v0.0.4 + github.com/rodaine/table v1.0.1 github.com/sirupsen/logrus v1.7.0 github.com/urfave/cli/v2 v2.3.0 ) diff --git a/go.sum b/go.sum index 74d6bd3..102c46b 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,7 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= @@ -9,18 +10,27 @@ github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/miekg/dns v1.1.35 h1:oTfOaDH+mZkdcgdIjH6yBajRGtIwcwcaR+rt23ZSrJs= github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= +github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rodaine/table v1.0.1 h1:U/VwCnUxlVYxw8+NJiLIuCxA/xa6jL38MY3FYysVWWQ= +github.com/rodaine/table v1.0.1/go.mod h1:UVEtfBsflpeEcD56nF4F5AocNFta0ZuolpSVdPtlmP4= github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -47,3 +57,4 @@ golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapK golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=