openwrt 使用dnspod 获得动态域名


使用此方法必须先安装curl!!

将末尾的代码保存至 /usr/bin下,起名为dnspod.

编辑脚本中dnspod网站的账号和密码。

保存后记得chmod 755 /usr/bin/dnspod

  • 创建域名记录

dnspod -C aimonica.com

记得要更换成你自己的域名,并且是不带www。如果已经创建,可以跳过此步。

成功创建域名记录后,脚本会在后台运行,每五分钟检测一次IP是否变化,有变化就更新,这样可减少对dnspod服务的请求次数。

  • 启用开机运行

openwrt的用户可以把下面的脚本拷贝到/etc/init.d/下面,保存为dnspod,然后chmod 755 /etc/init.d/dnspod

#!/bin/sh /etc/rc.common
# Copyright (C) 2006-2011 OpenWrt.org

START=60

start() {
       lino-dnspod -u aimonica.com &
}

stop() {
        killall dnspod
}

然后,/etc/init.d/dnspod enable即可。

  • 命令简介

创建域名命令
dnspod -C aimonica.com

创建记录命令
dnspod -c aimonica.com

删除记录命令
dnspod -r aimonica.com

更新记录命令
dnspod -u aimonica.com

 

以下为脚本内容

#!/bin/sh
#written by benson huang
#[email protected]

curl_status=`which curl 2>/dev/null`
[ -n "$curl_status" ] || { echo "curl is not installed";exit 3; }
#dnspod帐号名
email='[email protected]'
#dnspod密码
password='xxxxxxx'
sub_domains='www ftp @'
API_url="https://dnsapi.cn"
pub_ip_addr=$(curl -s http://checkip.dyndns.com | sed -n 's/.*: \([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/p')
format='json'
lang='en'
record_type='A'
offset="2"
length=""
os=$(uname -a | egrep -io 'openwrt' | tr [A-Z] [a-z])
shared_data="login_email=$email&login_password=$password&format=$format&lang=$lang&"
PROGRAM=$(basename $0)
#check for changed ip every 300 seconds
wait=300

getJsonValue(){
      params="$1"
 echo $json_data | sed 's/\\\\\//\//g' | sed 's/[{}]//g;s/\(\[\|\]\)//g' |\
 awk -F ',' '{ for (i=1;i<=NF;i++) { print $i }}' |\
 sed 's/":/\|/g;s/"//g' |\
 awk -v k="$params" -F'|' '{ if ($(NF - 1) == k )  print $NF }'
}

getDomainId() {
     local json_data=`curl -k -A 'xddns' $API_url/Domain.info -d ${shared_data}domain=$domainname`
          getJsonValue id
 }

getRecordId() {

  for sub_domain in $sub_domains;do

      local json_data
      json_data=$(curl -k -A 'xddns' $API_url/Record.List -d\ "${shared_data}record_type=$record_type&domain_id=$domain_id&sub_domain=${sub_domain}&offset=${offset}&length=${length}")

	   #check if record type is NS
	   IS_NS=$(getJsonValue type | grep -o 'NS' | head -n1)

      #if there are 3 @ subdomains, get the non-NS record id only
     if [ "$IS_NS" = "NS" ];then

		 numofline=$(getJsonValue id | sed '/^[0-9]\{7\}$/d' | wc -l)

		[ $numofline -eq 3 ] && tmp_result_id="$(getJsonValue id | sed '/^[0-9]\{7\}$/d' | head -n1 )" || continue

     else  
	       tmp_result_id="$(getJsonValue id | sed '/^[0-9]\{7\}$/d')"
	 fi	
	        #if result_id is not empty or unset, append a space to split record id
		   result_id="${result_id:+${result_id} }${tmp_result_id}"

  done

      echo $result_id
      exit
}

createDomain() {
      curl -k -A 'xddns' $API_url/Domain.Create -d ${shared_data}domain=$domainname
       exit
}

createRecord() {
             for sub_domain in $sub_domains;do

             local extra_data="&domain_id=$domain_id&sub_domain=$sub_domain&record_type=$record_type&record_line=默认&value=${pub_ip_addr}"
             curl -k -A 'xddns' $API_url/Record.Create -d $shared_data"$extra_data"			 
            done
}

updateRecord() {

         local record_id_list=`getRecordId`
         tmp_sub_domains=${sub_domains}

         for record_id in $record_id_list;do

                 sub_domain=$(echo $tmp_sub_domains | awk '{ print $1 }')
                 tmp_sub_domains=${tmp_sub_domains#* }

      local extra_data="&domain_id=$domain_id&sub_domain=${sub_domain}\
          &record_type=${record_type}&record_line=默认&value=${pub_ip_addr}&record_id=$record_id"

      curl -k -A 'xddns' $API_url/Record.Modify -d $shared_data"$extra_data"

          done
}

removeRecord(){

             read -p "list the subdomains to be deleted " subdomain

                 sub_domains="$subdomain"

				 for sub_domain in $sub_domains;do

                   record_id=`getRecordId`

                  local extra_data="&domain_id=$domain_id&record_id=$record_id"
                  curl -k -A 'xddns' $API_url/Record.Remove -d $shared_data"$extra_data"
			    done

                 exit

 }

checkip() {
          oldip=$pub_ip_addr
          newip=$(curl -s http://checkip.dyndns.com | sed -n 's/.*: \([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/p')

                  if [ "$newip" != "$oldip" ];then
                        oldip="$newip"
                        return 8
                  else
                        return 3
                  fi
}

 if [ $# -ne 2 ];then
      echo "usage:$PROGRAM |-c create record|-r remove records|-C create new domain|-m modify record | -bc create a batch of records DOMAIN [eg.example.com]"
          exit 3
 fi

 [ -n "$2" ] && domainname=$2

domain_id=`getDomainId $domainname`

  case $1 in
          -c)createRecord $domainname;;
          -r)removeRecord $domainname;;
          -u)updateRecord $domainname;;
          -C)createDomain $domainname;;
          -i)getRecordId $domainname;;
          *) echo "no such option";
             exit 3;;
  esac

 while [ 1 ];do

          checkip

       if [ $? -eq 8 ];then
               pub_ip_addr="$newip"
               updateRecord
       fi

       sleep $wait

done

你可能感兴趣的:(OpenWRT)