Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import argparse
- import ipaddress
- import json
- def contains_valid_cidr(ip: str) -> bool:
- return '/' in ip and len(ip.split('/')) == 2
- def is_valid_ip(ip: str) -> bool:
- try:
- if contains_valid_cidr(ip):
- ipaddress.ip_address(ip.split('/')[0])
- else:
- ipaddress.ip_address(ip)
- return True
- except Exception:
- return False
- def get_network_range(version: int, ip: str) -> tuple[str, str]:
- if version == 4:
- network = ipaddress.IPv4Network(ip, strict=False)
- else:
- network = ipaddress.IPv6Network(ip, strict=False)
- return network[0].exploded, network[-1].exploded
- # *Try using dataclass instead of dict if you want better typing
- def get_ip_breakdown(addr: str, cidr: str | None) -> dict:
- ip = ipaddress.ip_address(addr)
- if cidr is None:
- cidr = '32' if ip.version == 4 else '64'
- cidr_ip = f"{addr}/{cidr}"
- network_start, network_end = get_network_range(ip.version, cidr_ip)
- return {
- 'version': ip.version,
- 'ip': cidr_ip,
- 'address': addr,
- 'cidr': int(cidr),
- 'network_start': network_start,
- 'network_end': network_end,
- 'bin_address': bin(int(ip)),
- 'bin_start': bin(int(ipaddress.ip_address(network_start))),
- 'bin_end': bin(int(ipaddress.ip_address(network_end))),
- }
- if __name__ == "__main__":
- parser = argparse.ArgumentParser()
- parser.add_argument("ip",
- nargs='?',
- help="IP address or CIDR network")
- args = parser.parse_args()
- if not is_valid_ip(args.ip):
- exit("Invalid input, not an IP address or CIDR network")
- addr, cidr = args.ip, None
- if contains_valid_cidr(addr):
- addr, cidr = addr.split("/")
- breakdown = get_ip_breakdown(addr, cidr)
- print(json.dumps(breakdown, indent=4))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement