diff options
| author | Kevin Wallace <doof@doof.net> | 2021-06-25 23:04:34 -0700 | 
|---|---|---|
| committer | Kevin Wallace <doof@doof.net> | 2021-06-25 23:08:29 -0700 | 
| commit | 94f1e2f000dc79cbb1ef57202f5e6fc354205a21 (patch) | |
| tree | c91764ba9b7069b8163ed19c0dc1b9459eaf21ff | |
| parent | update README.md examples now that NXDOMAINs are unreported (diff) | |
add -asn flag to look up ASN info
| -rw-r--r-- | main.go | 42 | 
1 files changed, 40 insertions, 2 deletions
| @@ -10,6 +10,10 @@ import (  var (  	txt = flag.Bool("txt", false, "also look up TXT records") +	asn = flag.Bool("asn", false, "also look up ASN info from -asn-zone4/-asn-zone6 reverse zones") + +	asnZone4 = flag.String("asn-zone4", "origin.asn.cymru.com", "v4 reverse zone for -asn") +	asnZone6 = flag.String("asn-zone6", "origin6.asn.cymru.com", "v6 reverse zone for -asn")  )  func main() { @@ -20,6 +24,16 @@ func main() {  		} else {  			fmt.Printf("# %s\n", arg)  			for _, ipnet := range ipnets { +				if *asn { +					asnInfos, err := lookupAsnInfo(ipnet) +					if err != nil { +						printErr(ipnet, "ASN", err) +					} else { +						for _, asnInfo := range asnInfos { +							fmt.Printf("# %s\n", asnInfo) +						} +					} +				}  				ip := ipnet.IP  				for ipnet.Contains(ip) {  					if names, err := net.LookupAddr(ip.String()); err != nil { @@ -44,12 +58,12 @@ func main() {  	}  } -func printErr(ip net.IP, rrtype string, err error) { +func printErr(what interface{}, rrtype string, err error) {  	// the error types here are awful and this feels like it might  	// accidentally catch some non-NXDOMAIN errors  	if !strings.HasSuffix(err.Error(), "no such host") &&  		!strings.HasSuffix(err.Error(), "nodename nor servname provided, or not known") { -		fmt.Fprintf(os.Stderr, "%s\t# %s error: %s\n", ip, rrtype, err) +		fmt.Fprintf(os.Stderr, "%s\t# %s error: %s\n", what, rrtype, err)  	}  } @@ -126,6 +140,9 @@ func resolveArg(arg string) ([]net.IPNet, error) {  				ipnets[i] = *ipnet  			}  		} else { +			if ip4 := ip.To4(); ip4 != nil { +				ip = ip4 +			}  			ipnets[i].IP = ip  			ipnets[i].Mask = net.CIDRMask(len(ip)*8, len(ip)*8)  		} @@ -143,3 +160,24 @@ func resolveHost(host string, canLookup bool) ([]net.IP, error) {  	}  	return nil, fmt.Errorf("can't parse IP")  } + +func lookupAsnInfo(ipnet net.IPNet) ([]string, error) { +	ones, bits := ipnet.Mask.Size() +	if bits == 0 { +		return nil, fmt.Errorf("invalid netmask in %s", ipnet) +	} +	var name string +	if ip4 := ipnet.IP.To4(); ip4 != nil { +		for b := (ones-1)/8; b >= 0; b-- { +			name += fmt.Sprintf("%d.", ip4[b]) +		} +		name += *asnZone4 +	} else { +		ip6 := ipnet.IP +		for n := (ones-1)/4; n >= 0; n-- { +			name += fmt.Sprintf("%x.", (ip6[n/2] >> (4-4*(n%2))) & 0xf) +		} +		name += *asnZone6 +	} +	return net.LookupTXT(name) +} |