本項目完全免費(fèi)公開(kāi)腳本源碼。
ROS的(de)DNSPOD腳本更新:(2020/04/12更新)
1.可直接對(duì)接DNSPOD官方服務器(qì)進行更新。(無需借助任何第三方服務器(qì),再也不用擔心安全問(wèn)題了!)
2.一個(gè)腳本可以支持IPV4和(hé)IPV6的(de)DDNS更新,填補ROS目前IPV6的(de)DDNS解決方案的(de)空白。
3.檢測子(zǐ)域名不存在時(shí)自(zì)動創建
4.支持域名使用V4+V6雙棧,2個(gè)IP共用一個(gè)域名
5.增加日(rì)志(zhì)記錄流程
6.增加域名ID緩存功能,減少API交互次數
使用條件(jiàn):
1.将ROS系統版本升級到6.45.6或更高(gāo),安裝并啓用IPV6組件(jiàn)。
2.沒有(yǒu)IPV6的(de)環境,無需填寫V6的(de)域名。(mydomains4代表V4的(de)域名,mydomains6代表V6的(de)域名。可以是同一個(gè)域名開(kāi)啓雙棧。)
3.子(zǐ)域名請盡量全部大于3位,如果子(zǐ)域名列表裏同時(shí)存在1.x.com和(hé)11.x.com記錄時(shí)會出現(xiàn)誤判
4.使用V4V6同時(shí)更新的(de)域名,頂級域名必須一緻,否則會因為(wèi)緩存域名ID導緻後續更新失敗
5.不要多個(gè)撥号接口引用這(zhè)同一個(gè)PPP模闆
6.由于目前V6并沒有(yǒu)統一标準,環境不一定兼容,如發現(xiàn)異常可以與我聯系排查。
###程序執行完需要較長(cháng)時(shí)間(jiān),請耐心等待,不要反複執行,建議(yì)放(fàng)在PPP模闆裏ON-UP使用###
###注意事(shì)項:子(zǐ)域名請盡量全部大于3位,如果子(zǐ)域名列表裏同時(shí)存在1.x.com和(hé)11.x.com記錄時(shí)會出現(xiàn)誤判###
###注意事(shì)項:使用V4V6同時(shí)更新的(de)域名,頂級域名必須一緻,否則會因為(wèi)緩存域名ID導緻後續更新失敗###
###定義必須變量#####
###定義DNSPOD的(de)TOKEN###
:global mytoken "xxxxx,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
###定義自(zì)己的(de)需更新域名(不需要更新的(de)IP類型留空即可)###
:global mydomains4 "abc4.123.com"
:global mydomains6 "abc6.123.com"
###定義自(zì)己的(de)需更新的(de)撥号接口###
:global myint "pppoe-out1"
###以下(xià)內(nèi)容無需修改###
###預判斷域名是否為(wèi)雙棧###
:global v4putex ""
:global v6putex ""
:if ($mydomains4 = $mydomains6) do={:log error "檢測到當前更新域名使用雙棧。";:global v4putex "&offset=0&length=1";:global v6putex "&offset=1&length=1";}
:global domainid
:if ([:len $domainid] =0) do={:global cached 0;:log error "未獲取到緩存的(de)域名ID,執行域名ID獲取步驟。";} else={:global cached 1;:log error "已獲取到緩存的(de)域名ID,跳(tiào)過域名ID獲取步驟。";}
:if ([:len $mydomains4] >0) do={
###開(kāi)始IPV4獲取工(gōng)作(zuò),可自(zì)行按需調整###
:global mydomain41 [:pick $mydomains4 ([:find $mydomains4 "."] +1) [:len $mydomains4]]
:global mydomain42 [:pick $mydomains4 0 [:find $mydomains4 "."]]
:global myipv4 [/ip address get [find interface=$myint] address]
:set myipv4 [:pick $myipv4 0 [:find $myipv4 "/"]]
###開(kāi)始DNSPOD處理(lǐ)IPV4工(gōng)作(zuò),以下(xià)請勿修改###
:log error "DNSPOD腳本執行IPV4更新開(kāi)始"
:global cached
:if ($cached !=1) do={
:delay 2s
:do [/tool fetch url="https://dnsapi.cn/Domain.List" http-data="login_token=$mytoken&format=json&keyword=$mydomain41"]
:delay 5s
:global dnspodf [/file get [find name="Domain.List"] contents]}
:if (([:len [:find $dnspodf "u6210"]] >0) || ($cached != "")) do={
:if ($cached !=1) do={
:global mydomain41
:global dnspodf
:global fdend [:find $dnspodf $mydomain41]
:global fdinfo [:pick $dnspodf 0 $fdend]
:while ([:len [:find $fdinfo "{"]] > 0) do={
:global fdinfo [:pick $fdinfo ([:find $fdinfo "{"] +1) [:len $fdinfo]]}
:global fdinfo [:pick $fdinfo 5 [:len $fdinfo]]
:global fdinfo [:pick $fdinfo 0 [:find $fdinfo ","]]
:global domainid $fdinfo}
/file remove [find name="Domain.List"]
:global domainid
:do [/tool fetch url="https://dnsapi.cn/Record.List" http-data="login_token=$mytoken&format=json&domain_id=$domainid&sub_domain=$mydomain42&$v4putex"]
:delay 5s
:global reprec [/file get [find name="Record.List"] contents]
:if ([:len [:find $reprec "u7a7a"]] >0) do={
/file remove [find name="Record.List"]
:log error "DNSPOD因為(wèi)沒有(yǒu)對(duì)應子(zǐ)域名,嘗試自(zì)己NEW一個(gè)。"
:global myipv4
:do [/tool fetch url="https://dnsapi.cn/Record.Create" http-data="login_token=$mytoken&format=json&domain_id=$domainid&sub_domain=$mydomain42&value=$myipv4&record_type=A&record_line=%e9%bb%98%e8%ae%a4" keep-result=no]
:delay 5s
:do [/tool fetch url="https://dnsapi.cn/Record.List" http-data="login_token=$mytoken&format=json&domain_id=$domainid&sub_domain=$mydomain42"]
:delay 5s
:global reprec [/file get [find name="Record.List"] contents]
}
:if ([:len [:find $reprec "u6210"]] >0) do={
:global dnspodf [/file get [find name="Record.List"] contents]
:global fdend [:find $dnspodf ("\"".$mydomain42."\"")]
:global fdinfo [:pick $dnspodf 0 $fdend]
:while ([:len [:find $fdinfo "{"]] > 0) do={
:global fdinfo [:pick $fdinfo ([:find $fdinfo "{"] +1) [:len $fdinfo]]}
:global fdinfo [:pick $fdinfo 6 [:len $fdinfo]]
:global fdinfo [:pick $fdinfo 0 [:find $fdinfo "\","]]
:global recordid $fdinfo
/file remove [find name="Record.List"]
:global myipv4
:if ([:len [:find $dnspodf $myipv4]] >0) do={
:log error ("DNSPOD放(fàng)棄更新,IPV4沒有(yǒu)變化(huà)。")
} else={
:do [/tool fetch url="https://dnsapi.cn/Record.Modify" http-data="login_token=$mytoken&format=json&domain_id=$domainid&record_id=$recordid&sub_domain=$mydomain42&value=$myipv4&record_type=A&record_line=%e9%bb%98%e8%ae%a4"]
:delay 5s
:global reprec [/file get [find name="Record.Modify"] contents]
/file remove [find name="Record.Modify"]
:if ([:len [:find $reprec "u6210"]] >0) do={
:log error ("DNSPOD更新IPV4成功。當前IPV4為(wèi):".myipv4)
} else={
:log error "DNSPOD更新IPV4失敗"
}}}} else={
:log error "DNSPOD更新IPV4失敗,檢查TOKEN,域名參數是否正确。"}
:log error "DNSPOD執行腳本IPV4更新完畢"}
:if ([:len $mydomains6] >0) do={
###開(kāi)始IPV6獲取工(gōng)作(zuò),可自(zì)行按需調整###
:global mydomain61 [:pick $mydomains6 ([:find $mydomains6 "."] +1) [:len $mydomains6]]
:global mydomain62 [:pick $mydomains6 0 [:find $mydomains6 "."]]
:global myipv6 [/ip address get [find interface=$myint] address]
:set myipv6 [:pick $myipv6 0 [:find $myipv6 "/"]]
###有(yǒu)的(de)朋友(yǒu)這(zhè)裏V6使用release會有(yǒu)問(wèn)題,可更換為(wèi)renew嘗試,和(hé)運營商有(yǒu)關###
/ipv6 dhcp-client release [find interface=$myint]
:delay 3s
:global myipv6 [/ipv6 dhcp-client get [find interface=$myint status=bound] prefix]
:set myipv6 [:pick $myipv6 0 [:find $myipv6 "/"]]
###開(kāi)始DNSPOD處理(lǐ)IPV6工(gōng)作(zuò),以下(xià)請勿修改###
:log error "DNSPOD腳本執行IPV6更新開(kāi)始"
:global cached
:if ($cached !=1) do={
:do [/tool fetch url="https://dnsapi.cn/Domain.List" http-data="login_token=$mytoken&format=json&keyword=$mydomain61"]
:delay 5s
:global dnspodf [/file get [find name="Domain.List"] contents]}
:if (([:len [:find $dnspodf "u6210"]] >0) || ($cached != "")) do={
:if ($cached !=1) do={
:global mydomain61
:global dnspodf
:global fdend [:find $dnspodf $mydomain61]
:global fdinfo [:pick $dnspodf 0 $fdend]
:while ([:len [:find $fdinfo "{"]] > 0) do={
:global fdinfo [:pick $fdinfo ([:find $fdinfo "{"] +1) [:len $fdinfo]]}
:global fdinfo [:pick $fdinfo 5 [:len $fdinfo]]
:global fdinfo [:pick $fdinfo 0 [:find $fdinfo ","]]
:global domainid $fdinfo}
/file remove [find name="Domain.List"]
:global domainid
:do [/tool fetch url="https://dnsapi.cn/Record.List" http-data="login_token=$mytoken&format=json&domain_id=$domainid&sub_domain=$mydomain62&$v6putex"]
:delay 5s
:global reprec [/file get [find name="Record.List"] contents]
:if ([:len [:find $reprec "u7a7a"]] >0) do={
/file remove [find name="Record.List"]
:log error "DNSPOD因為(wèi)沒有(yǒu)對(duì)應子(zǐ)域名,嘗試自(zì)己NEW一個(gè)。"
:global myipv6
:do [/tool fetch url="https://dnsapi.cn/Record.Create" http-data="login_token=$mytoken&format=json&domain_id=$domainid&sub_domain=$mydomain62&value=$myipv6&record_type=AAAA&record_line=%e9%bb%98%e8%ae%a4" keep-result=no]
:delay 5s
:do [/tool fetch url="https://dnsapi.cn/Record.List" http-data="login_token=$mytoken&format=json&domain_id=$domainid&sub_domain=$mydomain62"]
:delay 5s
:global reprec [/file get [find name="Record.List"] contents]}
:if ([:len [:find $reprec "u6210"]] >0) do={
:global dnspodf [/file get [find name="Record.List"] contents]
:global fdend [:find $dnspodf ("\"".$mydomain62."\"")]
:global fdinfo [:pick $dnspodf 0 $fdend]
:while ([:len [:find $fdinfo "{"]] > 0) do={
:global fdinfo [:pick $fdinfo ([:find $fdinfo "{"] +1) [:len $fdinfo]]}
:global fdinfo [:pick $fdinfo 6 [:len $fdinfo]]
:global fdinfo [:pick $fdinfo 0 [:find $fdinfo "\","]]
:global recordid $fdinfo
/file remove [find name="Record.List"]
:global myipv6
:if ([:len [:find $dnspodf $myipv6]] >0) do={
:log error ("DNSPOD放(fàng)棄更新,IPV6沒有(yǒu)變化(huà)。")
} else={
:do [/tool fetch url="https://dnsapi.cn/Record.Modify" http-data="login_token=$mytoken&format=json&domain_id=$domainid&record_id=$recordid&sub_domain=$mydomain62&value=$myipv6&record_type=AAAA&record_line=%e9%bb%98%e8%ae%a4"]
:delay 5s
:global reprec [/file get [find name="Record.Modify"] contents]
/file remove [find name="Record.Modify"]
:if ([:len [:find $reprec "u6210"]] >0) do={
:log error ("DNSPOD更新IPV6成功。當前IPV6為(wèi):".myipv6)
} else={
:log error "DNSPOD更新IPV6失敗"
}}}} else={
:log error "DNSPOD更新IPV6失敗,檢查TOKEN,域名參數是否正确。"}
:log error "DNSPOD執行腳本IPV6更新完畢"}
注意:無論是否使用IPV6,都(dōu)需要啓用改組件(jiàn)否則此代碼無法正确執行!