1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
| set -o errexit set -o nounset set -o pipefail
date "+%n%F %T"
CFKEY=
CFUSER=
CFZONE_NAME=
CFRECORD_NAME=next.litao.cloud
CFRECORD_TYPE=AAAA
CFTTL=120
FORCE=false
WANIPSITE=`ifconfig | grep global | awk {'print $2'}`
if [ "$CFRECORD_TYPE" = "AAAA" ]; then : elif [ "$CFRECORD_TYPE" = "A" ]; then WANIPSITE="http://ipv4.icanhazip.com" else echo "$CFRECORD_TYPE specified is invalid, CFRECORD_TYPE can only be A(for IPv4)|AAAA(for IPv6)" exit 2 fi
while getopts k:u:h:z:t:f: opts; do case ${opts} in k) CFKEY=${OPTARG} ;; u) CFUSER=${OPTARG} ;; h) CFRECORD_NAME=${OPTARG} ;; z) CFZONE_NAME=${OPTARG} ;; t) CFRECORD_TYPE=${OPTARG} ;; f) FORCE=${OPTARG} ;; esac done
if [ "$CFKEY" = "" ]; then echo "Missing api-key, get at: https://www.cloudflare.com/a/account/my-account" echo "and save in ${0} or using the -k flag" exit 2 fi if [ "$CFUSER" = "" ]; then echo "Missing username, probably your email-address" echo "and save in ${0} or using the -u flag" exit 2 fi if [ "$CFRECORD_NAME" = "" ]; then echo "Missing hostname, what host do you want to update?" echo "save in ${0} or using the -h flag" exit 2 fi
if [ "$CFRECORD_NAME" != "$CFZONE_NAME" ] && ! [ -z "${CFRECORD_NAME##*$CFZONE_NAME}" ]; then CFRECORD_NAME="$CFRECORD_NAME.$CFZONE_NAME" echo " => Hostname is not a FQDN, assuming $CFRECORD_NAME" fi
WAN_IP=`curl -s ${WANIPSITE}` WAN_IP_FILE=$HOME/.cf-wan_ip_$CFRECORD_NAME.txt if [ -f $WAN_IP_FILE ]; then OLD_WAN_IP=`cat $WAN_IP_FILE` else echo "No file, need IP" OLD_WAN_IP="" fi
if [ "$WAN_IP" = "$OLD_WAN_IP" ] && [ "$FORCE" = false ]; then echo "WAN IP Unchanged, to update anyway use flag -f true" exit 0 fi
ID_FILE=$HOME/.cf-id_$CFRECORD_NAME.txt if [ -f $ID_FILE ] && [ $(wc -l $ID_FILE | cut -d " " -f 1) == 4 ] \ && [ "$(sed -n '3,1p' "$ID_FILE")" == "$CFZONE_NAME" ] \ && [ "$(sed -n '4,1p' "$ID_FILE")" == "$CFRECORD_NAME" ]; then CFZONE_ID=$(sed -n '1,1p' "$ID_FILE") CFRECORD_ID=$(sed -n '2,1p' "$ID_FILE") else echo "Updating zone_identifier & record_identifier" CFZONE_ID=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=$CFZONE_NAME" -H "X-Auth-Email: $CFUSER" -H "X-Auth-Key: $CFKEY" -H "Content-Type: application/json" | grep -Po '(?<="id":")[^"]*' | head -1 ) CFRECORD_ID=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$CFZONE_ID/dns_records?name=$CFRECORD_NAME" -H "X-Auth-Email: $CFUSER" -H "X-Auth-Key: $CFKEY" -H "Content-Type: application/json" | grep -Po '(?<="id":")[^"]*' | head -1 ) echo "$CFZONE_ID" > $ID_FILE echo "$CFRECORD_ID" >> $ID_FILE echo "$CFZONE_NAME" >> $ID_FILE echo "$CFRECORD_NAME" >> $ID_FILE fi
echo "Updating DNS to $WAN_IP"
RESPONSE=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$CFZONE_ID/dns_records/$CFRECORD_ID" \ -H "X-Auth-Email: $CFUSER" \ -H "X-Auth-Key: $CFKEY" \ -H "Content-Type: application/json" \ --data "{\"id\":\"$CFZONE_ID\",\"type\":\"$CFRECORD_TYPE\",\"name\":\"$CFRECORD_NAME\",\"content\":\"$WAN_IP\", \"ttl\":$CFTTL}")
if [ "$RESPONSE" != "${RESPONSE%success*}" ] && [ "$(echo $RESPONSE | grep "\"success\":true")" != "" ]; then echo "Updated succesfuly!" echo $WAN_IP > $WAN_IP_FILE exit else echo 'Something went wrong :(' echo "Response: $RESPONSE" exit 1 fi
|