419 lines
20 KiB
PowerShell
419 lines
20 KiB
PowerShell
# ==========================================
|
||
# <20>️ PROXIFYRE INSTALLER ДЛЯ DISCORD/VESKTOP
|
||
# ==========================================
|
||
param(
|
||
[switch]$Force, # Принудительная переустановка
|
||
[string]$Proxy = "", # Адрес прокси (для неинтерактивного режима), например "127.0.0.1:8080"
|
||
[string[]]$Apps = @(), # Приложения (для неинтерактивного режима), например @("Discord", "Vesktop")
|
||
[switch]$Silent # Тихий режим (без лишнего вывода, для вызова из других скриптов)
|
||
)
|
||
|
||
# ==========================================
|
||
# 🛠️ ПРЯМЫЕ ССЫЛКИ (Hardcoded)
|
||
# ==========================================
|
||
$InstallPath = "C:\Tools\ProxiFyre"
|
||
$DriverUrl = "https://github.com/wiresock/ndisapi/releases/download/v3.6.2/Windows.Packet.Filter.3.6.2.1.x64.msi"
|
||
$AppUrl = "https://github.com/wiresock/proxifyre/releases/download/v2.1.4/ProxiFyre-v2.1.4-x64-signed.zip"
|
||
# ==========================================
|
||
|
||
# 0. Проверка прав
|
||
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
|
||
Write-Host "⛔ Запусти от имени АДМИНИСТРАТОРА!" -ForegroundColor Red
|
||
Start-Sleep -s 3; Exit
|
||
}
|
||
|
||
Clear-Host
|
||
Write-Host "==========================================" -ForegroundColor Cyan
|
||
Write-Host " 🚀 PROXIFYRE SERVICE INSTALLER " -ForegroundColor Cyan
|
||
Write-Host "==========================================" -ForegroundColor Cyan
|
||
|
||
# ==========================================
|
||
# ПРОВЕРКА СУЩЕСТВУЮЩЕЙ УСТАНОВКИ
|
||
# ==========================================
|
||
$proxifyreExists = Test-Path "$InstallPath\ProxiFyre.exe"
|
||
$proxifyreService = Get-Service -Name "ProxiFyreService" -ErrorAction SilentlyContinue
|
||
|
||
if ($proxifyreExists -and -not $Force) {
|
||
Write-Host ""
|
||
Write-Host "==========================================" -ForegroundColor Green
|
||
Write-Host " ✅ PROXIFYRE УЖЕ УСТАНОВЛЕН! " -ForegroundColor Green
|
||
Write-Host "==========================================" -ForegroundColor Green
|
||
Write-Host ""
|
||
|
||
# Статус службы
|
||
Write-Host "📊 Статус службы: " -NoNewline -ForegroundColor Yellow
|
||
if ($proxifyreService -and $proxifyreService.Status -eq 'Running') {
|
||
Write-Host "РАБОТАЕТ" -ForegroundColor Green
|
||
}
|
||
elseif ($proxifyreService) {
|
||
Write-Host "$($proxifyreService.Status)" -ForegroundColor Red
|
||
}
|
||
else {
|
||
Write-Host "НЕ ЗАРЕГИСТРИРОВАНА" -ForegroundColor Red
|
||
}
|
||
|
||
Write-Host ""
|
||
Write-Host "📁 Расположение:" -ForegroundColor Yellow
|
||
Write-Host " Путь: $InstallPath" -ForegroundColor White
|
||
Write-Host " Конфиг: $InstallPath\app-config.json" -ForegroundColor White
|
||
Write-Host " Логи: $InstallPath\logs\" -ForegroundColor White
|
||
Write-Host ""
|
||
|
||
# Показываем текущий конфиг
|
||
$configPath = "$InstallPath\app-config.json"
|
||
if (Test-Path $configPath) {
|
||
try {
|
||
$config = Get-Content $configPath -Raw | ConvertFrom-Json
|
||
$apps = $config.proxies[0].appNames -join ", "
|
||
$proxy = $config.proxies[0].socks5ProxyEndpoint
|
||
Write-Host "⚙️ Текущие настройки:" -ForegroundColor Yellow
|
||
Write-Host " Прокси: $proxy" -ForegroundColor White
|
||
Write-Host " Приложения: $apps" -ForegroundColor White
|
||
Write-Host ""
|
||
}
|
||
catch {
|
||
Write-Host " ⚠️ Не удалось прочитать конфиг" -ForegroundColor Yellow
|
||
}
|
||
}
|
||
|
||
Write-Host "==========================================" -ForegroundColor Cyan
|
||
Write-Host ""
|
||
Write-Host "Что вы хотите сделать?" -ForegroundColor Yellow
|
||
Write-Host " [1] Запустить службу" -ForegroundColor White
|
||
Write-Host " [2] Остановить службу" -ForegroundColor White
|
||
Write-Host " [3] Перезапустить службу" -ForegroundColor White
|
||
Write-Host " [4] Изменить настройки (прокси/приложения)" -ForegroundColor White
|
||
Write-Host " [5] Показать логи" -ForegroundColor White
|
||
Write-Host " [6] Показать конфиг" -ForegroundColor White
|
||
Write-Host " [7] Переустановить (полная переустановка)" -ForegroundColor White
|
||
Write-Host " [q] Выход" -ForegroundColor White
|
||
Write-Host ""
|
||
$choice = Read-Host "👉 Выбор (1-7/q)"
|
||
|
||
switch ($choice) {
|
||
"1" {
|
||
Write-Host "`n🚀 Запуск службы..." -ForegroundColor Cyan
|
||
Start-Process -FilePath "$InstallPath\ProxiFyre.exe" -ArgumentList "start" -Wait -NoNewWindow
|
||
Start-Sleep -s 2
|
||
$svc = Get-Service -Name "ProxiFyreService" -ErrorAction SilentlyContinue
|
||
Write-Host " Статус: $($svc.Status)" -ForegroundColor Green
|
||
exit 0
|
||
}
|
||
"2" {
|
||
Write-Host "`n⏹️ Остановка службы..." -ForegroundColor Cyan
|
||
Start-Process -FilePath "$InstallPath\ProxiFyre.exe" -ArgumentList "stop" -Wait -NoNewWindow
|
||
Write-Host " ✅ Служба остановлена" -ForegroundColor Green
|
||
exit 0
|
||
}
|
||
"3" {
|
||
Write-Host "`n🔄 Перезапуск службы..." -ForegroundColor Cyan
|
||
Start-Process -FilePath "$InstallPath\ProxiFyre.exe" -ArgumentList "stop" -Wait -NoNewWindow
|
||
Start-Sleep -s 1
|
||
Start-Process -FilePath "$InstallPath\ProxiFyre.exe" -ArgumentList "start" -Wait -NoNewWindow
|
||
Start-Sleep -s 2
|
||
$svc = Get-Service -Name "ProxiFyreService" -ErrorAction SilentlyContinue
|
||
Write-Host " Статус: $($svc.Status)" -ForegroundColor Green
|
||
exit 0
|
||
}
|
||
"4" {
|
||
Write-Host "`n⚙️ Изменение настроек..." -ForegroundColor Cyan
|
||
|
||
# Выбор режима
|
||
Write-Host ""
|
||
Write-Host "📡 Где работает VPN-прокси?" -ForegroundColor Yellow
|
||
Write-Host " [1] Удалённый сервер (Docker на VPS/другом ПК)" -ForegroundColor White
|
||
Write-Host " [2] Локальный Docker Desktop (на этом ПК)" -ForegroundColor White
|
||
$modeChoice = Read-Host "👉 Выбор (1-2)"
|
||
|
||
if ($modeChoice -eq "2") {
|
||
# Локальный Docker — нужен sing-box
|
||
$singboxTask = Get-ScheduledTask -TaskName "SingBoxProxy" -ErrorAction SilentlyContinue
|
||
if ($singboxTask -and $singboxTask.State -eq "Running") {
|
||
Write-Host "`n✅ Нативный sing-box работает!" -ForegroundColor Green
|
||
$NewProxy = "127.0.0.1:1080"
|
||
}
|
||
else {
|
||
Write-Host "`n⚠️ Нативный sing-box не запущен!" -ForegroundColor Yellow
|
||
Write-Host " Запустите: .\setup-singbox-native.ps1" -ForegroundColor Cyan
|
||
$runSetup = Read-Host " Запустить сейчас? (y/n)"
|
||
if ($runSetup -eq "y") {
|
||
$setupScript = Join-Path $PSScriptRoot "setup-singbox-native.ps1"
|
||
if (Test-Path $setupScript) { & $setupScript }
|
||
}
|
||
$NewProxy = "127.0.0.1:1080"
|
||
}
|
||
}
|
||
else {
|
||
# Удалённый прокси
|
||
Write-Host "`n🌐 SOCKS5 Прокси (IP:PORT):" -ForegroundColor Yellow
|
||
$NewProxy = Read-Host " [Enter] для 127.0.0.1:8080"
|
||
if ([string]::IsNullOrWhiteSpace($NewProxy)) { $NewProxy = "127.0.0.1:8080" }
|
||
}
|
||
|
||
# Запрос приложений
|
||
Write-Host "`n🎮 Что проксируем?" -ForegroundColor Yellow
|
||
Write-Host " [1] Vesktop"
|
||
Write-Host " [2] Discord"
|
||
Write-Host " [3] Vesktop + Discord"
|
||
$AppChoice = Read-Host "👉 Выбор (1-3)"
|
||
|
||
switch ($AppChoice) {
|
||
"2" { $NewApps = @("Discord") }
|
||
"3" { $NewApps = @("Vesktop", "Discord") }
|
||
Default { $NewApps = @("Vesktop") }
|
||
}
|
||
|
||
# Генерируем новый конфиг
|
||
Write-Host "`n📝 Обновляем конфиг..." -ForegroundColor Cyan
|
||
$ConfigData = @{
|
||
logLevel = "Info"
|
||
proxies = @(
|
||
@{
|
||
appNames = $NewApps
|
||
socks5ProxyEndpoint = $NewProxy
|
||
username = ""
|
||
password = ""
|
||
supportedProtocols = @("TCP", "UDP")
|
||
}
|
||
)
|
||
excludes = @()
|
||
} | ConvertTo-Json -Depth 4
|
||
Set-Content -Path $configPath -Value $ConfigData -Encoding UTF8
|
||
|
||
Write-Host " ✅ Конфиг обновлён:" -ForegroundColor Green
|
||
Write-Host " Прокси: $NewProxy" -ForegroundColor White
|
||
Write-Host " Приложения: $($NewApps -join ', ')" -ForegroundColor White
|
||
|
||
# Перезапуск службы
|
||
Write-Host "`n🔄 Перезапуск службы для применения..." -ForegroundColor Cyan
|
||
Start-Process -FilePath "$InstallPath\ProxiFyre.exe" -ArgumentList "stop" -Wait -NoNewWindow
|
||
Start-Sleep -s 1
|
||
Start-Process -FilePath "$InstallPath\ProxiFyre.exe" -ArgumentList "start" -Wait -NoNewWindow
|
||
Start-Sleep -s 2
|
||
$svc = Get-Service -Name "ProxiFyreService" -ErrorAction SilentlyContinue
|
||
Write-Host " Статус: $($svc.Status)" -ForegroundColor Green
|
||
exit 0
|
||
}
|
||
"5" {
|
||
Write-Host "`n📋 Логи ProxiFyre:" -ForegroundColor Cyan
|
||
$logFiles = Get-ChildItem "$InstallPath\logs\*.log" -ErrorAction SilentlyContinue | Sort-Object LastWriteTime -Descending | Select-Object -First 1
|
||
if ($logFiles) {
|
||
Get-Content $logFiles.FullName -Tail 50
|
||
}
|
||
else {
|
||
Write-Host " Лог-файлы не найдены" -ForegroundColor Yellow
|
||
}
|
||
exit 0
|
||
}
|
||
"6" {
|
||
Write-Host "`n📄 Конфиг ProxiFyre:" -ForegroundColor Cyan
|
||
if (Test-Path $configPath) {
|
||
Get-Content $configPath
|
||
}
|
||
else {
|
||
Write-Host " Конфиг не найден" -ForegroundColor Yellow
|
||
}
|
||
exit 0
|
||
}
|
||
"7" {
|
||
Write-Host "`n🔧 Переустановка..." -ForegroundColor Cyan
|
||
$Force = $true
|
||
# Продолжаем выполнение скрипта для полной переустановки
|
||
}
|
||
default {
|
||
Write-Host "`n ℹ️ Выход" -ForegroundColor Gray
|
||
exit 0
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
# --- ШАГ 1: КОНФИГУРАЦИЯ ---
|
||
# Если параметры переданы — используем их (неинтерактивный режим)
|
||
if ($Proxy -and $Apps.Count -gt 0) {
|
||
$UserProxy = $Proxy
|
||
$TargetApps = $Apps
|
||
if (-not $Silent) {
|
||
Write-Host "`n⚙️ Неинтерактивный режим:" -ForegroundColor Cyan
|
||
Write-Host " Прокси: $UserProxy" -ForegroundColor White
|
||
Write-Host " Приложения: $($TargetApps -join ', ')" -ForegroundColor White
|
||
}
|
||
}
|
||
else {
|
||
# Интерактивный режим — сначала выбор режима
|
||
Write-Host ""
|
||
Write-Host "==========================================" -ForegroundColor Cyan
|
||
Write-Host " 📡 ГДЕ РАБОТАЕТ ВАШ VPN-ПРОКСИ? " -ForegroundColor Cyan
|
||
Write-Host "==========================================" -ForegroundColor Cyan
|
||
Write-Host ""
|
||
Write-Host " [1] 🌐 УДАЛЁННЫЙ СЕРВЕР" -ForegroundColor White
|
||
Write-Host " Docker на VPS или другом ПК в сети" -ForegroundColor Gray
|
||
Write-Host " (UDP работает, просто укажите адрес)" -ForegroundColor Gray
|
||
Write-Host ""
|
||
Write-Host " [2] 💻 ЛОКАЛЬНЫЙ DOCKER НА WINDOWS" -ForegroundColor White
|
||
Write-Host " Docker Desktop на этом компьютере" -ForegroundColor Gray
|
||
Write-Host " (UDP НЕ работает, нужен нативный sing-box)" -ForegroundColor Gray
|
||
Write-Host ""
|
||
|
||
$modeChoice = Read-Host "👉 Выбор (1-2)"
|
||
|
||
if ($modeChoice -eq "2") {
|
||
# Локальный Docker — нужен нативный sing-box
|
||
Write-Host ""
|
||
Write-Host "==========================================" -ForegroundColor Yellow
|
||
Write-Host " ⚠️ ЛОКАЛЬНЫЙ DOCKER DESKTOP " -ForegroundColor Yellow
|
||
Write-Host "==========================================" -ForegroundColor Yellow
|
||
Write-Host ""
|
||
Write-Host "Docker Desktop на Windows НЕ поддерживает UDP!" -ForegroundColor Red
|
||
Write-Host "Для голосовых звонков Discord нужен нативный sing-box." -ForegroundColor Red
|
||
Write-Host ""
|
||
|
||
# Проверяем, установлен ли уже нативный sing-box
|
||
$singboxInstalled = Test-Path "C:\Tools\sing-box\sing-box.exe"
|
||
$singboxTask = Get-ScheduledTask -TaskName "SingBoxProxy" -ErrorAction SilentlyContinue
|
||
|
||
if ($singboxInstalled -and $singboxTask -and $singboxTask.State -eq "Running") {
|
||
Write-Host "✅ Нативный sing-box уже установлен и работает!" -ForegroundColor Green
|
||
Write-Host " Прокси: 127.0.0.1:1080" -ForegroundColor White
|
||
$UserProxy = "127.0.0.1:1080"
|
||
}
|
||
else {
|
||
Write-Host "Для установки нативного sing-box запустите:" -ForegroundColor Yellow
|
||
Write-Host " .\setup-singbox-native.ps1" -ForegroundColor Cyan
|
||
Write-Host ""
|
||
|
||
$runSetup = Read-Host "Запустить setup-singbox-native.ps1 сейчас? (y/n)"
|
||
if ($runSetup -eq "y") {
|
||
$setupScript = Join-Path $PSScriptRoot "setup-singbox-native.ps1"
|
||
if (Test-Path $setupScript) {
|
||
& $setupScript
|
||
# После установки используем порт 1080
|
||
$UserProxy = "127.0.0.1:1080"
|
||
}
|
||
else {
|
||
Write-Host "❌ Скрипт setup-singbox-native.ps1 не найден!" -ForegroundColor Red
|
||
exit 1
|
||
}
|
||
}
|
||
else {
|
||
Write-Host ""
|
||
Write-Host "Установите sing-box вручную и повторите." -ForegroundColor Yellow
|
||
exit 0
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
# Удалённый прокси — просто спрашиваем адрес
|
||
Write-Host "`n🌐 SOCKS5 Прокси (IP:PORT):" -ForegroundColor Yellow
|
||
Write-Host " Примеры: 192.168.1.100:8080, myserver.com:8080" -ForegroundColor Gray
|
||
$UserProxy = Read-Host " [Enter] для 127.0.0.1:8080"
|
||
if ([string]::IsNullOrWhiteSpace($UserProxy)) { $UserProxy = "127.0.0.1:8080" }
|
||
}
|
||
|
||
Write-Host "`n🎮 Что проксируем?" -ForegroundColor Yellow
|
||
Write-Host " [1] Vesktop"
|
||
Write-Host " [2] Discord"
|
||
Write-Host " [3] Vesktop + Discord"
|
||
$AppChoice = Read-Host "👉 Выбор (1-3)"
|
||
|
||
switch ($AppChoice) {
|
||
"2" { $TargetApps = @("Discord") }
|
||
"3" { $TargetApps = @("Vesktop", "Discord") }
|
||
Default { $TargetApps = @("Vesktop") }
|
||
}
|
||
}
|
||
|
||
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
||
|
||
# --- ШАГ 2: ПОДГОТОВКА (ОЧИСТКА) ---
|
||
Write-Host "`n🧹 [0/3] Очистка процессов..." -ForegroundColor Magenta
|
||
# Убиваем любые старые процессы, чтобы они не держали драйвер
|
||
Stop-Process -Name "ProxiFyre" -Force -ErrorAction SilentlyContinue
|
||
Start-Sleep -s 1
|
||
|
||
# --- ШАГ 3: ДРАЙВЕР ---
|
||
Write-Host "⚙️ [1/3] Ставим драйвер (Packet Filter)..." -ForegroundColor Magenta
|
||
$MsiFile = "$env:TEMP\WinpkFilter.msi"
|
||
|
||
try {
|
||
Invoke-WebRequest -Uri $DriverUrl -OutFile $MsiFile -ErrorAction Stop
|
||
$Proc = Start-Process -FilePath "msiexec.exe" -ArgumentList "/i `"$MsiFile`" /qn /norestart" -Wait -PassThru
|
||
if ($Proc.ExitCode -eq 0) { Write-Host " ✅ Успешно." -ForegroundColor Green }
|
||
elseif ($Proc.ExitCode -eq 1603) { Write-Host " ⚠️ Уже установлен." -ForegroundColor Yellow }
|
||
}
|
||
catch {
|
||
Write-Error "❌ Ошибка скачивания драйвера: $_"; Exit
|
||
}
|
||
|
||
# --- ШАГ 4: PROXIFYRE ---
|
||
Write-Host "`n⬇️ [2/3] Ставим ProxiFyre..." -ForegroundColor Magenta
|
||
|
||
# Если папка есть, чистим всё, кроме конфига (если вдруг хотим сохранить), но проще пересоздать
|
||
if (Test-Path $InstallPath) { Remove-Item $InstallPath -Recurse -Force -ErrorAction SilentlyContinue }
|
||
New-Item -ItemType Directory -Force -Path $InstallPath | Out-Null
|
||
|
||
try {
|
||
$ZipFile = "$env:TEMP\ProxiFyre.zip"
|
||
Invoke-WebRequest -Uri $AppUrl -OutFile $ZipFile -ErrorAction Stop
|
||
Expand-Archive -Path $ZipFile -DestinationPath $InstallPath -Force
|
||
Write-Host " ✅ Распаковано." -ForegroundColor Green
|
||
}
|
||
catch {
|
||
Write-Error "❌ Ошибка скачивания ProxiFyre: $_"; Exit
|
||
}
|
||
|
||
# Вытаскиваем из подпапки если надо
|
||
$ExeItem = Get-ChildItem -Path $InstallPath -Filter "ProxiFyre.exe" -Recurse | Select-Object -First 1
|
||
if ($ExeItem.DirectoryName -ne $InstallPath) {
|
||
Copy-Item -Path "$($ExeItem.DirectoryName)\*" -Destination $InstallPath -Recurse -Force
|
||
}
|
||
|
||
# --- ШАГ 5: КОНФИГ ---
|
||
Write-Host "`n📝 [3/3] Генерируем конфиг..." -ForegroundColor Cyan
|
||
$ConfigPath = Join-Path -Path $InstallPath -ChildPath "app-config.json"
|
||
$ConfigData = @{
|
||
logLevel = "Info"
|
||
proxies = @(
|
||
@{
|
||
appNames = $TargetApps
|
||
socks5ProxyEndpoint = $UserProxy
|
||
username = ""
|
||
password = ""
|
||
supportedProtocols = @("TCP", "UDP")
|
||
}
|
||
)
|
||
excludes = @()
|
||
} | ConvertTo-Json -Depth 4
|
||
Set-Content -Path $ConfigPath -Value $ConfigData -Encoding UTF8
|
||
|
||
# --- ШАГ 6: УСТАНОВКА СЛУЖБЫ ---
|
||
Write-Host "`n🛡️ [4/3] Регистрация службы Windows..." -ForegroundColor Cyan
|
||
$ExePath = Join-Path -Path $InstallPath -ChildPath "ProxiFyre.exe"
|
||
|
||
# 1. Удаляем старую службу если была
|
||
Start-Process -FilePath $ExePath -ArgumentList "uninstall" -Wait -NoNewWindow
|
||
Start-Sleep -s 1
|
||
|
||
# 2. Инсталлируем службу
|
||
Start-Process -FilePath $ExePath -ArgumentList "install" -Wait -NoNewWindow
|
||
Start-Sleep -s 1
|
||
|
||
# 3. Запускаем службу
|
||
Write-Host " 🚀 Запускаем службу..." -ForegroundColor Yellow
|
||
Start-Process -FilePath $ExePath -ArgumentList "start" -Wait -NoNewWindow
|
||
Start-Sleep -s 3
|
||
|
||
# 4. Проверка
|
||
# Важно: имя службы в системе именно "ProxiFyreService" (судя по твоим логам)
|
||
$Service = Get-Service -Name "ProxiFyreService" -ErrorAction SilentlyContinue
|
||
|
||
if ($Service -and $Service.Status -eq 'Running') {
|
||
Write-Host "`n==========================================" -ForegroundColor Green
|
||
Write-Host "🎉 УСПЕХ! Служба работает в фоне." -ForegroundColor Green
|
||
Write-Host "📁 Логи тут: $InstallPath\logs"
|
||
Write-Host "=========================================="
|
||
}
|
||
else {
|
||
Write-Host "`n⚠️ Служба установлена, но статус: $($Service.Status). Проверь логи." -ForegroundColor Red
|
||
Write-Host "Попробуй вручную: net start ProxiFyreService"
|
||
} |