aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Wallace <doof@doof.net>2021-09-30 07:11:14 -0700
committerKevin Wallace <doof@doof.net>2021-09-30 07:15:50 -0700
commit9c436306cb6733f601527384bb1d6e39cc13d59f (patch)
tree9d7ba320b92347fd4f0496acb244310cb5937e25
parentadd -asn flag to look up ASN info (diff)
parse origin info, fetch ASN name
-rw-r--r--main.go40
1 files 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
+}