Auto-download Xray for VLESS connections
This commit is contained in:
@@ -19,11 +19,11 @@ import (
|
||||
|
||||
// XrayConfig представляет конфигурацию Xray
|
||||
type XrayConfig struct {
|
||||
Log LogConfig `json:"log"`
|
||||
Inbounds []InboundConfig `json:"inbounds"`
|
||||
Log LogConfig `json:"log"`
|
||||
Inbounds []InboundConfig `json:"inbounds"`
|
||||
Outbounds []OutboundConfig `json:"outbounds"`
|
||||
Stats interface{} `json:"stats"`
|
||||
Policy PolicyConfig `json:"policy"`
|
||||
Stats interface{} `json:"stats"`
|
||||
Policy PolicyConfig `json:"policy"`
|
||||
}
|
||||
|
||||
type LogConfig struct {
|
||||
@@ -34,11 +34,11 @@ type LogConfig struct {
|
||||
}
|
||||
|
||||
type InboundConfig struct {
|
||||
Port int `json:"port"`
|
||||
Protocol string `json:"protocol"`
|
||||
Settings InboundSettings `json:"settings"`
|
||||
Sniffing SniffingConfig `json:"sniffing"`
|
||||
Tag string `json:"tag"`
|
||||
Port int `json:"port"`
|
||||
Protocol string `json:"protocol"`
|
||||
Settings InboundSettings `json:"settings"`
|
||||
Sniffing SniffingConfig `json:"sniffing"`
|
||||
Tag string `json:"tag"`
|
||||
}
|
||||
|
||||
type InboundSettings struct {
|
||||
@@ -53,8 +53,8 @@ type SniffingConfig struct {
|
||||
}
|
||||
|
||||
type OutboundConfig struct {
|
||||
Protocol string `json:"protocol"`
|
||||
Tag string `json:"tag"`
|
||||
Protocol string `json:"protocol"`
|
||||
Tag string `json:"tag"`
|
||||
Settings OutboundSettings `json:"settings"`
|
||||
StreamSettings StreamSettings `json:"streamSettings"`
|
||||
}
|
||||
@@ -76,13 +76,13 @@ type UserConfig struct {
|
||||
}
|
||||
|
||||
type StreamSettings struct {
|
||||
Network string `json:"network"`
|
||||
Security string `json:"security,omitempty"`
|
||||
TLSSettings *TLSSettings `json:"tlsSettings,omitempty"`
|
||||
RealitySettings *RealitySettings `json:"realitySettings,omitempty"`
|
||||
WSSettings *WSSettings `json:"wsSettings,omitempty"`
|
||||
GRPCSettings *GRPCSettings `json:"grpcSettings,omitempty"`
|
||||
HTTPSettings *HTTPSettings `json:"httpSettings,omitempty"`
|
||||
Network string `json:"network"`
|
||||
Security string `json:"security,omitempty"`
|
||||
TLSSettings *TLSSettings `json:"tlsSettings,omitempty"`
|
||||
RealitySettings *RealitySettings `json:"realitySettings,omitempty"`
|
||||
WSSettings *WSSettings `json:"wsSettings,omitempty"`
|
||||
GRPCSettings *GRPCSettings `json:"grpcSettings,omitempty"`
|
||||
HTTPSettings *HTTPSettings `json:"httpSettings,omitempty"`
|
||||
}
|
||||
|
||||
type TLSSettings struct {
|
||||
@@ -375,8 +375,8 @@ func Connect(configName string, logsDir, xrayDir string) error {
|
||||
}
|
||||
xrayPath := filepath.Join(xrayDir, xrayExe)
|
||||
|
||||
if _, err := os.Stat(xrayPath); os.IsNotExist(err) {
|
||||
return fmt.Errorf("xray не найден в %s", xrayDir)
|
||||
if xrayPath, err = ensureXrayBinary(xrayDir); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Создаем лог-файл трафика
|
||||
@@ -447,24 +447,24 @@ func Connect(configName string, logsDir, xrayDir string) error {
|
||||
func PingServer(vlessURL string, timeout time.Duration) (bool, float64, error) {
|
||||
// Парсим URL для получения адреса сервера
|
||||
urlStr := strings.TrimPrefix(vlessURL, "vless://")
|
||||
|
||||
|
||||
if idx := strings.Index(urlStr, "#"); idx != -1 {
|
||||
urlStr = urlStr[:idx]
|
||||
}
|
||||
|
||||
|
||||
if idx := strings.Index(urlStr, "?"); idx != -1 {
|
||||
urlStr = urlStr[:idx]
|
||||
}
|
||||
|
||||
|
||||
parts := strings.Split(urlStr, "@")
|
||||
if len(parts) != 2 {
|
||||
return false, 0, fmt.Errorf("неверный формат URL")
|
||||
}
|
||||
|
||||
|
||||
serverPort := parts[1]
|
||||
var server string
|
||||
var port string
|
||||
|
||||
|
||||
if strings.Contains(serverPort, "[") {
|
||||
endIdx := strings.Index(serverPort, "]")
|
||||
server = serverPort[1:endIdx]
|
||||
@@ -474,20 +474,20 @@ func PingServer(vlessURL string, timeout time.Duration) (bool, float64, error) {
|
||||
server = serverPort[:lastColon]
|
||||
port = serverPort[lastColon+1:]
|
||||
}
|
||||
|
||||
|
||||
if port == "" {
|
||||
port = "443"
|
||||
}
|
||||
|
||||
|
||||
// Измеряем время подключения
|
||||
start := time.Now()
|
||||
conn, err := net.DialTimeout("tcp", net.JoinHostPort(server, port), timeout)
|
||||
elapsed := time.Since(start)
|
||||
|
||||
|
||||
if err != nil {
|
||||
return false, 0, err
|
||||
}
|
||||
conn.Close()
|
||||
|
||||
|
||||
return true, float64(elapsed.Milliseconds()), nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user