From 34c24eea379d9b1023c04064045f0d29ed43b73f Mon Sep 17 00:00:00 2001 From: iBreakEverything <1362764+iBreakEverything@users.noreply.github.com> Date: Sat, 31 May 2025 15:20:31 +0300 Subject: [PATCH] Fix ip fetching Changed ipv4 regex to a better version, from https://stackoverflow.com/a/13778973/5853386 Added public ip services to an array for better functionality and maintainability Added a log to monitor if an ip service is failing --- cloudflare-template.sh | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/cloudflare-template.sh b/cloudflare-template.sh index 0834eaa..ae75044 100644 --- a/cloudflare-template.sh +++ b/cloudflare-template.sh @@ -17,20 +17,29 @@ discorduri="" # URI for Discord WebHook "h ########################################### ## Check if we have a public IP ########################################### -ipv4_regex='([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])' -ip=$(curl -s -4 https://cloudflare.com/cdn-cgi/trace | grep -E '^ip'); ret=$? -if [[ ! $ret == 0 ]]; then # In the case that cloudflare failed to return an ip. - # Attempt to get the ip from other websites. - ip=$(curl -s https://api.ipify.org || curl -s https://ipv4.icanhazip.com) -else - # Extract just the ip from the ip line from cloudflare. - ip=$(echo $ip | sed -E "s/^ip=($ipv4_regex)$/\1/") -fi +REGEX_IPV4="^(0*(1?[0-9]{1,2}|2([0-4][0-9]|5[0-5]))\.){3}0*(1?[0-9]{1,2}|2([0-4][0-9]|5[0-5]))$" +IP_SERVICES=( + "https://api.ipify.org" + "https://ipv4.icanhazip.com" + "https://ipinfo.io/ip" +) + +# Try all the ip services for a valid IPv4 address +for service in ${IP_SERVICES[@]}; do + RAW_IP=$(curl -s $service) + if [[ $RAW_IP =~ $REGEX_IPV4 ]]; then + CURRENT_IP=$BASH_REMATCH + logger -s "DDNS Updater: Fetched IP $CURRENT_IP" + break + else + logger -s "DDNS Updater: IP service $service failed." + fi +done -# Use regex to check for proper IPv4 format. -if [[ ! $ip =~ ^$ipv4_regex$ ]]; then - logger -s "DDNS Updater: Failed to find a valid IP." - exit 2 +# Exit if IP fetching failed +if [[ -z "$CURRENT_IP" ]]; then + logger -s "DDNS Updater: Failed to find a valid IP." + exit 2 fi ###########################################