├── .gitattributes ├── README-en.md ├── README.md └── cf-replace-ips.sh /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /README-en.md: -------------------------------------------------------------------------------- 1 | ## Add/Replace Cloudflare Subdomain Using Listed IPs 2 | 3 | This script is a Bash script designed to modify Cloudflare DNS records for a particular subdomain. It reads Cloudflare credentials and A record modification details from the user, and then it deletes existing A records for the specified subdomain and adds new A records based on a list of IP addresses provided in a CSV file. 4 | 5 | The script sets default values for the Cloudflare credentials and A record modification details, which can be overridden by user input. It also looks for a configuration file in the current directory, and loads any values from it if it exists. 6 | 7 | The script uses the Cloudflare API to retrieve existing A records for the subdomain, delete them, and add new A records for each IP address listed in the CSV file. 8 | 9 | Finally, the script saves the user input as default values in the configuration file. 10 | 11 | To run the script, you need to have the following: 12 | 13 | - A Cloudflare account with the API key, zone ID, and email address associated with it. 14 | - A CSV file containing the list of new IP addresses for the subdomain. 15 | - The script saved in a file with the ".sh" extension. 16 | - The script file needs to be executable using the command "chmod +x cf-replace-ips.sh". 17 | 18 | ### MacOSX/Linux 19 | To run the script in MacOSX/Linux terminal, download and unzip the script folder to your home directory, then go to the related folder, then do the following: 20 | ``` 21 | cd ~/cf-replace-ips 22 | bash ./cf-replace-ips.sh 23 | ``` 24 | 25 | ### Windows 26 | For Windows, you need to install some package to run bash scripts, I recommend to install proper [Cygwin](https://www.cygwin.com) based on your windows version. 27 | To run the script in Cygwin, download the script and copy the script folder to your home directory in Cygwin (Usually placed in `C:\Cygwin\home\yourname`), then execute Cygwin and do following steps: 28 | ``` 29 | cd ~/cf-replace-ips 30 | bash ./cf-replace-ips.sh 31 | ``` 32 | 33 | When executed, the script will prompt the user for the Cloudflare credentials and A record modification details. If any default values are set, they will be displayed as prompts for the user. 34 | 35 | The script should be used with caution, as it can modify DNS records for a subdomain, potentially affecting website availability. It's recommended to test it in a non-production environment first. 36 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## با استفاده از IP های لیست شده، زیر دامنه Cloudflare را اضافه یا جایگزین کنید 2 | 3 | این اسکریپت یک اسکریپت Bash است که برای تغییر رکوردهای DNS درCloudflare برای یک زیر دامنه خاص طراحی شده است. اطلاعات کاربری Cloudflare و جزئیات اصلاح رکورد A را از کاربر می پرسد و سپس رکوردهای A موجود را برای زیردامنه مشخص شده حذف کرده و رکوردهای A جدید را بر اساس آی‌پی‌های لیست شده در فایل CSV به همان زیردامنه در کلادفلر شما اضافه می‌کند. 4 | 5 | این اسکریپت پس از دریافت اطلاعات مورد نیاز برای دسترسی به کلادفلر، زیردامنه و همینطور مسیر فایل CSV، این اطلاعات را برای استفاده های بعدی در یه فایل کانفیگ در مسیر اجرای اسکریپت ذخیره می‌کند. 6 | 7 | این اسکریپت از Cloudflare API برای بازیابی رکوردهای A موجود برای زیر دامنه، حذف آنها و اضافه کردن رکوردهای A جدید برای هر آدرس IP فهرست شده در فایل CSV استفاده می کند. 8 | 9 | برای اجرای اسکریپت باید موارد زیر را داشته باشید: 10 | 11 | - یک حساب Cloudflare با کلید API، شناسه Zone و آدرس ایمیل مرتبط با آن. 12 | - یک فایل CSV حاوی لیست آدرس های IP جدید برای زیر دامنه که هر آی‌پی در یک سطر آورده شده است. 13 | - اسکریپت ذخیره شده در یک فایل با پسوند ".sh". 14 | - فایل اسکریپت باید با استفاده از دستور "chmod +x cf-replace-ips.sh" قابل اجرا باشد. 15 | 16 | ### لینوکس/مک 17 | برای اجرای اسکریپت در ترمینال MacOSX/Linux، پوشه اسکریپت را دانلود کرده و در پوشه اصلی خود از حالت فشرده خارج کنید، سپس به پوشه مربوطه بروید، سپس مراحل زیر را انجام دهید: 18 | ``` 19 | cd ~/cf-replace-ips 20 | bash ./cf-replace-ips.sh 21 | ``` 22 | 23 | ### ویندوز 24 | برای ویندوز، برای اجرای اسکریپت های bash باید بسته ای را نصب کنید، توصیه می کنم [Cygwin](https://www.cygwin.com) مناسب را بر اساس نسخه ویندوز خود نصب کنید. 25 | برای اجرای اسکریپت در Cygwin، اسکریپت را دانلود کنید و پوشه اسکریپت را در پوشه اصلی خود در Cygwin کپی کنید (معمولاً در 'C:\Cygwin\home\yourname' قرار می گیرد)، سپس Cygwin را اجرا کنید و مراحل زیر را انجام دهید: 26 | ``` 27 | cd ~/cf-replace-ips 28 | bash ./cf-replace-ips.sh 29 | ``` 30 | 31 | هنگامی که اسکریپت اجرا شد، از کاربر می‌خواهد اعتبارنامه Cloudflare و جزئیات اصلاح رکورد A را دریافت کند. اگر قبلا این مقادیر داده باشید، به‌عنوان پیش فرض برای کاربر نمایش داده می‌شود. 32 | 33 | این اسکریپت باید با احتیاط استفاده شود، زیرا می تواند رکوردهای DNS را برای یک زیر دامنه تغییر دهد، که به طور بالقوه بر در دسترس بودن وب سایت تأثیر می گذارد. توصیه می شود ابتدا آن را در یک محیط غیر تولیدی تست کنید. 34 | -------------------------------------------------------------------------------- /cf-replace-ips.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Set default values for Cloudflare credentials 4 | DEFAULT_EMAIL="" 5 | DEFAULT_ZONE_ID="" 6 | DEFAULT_API_KEY="" 7 | 8 | # Set default values for A record modification 9 | DEFAULT_SUBDOMAIN="" 10 | DEFAULT_CSV_PATH="" 11 | 12 | # Set default configuration file path 13 | CFG_PATH="./config.cfg" 14 | 15 | # Load configuration file if it exists 16 | if [ -f "$CFG_PATH" ]; then 17 | source "$CFG_PATH" 18 | fi 19 | 20 | # Prompt user for Cloudflare credentials 21 | read -p "Cloudflare email [${DEFAULT_EMAIL}]: " EMAIL 22 | read -p "Cloudflare zone ID [${DEFAULT_ZONE_ID}]: " ZONE_ID 23 | read -p "Cloudflare API key [${DEFAULT_API_KEY}]: " API_KEY 24 | 25 | # Use default values if user input is empty 26 | EMAIL="${EMAIL:-$DEFAULT_EMAIL}" 27 | ZONE_ID="${ZONE_ID:-$DEFAULT_ZONE_ID}" 28 | API_KEY="${API_KEY:-$DEFAULT_API_KEY}" 29 | 30 | # Prompt user for A record modification details 31 | read -p "Subdomain to modify [${DEFAULT_SUBDOMAIN}]: " SUBDOMAIN 32 | read -p "Path to CSV file containing new IPs [${DEFAULT_CSV_PATH}]: " CSV_PATH 33 | 34 | # Use default values if user input is empty 35 | SUBDOMAIN="${SUBDOMAIN:-$DEFAULT_SUBDOMAIN}" 36 | CSV_PATH="${CSV_PATH:-$DEFAULT_CSV_PATH}" 37 | 38 | # Get existing A records for subdomain 39 | RECORDS=$(curl -X GET "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records?type=A&name=${SUBDOMAIN}" \ 40 | -H "X-Auth-Email: ${EMAIL}" \ 41 | -H "X-Auth-Key: ${API_KEY}" \ 42 | -H "Content-Type: application/json") 43 | 44 | # Extract existing record IDs 45 | IDS=$(echo "$RECORDS" | jq -r '.result[].id') 46 | 47 | # Delete existing A records for subdomain 48 | echo -e "\n\nDeleting existing records...\n" 49 | for ID in $IDS; do 50 | curl -X DELETE "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records/${ID}" \ 51 | -H "X-Auth-Email: ${EMAIL}" \ 52 | -H "X-Auth-Key: ${API_KEY}" \ 53 | -H "Content-Type: application/json" 54 | echo -e "\n" 55 | done 56 | 57 | # Add new A records for each IP address listed in CSV file 58 | echo -e "\n\nAdding new A Records for listed IPs...\n" 59 | while read -r IP; do 60 | curl -X POST "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records" \ 61 | -H "X-Auth-Email: ${EMAIL}" \ 62 | -H "X-Auth-Key: ${API_KEY}" \ 63 | -H "Content-Type: application/json" \ 64 | --data "{\"type\":\"A\",\"name\":\"${SUBDOMAIN}\",\"content\":\"${IP}\",\"ttl\":1,\"proxied\":false}" 65 | echo -e "\n" 66 | done < "$CSV_PATH" 67 | 68 | # Save user input as default values in configuration file 69 | echo "DEFAULT_EMAIL='${EMAIL}'" > "$CFG_PATH" 70 | echo "DEFAULT_ZONE_ID='${ZONE_ID}'" >> "$CFG_PATH" 71 | echo "DEFAULT_API_KEY='${API_KEY}'" >> "$CFG_PATH" 72 | echo "DEFAULT_SUBDOMAIN='${SUBDOMAIN}'" >> "$CFG_PATH" 73 | echo "DEFAULT_CSV_PATH='${CSV_PATH}'" >> "$CFG_PATH" 74 | --------------------------------------------------------------------------------