diff --git a/.drone.jsonnet b/.drone.jsonnet index 5e673fd..bfd5b1c 100644 --- a/.drone.jsonnet +++ b/.drone.jsonnet @@ -84,6 +84,8 @@ local release() = { }; [ + testing("1.19", "amd64"), + testing("1.19", "arm64"), testing("1.18", "amd64"), testing("1.18", "arm64"), diff --git a/.gitignore b/.gitignore index 011681a..0aa6c52 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,5 @@ coverage/* !coverage/.gitkeep awl + +.dccache \ No newline at end of file diff --git a/GNUmakefile b/GNUmakefile index fc8a3cc..c3957fd 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -12,8 +12,9 @@ endif $(PROG): $(GO) build -o $(EXE) $(GOFLAGS) . -## install: installs awl + ifeq ($(OS),Windows_NT) +## install: installs awl install: $(GO) install $(GOFLAGS) . else diff --git a/Makefile b/Makefile index d45f0fd..470145a 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ include template.mk $(PROG): $(GO) build -o $(PROG) $(GOFLAGS) . -## install: installs awl +## install: installs awl and the manpage, RUN AS ROOT install: all install -m755 $(PROG) $(PREFIX)/$(BIN) install -m644 doc/$(PROG).1 $(MAN)/man1 diff --git a/cli/cli.go b/cli/cli.go index 89421b1..d034374 100644 --- a/cli/cli.go +++ b/cli/cli.go @@ -4,8 +4,10 @@ package cli import ( "fmt" + "net" "os" "runtime" + "strconv" "strings" "time" @@ -56,7 +58,8 @@ func ParseCLI(version string) (Options, error) { cookie = flag.Bool("no-cookie", false, "disable sending EDNS cookie (default: cookie sent)") tcpKeepAlive = flag.Bool("keep-alive", false, "send EDNS TCP keep-alive") udpBufSize = flag.Uint16("buffer-size", 1232, "set EDNS UDP buffer size", flag.OptShorthand('b')) - zflag = flag.Uint16("zflag", 0, "set EDNS z-flag") + zflag = flag.String("zflag", "0", "set EDNS z-flag") + subnet = flag.String("subnet", "", "set EDNS subnet") padding = flag.Bool("pad", false, "set EDNS padding") truncate = flag.Bool("no-truncate", false, "ignore truncation if a UDP request truncates (default: retry with TCP)") @@ -83,6 +86,7 @@ func ParseCLI(version string) (Options, error) { noC = flag.Bool("no-comments", false, "disable printing the comments") noQ = flag.Bool("no-question", false, "disable printing the question section") + noOpt = flag.Bool("no-opt", false, "disable printing the OPT pseudosection") noAns = flag.Bool("no-answer", false, "disable printing the answer section") noAuth = flag.Bool("no-authority", false, "disable printing the authority section") noAdd = flag.Bool("no-additional", false, "disable printing the additonal section") @@ -101,6 +105,12 @@ func ParseCLI(version string) (Options, error) { return Options{Logger: util.InitLogger(*verbosity)}, err } + // TODO: DRY, dumb dumb. + mbz, err := strconv.ParseInt(*zflag, 0, 16) + if err != nil { + return Options{Logger: util.InitLogger(*verbosity)}, err + } + opts := Options{ Logger: util.InitLogger(*verbosity), Port: *port, @@ -138,6 +148,7 @@ func ParseCLI(version string) (Options, error) { Display: Displays{ Comments: !*noC, Question: !*noQ, + Opt: !*noOpt, Answer: !*noAns, Authority: !*noAuth, Additional: !*noAdd, @@ -152,11 +163,43 @@ func ParseCLI(version string) (Options, error) { Expire: *expire, KeepOpen: *tcpKeepAlive, Nsid: *nsid, - ZFlag: *zflag, + ZFlag: uint16(mbz & 0x7FFF), Padding: *padding, }, } + // TODO: DRY + if *subnet != "" { + ip, inet, err := net.ParseCIDR(*subnet) + if err != nil { + // TODO: make not a default? + if *subnet == "0" { + opts.EDNS.Subnet = dns.EDNS0_SUBNET{ + Code: dns.EDNS0SUBNET, + Family: 1, + SourceNetmask: 0, + SourceScope: 0, + Address: net.IPv4(0, 0, 0, 0), + } + } else { + return Options{Logger: util.InitLogger(*verbosity)}, err + } + } else { + sub, _ := inet.Mask.Size() + opts.EDNS.Subnet = *new(dns.EDNS0_SUBNET) + opts.EDNS.Subnet.Address = ip + opts.EDNS.Subnet.SourceNetmask = uint8(sub) + switch ip.To4() { + case nil: + // Not a valid IPv4 so assume IPv6 + opts.EDNS.Subnet.Family = 2 + default: + // Valid IPv4 + opts.EDNS.Subnet.Family = 1 + } + } + } + opts.Logger.Info("POSIX flags parsed") opts.Logger.Debug(fmt.Sprintf("%+v", opts)) diff --git a/cli/cli_test.go b/cli/cli_test.go index 087e6f4..93a5a4f 100644 --- a/cli/cli_test.go +++ b/cli/cli_test.go @@ -30,6 +30,26 @@ func TestTLSPort(t *testing.T) { os.Args = old } +func TestSubnet(t *testing.T) { + old := os.Args + os.Args = []string{"awl", "--subnet", "127.0.0.1/32"} + opts, err := cli.ParseCLI("TEST") + assert.NilError(t, err) + assert.Equal(t, opts.EDNS.Subnet.Family, uint16(1)) + + os.Args = []string{"awl", "--subnet", "0"} + opts, err = cli.ParseCLI("TEST") + assert.NilError(t, err) + assert.Equal(t, opts.EDNS.Subnet.Family, uint16(1)) + os.Args = old + + os.Args = []string{"awl", "--subnet", "::/0"} + opts, err = cli.ParseCLI("TEST") + assert.NilError(t, err) + assert.Equal(t, opts.EDNS.Subnet.Family, uint16(2)) + os.Args = old +} + func TestInvalidFlag(t *testing.T) { old := os.Args os.Args = []string{"awl", "--treebug"} diff --git a/cli/dig.go b/cli/dig.go index 60e0b56..8a09220 100644 --- a/cli/dig.go +++ b/cli/dig.go @@ -4,9 +4,12 @@ package cli import ( "fmt" + "net" "strconv" "strings" "time" + + "github.com/miekg/dns" ) // Parse dig-like commands and set the options as such. @@ -93,6 +96,8 @@ func ParseDig(arg string, opts *Options) error { opts.Display.Comments = isNo case "question": opts.Display.Question = isNo + case "opt": + opts.Display.Opt = isNo case "answer": opts.Display.Answer = isNo case "authority": @@ -104,6 +109,7 @@ func ParseDig(arg string, opts *Options) error { case "all": opts.Display.Comments = isNo opts.Display.Question = isNo + opts.Display.Opt = isNo opts.Display.Answer = isNo opts.Display.Authority = isNo opts.Display.Additional = isNo @@ -113,41 +119,54 @@ func ParseDig(arg string, opts *Options) error { default: // Recursive switch statements WOO - switch { - case strings.HasPrefix(arg, "time"), strings.HasPrefix(arg, "timeout"): - timeout, err := strconv.Atoi(strings.Split(arg, "=")[1]) + arg := strings.Split(arg, "=") + switch arg[0] { - if err != nil { - return fmt.Errorf("digflags: Invalid timeout value") - } + case "time", "timeout": + if len(arg) > 1 && arg[1] != "" { + timeout, err := strconv.Atoi(arg[1]) - opts.Request.Timeout = time.Duration(timeout) - - case strings.HasPrefix(arg, "retry"), strings.HasPrefix(arg, "tries"): - tries, err := strconv.Atoi(strings.Split(arg, "=")[1]) - if err != nil { - return fmt.Errorf("digflags: Invalid retry value") - } - - if strings.HasPrefix(arg, "tries") { - tries++ - } - - opts.Request.Retries = tries - - case strings.HasPrefix(arg, "bufsize"): - size, err := strconv.Atoi(strings.Split(arg, "=")[1]) - if err != nil { - return fmt.Errorf("digflags: Invalid UDP buffer size value") - } - opts.EDNS.BufSize = uint16(size) - - case strings.HasPrefix(arg, "ednsflags"): - split := strings.Split(arg, "=") - if len(split) > 1 { - ver, err := strconv.ParseInt(split[1], 0, 16) if err != nil { - return fmt.Errorf("digflags: Invalid EDNS flag") + return fmt.Errorf("digflags: Invalid timeout value: %w", err) + } + + opts.Request.Timeout = time.Duration(timeout) + } else { + return fmt.Errorf("digflags: Invalid timeout value: %w", errNoArg) + } + + case "retry", "tries": + if len(arg) > 1 && arg[1] != "" { + tries, err := strconv.Atoi(arg[1]) + if err != nil { + return fmt.Errorf("digflags: Invalid retry value: %w", err) + } + opts.Request.Retries = tries + + // TODO: Is there a better way to do this? + if arg[0] == "tries" { + opts.Request.Retries++ + } + } else { + return fmt.Errorf("digflags: Invalid retry value: %w", errNoArg) + } + + case "bufsize": + if len(arg) > 1 && arg[1] != "" { + size, err := strconv.Atoi(arg[1]) + if err != nil { + return fmt.Errorf("digflags: Invalid UDP buffer size value: %w", err) + } + opts.EDNS.BufSize = uint16(size) + } else { + return fmt.Errorf("digflags: Invalid UDP buffer size value: %w", errNoArg) + } + + case "ednsflags": + if len(arg) > 1 && arg[1] != "" { + ver, err := strconv.ParseInt(arg[1], 0, 16) + if err != nil { + return fmt.Errorf("digflags: Invalid EDNS flag: %w", err) } // Ignore setting DO bit opts.EDNS.ZFlag = uint16(ver & 0x7FFF) @@ -155,20 +174,51 @@ func ParseDig(arg string, opts *Options) error { opts.EDNS.ZFlag = 0 } - case strings.HasPrefix(arg, "edns"): + case "edns": opts.EDNS.EnableEDNS = isNo - split := strings.Split(arg, "=") - if len(split) > 1 { - ver, err := strconv.Atoi(split[1]) + if len(arg) > 1 && arg[1] != "" { + ver, err := strconv.Atoi(arg[1]) if err != nil { - return fmt.Errorf("digflags: Invalid EDNS version") + return fmt.Errorf("digflags: Invalid EDNS version: %w", err) } opts.EDNS.Version = uint8(ver) } else { opts.EDNS.Version = 0 } - case strings.HasPrefix(arg, "subnet"): + case "subnet": + if len(arg) > 1 && arg[1] != "" { + ip, inet, err := net.ParseCIDR(arg[1]) + if err != nil { + // TODO: make not a default? + if arg[1] == "0" { + opts.EDNS.Subnet = dns.EDNS0_SUBNET{ + Code: dns.EDNS0SUBNET, + Family: 1, + SourceNetmask: 0, + SourceScope: 0, + Address: net.IPv4(0, 0, 0, 0), + } + return nil + } else { + return fmt.Errorf("digflags: Invalid EDNS Subnet: %w", errNoArg) + } + } + subnet, _ := inet.Mask.Size() + opts.EDNS.Subnet = *new(dns.EDNS0_SUBNET) + opts.EDNS.Subnet.Address = ip + opts.EDNS.Subnet.SourceNetmask = uint8(subnet) + switch ip.To4() { + case nil: + // Not a valid IPv4 so assume IPv6 + opts.EDNS.Subnet.Family = 2 + default: + // Valid IPv4 + opts.EDNS.Subnet.Family = 1 + } + } else { + return fmt.Errorf("digflags: Invalid EDNS Subnet: %w", errNoArg) + } default: return fmt.Errorf("digflags: unknown flag %s given", arg) diff --git a/cli/dig_test.go b/cli/dig_test.go index ed6704d..03e84d8 100644 --- a/cli/dig_test.go +++ b/cli/dig_test.go @@ -28,13 +28,15 @@ func FuzzDig(f *testing.F) { "edns", "edns=a", "edns=0", "noedns", "expire", "noexpire", "ednsflags", "ednsflags=\"", "ednsflags=1", "noednsflags", + "subnet=0.0.0.0/0", "subnet=::0/0", "subnet=b", "subnet=0", "subnet", "cookie", "nocookeie", "keepopen", "keepalive", "nokeepopen", "nokeepalive", "nsid", "nonsid", "padding", "nopadding", - "bufsize=512", "bufsize=a", - "time=5", "timeout=a", - "retry=a", "tries=3", + "bufsize=512", "bufsize=a", "bufsize", + "time=5", "timeout=a", "timeout", + "retry=a", "retry=3", "retry", + "tries=2", "tries=b", "tries", "tcp", "vc", "notcp", "novc", "ignore", "noignore", "tls", "notls", @@ -48,6 +50,7 @@ func FuzzDig(f *testing.F) { "yaml", "noyaml", "comments", "nocomments", "question", "noquestion", + "opt", "noopt", "answer", "noanswer", "authority", "noauthority", "additional", "noadditional", diff --git a/cli/misc.go b/cli/misc.go index c2bbb94..6d8e1b7 100644 --- a/cli/misc.go +++ b/cli/misc.go @@ -46,23 +46,29 @@ func ParseMiscArgs(args []string, opts *Options) error { default: opts.Request.Server = arg } + + // Dig-style +queries + case strings.HasPrefix(arg, "+"): + opts.Logger.Info(arg, "detected as a dig query") + err = ParseDig(strings.ToLower(arg[1:]), opts) + if err != nil { + return err + } + + // Domain names case strings.Contains(arg, "."): opts.Logger.Info(arg, "detected as a domain name") opts.Request.Name, err = idna.ToASCII(arg) if err != nil { return err } + + // DNS query type case ok: opts.Logger.Info(arg, "detected as a type") - // If it's a DNS request, it's a DNS request (obviously) opts.Request.Type = r - case strings.HasPrefix(arg, "+"): - opts.Logger.Info(arg, "detected as a dig query") - // Dig-style +queries - err = ParseDig(strings.ToLower(arg[1:]), opts) - if err != nil { - return err - } + + // Domain? default: opts.Logger.Info(arg, "is unknown. Assuming domain") opts.Request.Name, err = idna.ToASCII(arg) diff --git a/cli/options.go b/cli/options.go index 1e51cab..9183e38 100644 --- a/cli/options.go +++ b/cli/options.go @@ -7,6 +7,8 @@ import ( "git.froth.zone/sam/awl/internal/helpers" "git.froth.zone/sam/awl/logawl" + + "github.com/miekg/dns" ) // CLI options structure. @@ -49,6 +51,7 @@ type Options struct { type Displays struct { Comments bool Question bool // QUESTION SECTION + Opt bool // OPT PSEUDOSECTION Answer bool // ANSWER SECTION Authority bool // AUTHORITY SECTION Additional bool // ADDITIONAL SECTION @@ -57,22 +60,19 @@ type Displays struct { } type EDNS struct { - EnableEDNS bool // Enable EDNS - Cookie bool // Enable EDNS cookie - DNSSEC bool // Enable DNSSEC - BufSize uint16 // Set UDP buffer size - Version uint8 // Set EDNS version - Expire bool // Set EDNS expiration - KeepOpen bool // TCP keep alive - Nsid bool // Show EDNS nsid - ZFlag uint16 // EDNS flags - Padding bool // EDNS padding - // Subnet EDNS_SUBNET + EnableEDNS bool // Enable EDNS + Cookie bool // Enable EDNS cookie + DNSSEC bool // Enable DNSSEC + BufSize uint16 // Set UDP buffer size + Version uint8 // Set EDNS version + Expire bool // Set EDNS expiration + KeepOpen bool // TCP keep alive + Nsid bool // Show EDNS nsid + ZFlag uint16 // EDNS flags + Padding bool // EDNS padding + Subnet dns.EDNS0_SUBNET // EDNS Subnet (duh) } -// Subnets get their own structure because complicated -// type EDNS_SUBNET struct { -// family uint16 -// } - var ErrNotError = errors.New("not an error") + +var errNoArg = errors.New("no argument given") diff --git a/conf/unix_test.go b/conf/unix_test.go index 9899c3a..64df984 100644 --- a/conf/unix_test.go +++ b/conf/unix_test.go @@ -13,7 +13,7 @@ import ( func TestNonWinConfig(t *testing.T) { if runtime.GOOS == "windows" { - t.Skip("Not running Windows, skipping") + t.Skip("Running Windows, skipping") } conf, err := conf.GetDNSConfig() assert.NilError(t, err) diff --git a/doc/awl.1 b/doc/awl.1 index 7a11969..27e4a92 100644 --- a/doc/awl.1 +++ b/doc/awl.1 @@ -5,7 +5,7 @@ .nh .ad l .\" Begin generated content: -.TH "awl" "1" "2022-07-29" +.TH "awl" "1" "2022-08-01" .PP .SH NAME awl - DNS lookup tool @@ -23,11 +23,11 @@ where .PP .SH DESCRIPTION .PP -\fBawl\fR (\fBa\fRwls \fBw\fRant \fBl\fRicorice) is a simple tool designed to make DNS queries +\fBawl\fR (\fBa\fRwls \fBw\fRant \fBl\fRicorice) is a simple tool designed to make DNS queries , much like the venerable \fIdig\fR(1).\& An awl is a tool used to make small holes, typically used in leatherworking.\& .PP -\fBawl\fR is designed to be a more "modern" version of \fIdrill\fR(1) by including +\fBawl\fR is designed to be a more "modern" version of \fIdrill\fR(1) by including some more recent RFCs and output options.\& \fBawl\fR is still heavily Work-In-Progress so some features may get added or removed.\& .PP @@ -214,6 +214,10 @@ Setting the first bit (DO) will be ignored, use \fB-D\fR instead .br Set EDNS padding .PP +\fB+subnet\fR=\fIaddr/prefix\fR +.br + Set EDNS client subnet +.PP .RE .SS Output Display .RS 4 diff --git a/go.mod b/go.mod index 64960c3..cd6db6b 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/lucas-clemente/quic-go v0.28.1 github.com/miekg/dns v1.1.50 github.com/stefansundin/go-zflag v1.1.1 - golang.org/x/net v0.0.0-20220728211354-c7608f3a8462 + golang.org/x/net v0.0.0-20220802222814-0bcc04d9c69b gopkg.in/yaml.v3 v3.0.1 gotest.tools/v3 v3.3.0 ) @@ -34,7 +34,7 @@ require ( github.com/stretchr/testify v1.8.0 // indirect golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect - golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 + golang.org/x/sys v0.0.0-20220731174439-a90be440212d golang.org/x/text v0.3.7 // indirect golang.org/x/tools v0.1.12 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect diff --git a/go.sum b/go.sum index 68c3834..45dfb38 100644 --- a/go.sum +++ b/go.sum @@ -219,18 +219,10 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220726230323-06994584191e h1:wOQNKh1uuDGRnmgF0jDxh7ctgGy/3P4rYWQRVJD4/Yg= -golang.org/x/net v0.0.0-20220726230323-06994584191e/go.mod h1:AaygXjzTFtRAg2ttMY5RMuhpJ3cNnI0XpyFJD1iQRSM= -golang.org/x/net v0.0.0-20220728012108-993b7b1e3a27 h1:Khs7GS6mUxEA1e5DfKm9ojYX4BiI297wdliOwp/CPmw= -golang.org/x/net v0.0.0-20220728012108-993b7b1e3a27/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20220728030405-41545e8bf201 h1:bvOltf3SADAfG05iRml8lAB3qjoEX5RCyN4K6G5v3N0= -golang.org/x/net v0.0.0-20220728030405-41545e8bf201/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20220728153142-1f511ac62c11 h1:BZ+7NKCw5UIzmPP4GFz9VcjTVpN9mswsWRDmJ2tWKAs= -golang.org/x/net v0.0.0-20220728153142-1f511ac62c11/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20220728181054-f92ba40d432d h1:3iMzhioG3w6/URLOo7X7eZRkWoLdz9iWE/UsnXHNTfY= -golang.org/x/net v0.0.0-20220728181054-f92ba40d432d/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20220728211354-c7608f3a8462 h1:UreQrH7DbFXSi9ZFox6FNT3WBooWmdANpU+IfkT1T4I= golang.org/x/net v0.0.0-20220728211354-c7608f3a8462/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20220802222814-0bcc04d9c69b h1:3ogNYyK4oIQdIKzTu68hQrr4iuVxF3AxKl9Aj/eDrw0= +golang.org/x/net v0.0.0-20220802222814-0bcc04d9c69b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -242,7 +234,6 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -270,10 +261,8 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220727055044-e65921a090b8 h1:dyU22nBWzrmTQxtNrr4dzVOvaw35nUYE279vF9UmsI8= -golang.org/x/sys v0.0.0-20220727055044-e65921a090b8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 h1:WIoqL4EROvwiPdUtaip4VcDdpZ4kha7wBWZrbVKCIZg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220731174439-a90be440212d h1:Sv5ogFZatcgIMMtBSTTAgMYsicp25MXBubjXNDKwm80= +golang.org/x/sys v0.0.0-20220731174439-a90be440212d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -297,8 +286,6 @@ golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.11 h1:loJ25fNOEhSXfHrpoGj91eCUThwdNX6u24rO1xnNteY= -golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/query/query.go b/query/query.go index 2ba34e7..05e2c93 100644 --- a/query/query.go +++ b/query/query.go @@ -76,6 +76,10 @@ func CreateQuery(opts cli.Options) (helpers.Response, error) { opts.Logger.Info("EDNS DNSSEC OK set") } + if opts.EDNS.Subnet.Address != nil { + o.Option = append(o.Option, &opts.EDNS.Subnet) + } + req.Extra = append(req.Extra, o) } else { if opts.EDNS.DNSSEC { @@ -109,7 +113,7 @@ func CreateQuery(opts cli.Options) (helpers.Response, error) { str += "\n;; QUERY SIZE: " + strconv.Itoa(req.Len()) } fmt.Println(str, "\n------") - opts.QR = false + opts.ShowQuery = false } } diff --git a/query/struct.go b/query/struct.go index 1c3d9ae..f776331 100644 --- a/query/struct.go +++ b/query/struct.go @@ -60,7 +60,7 @@ func ToString(res helpers.Response, opts cli.Options) string { s += "AUTHORITY: " + strconv.Itoa(len(res.DNS.Ns)) + ", " s += "ADDITIONAL: " + strconv.Itoa(len(res.DNS.Extra)) + "\n" opt = res.DNS.IsEdns0() - if opt != nil { + if opt != nil && opts.Display.Opt { // OPT PSEUDOSECTION s += opt.String() + "\n" } diff --git a/template.mk b/template.mk index e197a34..57cfc31 100644 --- a/template.mk +++ b/template.mk @@ -7,7 +7,7 @@ VER ?= "git-$(HASH)" CGO_ENABLED ?= 0 GO ?= go COVER ?= $(GO) tool cover -GOFLAGS ?= -ldflags "-s -w -X=main.version=$(VER)" +GOFLAGS ?= -ldflags "-s -w -X=main.version=$(VER)" -trimpath PREFIX ?= /usr/local BIN ?= bin @@ -24,7 +24,6 @@ doc/$(PROG).1: doc/wiki/$(PROG).1.md @cp doc/awl.1 doc/awl.bak $(SCDOC) doc/$(PROG).1 && rm doc/awl.bak || mv doc/awl.bak doc/awl.1 - ## test: run go test test: $(GO) test -cover -coverprofile=coverage/coverage.out ./...