代码拉取完成,页面将自动刷新
# /bin/bash
path=$(cd "$(dirname $0)";pwd) # 当前路径
zone_id='404fxxxxxxxxxxxxxxxxxxxxxxxxxxae1b'
api_key='UPvxxxxxxxxxxxxxxxxxxxxxxxxxxTeS-y'
main_doman='xxxxxxxxxx.top'
flag=0 # 解析记录成功则不变,失败则置为-1,控制是否更新本地 ipv6_prefix。
# 判断ip是否变化
if_ip_diff(){
# 读取本地记录ipv6前缀,存放在ipv6_prefix.ini
local old_ipv6_prefix=`cat $path/ipv6_prefix.ini`
# 读取当前实际ipv6前缀
export new_ipv6_prefix=`/usr/sbin/ip -6 addr|grep global|head -1|awk -F/ '{print $1}'|awk '{print $NF}'|awk -F: '{print $1":"$2":"$3":"$4}'`
echo "`date +"%Y年%m月%d日 %H时%M分"` 原ip为:$old_ipv6_prefix,新ip为:$new_ipv6_prefix" >> $path/logs/details.log
if [ $old_ipv6_prefix != $new_ipv6_prefix ];then
#前缀有变动需要更新
echo "`date +"%Y年%m月%d日 %H时%M分"` ip变动 原前缀为:$old_ipv6_prefix;新前缀为:$new_ipv6_prefix" | tee -a $path/logs/ddns.log $path/logs/details.log >/dev/null
return 1
else
echo "`date +"%Y年%m月%d日 %H时%M分"`;ip无变化" | tee -a $path/logs/ddns.log $path/logs/details.log
echo "退出程序" | tee -a $path/logs/details.log
return 0
fi
}
# 更新原有记录
Update_DNS_Record(){
local local_domain=$1
local local_ip=$2
local dns_id=$3
local proxied=$4
echo "`date +"%Y年%m月%d日 %H时%M分"` 发送更新dns请求" >> $path/logs/details.log
sleep 2
export dns_update_data=`curl -X PUT "https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records/${dns_id}" \
-H "Authorization: Bearer ${api_key}" \
-H "Content-Type: application/json" \
--data '{
"type":"AAAA",
"name":"'"${local_domain}"'",
"content":"'"${local_ip}"'",
"ttl":600,
"proxied":'"${proxied}"'
}' -s `
if [ ` echo ${dns_update_data}| jq .success | tr 'A-Z' 'a-z' ` == 'true' ]; then
echo "`date +"%Y年%m月%d日 %H时%M分"` 更新${local_domain}记录成功" | tee -a $path/logs/details.log $path/logs/ddns.log
return 0
else
flag=-1 # 设为-1,不更新本地ipv6前缀记录
echo "更新dns记录失败,响应为:${dns_update_data}" >> $path/logs/details.log
echo "`date +"%Y年%m月%d日 %H时%M分"` 更新${local_domain}记录失败" | tee -a $path/logs/ddns.log
return 2
fi
}
# 创建新的dns解析记录
Create_DNS_Record(){
local local_domain=$1
local local_ip=$2
local proxied=$3
echo "发送创建新记录请求" >> $path/logs/details.log
sleep 2
export dns_create_data=`curl -X POST "https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records" \
-H "Authorization: Bearer ${api_key}" \
-H "Content-Type: application/json" \
--data '{
"type":"AAAA",
"name":"'"${local_domain}"'",
"content":"'"${local_ip}"'",
"ttl":600,
"proxied":'"${proxied}"'
}' -s `
if [ ` echo ${dns_create_data}| jq .success | tr 'A-Z' 'a-z' ` == 'true' ]; then
echo "`date +"%Y年%m月%d日 %H时%M分"` 创建新的${local_domain}记录成功" | tee -a $path/logs/details.log $path/logs/ddns.log
return 0
else
flag=-3 # 设为-3,不更新本地ipv6前缀记录
echo "`date +"%Y年%m月%d日 %H时%M分"` 创建新的${local_domain}解析记录失败,响应为:${dns_create_data}" >> $path/logs/details.log
echo "`date +"%Y年%m月%d日 %H时%M分"` 创建新的${local_domain}记录失败" | tee -a $path/logs/ddns.log
return 2
fi
}
# 获取dns列表
get_dns_list(){
# 发送dns查询请求
# - 存到变量中待用 --> dns_list_data
echo "`date +"%Y年%m月%d日 %H时%M分"`发送获取dns列表请求" >> $path/logs/details.log
sleep 2
export dns_list_data=`curl -X GET "https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records" \
-H "Authorization: Bearer ${api_key}" \
-H "Content-Type: application/json" -s`
echo "dns列表请求结束" >> $path/logs/details.log
if [ `echo ${dns_list_data}| jq .success | tr 'A-Z' 'a-z'` == 'true' ]; then
echo "获取dns列表成功" >> $path/logs/details.log
# 只取包含数据的部分 result 。
export dns_list_data=`echo ${dns_list_data}| jq .result`
# echo ${dns_list_data} > data.txt
return 0
else
flag=-2 # 设为-2,不更新本地ipv6前缀记录
echo "`date +"%Y年%m月%d日 %H时%M分"` dns列表请求失败,响应为:$dns_list_data" >> $path/logs/details.log
echo "程序结束,-2" >> $path/logs/details.log
exit -2
fi
}
# 主程序
main(){
# 循环读取每行数据
while IFS= read -r line
do
# 跳过空行
[[ $line =~ ^[[:space:]]*$ ]] && continue
# 跳过以#开头的注释行
[[ $line =~ ^\#.*$ ]] && continue
# 截取=左边的部分,即域名
local_domain=${line%=*}.${main_doman}
local_ip=${new_ipv6_prefix}:$(echo $line | sed 's/.*=\(.*\)@.*/\1/')
proxied=${line#*@} # 是否代理,false/true
echo "当前提交域名为:$local_domain" >> $path/logs/details.log
echo "当前提交ip为:$local_ip" >> $path/logs/details.log
echo "是否需要代理为:$proxied" >> $path/logs/details.log
# 查询当前local_domain的dns_id,存在则输出dns_id,不存在输出空。
dns_id=`echo $dns_list_data | jq -r ".[] | if .name == \"$local_domain\" then .id else empty end"`
echo "查询到的dns_id为:$dns_id" >> $path/logs/details.log
if [ ! $dns_id ];then
# 创建新的dns解析记录
echo "创建新的dns解析记录" >> $path/logs/details.log
Create_DNS_Record $local_domain $local_ip $proxied
else
# 判断内容是否有变化
#############################################################################################################################
# `echo $dns_list_data | jq -r ".[] | if .id == \"$dns_id\" then .content else empty end"`
if [ $local_ip == `echo $dns_list_data | jq -r ".[] | if .id == \"$dns_id\" then .content else empty end"` ];then
# ip没有变化,跳出
echo "${local_domain}的配置没有改变,不更新" >> $path/logs/details.log
continue
else
# 更新原有记录
echo "更新原有记录" >> $path/logs/details.log
Update_DNS_Record $local_domain $local_ip $dns_id $proxied
fi
fi
done < $path/dns_data.ini
}
####################程序入口##################################
echo "`date +"%Y年%m月%d日 %H时%M分"` 程序开始执行###############################" >> $path/logs/details.log
options=$(getopt -o f -- "$@")
if [ $? -ne 0 ]; then
echo "Usage: $(basename $0) [-f]
-f: 强制更新
不加选项:判断前缀是否更改,如果更改则更新"
exit 1
fi
eval set -- "$options"
case "$1" in
-f)
echo "强制执行更新" | tee -a $path/logs/details.log
export new_ipv6_prefix=`/usr/sbin/ip -6 addr|grep global|head -1|awk -F/ '{print $1}'|awk '{print $NF}'|awk -F: '{print $1":"$2":"$3":"$4}'`
get_dns_list
main
# 更新前缀记录
if [ $flag -eq 0 ];then
echo $new_ipv6_prefix > $path/ipv6_prefix.ini
fi
shift
;;
--)
echo "正常执行"
if_ip_diff
if [ $? -eq 1 ];then
# 获取dns列表
get_dns_list
main
# 更新前缀记录
if [ $flag -eq 0 ];then
echo $new_ipv6_prefix > $path/ipv6_prefix.ini
fi
fi
shift
;;
esac
echo "`date +"%Y年%m月%d日 %H时%M分"` 程序退出###############################" >> $path/logs/details.log
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。