diff options
| author | Kevin Wallace <doof@doof.net> | 2021-09-30 07:11:14 -0700 | 
|---|---|---|
| committer | Kevin Wallace <doof@doof.net> | 2021-09-30 07:15:50 -0700 | 
| commit | 9c436306cb6733f601527384bb1d6e39cc13d59f (patch) | |
| tree | 9d7ba320b92347fd4f0496acb244310cb5937e25 | |
| parent | add -asn flag to look up ASN info (diff) | |
parse origin info, fetch ASN name
| -rw-r--r-- | main.go | 40 | 
1 files changed, 34 insertions, 6 deletions
| @@ -5,13 +5,15 @@ import (  	"fmt"  	"net"  	"os" +	"strconv"  	"strings"  )  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") +	asn = flag.Bool("asn", false, "also look up ASN info from -asn-zone{,4,6} reverse zones") +	asnZone = flag.String("asn-zone", "asn.cymru.com", "ASN info zone for -asn")  	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")  ) @@ -25,12 +27,22 @@ func main() {  			fmt.Printf("# %s\n", arg)  			for _, ipnet := range ipnets {  				if *asn { -					asnInfos, err := lookupAsnInfo(ipnet) +					originInfos, err := lookupOriginInfo(ipnet)  					if err != nil { -						printErr(ipnet, "ASN", err) +						printErr(ipnet, "origin", err)  					} else { -						for _, asnInfo := range asnInfos { -							fmt.Printf("# %s\n", asnInfo) +						for _, originInfo := range originInfos { +							parts := strings.SplitN(originInfo, " | ", 2) +							if asn, err := strconv.Atoi(parts[0]); err == nil { +								asnNames, err := lookupAsnNames(asn) +								if err != nil { +									printErr(asn, "asn", err) +								} else if len(asnNames) > 0 { +									parts[0] += " | " + strings.Join(asnNames, "; ") +								} +							} +							originInfo = strings.Join(parts, " | ") +							fmt.Printf("# %s\n", originInfo)  						}  					}  				} @@ -161,7 +173,7 @@ func resolveHost(host string, canLookup bool) ([]net.IP, error) {  	return nil, fmt.Errorf("can't parse IP")  } -func lookupAsnInfo(ipnet net.IPNet) ([]string, error) { +func lookupOriginInfo(ipnet net.IPNet) ([]string, error) {  	ones, bits := ipnet.Mask.Size()  	if bits == 0 {  		return nil, fmt.Errorf("invalid netmask in %s", ipnet) @@ -181,3 +193,19 @@ func lookupAsnInfo(ipnet net.IPNet) ([]string, error) {  	}  	return net.LookupTXT(name)  } + +func lookupAsnNames(asn int) ([]string, error) { +	recs, err := net.LookupTXT(fmt.Sprintf("AS%d.%s", asn, *asnZone)) +	if err != nil { +		return nil, err +	} +	var names []string +	for _, rec := range recs { +		parts := strings.Split(rec, " | ") +		if len(parts) != 5 { +			return nil, fmt.Errorf("unknown asn info format for %d: %s", asn, rec) +		} +		names = append(names, parts[4]) +	} +	return names, nil +} |