cfip.acc cập nhật tất cả IP v4/v6 của các record thuộc một tài khoản của cloudflare.com
usage:
cfip.acc [-f][-v][-e auth_email][-k auth_key][-4][-6][-x exclude_domain]
-f: buộc cập nhật
-v: in thông báo ra file ~/cfip.acc.log (mặc định không)
-e: email đăng nhập của tài khoản
-k: API key của tài khoản, có quyền đọc ghi
-4: cập nhật IP v4 (mặc định)
-6: cập nhật IP v6
-x: bỏ qua domain/subdomain này
Thí dụ:
# cập nhật ip v4 cho tất cả domain/subdomain,
# ngoại trừ domain/subdomain example.com và my.cam.net
cfip.acc -e yr.mail -k yr.key -v -x example.com -x my.cam.net
# output ra ~/cfip.acc.log
[Domain example.com] ✘ Bỏ qua!
[Domain cam.net]
░ my.cam.net: ✘ Bỏ qua!
░ cloud.cam.net: ✓ IP A không thay đổi
░ store.cam.net: ✓ IP A không thay đổi
# cập nhật ip v6 cho tất cả domain/subdomain
# (email/api_key đã ghi sẳn trong script)
cfip.acc -v -6
# output ra ~/cfip.acc.log
[Domain cam.net]
░ cam.net: 2001:ee0:4fb3:1990:52de:105d:debe:7b99 → 2001:ee0:4fb3:1999::cfa
Khác với phiên bản trước, phiên bản này không dùng jq mà dùng python (có sẳn trong máy) để lọc kết quả trả về từ cloudflare.com
#!/bin/bash
# cfip.acc
# Update IP for all A/AAAA records belonging to cloudflare.com account
# © 2020 LNT <lnt@lyle.info>
# version 20221011
#
L=$HOME/$(basename $0).log
E="✘ Bỏ qua!"
SHM=/dev/shm/cfIP
[ -d $SHM ]||mkdir $SHM
ff=0;X=();v=0;ip4='';ip6=''
function usage(){
cat >&2<<EOF
Cập nhật IP cho tất cả record A hay AAAA thuộc một tài khoản cloudflare.com
usage:
$(basename $0) [-f][-e auth_email][-k auth_key][-4][-6][-x exclude_domain]
-4: cập nhật IP v4 (mặc định)
-6: cập nhật IP v6
EOF
exit 1
}
msg="[cfip.acc]\n"$(date +'%d-%m-%Y %T')
c4=`dig txt ch +short @1.1.1.1 whoami.cloudflare|sed 's/"//g'`
while getopts :e:k:x:46fv opt; do
case $opt in
f) ff=1;rm -rf $SHM/*;;
4) ip4="$c4";;
6) ip6=`dig txt ch +short @2606:4700:4700::1111 whoami.cloudflare|sed 's/"//g'`;;
e) AUTH_EMAIL="$OPTARG";;
k) AUTH_KEY="$OPTARG";;
x) X+=("$OPTARG");;
v) v=1;;
?) usage
esac
done
# Default account
[ -z "$AUTH_EMAIL" ] && AUTH_EMAIL='mail mặc định'
[ -z "$AUTH_KEY" ] && AUTH_KEY='auth key mặc định'
[[ -z "$ip4" && -z "$ip6" ]] && ip4="$c4"
[ -e "$SHM/ip4" ] && o4=$(<$SHM/ip4) || o4=''
[ ! -z "$ip4" ] && printf $ip4>$SHM/ip4
[ -e "$SHM/ip6" ] && o6=$(<$SHM/ip6)||o6=''
[ ! -z "$ip6" ] && printf $ip6>$SHM/ip6
[[ $ff == 0 && "$ip4" == "$o4" && "$ip6" == "$o6" ]] && { (( $v )) && echo -e "$msg\n✓ Tất cả IP không thay đổi">>$L; exit 1; }
BASE_URL='https://api.cloudflare.com/client/v4/zones'
H1="X-Auth-Email:$AUTH_EMAIL"
H2="X-Auth-Key:$AUTH_KEY"
H3="Content-Type:application/json"
ZID=$(curl -s -G -H "$H1" -H "$H2" -H "$H3" "$BASE_URL" \
| python -c "import sys,json;dIn=json.load(sys.stdin)['result'];print([d['id']+'='+d['name'] for d in dIn])" \
| sed "s/\(,\|'\|\[\|\]\)//g")
[ -z "$ZID" ] && { (( $v )) && echo -e "$msg\n‼ Sai/Thiếu AUTH EMAIL/KEY!\n">>$L;exit 1; }
for z in $ZID; do
n="${z#*=}"
[[ " ${X[*]} " =~ " $n " ]]&&{ msg="$msg\n[Domain $n] $E"; continue; }
zid=${z%=*}
if [ -z "$ip6" ];then
typ='A'
elif [ -z "$ip4" ];then
typ='AAAA'
else
typ='A,AAAA'
fi
rs=$(curl -s -G -H "$H1" -H "$H2" -H "$H3" "${BASE_URL}/$zid/dns_records?type=$typ" \
| python -c "import sys,json;dIn=json.load(sys.stdin)['result']; print([d['id']+'='+d['name']+'='+d['content']+'='+d['type'] for d in dIn])" \
| sed "s/\(,\|'\|\[\|\]\)//g")
[ -z "$rs" ] || msg="$msg\n[Domain $n]"
s=''
for rc in $rs; do
IFS='=' read -r id n cIP t <<<"$rc"; unset IFS
[[ " ${X[*]} " =~ " $n " ]] && { s="${s} ░ ${n}: $E\n"; continue; }
[ "$t" == 'A' ]&&ip="$ip4" || ip="$ip6"
if [ "$ip" == "$cIP" ]; then
r="✓ IP $t không thay đổi"
else
ret=$(curl -s -X PUT -H "$H1" -H "$H2" -H "$H3" \
"${BASE_URL}/$zid/dns_records/$id" \
--data "{\"type\":\"$t\", \"name\":\"$n\", \"content\":\"$ip\", \"ttl\":3600, \"proxied\":false}" \
| python -c "import sys,json;print(json.load(sys.stdin)['success'])")
[ "$ret" == 'True' ] && r="$cIP → $ip" || r="⛔ Lỗi!"
fi
[ ! -z "$r" ] && s="$s ░ ${n}: $r\n"
done
[ ! -z "$s" ] && msg="$msg\n${s::-2}"
done
(( $v )) && echo -e "$msg\n" >> $L
exit 0