refactor(wsl): унифицирована логика hproxy.local и добавлена миграция legacy boot command

- Зачем:
  - setup-hproxy.sh удалял запись из hosts до проверки gateway — при ошибке hosts ломался.
  - update_hproxy() дублировала логику скрипта с багами и не тестировалась.
  - legacy inline boot command в wsl.conf не мигрировался автоматически.
- Что:
  - setup-hproxy.sh: безопасный порядок (gateway → hosts), set -e, экранированная точка в sed.
  - update_hproxy() заменена на thin wrapper с проверкой wsl.conf и ошибок sudo.
  - install.sh: интерактивная замена legacy boot command, детекция существующих [boot] command,
    принимает русскую «у» наравне с «y».
  - README.md: описаны три сценария (WSL NAT, WSL mirrored — host-side resolution, native Linux).
  - добавлены тесты: existing boot command preserved, legacy command migration hint.
- Проверка:
  - bash tests/test_install.sh
  - ./install.sh (интерактивно, ответить «y» на миграцию legacy command)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
ddadminandClaude Opus 4.6 committed 2026-03-22 19:42:50 +03:00
1 parent 1963b6a117
commit 898db1098d
5 files changed
+131 -66

No files matched your search

+15 -37
View File
@@ -3,46 +3,24 @@
# export HTTP_PROXY="http://127.0.0.1:10809"
# export HTTPS_PROXY="http://127.0.0.1:10809"
# --- WSL Host Update ---
# --- WSL Host Update (только WSL NAT) ---
update_hproxy() {
echo "🔄 Обновление IP-адреса для hproxy.local..."
local host_ip=""
local wslconfig=$(ls /mnt/c/Users/*/.wslconfig 2>/dev/null | head -n 1)
local win_hosts="/mnt/c/Windows/System32/drivers/etc/hosts"
# Проверяем наличие параметра networkingMode=mirror в конфиге Windows
if [ -f "$wslconfig" ] && grep -qiE '^[[:space:]]*networkingMode[[:space:]]*=[[:space:]]*mirror' "$wslconfig"; then
echo "🔍 Обнаружен режим Mirror."
# Читаем hosts из Windows
if [ -f "$win_hosts" ] && grep -qiw "hproxy.local" "$win_hosts"; then
# Извлекаем IP (первый столбец) и чистим от виндовых символов возврата каретки (\r)
host_ip=$(grep -iw "hproxy.local" "$win_hosts" | awk '{print $1}' | tr -d '\r' | head -n 1)
echo "📂 Взят IP из Windows hosts: $host_ip"
else
# Фолбэк на случай, если записи в Windows нет
host_ip="127.0.0.1"
echo "⚠️ Запись hproxy.local в Windows hosts не найдена, используем дефолтный $host_ip"
fi
else
echo "🔍 Обнаружен режим NAT."
# Формируем IP на лету из маршрута по умолчанию
host_ip=$(ip route show default | awk '{print $3}')
echo "🌐 Вычислен IP шлюза WSL: $host_ip"
fi
if [ -z "$host_ip" ]; then
echo "❌ Ошибка: Не удалось определить IP-адрес."
local script
script="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")/../scripts/setup-hproxy.sh"
if [ ! -f "$script" ]; then
echo "❌ Скрипт не найден: $script"
return 1
fi
# Обновляем /etc/hosts в Ubuntu
sudo sed -i '/hproxy.local/d' /etc/hosts
echo "$host_ip hproxy.local" | sudo tee -a /etc/hosts > /dev/null
echo "✅ Готово! hproxy.local теперь указывает на $host_ip"
if ! awk '/^\[boot\]$/{b=1;next} /^\[/{b=0} b && /^[[:space:]]*command[[:space:]]*=/ && /setup-hproxy\.sh/' \
"${WSL_CONF_PATH:-/etc/wsl.conf}" 2>/dev/null | grep -q .; then
echo "⚠️ Boot command не настроен — update_hproxy работает только для WSL NAT"
return 1
fi
if ! sudo "$script"; then
echo "❌ Ошибка обновления hproxy.local"
return 1
fi
echo "✅ hproxy.local -> $(getent hosts hproxy.local 2>/dev/null | awk '{print $1}')"
}
# Удобные функции-переключатели для терминала