# Python: Subnet and Host Capacity Calculator

**Puedes ver este scripte en** [**Github**](https://gist.github.com/shanickcuello/ad6728f04bcc7bc4785d921ba8d345b7)

```python
#!/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`

```python
#!/usr/bin/env python3
```

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

```python
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.

```python
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.

```python
    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.

```python
    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)

```python
    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.

```python
if __name__ == "__main__":
```

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

```python
    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.

```python
    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.









