diff --git a/internal/vless/vless.go b/internal/vless/vless.go index f861f60..7483f28 100644 --- a/internal/vless/vless.go +++ b/internal/vless/vless.go @@ -11,10 +11,12 @@ import ( "runtime" "strconv" "strings" + "syscall" "time" "vpn-client/internal/config" "vpn-client/internal/logger" + "vpn-client/internal/wireguard" ) // XrayConfig представляет конфигурацию Xray @@ -332,6 +334,10 @@ func getParam(params map[string]string, key, defaultValue string) string { // Connect подключается к VLESS серверу func Connect(configName string, logsDir, xrayDir string) error { + if err := disconnectExistingConnection(logsDir); err != nil { + return err + } + // Загружаем конфигурации configs, err := config.LoadConfigs() if err != nil { @@ -443,6 +449,40 @@ func Connect(configName string, logsDir, xrayDir string) error { 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 сервера func PingServer(vlessURL string, timeout time.Duration) (bool, float64, error) { // Парсим URL для получения адреса сервера