diff --git a/.github/workflows/create-lists.yml b/.github/workflows/create-lists.yml index fc62d13..afe873a 100644 --- a/.github/workflows/create-lists.yml +++ b/.github/workflows/create-lists.yml @@ -4,9 +4,9 @@ on: push: branches: [ "main" ] paths: - - .github/** + - .github/create-lists.yml - src/** - - '*.py' + - convert.py schedule: - cron: '29 */8 * * *' diff --git a/.github/workflows/create-subnets.yml b/.github/workflows/create-subnets.yml new file mode 100644 index 0000000..832cc49 --- /dev/null +++ b/.github/workflows/create-subnets.yml @@ -0,0 +1,33 @@ +name: Create subnets + +on: + push: + branches: [ "subnets" ] + paths: + - .github/create-subnets.yml + - get-subnets.py + schedule: + - cron: '15 7 * * 1' + +permissions: + contents: write + +jobs: + generate: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4.1.7 + - name: Generate subnets + uses: actions/setup-python@v5.1.0 + with: + python-version: '3.10' + - run: | + python get-subnets.py + - name: Push subnets + uses: EndBug/add-and-commit@v9.1.4 + with: + add: 'Subnets' + author_name: GitHub Action + author_email: githubaction@githubaction.com + message: 'Update subnet' + push: true \ No newline at end of file diff --git a/get-subnets.py b/get-subnets.py new file mode 100755 index 0000000..f84be58 --- /dev/null +++ b/get-subnets.py @@ -0,0 +1,66 @@ +#!/usr/bin/python3.10 + +import ipaddress +import urllib.request + +BGP_TOOLS_URL = 'https://bgp.tools/table.txt' +USER_AGENT = 'itdog.info - hi@itdog.info' +AS_FILE = 'AS.lst' +IPv4_DIR = 'Subnets/IPv4' +IPv6_DIR = 'Subnets/IPv6' + +AS_META = '32934' +AS_TWITTER = '13414' +META = 'Meta.lst' +TWITTER = 'Twitter.lst' + +subnet_list = [] + +def subnet_summarization(subnet_list): + subnets = [ipaddress.ip_network(subnet) for subnet in subnet_list] + return list(ipaddress.collapse_addresses(subnets)) + +def process_subnets(subnet_list, target_as): + ipv4_subnets = [] + ipv6_subnets = [] + + for subnet_str, as_number in subnet_list: + try: + subnet = ipaddress.ip_network(subnet_str) + if as_number == target_as: + if subnet.version == 4: + ipv4_subnets.append(subnet_str) + elif subnet.version == 6: + ipv6_subnets.append(subnet_str) + except ValueError: + print(f"Invalid subnet: {subnet_str}") + sys.exit(1) + + ipv4_merged = subnet_summarization(ipv4_subnets) + ipv6_merged = subnet_summarization(ipv6_subnets) + + return ipv4_merged, ipv6_merged + +def write_subnets_to_file(subnets, filename): + with open(filename, 'w') as file: + for subnet in subnets: + file.write(f'{subnet}\n') + +if __name__ == '__main__': + request = urllib.request.Request(BGP_TOOLS_URL, headers={'User-Agent': USER_AGENT}) + + with urllib.request.urlopen(request) as response: + for line in response: + decoded_line = line.decode('utf-8').strip() + subnet, as_number = decoded_line.split() + subnet_list.append((subnet, as_number)) + + # Meta + ipv4_merged_meta, ipv6_merged_meta = process_subnets(subnet_list, AS_META) + write_subnets_to_file(ipv4_merged_meta, f'{IPv4_DIR}/{META}') + write_subnets_to_file(ipv6_merged_meta, f'{IPv6_DIR}/{META}') + + # Twitter + ipv4_merged_twitter, ipv6_merged_twitter = process_subnets(subnet_list, AS_TWITTER) + write_subnets_to_file(ipv4_merged_twitter, f'{IPv4_DIR}/{TWITTER}') + write_subnets_to_file(ipv6_merged_twitter, f'{IPv6_DIR}/{TWITTER}') \ No newline at end of file