cfip.acc (2): Cập nhật IP trên cloudflare

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@ly-le.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

Comments Off on cfip.acc (2): Cập nhật IP trên cloudflare

Filed under Software

Comments are closed.