Python: Subnet and Host Capacity Calculator

Puedes ver este scripte en Github

#!/usr/bin/env python3
import ipaddress
import sys

def analyze_network(ip_range, new_prefix=None):
    try:
        network = ipaddress.ip_network(ip_range, strict=False)
    except ValueError as e:
        print(f"Error: {e}")
        return

    print(f"\nOriginal Network: {network}")
    print(f"  Network Address: {network.network_address}")
    print(f"  Broadcast Address: {network.broadcast_address}")
    print(f"  Subnet Mask: /{network.prefixlen}")
    print(f"  Usable Hosts: {network.num_addresses - 2}")

    if new_prefix:
        new_prefix = int(new_prefix)
        if new_prefix > network.prefixlen:
            subnets = list(network.subnets(new_prefix=new_prefix))
            print(f"\nSubnets with /{new_prefix}: {len(subnets)}")
            print(f"  Hosts per Subnet: {subnets[0].num_addresses - 2}")
        else:
            print("\nWarning: New prefix must be larger than the original to create subnets.")

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage: python3 ip_analyzer.py <ip_range> [new_prefix]")
        sys.exit(1)

    ip_range = sys.argv[1]
    new_prefix = sys.argv[2] if len(sys.argv) > 2 else None
    analyze_network(ip_range, new_prefix)

Explicación línea por línea de ip_analyzer.py

#!/usr/bin/env python3

Indica que el script debe ejecutarse con el intérprete de Python 3.

import ipaddress
import sys

Importa los módulos necesarios:

  • ipaddress para manipulación de redes IP.

  • sys para acceder a argumentos desde la línea de comandos.

def analyze_network(ip_range, new_prefix=None):

Define una función llamada analyze_network que recibe un rango IP y opcionalmente un nuevo prefijo de subred.

    try:
        network = ipaddress.ip_network(ip_range, strict=False)
    except ValueError as e:
        print(f"Error: {e}")
        return

Intenta crear una red a partir del rango IP ingresado. Si hay un error de formato, lo muestra y termina la función.

    print(f"\nOriginal Network: {network}")
    print(f"  Network Address: {network.network_address}")
    print(f"  Broadcast Address: {network.broadcast_address}")
    print(f"  Subnet Mask: /{network.prefixlen}")
    print(f"  Usable Hosts: {network.num_addresses - 2}")

Imprime la información principal de la red:

  • Red

  • Dirección de red

  • Dirección de broadcast

  • Máscara de subred

  • Cantidad de hosts usables (excluye dirección de red y broadcast)

    if new_prefix:
        new_prefix = int(new_prefix)
        if new_prefix > network.prefixlen:
            subnets = list(network.subnets(new_prefix=new_prefix))
            print(f"\nSubnets with /{new_prefix}: {len(subnets)}")
            print(f"  Hosts per Subnet: {subnets[0].num_addresses - 2}")
        else:
            print("\nWarning: New prefix must be larger than the original to create subnets.")

Si se proporciona un nuevo prefijo:

  • Lo convierte a entero.

  • Verifica que sea mayor que el prefijo original (para poder subdividir).

  • Calcula cuántas subredes se pueden generar y cuántos hosts tiene cada una.

  • Si el prefijo no es válido, muestra una advertencia.

if __name__ == "__main__":

Este bloque se ejecuta solo si el script se corre directamente (no si se importa como módulo).

    if len(sys.argv) < 2:
        print("Usage: python3 ip_analyzer.py <ip_range> [new_prefix]")
        sys.exit(1)

Verifica que al menos se haya pasado un argumento desde la consola. Si no, muestra un mensaje de uso y termina el programa.

    ip_range = sys.argv[1]
    new_prefix = sys.argv[2] if len(sys.argv) > 2 else None
    analyze_network(ip_range, new_prefix)

Toma los argumentos:

  • ip_range: primer argumento.

  • new_prefix: segundo argumento, si existe. Luego llama a la función analyze_network con esos valores.

Last updated