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