Advertisement
Guest User

Untitled

a guest
May 18th, 2025
25
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.91 KB | Source Code | 0 0
  1. import argparse
  2. import ipaddress
  3. import json
  4.  
  5.  
  6. def contains_valid_cidr(ip: str) -> bool:
  7.     return '/' in ip and len(ip.split('/')) == 2
  8.  
  9. def is_valid_ip(ip: str) -> bool:
  10.     try:
  11.         if contains_valid_cidr(ip):
  12.             ipaddress.ip_address(ip.split('/')[0])
  13.         else:
  14.             ipaddress.ip_address(ip)
  15.         return True
  16.     except Exception:
  17.         return False
  18.    
  19. def get_network_range(version: int, ip: str) -> tuple[str, str]:
  20.     if version == 4:
  21.         network = ipaddress.IPv4Network(ip, strict=False)
  22.     else:
  23.         network = ipaddress.IPv6Network(ip, strict=False)
  24.    
  25.     return network[0].exploded, network[-1].exploded
  26.  
  27. # *Try using dataclass instead of dict if you want better typing
  28. def get_ip_breakdown(addr: str, cidr: str | None) -> dict:
  29.     ip = ipaddress.ip_address(addr)
  30.     if cidr is None:
  31.         cidr = '32' if ip.version == 4 else '64'
  32.    
  33.     cidr_ip = f"{addr}/{cidr}"
  34.     network_start, network_end = get_network_range(ip.version, cidr_ip)
  35.  
  36.     return {
  37.         'version': ip.version,
  38.         'ip': cidr_ip,
  39.         'address': addr,
  40.         'cidr': int(cidr),
  41.         'network_start': network_start,
  42.         'network_end': network_end,
  43.         'bin_address': bin(int(ip)),
  44.         'bin_start': bin(int(ipaddress.ip_address(network_start))),
  45.         'bin_end': bin(int(ipaddress.ip_address(network_end))),
  46.     }
  47.  
  48.  
  49. if __name__ == "__main__":
  50.     parser = argparse.ArgumentParser()
  51.     parser.add_argument("ip",
  52.                         nargs='?',
  53.                         help="IP address or CIDR network")
  54.     args = parser.parse_args()
  55.  
  56.     if not is_valid_ip(args.ip):
  57.         exit("Invalid input, not an IP address or CIDR network")
  58.  
  59.     addr, cidr = args.ip, None
  60.     if contains_valid_cidr(addr):
  61.         addr, cidr = addr.split("/")
  62.  
  63.     breakdown = get_ip_breakdown(addr, cidr)
  64.     print(json.dumps(breakdown, indent=4))
  65.    
  66.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement