From 9c436306cb6733f601527384bb1d6e39cc13d59f Mon Sep 17 00:00:00 2001 From: Kevin Wallace Date: Thu, 30 Sep 2021 07:11:14 -0700 Subject: parse origin info, fetch ASN name --- main.go | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/main.go b/main.go index 01401d4..f96dab8 100644 --- a/main.go +++ b/main.go @@ -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 +} -- cgit v1.2.3