doggo/cmd/cli.go

117 lines
3.2 KiB
Go
Raw Normal View History

2020-12-09 18:11:09 +01:00
package main
import (
2020-12-16 14:08:34 +01:00
"fmt"
2020-12-09 18:11:09 +01:00
"os"
2020-12-13 13:19:10 +01:00
"github.com/knadh/koanf"
"github.com/knadh/koanf/providers/posflag"
2020-12-13 16:33:44 +01:00
"github.com/sirupsen/logrus"
2020-12-13 13:19:10 +01:00
flag "github.com/spf13/pflag"
2020-12-09 18:11:09 +01:00
)
var (
// Version and date of the build. This is injected at build-time.
2020-12-13 08:15:45 +01:00
buildVersion = "unknown"
buildDate = "unknown"
2020-12-13 13:19:10 +01:00
k = koanf.New(".")
2020-12-09 18:11:09 +01:00
)
func main() {
2020-12-10 10:39:05 +01:00
var (
2020-12-13 08:15:45 +01:00
logger = initLogger()
2020-12-10 10:39:05 +01:00
)
2020-12-13 13:19:10 +01:00
2020-12-10 10:39:05 +01:00
// Initialize hub.
hub := NewHub(logger, buildVersion)
2020-12-10 17:14:04 +01:00
2020-12-13 13:19:10 +01:00
// Configure Flags
// Use the POSIX compliant pflag lib instead of Go's flag lib.
f := flag.NewFlagSet("config", flag.ContinueOnError)
2020-12-13 16:33:44 +01:00
f.Usage = renderCustomHelp
2020-12-13 13:19:10 +01:00
// Path to one or more config files to load into koanf along with some config params.
f.StringSliceP("query", "q", []string{}, "Domain name to query")
f.StringSliceP("type", "t", []string{}, "Type of DNS record to be queried (A, AAAA, MX etc)")
f.StringSliceP("class", "c", []string{}, "Network class of the DNS record to be queried (IN, CH, HS etc)")
2020-12-13 17:00:54 +01:00
f.StringSliceP("nameserver", "n", []string{}, "Address of the nameserver to send packets to")
2020-12-13 13:19:10 +01:00
// Resolver Options
f.Int("timeout", 5, "Sets the timeout for a query to T seconds. The default timeout is 5 seconds.")
2020-12-13 13:19:10 +01:00
f.Bool("search", false, "Use the search list provided in resolv.conf. It sets the `ndots` parameter as well unless overriden by `ndots` flag.")
2020-12-13 17:16:27 +01:00
f.Int("ndots", 1, "Specify the ndots paramter. Default value is taken from resolv.conf and fallbacks to 1 if ndots statement is missing in resolv.conf")
2020-12-13 13:19:10 +01:00
// Output Options
f.BoolP("json", "J", false, "Set the output format as JSON")
f.Bool("time", false, "Display how long it took for the response to arrive")
2020-12-13 16:33:44 +01:00
f.Bool("color", true, "Show colored output")
2020-12-13 13:19:10 +01:00
f.Bool("debug", false, "Enable debug mode")
// Parse and Load Flags
f.Parse(os.Args[1:])
if err := k.Load(posflag.Provider(f, ".", k), nil); err != nil {
2020-12-13 16:33:44 +01:00
hub.Logger.Errorf("error loading flags: %v", err)
f.Usage()
hub.Logger.Exit(2)
}
2020-12-13 17:00:54 +01:00
hub.FreeArgs = f.Args()
2020-12-13 16:33:44 +01:00
// set log level
if k.Bool("debug") {
// Set logger level
hub.Logger.SetLevel(logrus.DebugLevel)
} else {
hub.Logger.SetLevel(logrus.InfoLevel)
2020-12-09 18:11:09 +01:00
}
2020-12-13 17:16:27 +01:00
2020-12-09 18:11:09 +01:00
// Run the app.
2020-12-13 16:33:44 +01:00
hub.Logger.Debug("Starting doggo 🐶")
2020-12-13 13:19:10 +01:00
// Parse Query Args
err := hub.loadQueryArgs()
if err != nil {
hub.Logger.WithError(err).Error("error parsing flags/arguments")
hub.Logger.Exit(2)
}
2020-12-16 14:08:34 +01:00
// Load Nameservers
for _, srv := range hub.QueryFlags.Nameservers {
ns, err := initNameserver(srv)
if err != nil {
hub.Logger.WithError(err).Errorf("error parsing nameserver: %s", ns)
hub.Logger.Exit(2)
}
if ns.Address != "" && ns.Type != "" {
fmt.Println("appending", ns.Address, ns.Type)
hub.Nameservers = append(hub.Nameservers, ns)
}
}
// fallback to system nameserver
if len(hub.Nameservers) == 0 {
ns, err := getDefaultServers()
if err != nil {
hub.Logger.WithError(err).Errorf("error fetching system default nameserver")
hub.Logger.Exit(2)
}
hub.Nameservers = ns
}
// Load Resolvers
err = hub.initResolver()
if err != nil {
hub.Logger.WithError(err).Error("error loading resolver")
hub.Logger.Exit(2)
}
2020-12-13 13:19:10 +01:00
// Start App
if len(hub.QueryFlags.QNames) == 0 {
2020-12-13 16:33:44 +01:00
f.Usage()
hub.Logger.Exit(0)
}
err = hub.Lookup()
if err != nil {
hub.Logger.WithError(err).Error("error looking up DNS records")
hub.Logger.Exit(2)
2020-12-09 18:11:09 +01:00
}
}