Add tools for ASNIP database

This commit is contained in:
Denys Fedoryshchenko
2023-08-18 20:02:12 +03:00
parent de020be72a
commit 3a64bfdfff
3 changed files with 115 additions and 0 deletions
+2
View File
@@ -0,0 +1,2 @@
* To retrieve ASN list use get_asndb.sh
* convert_tsv.py ip2asn-v4.tsv ip2asn-v4.csv
+89
View File
@@ -0,0 +1,89 @@
#!/usr/bin/env python3
# Convert a TSV file to a asn.txt
# Source:
# range_start range_end AS_number country_code AS_description
# Result:
# subnet/mask AS_number AS_description country_code
# 1.0.0.0/24 13335 eetc US
# 1.0.4.0/22 38803 etc AU
import sys
import ipaddress
import csv
def calculate_subnets(line_list):
subnets = []
while True:
# Calculate from diff of range_start and range_end subnet size
# 1.1.1.0 1.1.2.0 = 256
subnet1_uint32 = int(ipaddress.IPv4Address(line_list[0]))
subnet2_uint32 = int(ipaddress.IPv4Address(line_list[1]))
subnet_size = subnet2_uint32 - subnet1_uint32
# calculate bitmask
subnet_mask = 32 - subnet_size.bit_length()
# is subnet not exact size of 2^n? verify using subnet_mask
p2 = (2**(32-subnet_mask))-1
if subnet_size != p2:
#print(f'Error: {line} is not a power of 2 {subnet_size} {subnet_mask} {p2}')
# Calculate next subnet
subnet_mask = subnet_mask + 1
subnets.append(f'{line_list[0]}/{subnet_mask}')
#print(f'Adding {line_list[0]}/{subnet_mask}')
# Calculate next subnet
subnet1_uint32 = subnet1_uint32 + (2**(32-subnet_mask))
printable_subnet = str(ipaddress.IPv4Address(subnet1_uint32))
#print(f'Next subnet {printable_subnet}')
# if next subnet is not in range, break
if subnet1_uint32 > subnet2_uint32:
print(f'Error: Subnet {subnet1_uint32} is not in range {subnet2_uint32}')
break
line_list[0] = str(ipaddress.IPv4Address(subnet1_uint32))
else:
# Add subnet to subnets
subnets.append(f'{line_list[0]}/{subnet_mask}')
break
return subnets
def main():
# argv[1] is the input file
# argv[2] is the output file
if len(sys.argv) != 3:
print("Usage: convert_tsv.py <input_file> <output_file>")
sys.exit(1)
# Open the input file
try:
input_file = open(sys.argv[1], 'r')
except IOError:
print("Error: Cannot open input file")
sys.exit(1)
# Open the output file
try:
output_file = csv.writer(open(sys.argv[2], 'w'), delimiter=',',doublequote=True,quoting=csv.QUOTE_ALL)
except IOError:
print("Error: Cannot open output file")
sys.exit(1)
# Read the input file line by line
for line in input_file:
# strip the newline at the end of the line
line = line.rstrip('\n')
# Split the line into a list by tabs
line_list = line.split('\t')
subnets = calculate_subnets(line_list)
for subnet in subnets:
#print(line_list[2] + '\t' + line_list[4] + '\t' + line_list[3] + '\t' + subnet)
# CSV
output_file.writerow([subnet, line_list[2], line_list[4], line_list[3]])
# Write the output file
#output_file.write(str(subnet) + '\t' + line_list[2] + '\t' + line_list[4] + '\t' + line_list[3] + '\n')
input_file.close()
if __name__ == '__main__':
main()
+24
View File
@@ -0,0 +1,24 @@
#!/bin/sh
# Retrieve the latest ASN database from github
# curl https://raw.githubusercontent.com/ipverse/asn-ip/master/as/1234/ipv4-aggregated.txt
# Set the path to the directory where the ASN database will be stored to script_dir
script_dir=$(dirname "$0")
cd $script_dir
curl https://raw.githubusercontent.com/ipverse/asn-info/master/as.csv > as-info.csv
if [ $? -eq 0 ]; then
echo "ASN-Info database updated successfully"
else
echo "ASN-Info database update failed"
fi
# https://iptoasn.com/
# https://iptoasn.com/data/ip2asn-v4.tsv.gz
curl https://iptoasn.com/data/ip2asn-v4.tsv.gz | gunzip > ip2asn-v4.tsv
if [ $? -eq 0 ]; then
echo "ASN database updated successfully"
else
echo "ASN database update failed"
fi
#range_start range_end AS_number country_code AS_description