#!/usr/bin/env bash # Déplace la carte Wi-Fi de l'hôte dans le conteneur ap-wifi. # Usage : sudo ./attach-wifi.sh (carte détectée automatiquement) # ou : sudo ./attach-wifi.sh wlan0 (pour en imposer une) # À relancer après chaque (re)démarrage du conteneur : la carte revient # automatiquement sur l'hôte quand le conteneur s'arrête. set -euo pipefail IFACE="${1:-${AP_INTERFACE:-}}" CONTAINER="${CONTAINER:-ap-wifi}" [[ $EUID -eq 0 ]] || { echo "Lancez en root : sudo $0 wlan0"; exit 1; } # Sans argument, reprendre AP_INTERFACE écrit dans le compose (lu depuis le conteneur) [[ -n "$IFACE" ]] || IFACE="$(docker inspect -f '{{range .Config.Env}}{{println .}}{{end}}' "$CONTAINER" 2>/dev/null | sed -n 's/^AP_INTERFACE=//p')" if [[ -z "$IFACE" ]]; then mapfile -t HOST_IFACES < <(iw dev 2>/dev/null | awk '$1=="Interface"{print $2}') [[ ${#HOST_IFACES[@]} -gt 0 ]] || { echo "Aucune carte Wi-Fi détectée sur l'hôte (voir : iw dev)."; exit 1; } IFACE="${HOST_IFACES[0]}" for d in "${HOST_IFACES[@]}"; do p="$(iw dev "$d" info 2>/dev/null | awk '/wiphy/{print "phy"$2}')" if [[ -n "$p" ]] && iw "$p" info 2>/dev/null | grep -qE '^\s+\* AP$'; then IFACE="$d"; break; fi done echo "Carte détectée automatiquement : $IFACE" fi PID="$(docker inspect -f '{{.State.Pid}}' "$CONTAINER" 2>/dev/null || echo 0)" [[ "$PID" != "0" ]] || { echo "Le conteneur $CONTAINER n'est pas démarré."; exit 1; } PHY="$(iw dev "$IFACE" info 2>/dev/null | awk '/wiphy/{print "phy"$2}')" [[ -n "$PHY" ]] || { echo "Interface $IFACE introuvable sur l'hôte (voir : iw dev)."; exit 1; } # L'hôte ne doit plus gérer la carte nmcli device set "$IFACE" managed no 2>/dev/null || true iw phy "$PHY" set netns "$PID" echo "Carte $IFACE ($PHY) injectée dans $CONTAINER. Suivez le démarrage : docker logs -f $CONTAINER"