# Author: Kerry Cordero
# Version: 1.0.0
# Description: This script prompt for the IP Address and then the SubnetMask/CIDR. It will output the Network Address, CIDR, Usable IP Range, Broadcast Address, Subnet Mask, and Total Usable IPs.
from prettytable import PrettyTable
import ipaddress
def subnet_calculation(ip_address, subnet):
# Convert the IP address to IPv4Network object
network = ipaddress.IPv4Network(f"{ip_address}/{subnet}", strict=False)
# Calculate the network address
network_address = str(network.network_address)
# Calculate the broadcast address
broadcast_address = str(network.broadcast_address)
# Calculate the CIDR notation
cidr_notation = f"{network_address}/{subnet}"
# Calculate the usable IP range
usable_ips = list(network.hosts())
start_ip = str(usable_ips[0])
end_ip = str(usable_ips[-1])
# Calculate the total number of usable IPs
total_usable_ips = len(usable_ips) # Only count usable addresses
# Create a PrettyTable and add rows
table = PrettyTable()
table.field_names = ["Network Address", "CIDR", "Usable IP Range", "Broadcast Address", "Subnet Mask", "Total Usable"]
table.add_row([network_address, cidr_notation, f"{start_ip} - {end_ip}", broadcast_address, str(network.netmask), total_usable_ips])
return table
# Prompt the user for the IP address
ip_address = input("Enter the IP address: ")
# Prompt the user for the subnet
subnet_input = input("Enter the subnet (in CIDR notation or full write out): ")
# Extract the subnet prefix length from the input
if "/" in subnet_input:
subnet = int(subnet_input.split("/")[1])
else:
# Use the subnet mask to generate a dummy IPv4Interface object, then get its network's prefix length
dummy_interface = ipaddress.IPv4Interface(f"0.0.0.0/{subnet_input}")
subnet = dummy_interface.network.prefixlen
# Call the subnet_calculation function
result_table = subnet_calculation(ip_address, subnet)
# Print the result table
print(result_table)