diff --git a/x-ui.sh b/x-ui.sh index 97517fc0..95405e5f 100644 --- a/x-ui.sh +++ b/x-ui.sh @@ -612,6 +612,94 @@ ssl_cert_issue_CF() { fi } +update_geo_files() { +echo -e "${green} ------------------------- " +echo -e "${yellow} Advanced Geo System Updater Select Update Server " +echo -e "${green}\t1.${plain} Github [Default] " +echo -e "${green}\t2.${plain} jsDelivr CDN " +echo -e "${green}\t0.${plain} Back To X-UI Menu " +read -p "Select an option: " select + +case "$select" in + 0) show_menu ;; + 1|2) + local="/usr/local/x-ui/bin" + source_mapping=() + + if [ "$select" -eq 1 ]; then + source_mapping=( + "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat geoip.dat" + "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat geosite.dat" + "https://github.com/chocolate4u/Iran-v2ray-rules/releases/latest/download/geoip.dat geoip_IR.dat" + "https://github.com/chocolate4u/Iran-v2ray-rules/releases/latest/download/geosite.dat geosite_IR.dat" + "https://github.com/bootmortis/iran-hosted-domains/releases/latest/download/iran.dat iran.dat" + ) + elif [ "$select" -eq 2 ]; then + source_mapping=( + "https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geoip.dat geoip.dat" + "https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geosite.dat geosite.dat" + "https://cdn.jsdelivr.net/gh/chocolate4u/Iran-v2ray-rules@release/geoip.dat geoip_IR.dat" + "https://cdn.jsdelivr.net/gh/chocolate4u/Iran-v2ray-rules@release/geosite.dat geosite_IR.dat" + "https://github.com/bootmortis/iran-hosted-domains/releases/latest/download/iran.dat iran.dat" + ) + fi + + mkdir -p "$local" && chmod 764 "$local" + + updated_files=() + + function needs_update() { + local source="$1" + local destination="$2" + + [ ! -e "$destination" ] || [ "$(wget -q --spider --no-check-certificate --timestamping "$source" && stat -c %Y "$destination")" != "$(stat -c %Y "$destination")" ] + } + + for pair in "${source_mapping[@]}"; do + output_file="${local}/$(echo "$pair" | cut -d ' ' -f 2)" + + if needs_update "$(echo "$pair" | cut -d ' ' -f 1)" "$output_file"; then + echo "Downloading $output_file..." + wget -q --no-check-certificate --timestamping --show-progress -O "$output_file" "$(echo "$pair" | cut -d ' ' -f 1)" + chmod 644 "$output_file" + updated_files+=("$output_file") + else + echo "$output_file is already up to date. No need to update." + fi + done + + echo -e "\n---------------------------" + echo -e " Summary Report " + echo -e "---------------------------" + + if [ ${#updated_files[@]} -gt 0 ]; then + echo -e "Number of Downloaded files: ${#updated_files[@]}" + echo "Downloaded files:" + for file in "${updated_files[@]}"; do + echo " - $file" + done + else + echo -e "\nNo files were updated." + fi + + echo -e "---------------------------" + sleep 1 + read -p "Do you want to restart x-ui? (y/n): " restart_choice + if [[ $restart_choice == [Yy] ]]; then + systemctl restart x-ui + echo "X-UI has been restarted." + else + echo "X-UI was not restarted." + fi + before_show_menu + ;; + *) + LOGE "Please enter the correct number [0-2]" + update_geo_files + ;; +esac +} + show_usage() { echo "X-UI Control Menu Usage" echo "------------------------------------------" @@ -658,10 +746,11 @@ show_menu() { ${green}15.${plain} 一A Key Installation BBR (latest kernel) ${green}16.${plain} 一SSL Certificate Management ${green}17.${plain} 一Cloudflare SSL Certificate + ${green}18.${plain} 一Advanced Geo Updater ———————————————— " show_status - echo && read -p "Please enter your selection [0-17]: " num + echo && read -p "Please enter your selection [0-18]: " num case "${num}" in 0) @@ -718,8 +807,11 @@ show_menu() { 17) ssl_cert_issue_CF ;; + 18) + update_geo_files + ;; *) - LOGE "Please enter the correct number [0-17]" + LOGE "Please enter the correct number [0-18]" ;; esac }