#!/bin/sh

# --------------------------------------------------
# change these 

aliddns_ak=<aliddns access key id> 
aliddns_sk=<aliddns access key secret>
aliddns_domain=<aliddns domain>
# --------------------------------------------------

aliddns_name=$1
aliddns_type=A
aliddns_dns=223.5.5.5
aliddns_record_id=""
aliddns_ttl=600
aliddns_version=1.0

now=`date`

die () {
    echo $1

}

file_name="/tmp/aliddns_$aliddns_name.$aliddns_domain.$aliddns_type.id";

if [ -f "$file_name" ];then
aliddns_record_id=`cat $file_name`;
else
aliddns_record_id=""
fi

#ip=`ip addr show dev pppoe0 |awk -F" " 'NR==3 {print $2}'`
ip=$(curl -s http://ipv4.icanhazip.com)

current_ip=`host $aliddns_name.$aliddns_domain $aliddns_dns |grep 'has address' 2>&1`

echo "curl_ip: $ip   dns_ip:$current_ip" 

if [ "$?" -eq "0" ]
then
    current_ip=`echo "$current_ip" | tail -n1|awk -F ' ' '{print $4}'`
     echo "dns_ip:$current_ip" 
    if [ "$ip" = "$current_ip" ]
    then
        echo "skipping"
        exit 0
    fi 
fi


timestamp=`date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ"`

urlencode() {
    # urlencode <string>
    out=""
    while read -n1 c
    do
        case $c in
            [a-zA-Z0-9._-]) out="$out$c" ;;
            *) out="$out`printf '%%%02X' "'$c"`" ;;
        esac
    done
    echo -n $out
}

enc() {
    echo -n "$1" | urlencode
}

send_request() {
    local args="AccessKeyId=$aliddns_ak&Action=$1&Format=json&$2&Version=2015-01-09"
    local hash=$(echo -n "GET&%2F&$(enc "$args")" | openssl dgst -sha1 -hmac "$aliddns_sk&" -binary | openssl base64)
	#echo  "http://alidns.aliyuncs.com/?$args&Signature=$(enc "$hash")"
    curl -s "http://alidns.aliyuncs.com/?$args&Signature=$(enc "$hash")"
}

get_recordid() {
    grep -Eo '"RecordId":"[0-9]+"' | cut -d':' -f2 | tr -d '"'
}

query_recordid() {
    send_request "DescribeSubDomainRecords" "SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&SubDomain=$aliddns_name.$aliddns_domain&Timestamp=$timestamp&Type=$aliddns_type"
}

update_record() {
    send_request "UpdateDomainRecord" "RR=$aliddns_name&RecordId=$1&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&TTL=$aliddns_ttl&Timestamp=$timestamp&Type=$aliddns_type&Value=$(enc "$ip")"
}

add_record() {
    send_request "AddDomainRecord&DomainName=$aliddns_domain" "RR=$aliddns_name&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&TTL=$aliddns_ttl&Timestamp=$timestamp&Type=$aliddns_type&Value=$(enc "$ip")"
}

if [ "$aliddns_record_id" = "" ]
then
    aliddns_record_id=`query_recordid | get_recordid`
fi
if [ "$aliddns_record_id" = "" ]
then
    aliddns_record_id=`add_record | get_recordid`
    echo "added record $aliddns_record_id"
else
    update_record $aliddns_record_id
    echo "updated record $aliddns_record_id"
fi

# save to file
if [ "$aliddns_record_id" = "" ]; then
    # failed
    echo "aliddns_record_id null"
else
    #dbus ram aliddns_record_id=$aliddns_record_id
    echo $aliddns_record_id > $file_name
fi
