diff --git a/attach-wifi.sh b/attach-wifi.sh new file mode 100644 index 0000000..e252f64 --- /dev/null +++ b/attach-wifi.sh @@ -0,0 +1,37 @@ +#!/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" diff --git a/entrypoint.sh b/entrypoint.sh index 0eed004..7982030 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -5,18 +5,23 @@ log() { echo "[ap-wifi] $*"; } # 1. Interface Wi-Fi -------------------------------------------------- IFACE="${AP_INTERFACE:-}" -log "Attente de la carte Wi-Fi ${IFACE}" +log "Attente de la carte Wi-Fi (à injecter avec : sudo ./attach-wifi.sh)…" FOUND=() for _ in $(seq 1 180); do mapfile -t FOUND < <(iw dev 2>/dev/null | awk '$1=="Interface"{print $2}') if [[ -n "$IFACE" ]]; then printf '%s\n' "${FOUND[@]:-}" | grep -qx "$IFACE" && break - elif [[ ${#FOUND[@]} -eq 1 ]]; then - IFACE="${FOUND[0]}"; break + elif [[ ${#FOUND[@]} -ge 1 ]]; then + IFACE="${FOUND[0]}" + for d in "${FOUND[@]}"; 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 + break fi sleep 1 done -[[ -n "$IFACE" ]] && iw dev "$IFACE" info >/dev/null 2>&1 || { log "ERREUR : interface '${IFACE:-?}' absente après 3 min (détectées : ${FOUND[*]:-aucune})"; exit 1; } +[[ -n "$IFACE" ]] && iw dev "$IFACE" info >/dev/null 2>&1 || { log "ERREUR : interface '${IFACE:-?}' absente après 3 min (détectées : ${FOUND[*]:-aucune}). Lancez attach-wifi.sh"; exit 1; } export AP_INTERFACE="$IFACE" log "Interface utilisée : $IFACE"