From c63331bbccf7911252754986ee8baf13db06f76b Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Fri, 12 Jan 2018 15:45:38 +0800 Subject: [PATCH] replace aliddns to ddns-scripts_aliyun by sensel --- package/lean/ddns-scripts_aliyun/Makefile | 72 ++++++ .../ddns-scripts_aliyun/update_aliyun_com.sh | 233 ++++++++++++++++++ package/lean/luci-app-aliddns/Makefile | 19 -- .../luasrc/controller/aliddns.lua | 4 - .../luasrc/model/cbi/aliddns.lua | 52 ---- .../lean/luci-app-aliddns/po/zh-cn/aliddns.po | 4 - .../luci-app-aliddns/root/etc/config/aliddns | 10 - .../luci-app-aliddns/root/etc/init.d/aliddns | 18 -- .../root/etc/uci-defaults/luci-app-aliddns | 5 - .../luci-app-aliddns/root/usr/sbin/aliddns | 128 ---------- 10 files changed, 305 insertions(+), 240 deletions(-) create mode 100644 package/lean/ddns-scripts_aliyun/Makefile create mode 100755 package/lean/ddns-scripts_aliyun/update_aliyun_com.sh delete mode 100644 package/lean/luci-app-aliddns/Makefile delete mode 100644 package/lean/luci-app-aliddns/luasrc/controller/aliddns.lua delete mode 100644 package/lean/luci-app-aliddns/luasrc/model/cbi/aliddns.lua delete mode 100644 package/lean/luci-app-aliddns/po/zh-cn/aliddns.po delete mode 100644 package/lean/luci-app-aliddns/root/etc/config/aliddns delete mode 100755 package/lean/luci-app-aliddns/root/etc/init.d/aliddns delete mode 100755 package/lean/luci-app-aliddns/root/etc/uci-defaults/luci-app-aliddns delete mode 100755 package/lean/luci-app-aliddns/root/usr/sbin/aliddns diff --git a/package/lean/ddns-scripts_aliyun/Makefile b/package/lean/ddns-scripts_aliyun/Makefile new file mode 100644 index 000000000..e35cef5a4 --- /dev/null +++ b/package/lean/ddns-scripts_aliyun/Makefile @@ -0,0 +1,72 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=ddns-scripts_aliyun +PKG_VERSION:=1.0.0 +PKG_RELEASE:=1 + +PKG_LICENSE:=GPLv2 +PKG_MAINTAINER:=Sense + +PKG_BUILD_PARALLEL:=1 + +include $(INCLUDE_DIR)/package.mk + +define Package/$(PKG_NAME) + SECTION:=net + CATEGORY:=Network + SUBMENU:=IP Addresses and Names + TITLE:=DDNS extension for AliYun.com + PKGARCH:=all + DEPENDS:=+ddns-scripts +wget +openssl-util +endef + +define Package/$(PKG_NAME)/description + Dynamic DNS Client scripts extension for AliYun.com +endef + +define Build/Configure +endef + +define Build/Compile + $(CP) ./*.sh $(PKG_BUILD_DIR) +endef + +define Package/$(PKG_NAME)/preinst + #!/bin/sh + # if NOT run buildroot then stop service + [ -z "$${IPKG_INSTROOT}" ] && /etc/init.d/ddns stop >/dev/null 2>&1 + exit 0 # suppress errors +endef + +define Package/$(PKG_NAME)/install + $(INSTALL_DIR) $(1)/usr/lib/ddns + $(INSTALL_BIN) $(PKG_BUILD_DIR)/update_aliyun_com.sh $(1)/usr/lib/ddns +endef + +define Package/$(PKG_NAME)/postinst + #!/bin/sh + # remove old services file entries + /bin/sed -i '/aliyun\.com/d' $${IPKG_INSTROOT}/etc/ddns/services >/dev/null 2>&1 + /bin/sed -i '/aliyun\.com/d' $${IPKG_INSTROOT}/etc/ddns/services_ipv6 >/dev/null 2>&1 + # and create new + printf "%s\\t\\t%s\\n" '"aliyun.com"' '"update_aliyun_com.sh"' >> $${IPKG_INSTROOT}/etc/ddns/services + printf "%s\\t\\t%s\\n" '"aliyun.com"' '"update_aliyun_com.sh"' >> $${IPKG_INSTROOT}/etc/ddns/services_ipv6 + # on real system restart service if enabled + [ -z "$${IPKG_INSTROOT}" ] && { + /etc/init.d/ddns enabled && \ + /etc/init.d/ddns start >/dev/null 2>&1 + } + exit 0 # suppress errors +endef + +define Package/$(PKG_NAME)/prerm + #!/bin/sh + # if NOT run buildroot then stop service + [ -z "$${IPKG_INSTROOT}" ] && /etc/init.d/ddns stop >/dev/null 2>&1 + # remove services file entries + /bin/sed -i '/aliyun\.com/d' $${IPKG_INSTROOT}/etc/ddns/services >/dev/null 2>&1 + /bin/sed -i '/aliyun\.com/d' $${IPKG_INSTROOT}/etc/ddns/services_ipv6 >/dev/null 2>&1 + exit 0 # suppress errors +endef + +$(eval $(call BuildPackage,$(PKG_NAME))) diff --git a/package/lean/ddns-scripts_aliyun/update_aliyun_com.sh b/package/lean/ddns-scripts_aliyun/update_aliyun_com.sh new file mode 100755 index 000000000..89ee909ce --- /dev/null +++ b/package/lean/ddns-scripts_aliyun/update_aliyun_com.sh @@ -0,0 +1,233 @@ +#!/bin/sh +# +# 用于阿里云解析的DNS更新脚本 +# 2017-2018 Sense +# 阿里云解析API文档 https://help.aliyun.com/document_detail/29739.html +# +# 本脚本由 dynamic_dns_functions.sh 内的函数 send_update() 调用 +# +# 需要在 /etc/config/ddns 中设置的选项 +# option username - 阿里云API访问账号 Access Key ID。可通过 aliyun.com 帐号管理的 accesskeys 获取, 或者访问 https://ak-console.aliyun.com +# option password - 阿里云API访问密钥 Access Key Secret +# option domain - 完整的域名。建议主机与域名之间使用 @符号 分隔,否则将以第一个 .符号 之前的内容作为主机名 +# + +# 检查传入参数 +[ -z "$username" ] && write_log 14 "配置错误!保存阿里云API访问账号的'用户名'不能为空" +[ -z "$password" ] && write_log 14 "配置错误!保存阿里云API访问密钥的'密码'不能为空" + +# 检查外部调用工具 +[ -n "$WGET_SSL" ] || write_log 13 "使用阿里云API需要 GNU Wget 支持,请先安装" +command -v sed >/dev/null 2>&1 || write_log 13 "使用阿里云API需要 sed 支持,请先安装" +command -v openssl >/dev/null 2>&1 || write_log 13 "使用阿里云API需要 openssl-util 支持,请先安装" + +# 包含用于解析 JSON 格式返回值的函数 +. /usr/share/libubox/jshn.sh + +# 变量声明 +local __HOST __DOMAIN __TYPE __URLBASE __CMDBASE __URLARGS __SEPARATOR __RECID +[ $use_https -eq 0 ] && __URLBASE="http://alidns.aliyuncs.com/" || __URLBASE="https://alidns.aliyuncs.com/" +__SEPARATOR="&" + +# 从 $domain 分离主机和域名 +[ "${domain:0:2}" == "@." ] && domain="${domain/./}" # 主域名处理 +[ "$domain" == "${domain/@/}" ] && domain="${domain/./@}" # 未找到分隔符,兼容常用域名格式 +__HOST="${domain%%@*}" +__DOMAIN="${domain#*@}" +[ -z "$__HOST" -o "$__HOST" == "$__DOMAIN" ] && __HOST="@" + +# 设置记录类型 +[ $use_ipv6 -eq 0 ] && __TYPE="A" || __TYPE="AAAA" + +# 构造基本通信命令 +build_command() { + __CMDBASE="$WGET_SSL -nv -t 1 -O $DATFILE -o $ERRFILE" + # 绑定用于通信的主机/IP + if [ -n "$bind_network" ]; then + local bind_ip run_prog + [ $use_ipv6 -eq 0 ] && run_prog="network_get_ipaddr" || run_prog="network_get_ipaddr6" + eval "$run_prog bind_ip $bind_network" || \ + write_log 13 "无法使用 '$run_prog $bind_network' 获取本地IP地址 - 错误代码: '$?'" + write_log 7 "强制使用IP '$bind_ip' 通信" + __CMDBASE="$__CMDBASE --bind-address=$bind_ip" + fi + # 强制设定IP版本 + if [ $force_ipversion -eq 1 ]; then + [ $use_ipv6 -eq 0 ] && __CMDBASE="$__CMDBASE -4" || __CMDBASE="$__CMDBASE -6" + fi + # 设置CA证书参数 + if [ $use_https -eq 1 ]; then + if [ "$cacert" = "IGNORE" ]; then + __CMDBASE="$__CMDBASE --no-check-certificate" + elif [ -f "$cacert" ]; then + __CMDBASE="$__CMDBASE --ca-certificate=${cacert}" + elif [ -d "$cacert" ]; then + __CMDBASE="$__CMDBASE --ca-directory=${cacert}" + elif [ -n "$cacert" ]; then + write_log 14 "在 '$cacert' 中未找到用于 HTTPS 通信的有效证书" + fi + fi + # 如果没有设置,禁用代理 (这可能是 .wgetrc 或环境设置错误) + [ -z "$proxy" ] && __CMDBASE="$__CMDBASE --no-proxy" +} + +# 用于阿里云API的通信函数 +aliyun_transfer() { + local __PARAM=$* + local __CNT=0 + local __RUNPROG __ERR PID_SLEEP + + [ $# -eq 0 ] && write_log 12 "'aliyun_transfer()' 出错 - 参数数量错误" + + while : ; do + build_Request $__PARAM + __RUNPROG="$__CMDBASE '${__URLBASE}?${__URLARGS}'" + + write_log 7 "#> $__RUNPROG" + eval $__RUNPROG + __ERR=$? + [ $__ERR -eq 0 ] && return 0 + + write_log 3 "wget 错误代码: '$__ERR'" + write_log 7 "$(cat $ERRFILE)" + + if [ $VERBOSE -gt 1 ]; then + write_log 4 "传输失败 - 详细模式: $VERBOSE - 出错后不再重试" + return 1 + fi + + __CNT=$(( $__CNT + 1 )) + [ $retry_count -gt 0 -a $__CNT -gt $retry_count ] && \ + write_log 14 "$retry_count 次重试后传输还是失败" + + write_log 4 "传输失败 - $__CNT/$retry_count 在 $RETRY_SECONDS 秒后重试" + sleep $RETRY_SECONDS & + PID_SLEEP=$! + wait $PID_SLEEP + PID_SLEEP=0 + done +} + +# 百分号编码 +percentEncode() { + if [ -z "${1//[A-Za-z0-9_.~-]/}" ]; then + echo -n "$1" + else + local string=$1; local i=0; local ret chr + while [ $i -lt ${#string} ]; do + chr=${string:$i:1} + [ -z "${chr#[^A-Za-z0-9_.~-]}" ] && chr=$(printf '%%%02X' "'$chr") + ret="$ret$chr" + i=$(( $i + 1 )) + done + echo -n "$ret" + fi +} + +# 构造阿里云解析请求参数 +build_Request() { + local args=$*; local string + local HTTP_METHOD="GET" + + # 添加请求参数 + __URLARGS= + for string in $args; do + case "${string%%=*}" in + Format|Version|AccessKeyId|SignatureMethod|Timestamp|SignatureVersion|SignatureNonce|Signature) ;; # 过滤公共参数 + *) __URLARGS="$__URLARGS${__SEPARATOR}"$(percentEncode "${string%%=*}")"="$(percentEncode "${string#*=}");; + esac + done + __URLARGS="${__URLARGS:1}" + + # 附加公共参数 + string="Format=JSON"; __URLARGS="$__URLARGS${__SEPARATOR}"$(percentEncode "${string%%=*}")"="$(percentEncode "${string#*=}") + string="Version=2015-01-09"; __URLARGS="$__URLARGS${__SEPARATOR}"$(percentEncode "${string%%=*}")"="$(percentEncode "${string#*=}") + string="AccessKeyId=$username"; __URLARGS="$__URLARGS${__SEPARATOR}"$(percentEncode "${string%%=*}")"="$(percentEncode "${string#*=}") + string="SignatureMethod=HMAC-SHA1"; __URLARGS="$__URLARGS${__SEPARATOR}"$(percentEncode "${string%%=*}")"="$(percentEncode "${string#*=}") + string="Timestamp="$(date -u '+%Y-%m-%dT%H:%M:%SZ'); __URLARGS="$__URLARGS${__SEPARATOR}"$(percentEncode "${string%%=*}")"="$(percentEncode "${string#*=}") + string="SignatureVersion=1.0"; __URLARGS="$__URLARGS${__SEPARATOR}"$(percentEncode "${string%%=*}")"="$(percentEncode "${string#*=}") + string="SignatureNonce="$(cat '/proc/sys/kernel/random/uuid'); __URLARGS="$__URLARGS${__SEPARATOR}"$(percentEncode "${string%%=*}")"="$(percentEncode "${string#*=}") + + # 对请求参数进行排序,用于生成签名 + string=$(echo -n "$__URLARGS" | sed 's/\'"${__SEPARATOR}"'/\n/g' | sort | sed ':label; N; s/\n/\'"${__SEPARATOR}"'/g; b label') + # 构造用于计算签名的字符串 + string="${HTTP_METHOD}${__SEPARATOR}"$(percentEncode "/")"${__SEPARATOR}"$(percentEncode "$string") + # 字符串计算签名HMAC值 + local signature=$(echo -n "$string" | openssl dgst -sha1 -hmac "${password}&" -binary) + # HMAC值编码成字符串,得到签名值 + signature=$(echo -n "$signature" | openssl base64) + + # 附加签名参数 + string="Signature=$signature"; __URLARGS="$__URLARGS${__SEPARATOR}"$(percentEncode "${string%%=*}")"="$(percentEncode "${string#*=}") +} + +# 添加解析记录 +add_domain() { + local value + aliyun_transfer "Action=AddDomainRecord" "DomainName=${__DOMAIN}" "RR=${__HOST}" "Type=${__TYPE}" "Value=${__IP}" || write_log 14 "服务器通信失败" + json_cleanup; json_load "$(cat "$DATFILE" 2> /dev/null)" >/dev/null 2>&1 + json_get_var value "RecordId" + [ -z "$value" ] && write_log 14 "添加新解析记录失败" + write_log 7 "添加新解析记录成功" + return 0 +} + +# 修改解析记录 +update_domain() { + local value + aliyun_transfer "Action=UpdateDomainRecord" "RecordId=${__RECID}" "RR=${__HOST}" "Type=${__TYPE}" "Value=${__IP}" || write_log 14 "服务器通信失败" + json_cleanup; json_load "$(cat "$DATFILE" 2> /dev/null)" >/dev/null 2>&1 + json_get_var value "RecordId" + [ -z "$value" ] && write_log 14 "修改解析记录失败" + write_log 7 "修改解析记录成功" + return 0 +} + +# 启用解析记录 +enable_domain() { + local value + aliyun_transfer "Action=SetDomainRecordStatus" "RecordId=${__RECID}" "Status=Enable" || write_log 14 "服务器通信失败" + json_cleanup; json_load "$(cat "$DATFILE" 2> /dev/null)" >/dev/null 2>&1 + json_get_var value "Status" + [ "$value" != "Enable" ] && write_log 14 "启用解析记录失败" + write_log 7 "启用解析记录成功" + return 0 +} + +# 获取子域名解析记录列表 +describe_domain() { + local value type; local ret=0 + aliyun_transfer "Action=DescribeSubDomainRecords" "SubDomain=${__HOST}.${__DOMAIN}" || write_log 14 "服务器通信失败" + json_cleanup; json_load "$(cat "$DATFILE" 2> /dev/null)" >/dev/null 2>&1 + json_get_var value "TotalCount" + if [ $value -eq 0 ]; then + write_log 7 "解析记录不存在" + ret=1 + else + json_select "DomainRecords" >/dev/null 2>&1 + json_select "Record" >/dev/null 2>&1 + json_select 1 >/dev/null 2>&1 + json_get_var value "Locked" + [ $value -ne 0 ] && write_log 14 "解析记录被锁定" + json_get_var __RECID "RecordId" + write_log 7 "获得解析记录ID: ${__RECID}" + json_get_var value "Status" + [ "$value" != "ENABLE" ] && ret=$(( $ret | 2 )) && write_log 7 "解析记录被禁用" + json_get_var type "Type" + json_get_var value "Value" + [ "$type" != "${__TYPE}" -o "$value" != "${__IP}" ] && ret=$(( $ret | 4 )) && write_log 7 "地址或类型需要修改" + fi + return $ret +} + +build_command +describe_domain +ret=$? +if [ $ret -eq 1 ]; then + sleep 3 && add_domain +else + [ $(( $ret & 2 )) -ne 0 ] && sleep 3 && enable_domain + [ $(( $ret & 4 )) -ne 0 ] && sleep 3 && update_domain +fi + +return 0 diff --git a/package/lean/luci-app-aliddns/Makefile b/package/lean/luci-app-aliddns/Makefile deleted file mode 100644 index e3f10e5d2..000000000 --- a/package/lean/luci-app-aliddns/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -# -# Copyright (C) 2008-2014 The LuCI Team -# -# This is free software, licensed under the Apache License, Version 2.0 . -# - -include $(TOPDIR)/rules.mk - -LUCI_TITLE:=LuCI for Aliddns -LUCI_DEPENDS:=+wget +openssl-util -LUCI_PKGARCH:=all -PKG_VERSION:=1.0 -PKG_RELEASE:=1 - -include $(TOPDIR)/feeds/luci/luci.mk - -# call BuildPackage - OpenWrt buildroot signature - - diff --git a/package/lean/luci-app-aliddns/luasrc/controller/aliddns.lua b/package/lean/luci-app-aliddns/luasrc/controller/aliddns.lua deleted file mode 100644 index c62864560..000000000 --- a/package/lean/luci-app-aliddns/luasrc/controller/aliddns.lua +++ /dev/null @@ -1,4 +0,0 @@ -module("luci.controller.aliddns",package.seeall) -function index() -entry({"admin","services","aliddns"},cbi("aliddns"),_("Aliddns Client"),101) -end diff --git a/package/lean/luci-app-aliddns/luasrc/model/cbi/aliddns.lua b/package/lean/luci-app-aliddns/luasrc/model/cbi/aliddns.lua deleted file mode 100644 index 76b386ef8..000000000 --- a/package/lean/luci-app-aliddns/luasrc/model/cbi/aliddns.lua +++ /dev/null @@ -1,52 +0,0 @@ -local a=require"luci.sys" -local e=luci.model.uci.cursor() -local e=require"nixio.fs" -require("luci.sys") -local t,e,o -local m,s -t=Map("aliddns",translate("阿里DDNS客户端"),translate("基于阿里云解析的私人DDNS解决方案")) - -e=t:section(TypedSection,"base") -e.anonymous=true - -e:tab("basic", translate("设置")) - -enable=e:taboption("basic",Flag,"enable",translate("开启"),translate("开启或关闭aliddns动态域名")) -enable.rmempty=false -token=e:taboption("basic",Value,"app_key",translate("APP KEY")) -email=e:taboption("basic",Value,"app_secret",translate("APP SECRET")) -iface=e:taboption("basic",ListValue,"interface",translate("选择外网接口"),translate("限定要动态aliddns的外网接口,如pppoe-wan")) -iface:value("",translate("选择要动态更新的外网接口")) -for t,e in ipairs(a.net.devices())do -if e~="lo"then iface:value(e)end -end -iface.rmempty=false -main=e:taboption("basic",Value,"main_domain",translate("主域名"),"想要解析的主域名,例如:baidu.com") -main.rmempty=false -sub=e:taboption("basic",Value,"sub_domain",translate("子域名"),"想要解析的子域名,例如:test hehe") -sub.rmempty=false -time=e:taboption("basic",Value,"time",translate("检查时间"),"域名检查时间,单位分钟,范围1-59") -time.rmempty=false - -e:tab("log", translate("更新记录")) ---e=t:section(TypedSection,"base",translate("更新记录")) -e.anonymous=true -local a="/var/log/aliddns.log" -tvlog=e:taboption("log",TextValue,"sylogtext") -tvlog.rows=14 -tvlog.readonly="readonly" -tvlog.wrap="off" -function tvlog.cfgvalue(e,e) -sylogtext="" -if a and nixio.fs.access(a)then -sylogtext=luci.sys.exec("tail -n 100 %s"%a) -end -return sylogtext -end -tvlog.write=function(e,e,e) -end -local e=luci.http.formvalue("cbi.apply") -if e then -io.popen("/etc/init.d/aliddns restart") -end -return t diff --git a/package/lean/luci-app-aliddns/po/zh-cn/aliddns.po b/package/lean/luci-app-aliddns/po/zh-cn/aliddns.po deleted file mode 100644 index 211e10d2c..000000000 --- a/package/lean/luci-app-aliddns/po/zh-cn/aliddns.po +++ /dev/null @@ -1,4 +0,0 @@ -msgid "Aliddns Client" -msgstr "阿里DDNS客户端" - - diff --git a/package/lean/luci-app-aliddns/root/etc/config/aliddns b/package/lean/luci-app-aliddns/root/etc/config/aliddns deleted file mode 100644 index 3dcd7e75a..000000000 --- a/package/lean/luci-app-aliddns/root/etc/config/aliddns +++ /dev/null @@ -1,10 +0,0 @@ - -config base 'base' - option time '30' - option enable '0' - option app_key '1' - option app_secret '1' - option interface 'br-lan' - option main_domain '1.com' - option sub_domain '2' - diff --git a/package/lean/luci-app-aliddns/root/etc/init.d/aliddns b/package/lean/luci-app-aliddns/root/etc/init.d/aliddns deleted file mode 100755 index 93bb659e6..000000000 --- a/package/lean/luci-app-aliddns/root/etc/init.d/aliddns +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh /etc/rc.common - -START=80 - -restart() -{ - /usr/sbin/aliddns -} - -start() -{ - /usr/sbin/aliddns -} - -stop() -{ - /usr/sbin/aliddns -} diff --git a/package/lean/luci-app-aliddns/root/etc/uci-defaults/luci-app-aliddns b/package/lean/luci-app-aliddns/root/etc/uci-defaults/luci-app-aliddns deleted file mode 100755 index c8dcb1e17..000000000 --- a/package/lean/luci-app-aliddns/root/etc/uci-defaults/luci-app-aliddns +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - - -rm -f /tmp/luci-indexcache -exit 0 diff --git a/package/lean/luci-app-aliddns/root/usr/sbin/aliddns b/package/lean/luci-app-aliddns/root/usr/sbin/aliddns deleted file mode 100755 index 7de6d904b..000000000 --- a/package/lean/luci-app-aliddns/root/usr/sbin/aliddns +++ /dev/null @@ -1,128 +0,0 @@ -#!/bin/sh - -aliddns_ak=`uci get aliddns.base.app_key 2>/dev/null` -aliddns_sk=`uci get aliddns.base.app_secret 2>/dev/null` -aliddns_record_id=`uci get aliddns.base.record_id 2>/dev/null` -time=`uci get aliddns.base.time 2>/dev/null` -aliddns_enable=`uci get aliddns.base.enable` -aliddns_domain=`uci get aliddns.base.main_domain 2>/dev/null` -aliddns_name=`uci get aliddns.base.sub_domain 2>/dev/null` -interface=`uci get aliddns.base.interface 2>/dev/null` -DATE=$(date +'%Y-%m-%d %H:%M:%S') -timestamp=`date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ"` -ip=$(ifconfig $interface 2> /dev/null | grep 'inet addr' | awk '{print $2}' | cut -d: -f2 2>/dev/null) - -check_aliddns() { -#ip=`wget -qO- http://whatismyip.akamai.com/ 2>/dev/null` -#current_ip=`nslookup $aliddns_name.$aliddns_domain | grep "Address 1"|tail -n1|cut -d' ' -f3 2>/dev/null` -current_ip=`echo $query_result | sed 's/.*,"Value":"\([0-9\.]*\)",.*/\1/'` -echo "$DATE 当前路由IP: ${ip}" >> /var/log/aliddns.log -echo "$DATE 远程解析IP: ${current_ip}" >> /var/log/aliddns.log -if [ "$ip" = "$current_ip" ] -then - echo "$DATE IP未改变,无需更新" >> /var/log/aliddns.log - exit 0 - else - echo "$DATE 更新中..." >> /var/log/aliddns.log -fi -} - -urlencode() { - # urlencode - - local length="${#1}" - i=0 - out="" - for i in $(awk "BEGIN { for ( i=0; i<$length; i++ ) { print i; } }") - do - local c="${1:$i:1}" - case $c in - [a-zA-Z0-9._-]) out="$out$c" ;; - *) out="$out`printf '%%%02X' "'$c"`" ;; - esac - i=$(($i + 1)) - done - echo -n $out -} - -send_request() { - local args="AccessKeyId=$aliddns_ak&Action=$1&Format=json&$2&Version=2015-01-09" - local hash=$(urlencode $(echo -n "GET&%2F&$(urlencode $args)" | openssl dgst -sha1 -hmac "$aliddns_sk&" -binary | openssl base64)) - wget -qO- "http://alidns.aliyuncs.com/?$args&Signature=$hash" 2> /dev/null -} - -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=$(urlencode "$aliddns_name").$aliddns_domain&Timestamp=$timestamp" -} - -update_record() { - send_request "UpdateDomainRecord" "RR=$(urlencode "$aliddns_name")&RecordId=$1&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&Timestamp=$timestamp&Type=A&Value=$ip" -} - -add_record() { - send_request "AddDomainRecord&DomainName=$aliddns_domain" "RR=$(urlencode "$aliddns_name")&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&Timestamp=$timestamp&Type=A&Value=$ip" -} - -go_record() { -if [ "$aliddns_record_id" = "" ] -then - aliddns_record_id=`echo $query_result | get_recordid` -fi -if [ "$aliddns_record_id" = "" ] -then - aliddns_record_id=`add_record | get_recordid` - echo "$DATE 添加 record $aliddns_record_id" >> /var/log/aliddns.log -else - update_record $aliddns_record_id - echo "$DATE 更新 record $aliddns_record_id" >> /var/log/aliddns.log -fi -# save to file -if [ "$aliddns_record_id" = "" ]; then - # failed - echo "$DATE : 更新出错,请检查设置!" >> /var/log/aliddns.log - exit 0 -else - uci set aliddns.base.record_id=$aliddns_record_id - uci commit - echo "$DATE : 更新成功!($ip)" >> /var/log/aliddns.log -fi -} -#将执行脚本写入crontab定时运行 -add_aliddns_cru(){ -wirtecron=$(cat /etc/crontabs/root | grep "$time * * * *" | grep aliddns) -if [ -z "$wirtecron" ];then - sed -i '/aliddns/d' /etc/crontabs/root >/dev/null 2>&1 - echo "*/$time * * * * /usr/sbin/aliddns" >> /etc/crontabs/root -fi -} - -#清除过多记录 -clean_log(){ -logrow=$(grep -c "" /var/log/aliddns.log) -if [ $logrow -ge 15 ];then - cat /dev/null > /var/log/aliddns.log - echo "$DATE Log条数超限,清空处理!" >> /var/log/aliddns.log -fi -} - -#停止服务 -stop_aliddns(){ - #停掉cru里的任务 - sed -i '/aliddns/d' /etc/crontabs/root >/dev/null 2>&1 -} - -if [ "$aliddns_enable" != "1" ]; then - stop_aliddns - echo "$DATE : aliddns没有开启!" >> /var/log/aliddns.log - else - clean_log - query_result=$(query_recordid) - check_aliddns - go_record - add_aliddns_cru -fi -