#!/usr/bin/env bash
# Construye (si hace falta) las imágenes del curso y abre una shell en el
# contenedor de trabajo. La carpeta actual se monta en la misma ruta que tiene
# en la computadora: Containerlab le pide contenedores al Docker de la máquina,
# y ese Docker tiene que encontrar los archivos de cada laboratorio en esa ruta.
#
#   run.sh               abre una shell (si ya está abierta, entra a la misma)
#   run.sh make test     ejecuta un comando dentro del contenedor
#   run.sh --rebuild     reconstruye las imágenes
set -euo pipefail

IMAGE=redes
ROUTER_IMAGE=redes-router
NAME=redes
HERE="$(cd "$(dirname "$0")" && pwd)"

build() {
    docker build -t "$IMAGE" -f "$HERE/Dockerfile" "$HERE/.."
    docker build -t "$ROUTER_IMAGE" -f "$HERE/router.Dockerfile" "$HERE/.."
}

if [ "${1:-}" = "--rebuild" ]; then
    build
    shift
    [ $# -eq 0 ] && exit 0
elif ! docker image inspect "$IMAGE" "$ROUTER_IMAGE" >/dev/null 2>&1; then
    build
fi

[ $# -eq 0 ] && set -- bash
TTY=-i; [ -t 0 ] && TTY=-it

if [ "$(docker inspect -f '{{.State.Running}}' "$NAME" 2>/dev/null)" = "true" ]; then
    MOUNT="$(docker inspect -f '{{index .Config.Labels "redes.mount"}}' "$NAME")"
    case "$PWD/" in
        "$MOUNT"/*) WD="$PWD" ;;
        *) echo "Aviso: el contenedor abierto monta $MOUNT; se entra a esa carpeta." >&2; WD="$MOUNT" ;;
    esac
    exec docker exec $TTY -w "$WD" "$NAME" "$@"
fi

# --privileged, --network host y --pid host son los que Containerlab exige
# cuando corre dentro de un contenedor. Por eso este contenedor es solo para
# el curso y no se usa para otra cosa.
exec docker run --rm $TTY --name "$NAME" --label "redes.mount=$PWD" \
    --privileged --network host --pid host \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /var/run/netns:/var/run/netns \
    -v "$PWD":"$PWD" -w "$PWD" "$IMAGE" "$@"
