Disconnect active tunnel before starting Xray
This commit is contained in:
@@ -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 для получения адреса сервера
|
||||
|
||||
Reference in New Issue
Block a user