Prechádzať zdrojové kódy

new alternative to get public IP address

mhsanaei 1 deň pred
rodič
commit
bbdeb65291
3 zmenil súbory, kde vykonal 41 pridanie a 6 odobranie
  1. 4 1
      install.sh
  2. 29 3
      web/service/server.go
  3. 8 2
      x-ui.sh

+ 4 - 1
install.sh

@@ -85,7 +85,10 @@ config_after_install() {
     local existing_hasDefaultCredential=$(/usr/local/x-ui/x-ui setting -show true | grep -Eo 'hasDefaultCredential: .+' | awk '{print $2}')
     local existing_webBasePath=$(/usr/local/x-ui/x-ui setting -show true | grep -Eo 'webBasePath: .+' | awk '{print $2}')
     local existing_port=$(/usr/local/x-ui/x-ui setting -show true | grep -Eo 'port: .+' | awk '{print $2}')
-    local server_ip=$(curl -s https://api.ipify.org)
+    local server_ip=$(curl -s --max-time 3 https://api.ipify.org)
+    if [ -z "$server_ip" ]; then
+        server_ip=$(curl -s --max-time 3 https://4.ident.me)
+    fi
 
     if [[ ${#existing_webBasePath} -lt 4 ]]; then
         if [[ "$existing_hasDefaultCredential" == "true" ]]; then

+ 29 - 3
web/service/server.go

@@ -94,21 +94,34 @@ type ServerService struct {
 	inboundService InboundService
 	cachedIPv4     string
 	cachedIPv6     string
+	noIPv6         bool
 }
 
 func getPublicIP(url string) string {
-	resp, err := http.Get(url)
+	client := &http.Client{
+		Timeout: 3 * time.Second,
+	}
+
+	resp, err := client.Get(url)
 	if err != nil {
 		return "N/A"
 	}
 	defer resp.Body.Close()
 
+	// Don't retry if access is blocked or region-restricted
+	if resp.StatusCode == http.StatusForbidden || resp.StatusCode == http.StatusUnavailableForLegalReasons {
+		return "N/A"
+	}
+	if resp.StatusCode != http.StatusOK {
+		return "N/A"
+	}
+
 	ip, err := io.ReadAll(resp.Body)
 	if err != nil {
 		return "N/A"
 	}
 
-	ipString := string(ip)
+	ipString := strings.TrimSpace(string(ip))
 	if ipString == "" {
 		return "N/A"
 	}
@@ -221,10 +234,23 @@ func (s *ServerService) GetStatus(lastStatus *Status) *Status {
 	}
 
 	// IP fetching with caching
-	if s.cachedIPv4 == "" || s.cachedIPv6 == "" {
+	if s.cachedIPv4 == "" {
 		s.cachedIPv4 = getPublicIP("https://api.ipify.org")
+		if s.cachedIPv4 == "N/A" {
+			s.cachedIPv4 = getPublicIP("https://4.ident.me")
+		}
+	}
+
+	if s.cachedIPv6 == "" && !s.noIPv6 {
 		s.cachedIPv6 = getPublicIP("https://api6.ipify.org")
+		if s.cachedIPv6 == "N/A" {
+			s.cachedIPv6 = getPublicIP("https://6.ident.me")
+			if s.cachedIPv6 == "N/A" {
+				s.noIPv6 = true
+			}
+		}
 	}
+
 	status.PublicIP.IPv4 = s.cachedIPv4
 	status.PublicIP.IPv6 = s.cachedIPv6
 

+ 8 - 2
x-ui.sh

@@ -249,7 +249,10 @@ check_config() {
     local existing_webBasePath=$(echo "$info" | grep -Eo 'webBasePath: .+' | awk '{print $2}')
     local existing_port=$(echo "$info" | grep -Eo 'port: .+' | awk '{print $2}')
     local existing_cert=$(/usr/local/x-ui/x-ui setting -getCert true | grep -Eo 'cert: .+' | awk '{print $2}')
-    local server_ip=$(curl -s https://api.ipify.org)
+    local server_ip=$(curl -s --max-time 3 https://api.ipify.org)
+    if [ -z "$server_ip" ]; then
+        server_ip=$(curl -s --max-time 3 https://4.ident.me)
+    fi
 
     if [[ -n "$existing_cert" ]]; then
         local domain=$(basename "$(dirname "$existing_cert")")
@@ -1630,7 +1633,10 @@ remove_iplimit() {
 }
 
 SSH_port_forwarding() {
-    local server_ip=$(curl -s https://api.ipify.org)
+    local server_ip=$(curl -s --max-time 3 https://api.ipify.org)
+    if [ -z "$server_ip" ]; then
+        server_ip=$(curl -s --max-time 3 https://4.ident.me)
+    fi
     local existing_webBasePath=$(/usr/local/x-ui/x-ui setting -show true | grep -Eo 'webBasePath: .+' | awk '{print $2}')
     local existing_port=$(/usr/local/x-ui/x-ui setting -show true | grep -Eo 'port: .+' | awk '{print $2}')
     local existing_listenIP=$(/usr/local/x-ui/x-ui setting -getListen true | grep -Eo 'listenIP: .+' | awk '{print $2}')