#!/bin/sh set -e RCI_URL="http://localhost:79/rci/" MAX_INTERFACE_NUM=9 check_dependencies() { local missing="" for cmd in curl jq date; do if ! command -v "$cmd" >/dev/null 2>&1; then missing="$missing $cmd" fi done if [ -n "$missing" ]; then echo "ERROR: Missing required utilities:$missing" >&2 echo "Please install them using: opkg update && opkg install$missing" >&2 return 1 fi return 0 } CLIENT_NAME="" CLIENT_PRIVATE_KEY="" CLIENT_IP="" CLIENT_IPV6="" SERVER_PUBLIC_KEY="" ENDPOINT_PORT=13255 KEEPALIVE=25 MTU=1420 FALLBACK_CONFIG="" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" } error() { echo "[ERROR] $*" >&2 log "ERROR: $*" } usage() { cat <&2 local i for i in 0 1 2 3 4 5 6 7 8 9; do local interface_json=$(curl -s "${RCI_URL}show/rc/interface/Wireguard${i}" 2>/dev/null) if [ -n "${interface_json}" ] && echo "${interface_json}" | jq -e . >/dev/null 2>&1; then local desc=$(echo "${interface_json}" | jq -r '.description // empty' 2>/dev/null) if [ "${desc}" = "${target_desc}" ]; then log "Найден существующий интерфейс: Wireguard${i}" >&2 echo "Wireguard${i}" return 0 fi fi done log "Существующий интерфейс Phobos не найден" >&2 echo "" return 0 } find_free_wireguard_interface() { log "Поиск свободного интерфейса WireGuard..." >&2 local i for i in 0 1 2 3 4 5 6 7 8 9; do local interface_json=$(curl -s "${RCI_URL}show/interface/Wireguard${i}" 2>/dev/null) if [ -z "${interface_json}" ] || ! echo "${interface_json}" | jq -e '.id' >/dev/null 2>&1; then log "Найден свободный интерфейс: Wireguard${i}" >&2 echo "Wireguard${i}" return 0 fi done error "Нет свободных интерфейсов WireGuard (0-${MAX_INTERFACE_NUM})" return 1 } remove_wireguard_interface() { local interface_name="$1" log "Удаление существующего интерфейса: ${interface_name}..." if command -v ndmc >/dev/null 2>&1; then if ndmc -c "no interface ${interface_name}" >/dev/null 2>&1; then log "Интерфейс ${interface_name} успешно удален ✓" return 0 else log "Предупреждение: не удалось удалить интерфейс через ndmc" return 1 fi else log "Предупреждение: команда ndmc не найдена" return 1 fi } configure_wireguard_interface() { local interface_name="$1" local description="Phobos-${CLIENT_NAME}" local client_ip_addr=$(echo "${CLIENT_IP}" | cut -d'/' -f1) local client_ipv6_block="${CLIENT_IPV6}" log "Настройка интерфейса ${interface_name}..." local config_json=$(cat </dev/null) if echo "${result}" | jq -e '.status == "error"' >/dev/null 2>&1; then local error_msg=$(echo "${result}" | jq -r '.message // "Unknown error"' 2>/dev/null) error "RCI API отклонил конфигурацию: ${error_msg}" log "JSON запрос:" log "${config_json}" return 1 fi log "Интерфейс ${interface_name} создан ✓" return 0 } save_configuration() { log "Сохранение конфигурации..." local result=$(curl -s -X POST \ -H "Content-Type: application/json" \ -d '{"system":{"configuration":{"save":{}}}}' \ "${RCI_URL}" 2>/dev/null) if echo "${result}" | grep -q '"status"[[:space:]]*:[[:space:]]*"message"'; then log "Конфигурация сохранена ✓" return 0 else error "Ошибка сохранения конфигурации" return 1 fi } verify_interface_created() { local client_name="$1" local interface_description="Phobos-${client_name}" log "Проверка создания интерфейса WireGuard..." local interfaces=$(curl -s "http://127.0.0.1:79/rci/show/interface" 2>/dev/null || echo "") if [ -z "$interfaces" ]; then error "Не удалось получить список интерфейсов через RCI API" return 1 fi if ! echo "$interfaces" | jq -e . >/dev/null 2>&1; then error "Некорректный JSON ответ от RCI API" return 1 fi local found=$(echo "$interfaces" | jq -r "to_entries[] | select(.value.description == \"$interface_description\") | .key" 2>/dev/null) if [ -n "$found" ]; then log "✓ Интерфейс $found (Phobos-${client_name}) успешно создан" return 0 else error "Интерфейс с description '$interface_description' не найден" return 1 fi } show_fallback_instructions() { cat <&1) if echo "${obf_status}" | grep -q "dead"; then log "⚠ wg-obfuscator остановлен, перезапускаем..." /opt/etc/init.d/S49wg-obfuscator start sleep 2 log "✓ wg-obfuscator перезапущен" else log "✓ wg-obfuscator работает" fi fi log "" log "Ожидание применения конфигурации..." sleep 5 if verify_interface_created "${CLIENT_NAME}"; then log "" log "╔════════════════════════════════════════════════════════════╗" log "║ WireGuard успешно настроен! ║" log "╚════════════════════════════════════════════════════════════╝" log "" exit 0 else log "" log "⚠ Не удалось подтвердить создание интерфейса WireGuard" log "" log "Проверьте вручную в веб-панели Keenetic:" log " Интернет → WireGuard" log "" exit 1 fi } main "$@"