import os
from asyncio import sleep
import ipaddress
import requests
import time
def generate_ip_ranges(start, end) -> list:
ip_ranges = []
for i in range(start, end + 1):
ip_ranges.append(f"{i}.0.0.0/8")
return ip_ranges
def calculate_public_ips(subnets, private_ranges, output_dir):
available_ips_info = {}
excluded_ips = set()
for private in private_ranges:
excluded_network = ipaddress.ip_network(private)
excluded_ips.update(excluded_network.hosts())
os.makedirs(output_dir, exist_ok=True)
for subnet in subnets:
network = ipaddress.ip_network(subnet, strict=False)
total_ips = network.num_addresses - 2 available_ips = [ip for ip in network.hosts() if ip not in excluded_ips]
available_count = len(available_ips)
available_ips_info[subnet] = {
"total_ips": total_ips,
"available_count": available_count,
"available_ips": available_ips
}
print(f"\nAvailable IPs in subnet: {subnet}:")
net = f"{subnet}"
file_name = f"{output_dir}/ip_list_{net.split('/')[0]}.txt"
if not os.path.exists(file_name):
with open(file_name, "a+") as file1:
for ip in available_ips:
file1.write(str(ip) + "\n")
else:
print(f"File {file_name} already exists. Skipping write.")
private_ranges = [
"10.0.0.0/8",
"172.16.0.0/12",
"192.168.0.0/16",
]
def main() -> None:
public_subnets = generate_ip_ranges(1, 223)
output_directory = "./ip_list"
print(f"Calculating IPs for {len(public_subnets)} subnets")
calculate_public_ips(public_subnets, private_ranges, output_directory)
if __name__ == "__main__":
main()