#!/bin/bash

# List of services to query for the public IP
services=(
    "ifconfig.me"
    "ipinfo.io/ip"
    "icanhazip.com"
    "api.ipify.org"
    "ident.me"
    "ip.tyk.nu"
    "checkip.amazonaws.com"
    "ipecho.net/plain"
    "myip.dnsomatic.com"
    "ip.seeip.org"
    "ipapi.co/ip"
    "wtfismyip.com/text"
    "openident.net/ip"
    "ifconfig.co/ip"
)

# Function to shuffle the array of services
shuffle_services() {
    local i
    for ((i=${#services[@]} - 1; i > 0; i--)); do
        local j=$((RANDOM % (i + 1)))
        local temp="${services[i]}"
        services[i]="${services[j]}"
        services[j]="$temp"
    done
}

# Function to fetch the public IP address
get_public_ip() {
    shuffle_services
    for service in "${services[@]}"; do
        public_ip=$(curl -s --max-time 5 "$service")
        
        # Check if the curl request was successful and there's a valid IP address
        if [[ $? -eq 0 && $public_ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
            logger -t public_ip_script "Service used: $service, IP found: $public_ip"
            echo "$public_ip"
            return
        fi
    done

    # If none of the services returned a valid IP, output an error message
    echo "Failed to retrieve public IP using all services." >&2
    logger -t public_ip_script "Error: Failed to retrieve public IP using all services."
    exit 1
}

# Execute the function
get_public_ip