Disconnect active tunnel before starting Xray

This commit is contained in:
2026-04-06 09:54:39 +07:00
parent 8dccb9fddc
commit 33ce01c0c2

View File

@@ -11,10 +11,12 @@ import (
"runtime" "runtime"
"strconv" "strconv"
"strings" "strings"
"syscall"
"time" "time"
"vpn-client/internal/config" "vpn-client/internal/config"
"vpn-client/internal/logger" "vpn-client/internal/logger"
"vpn-client/internal/wireguard"
) )
// XrayConfig представляет конфигурацию Xray // XrayConfig представляет конфигурацию Xray
@@ -332,6 +334,10 @@ func getParam(params map[string]string, key, defaultValue string) string {
// Connect подключается к VLESS серверу // Connect подключается к VLESS серверу
func Connect(configName string, logsDir, xrayDir string) error { func Connect(configName string, logsDir, xrayDir string) error {
if err := disconnectExistingConnection(logsDir); err != nil {
return err
}
// Загружаем конфигурации // Загружаем конфигурации
configs, err := config.LoadConfigs() configs, err := config.LoadConfigs()
if err != nil { if err != nil {
@@ -443,6 +449,40 @@ func Connect(configName string, logsDir, xrayDir string) error {
return nil return nil
} }
func disconnectExistingConnection(logsDir string) error {
state, err := config.LoadState()
if err != nil {
return fmt.Errorf("ошибка загрузки состояния подключения: %w", err)
}
if state == nil || !state.Connected {
return nil
}
switch state.ConfigType {
case "wireguard":
if state.Interface != "" {
if err := wireguard.Disconnect(state.Interface, logsDir); err != nil {
return fmt.Errorf("ошибка отключения текущего WireGuard: %w", err)
}
}
case "vless":
if state.ProcessPID > 0 {
process, err := os.FindProcess(state.ProcessPID)
if err == nil {
if runtime.GOOS == "windows" {
_ = process.Kill()
} else {
_ = process.Signal(syscall.SIGTERM)
}
time.Sleep(1 * time.Second)
}
}
}
return config.SaveState(&config.ConnectionState{})
}
// PingServer проверяет доступность VLESS сервера // PingServer проверяет доступность VLESS сервера
func PingServer(vlessURL string, timeout time.Duration) (bool, float64, error) { func PingServer(vlessURL string, timeout time.Duration) (bool, float64, error) {
// Парсим URL для получения адреса сервера // Парсим URL для получения адреса сервера