#!/bin/sh # Сброс сетевого стека macOS после смены хотспота / «интернет не поднимается без перезагрузки». # Типичная причина в связке с docs/connectivity: системный PAC на localhost:1089 при мёртвом/ещё не # поднятом PAC-сервере + кэш DNS / Wi‑Fi. См. HOTSPOT_NETWORK_EMERGENCY.md # # Использование (из корня репозитория): # ./docs/connectivity/scripts/macos-hotspot-network-recover.sh status # ./docs/connectivity/scripts/macos-hotspot-network-recover.sh recover # # Переменные: # MACOS_PAC_SERVICES — как в macos-system-pac.sh (по умолчанию Wi-Fi|Thunderbolt Bridge 2) # WIFI_DEVICE — например en0; иначе авто: первый Device у Hardware Port: Wi-Fi set -e ROOT="$(cd "$(dirname "$0")" && pwd)" PAC_SCRIPT="$ROOT/macos-system-pac.sh" wifi_device() { if [ -n "${WIFI_DEVICE:-}" ]; then printf '%s\n' "$WIFI_DEVICE" return fi # "Device: en0" под блоком "Hardware Port: Wi-Fi" networksetup -listallhardwareports 2>/dev/null \ | awk '/Hardware Port: Wi-Fi$/ {p=1; next} p && /^Device: / {print $2; exit}' } usage() { printf '%s\n' "Usage: $(basename "$0") status|recover" >&2 exit 1 } [ "$#" -eq 1 ] || usage cmd=$1 case "$cmd" in status) echo "=== Wi-Fi device (hardware) ===" wifi_device || true echo "=== networksetup -listallnetworkservices (excerpt) ===" networksetup -listallnetworkservices 2>/dev/null | head -15 || true echo "=== PAC / autoproxy (Wi-Fi + Thunderbolt Bridge 2 if present) ===" if [ -x "$PAC_SCRIPT" ]; then MACOS_PAC_SERVICES="${MACOS_PAC_SERVICES:-Wi-Fi|Thunderbolt Bridge 2}" "$PAC_SCRIPT" status || true fi echo "=== SOCKS firewall (Wi-Fi) ===" networksetup -getsocksfirewallproxy "Wi-Fi" 2>/dev/null || true echo "=== Web proxy (Wi-Fi) ===" networksetup -getwebproxy "Wi-Fi" 2>/dev/null || true echo "=== Listener on 1089 (PAC URL default) ===" if lsof -i :1089 -sTCP:LISTEN 2>/dev/null | head -5; then : else echo "(none — при Enabled PAC в Safari/системе возможны сбои)" fi echo "=== Default route ===" route -n get default 2>/dev/null | head -12 || true echo "=== Quick reachability (ICMP may be blocked on some hotspots) ===" ping -c 1 -W 2000 1.1.1.1 >/dev/null 2>&1 && echo "ping 1.1.1.1: ok" || echo "ping 1.1.1.1: fail" ;; recover) echo "1) Отключаем автоматический PAC на выбранных сервисах..." if [ -x "$PAC_SCRIPT" ]; then MACOS_PAC_SERVICES="${MACOS_PAC_SERVICES:-Wi-Fi|Thunderbolt Bridge 2}" "$PAC_SCRIPT" off else echo "WARN: нет $PAC_SCRIPT — вручную: Системные настройки → Сеть → Wi‑Fi → Подробнее → Прокси → снять «Автоматическая настройка прокси»" >&2 fi echo "2) Отключаем системный SOCKS-прокси на Wi-Fi (если был включён Shadowsocks и т.п.)..." if networksetup -listallnetworkservices 2>/dev/null | grep -Fqx "Wi-Fi"; then networksetup -setsocksfirewallproxystate "Wi-Fi" off 2>/dev/null || true fi echo "3) Сброс DNS-кэша (нужен sudo)..." if sudo -n true 2>/dev/null; then sudo dscacheutil -flushcache 2>/dev/null || true sudo killall -HUP mDNSResponder 2>/dev/null || true echo " mDNSResponder перезагружен." else echo " Пропуск (нет sudo без пароля). Выполните вручную:" echo " sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder" fi dev="$(wifi_device)" if [ -n "$dev" ]; then echo "4) Обновление DHCP на $dev (нужен sudo)..." if sudo -n true 2>/dev/null; then sudo ipconfig set "$dev" DHCP 2>/dev/null || true else echo " Пропуск. Вручную: sudo ipconfig set $dev DHCP" fi echo "5) Краткое выключение/включение Wi‑Fi радиомодуля ($dev)..." networksetup -setairportpower "$dev" off 2>/dev/null || true sleep 2 networksetup -setairportpower "$dev" on 2>/dev/null || true else echo "4–5) Не удалось определить Wi‑Fi device — пропуск DHCP/airport power. Вручную выключите/включите Wi‑Fi в меню." fi echo "=== Готово. Проверка: ===" "$0" status echo "" echo "Если интернет всё ещё нет: откройте хотспот в браузере (captive portal), затем при необходимости снова включите PAC:" echo " ./docs/connectivity/scripts/macos-pac-on.sh" ;; *) usage ;; esac