├── myscripts ├── sharealiddns │ ├── conf │ │ └── aliddns.conf │ ├── readme │ │ ├── error.txt │ │ └── readme.txt │ └── etc │ │ └── init.d │ │ ├── sharealiddns-install.sh │ │ └── sharealiddns.sh └── lib │ └── share.lib └── README.md /myscripts/sharealiddns/conf/aliddns.conf: -------------------------------------------------------------------------------- 1 | #********************************************************************# 2 | islog="1" 3 | isipv4_domain="1" 4 | isipv6_domain="1" 5 | pppoe_ifname="any" 6 | cron_Time="6" 7 | cron_Time_type="hour" 8 | aliddns_AccessKeyId="" 9 | aliddns_AccessKeySecret="" 10 | routerddns_no="1" 11 | #********************************************************************# 12 | aliddns_name="" 13 | aliddns_domain="" 14 | aliddns_ttl="" 15 | aliddns_type="" 16 | aliddns_lan_mac="" 17 | #********************************************************************# 18 | u4="http://ipv4.ident.me http://ipv4.icanhazip.com http://nsupdate.info/myip http://whatismyip.akamai.com http://ipv4.myip.dk/api/info/IPv4Address http://checkip4.spdyn.de http://v4.ipv6-test.com/api/myip.php http://checkip.amazonaws.com http://ipinfo.io/ip http://bot.whatismyipaddress.com http://ipv4.ident.me http://ipv4.icanhazip.com http://nsupdate.info/myip http://whatismyip.akamai.com http://ipv4.myip.dk/api/info/IPv4Address http://checkip4.spdyn.de http://v4.ipv6-test.com/api/myip.php http://checkip.amazonaws.com http://ipinfo.io/ip http://bot.whatismyipaddress.com" 19 | u6="http://ipv6.ident.me http://ipv6.icanhazip.com http://ipv6.ident.me http://ipv6.icanhazip.com http://ipv6.yunohost.org http://v6.ipv6-test.com/api/myip.php http://ipv6.ident.me http://ipv6.icanhazip.com http://ipv6.yunohost.org http://v6.ipv6-test.com/api/myip.php http://ipv6.ident.me http://ipv6.icanhazip.com http://ipv6.ident.me http://ipv6.icanhazip.com http://ipv6.yunohost.org http://v6.ipv6-test.com/api/myip.php http://ipv6.ident.me http://ipv6.icanhazip.com http://ipv6.yunohost.org http://v6.ipv6-test.com/api/myip.php" 20 | dns="180.76.76.76 1.2.4.8 202.181.224.2 1.0.0.1 1.1.1.1 114.114.114.114" 21 | #********************************************************************# -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 脚本说明文档 2 |   **sharealiddns脚本是共享的,你可自由下载和使用,但不得用于商业目的,不得转载抄袭,以保证脚本代码的完整性。本脚本当初是放在国内的K&S论坛上方便大家下载和使用,但经常习惯性地被K&S屏蔽,这就不符合共享精神了,所以决定放在全球知名的开源github社区上托管共大家下载和使用。个人看来,K&S后面的S可以删除了,你觉得呢?** 3 |   **这个项目是开源的,所以当您决定使用该脚本时,建议您马上给您所使用的开源项目 "点赞" ,只需在GitHub上点击star,然后感谢这个帮助了您的作者,这样将使作者有更多的动力和时间完善该项目。** 4 | ## 脚本使用条件: 5 |   **1、安装asuswrt-merlin官方固件的路由器或安装以asuswrt-merlin源码编译的第三方固件路由器。 6 |   2、安装padavan固件的路由器。 7 |   3、安装pandorabox固件的路由器。 8 |   4、安装lede/openwrt固件的路由器。 9 |   5、你必须到阿里云进行域名实名认证。 10 |   6、域名信息必须在阿里云中成功通过审核。 11 |   7、阿里云给你的key和cret,必须是正确而有效的。 12 |   8、你要有一个公网IPV4 IP并独占(有IPV6 IP环境除外)。** 13 | ## 脚本功能说明: 14 |   **1、本脚本有批量增加,批量更新,批量删除,批量验证解析记录等功能。 15 |   2、本脚本支持N个域名解析。 16 |   3、主机别名支持直通符@, 通配符*或具体的别名。 17 |   4、本脚本支持IPV4和IPV6域名解析。 18 |   5、不支持中文域名。 19 |   6、更多功能只有使用中才发现。** 20 | 21 | ## 重要提示: 22 |   **如果你要进行IPV6域名解析,首先确认运营商已经推送IPV6,其次确保路由器固件支持IPV6并已开启IPV6功能,检查是否已经成功获得IPV6 IP, 23 | 否则必须关闭IPV6,如何关闭IPV6?可以在路由器界面上进行设置,比如pandorabox、lede/openwrt固件的路由器需在网络-接口--WAN--高级设置 24 | --Obtain IPv6-Address Disabled--禁用。或者打开/etc/config/network文件,按下面设置: 25 | option ipv6 '0' 26 | 重启,使设置生效。** 27 | # [更多说明请点击此处参看脚本说明文档readme.txt](https://github.com/zwmscorm/sharealiddns/blob/master/myscripts/sharealiddns/readme/readme.txt) 28 | ***脚本不定时更新和完善,请多关注!*** 29 | ## 安装方法: 30 |   **1、准备好winscp和xshell工具软件,如国产FinalShell免费版软件。 31 |   2、要求固件的wget必须支持https,如不支持,必须升级,否则无法从github下载脚本和运行本脚本。 32 |     对pandorabox、lede/openwrt固件,可能还要安装https协议所需的软件包,在xshell或FinalShell 33 |     命令行窗口中粘贴下面安装软件包指令: 34 |     `opkg update && opkg install wget openssl-util libustream-openssl` 35 |     如只安装或升级wget,则粘贴下面的指令: 36 |     `opkg update && opkg install wget` 37 |     耐心等待直至安装完成。 38 |   3、拷贝下面的安装脚本指令并粘贴到xshell或FinalShell命令行窗口中,回车: 39 | ---------------------------------------------------分割线下是安装脚本指令-------------------------------------------------------- 40 | `cd /tmp/ && wget --no-check-certificate https://raw.githubusercontent.com/zwmscorm/sharealiddns/master/myscripts/sharealiddns/etc/init.d/sharealiddns-install.sh -O /tmp/sharealiddns-install.sh && chmod 0755 /tmp/sharealiddns-install.sh && sh /tmp/sharealiddns-install.sh` 41 | ---------------------------------------------------分割线上是安装脚本指令-------------------------------------------------------- 42 | 如果固件有curl, 也可以用curl下载脚本: 43 | ---------------------------------------------------分割线下是安装脚本指令-------------------------------------------------------- 44 | `cd /tmp/ && curl -k https://raw.githubusercontent.com/zwmscorm/sharealiddns/master/myscripts/sharealiddns/etc/init.d/sharealiddns-install.sh -o /tmp/sharealiddns-install.sh && chmod 0755 /tmp/sharealiddns-install.sh && sh /tmp/sharealiddns-install.sh` 45 | ---------------------------------------------------分割线上是安装脚本指令-------------------------------------------------------- 46 |   如果wget和curl都无法下载,可以先将sharealiddns-install.sh单独以web方式下载到本地,用winscp上传到路由器的tmp目录,然后将 47 | sharealiddns-install.sh权限提到0755, 在xshell或FinalShell命令行窗口中粘贴下面安装脚本指令: 48 | `sh /tmp/sharealiddns-install.sh` 49 | 接着按提示进行操作: 50 |   4、将脚本安装到nand,则输入nand,将脚本安装到usb,则输入usb,删除脚本,则输入uninstall。 51 |   5、接着是设置aliddns.conf参数,请按readme.txt文档中的说明认真填写。 52 |   6、稍候脚本会自动运行,请注意观察脚本运行情况。如出现错误,会有提示。 53 |     如果aliddns.conf参数设置错误,请运行下面的指令(假设脚本安装到asuswrt-merlin固件nand的jffs)重新设置参数: 54 |     `sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh setconf` 55 |     或者使用winscp直接进入/jffs/myscripts/sharealiddns/conf目录对aliddns.conf进行修改。 56 |     大部分情况都是参数设置不正确,使得脚本运行出现错误。 57 |     至此,脚本已经安装完毕。 58 |     一行指令就完成了脚本的安装工作,是不是很简单! 59 |   7、如脚本安装到asuswrt-merlin固件的nand,则脚本的的路径是: 60 |     `/jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh` 61 |   8、如脚本安装到padavan固件的nand,则脚本的的路径是: 62 |     `/etc/storage/myscripts/sharealiddns/etc/init.d/sharealiddns.sh` 63 |   9、如脚本安装到pandorabox、lede/openwrt固件的的nand,则脚本的的路径是: 64 |     `/etc/myscripts/sharealiddns/etc/init.d/sharealiddns.sh` 65 |   10、如脚本安装到各固件的usb,则脚本的的路径视具体的情况而定。** 66 | 67 | ## 部分运行脚本指令(假设脚本安装到asuswrt-merlin固件的nand): 68 |   **1、设置aliddns.conf参数: 69 |     `sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh setconf ` 70 |   2,增加或更新所有域名: 71 |     `sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh restart` 72 |   3,检测所有域名是否成功解析: 73 |     `sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh check` 74 |   4、删除所有域名: 75 |     `sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh remove 0` 76 |   5、监控域名解析: 77 |     `sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh monitor` 78 |   6、检测公网IPV4 IP或公网IPV6 IP: 79 |     `sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh checkwanip` 80 |   7、检测IPV4客户端状态: 81 |     `sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh client ipv4` 82 |   8、检测IPV6客户端状态: 83 |     `sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh client ipv6`** 84 | 85 | ## [更多指令参看说明文档readme.txt](https://github.com/zwmscorm/sharealiddns/blob/master/myscripts/sharealiddns/readme/readme.txt) 86 | 87 | ### [使用中有问题请issues](https://github.com/zwmscorm/sharealiddns/issues): https://github.com/zwmscorm/sharealiddns/issues 88 | ------------------------------------------------------------------------------------------------------------------------------------ 89 |              2019.06.02 zwmscorm 90 | -------------------------------------------------------------------------------- /myscripts/sharealiddns/readme/error.txt: -------------------------------------------------------------------------------- 1 | #API 错误中心(https://error-center.aliyun.com)返回例程 2 | {"Recommend":"https://error-center.aliyun.com/status/search?Keyword=MissingSignature&source=PopGw","Message":"Signature is mandatory for this action.","RequestId":"839F1626-2435-4799-8FB6-7EB058EC8D78","HostId":"alidns.aliyuncs.com","Code":"MissingSignature"} 3 | #通用性错误 4 | Error = "缺少参数", Code = "MissingParameter", Description = "The input parameter \"\" that is mandatory for processing this request is not supplied", HttpStatus = 400 5 | Error = "参数取值无效", Code = "InvalidParameter", Description = "The specified value of parameter \"\" is not valid.", HttpStatus = 400 6 | Error = "无效的接口", Code = "UnsupportedOperation", Description = "The specified action is not supported.", HttpStatus = 400 7 | Error = "无效的版本", Code = "NoSuchVersion", Description = "The specified version does not exist.", HttpStatus = 400 8 | Error = "操作被流量控制系统拒绝", Code = "Throttling", Description = "Request was denied due to request throttling.", HttpStatus = 400 9 | Error = "无效的Access Key", Code = "InvalidAccessKeyId.NotFound", Description = "The Access Key ID provided does not exist in our records.", HttpStatus = 400 10 | Error = "操作被禁止", Code = "Forbidden", Description = "User not authorized to operate on the specified resource.", HttpStatus = 403 11 | Error = "操作被风险控制系统禁止", Code = "Forbidden.RiskControl", Description = "This operation is forbidden by Aliyun Risk Control system.", HttpStatus = 403 12 | Error = "无效的签名", Code = "SignatureDoesNotMatch", Description = "The signature we calculated does not match the one you provided. Please refer to the API reference about authentication for details.", HttpStatus = 403 13 | Error = "无实名验证", Code = "Forbidden.UserVerification", Description = "Your user account is not verified by Aliyun.", HttpStatus = 403 14 | Error = "服务器无法完成对请求的处理", Code = "InternalError", Description = "The request processing has failed due to some unknown error, exception or failure.", HttpStatus = 500 15 | Error = "服务器当前无法处理请求", Code = "ServiceUnavailable", Description = "The request has failed due to a temporary failure of the server.", HttpStatus = 503 16 | 17 | Error = "无效的状态", Code = "InvalidStatus", Description = "The domain record status is invalid.", HttpStatus = 400 18 | Error = "不支持的域名后缀", Code = "InvalidDomainName.Suffix", Description = "The domain suffix isnot been supported.", HttpStatus = 400 19 | Error = "未注册的域名", Code = "InvalidDomainName.Unregistered", Description = "The domain name is not registered.", HttpStatus = 400 20 | Error = "未知错误", Code = "UnKnownError", Description = "There is an unknown error in system.", HttpStatus = 400 21 | Error = "本用户下已存在的域名", Code = "InvalidDomainName.Duplicate", Description = "The domain name is duplicated in this user’s domain list.", HttpStatus = 400 22 | Error = "其他用户下已存在此域名", Code = "DomainAddedByOthers", Description = "The domain name has been added by other users.", HttpStatus = 400 23 | Error = "中文域名与注册局返回信息不匹配", Code = "CHNDomainInfoNotMatch", Description = "The information of chinese domain does not match with CNNIC.", HttpStatus = 400 24 | Error = "获取不到Whois信息", Code = "UnabletoGetWoisInfo", Description = "The domain is unable to get information from whois system.", HttpStatus = 400 25 | Error = "域名在本账户下不存在", Code = "IncorrectDomainUser", Description = "The domain name does not belong to this user.", HttpStatus = 400 26 | Error = "域名为万网域名禁止删除", Code = "Forbidden.DomainType", Description = "The domain is forbidden to operate because it is a hichina domain.", HttpStatus = 400 27 | Error = "域名含有锁定解析", Code = "Fobidden.RecordLocked", Description = "The domain is forbidden to delete because there are some records have been locked.", HttpStatus = 400 28 | Error = "域名在云解析系统中不存在", Code = "InvalidDomainName.NoExist", Description = "The domain is not exist in aliyun DNS system.", HttpStatus = 400 29 | Error = "域名格式错误", Code = "InvalidDomainName.Format", Description = "The format of domain is error.", HttpStatus = 400 30 | Error = "Whois邮箱未获取到", Code = "UnableToGetWhoisEmail", Description = "The domain is unable to get whois email.", HttpStatus = 400 31 | Error = "万网域名不允许找回", Code = "Forbidden.DomainType", Description = "The domain is forbidden to operate because it is a hichina domain.", HttpStatus = 400 32 | Error = "90秒内不允许重复找回", Code = "Fobidden.TooOfen", Description = "The operation is too ofen in 90 seconds.", HttpStatus = 400 33 | Error = "超出解析记录类型最大值90", Code = "QuotaExceeded.Record", Description = "You Can’t add this domain record because the {“Type RR Line”} record has been out of MAX count (90).", HttpStatus = 400 34 | Error = "禁止解析操作的域名", Code = "DomainForbidden", Description = "The action could not be completed because the domain has been forbidden.", HttpStatus = 400 35 | Error = "URL转发不支持泛解析记录", Code = "URLForwardError.PanRecord", Description = "The Pan-record is not supported in url forward record.", HttpStatus = 400 36 | Error = "URL转发不是默认线路", Code = "URLForwardError.NotDefaultLine", Description = "The url forward record only support default line.", HttpStatus = 400 37 | Error = "URL转发目标域名为中文域名", Code = "URLForwardError. ChineseChar", Description = "The Chinese char is not supported in url forward record.", HttpStatus = 400 38 | Error = "URL转发域名未备案", Code = "URLForwardError.NotVerifyDomain", Description = "The domain name must be verified in Hichina in url forward record.", HttpStatus = 400 39 | Error = "解析记录在本账户下不存在", Code = "DomainRecordNotBelongToUser", Description = "The domain record does not belong to this user.", HttpStatus = 400 40 | Error = "解析记录被锁定", Code = "DomainRecordLocked", Description = "The domain record has been locked.", HttpStatus = 400 41 | Error = "解析记录已存在", Code = "DomainRecordDuplicate", Description = "The domain record is duplicated.", HttpStatus = 400 42 | Error = "解析记录冲突", Code = "DomainRecordConflict", Description = "The domain record is conflict with other records.", HttpStatus = 400 43 | -------------------------------------------------------------------------------- /myscripts/sharealiddns/readme/readme.txt: -------------------------------------------------------------------------------- 1 | ====================================================================================== 2 | 脚本说明文档: 3 | ====================================================================================== 4 |   sharealiddns脚本是共享的,你可自由下载和使用,但不得用于商业目的,不得转载抄袭, 5 | 以保证脚本代码的完整性。本脚本当初是放在国内的K&S论坛上方便大家下载和使用,但经常习 6 | 惯性地被K&S屏蔽,这就不符合共享精神了,所以决定放在全球知名的开源github社区上托管共 7 | 大家下载和使用。个人看来,K&S后面的S可以删除了,你觉得呢? 8 | ====================================================================================== 9 | 脚本使用条件: 10 | 1、安装asuswrt-merlin官方固件的路由器或安装以asuswrt-merlin源码编译的第三方固件路由器。 11 | 2、安装padavan固件的路由器。 12 | 3、安装pandorabox固件的路由器。 13 | 4、安装lede/openwrt固件的路由器。 14 | 5、你必须到阿里云进行域名实名认证。 15 | 6、域名信息必须在阿里云中成功通过审核。 16 | 7、阿里云给你的key和cret,必须是正确而有效的。 17 | 8、你要有一个公网IPV4 IP并独占(有IPV6 IP环境除外)。 18 | ====================================================================================== 19 | 脚本功能说明: 20 | 1、本脚本有批量增加,批量更新,批量删除,批量验证解析记录等功能。 21 | 2、本脚本支持N个域名解析。 22 | 3、主机别名支持直通符@, 通配符*或具体的别名。 23 | 4、本脚本支持IPV4和IPV6域名解析。 24 | 5、不支持中文域名。 25 | 6、更多功能只有使用中才发现。 26 | ====================================================================================== 27 | 重要提示: 28 |   如果你要进行IPV6域名解析,首先确认运营商已经推送IPV6,其次确保路由器固件支持IPV6并已开启IPV6功能, 29 | 检查是否已经成功获得IPV6 IP,否则必须关闭IPV6,如何关闭IPV6?可以在路由器界面上进行设置,比如 30 | pandorabox、lede/openwrt固件的路由器需在网络--接口--WAN--高级设置--Obtain IPv6-Address Disabled--禁用, 31 | 或者打开/etc/config/network文件,按下面设置: 32 | option ipv6 '0' 33 | 重启,使设置生效。 34 | ====================================================================================== 35 | 私有概念定义: 36 | 1、光猫桥接,与之相联的路由用来拨号,则是一级路由,接在一级路由之后的为二级路由。 37 | 2、光猫拨号,则光猫为一级路由,联在光猫之后的路由是二级路由。 38 | 3、你可直接理解成:拨号的东东就是一级路由,其它是二级路由,三级路由... 39 | ====================================================================================== 40 | 配置文件aliddns.conf中的pppoe_ifname参数设置: 41 | 1、对于二级路由(是路由),pppoe_ifname必须设置为any。 42 | 2、对于一级路由(是光猫非路由),pppoe_ifname必须也只能设置为any。 43 | 3、对于一级路由(非光猫是路由),接入的是单线,则pppoe_ifname设置为wan0或auto,最好设置为auto。 44 | 4、对于一级路由(非光猫是路由),接入的是双线,取wan0公网IP,则pppoe_ifname设置为wan0,取wan1公网IP,则pppoe_ifname设置为wan1。 45 | 5、对于一级路由(非光猫是路由),采用多拨模式,我没有环境,所以没办法测试。 46 | 6、对于有多台路由环境,选择其中一台路由运行此脚本就可以,不可多台都运行此脚本,否则域名解析有可能发生冲突。 47 | ====================================================================================== 48 | 配置文件aliddns.conf中的islog参数设置: 49 | islog设置为1时开启脚本运行日志,设置为0时关闭脚本运行日志,日志文件在log目录内。 50 | ====================================================================================== 51 | 配置文件aliddns.conf中定时更新域名时间参数设置: 52 | cron_Time_type:时间类型,可以设置为min或hour。 53 | cron_Time:当cron_Time_type设置为min时,可设置值为5~59,cron_Time_type设置为hour时,可设置为1~23。 54 | ====================================================================================== 55 | 配置文件aliddns.conf中的isipv4_domain和isipv6_domain参数设置: 56 | isipv4_domain设置为1,允许脚本执行IPV4域名解析,设置为0,不允许脚本执行IPV4域名解析。 57 | isipv6_domain设置为1,允许脚本执行IPV6域名解析,设置为0,不允许脚本执行IPV6域名解析。 58 | 注意这里指的是脚本,不是固件。 59 | ====================================================================================== 60 | 配置文件aliddns.conf域名参数设置: 61 | 具体设置说明: 62 | 1、aliddns_AccessKeyId和aliddns_AccessKeySecret,阿里给你的key和cret。 63 | 2、routerddns_no,在有多个域名的情况下,用哪一个域名远程访问路由器。 64 | 3、aliddns_name为主机别名,支持直通符@, 通配符*或具体的别名(如www, sss, yyy, m等),不能设置为空值。 65 | 4、aliddns_domain,为主机域名,如abc.com。 66 | 5、aliddns_ttl,为解析有效生存时间,通常设置为600,企业用户可以设置更小值。 67 | 6、aliddns_type,为记录类型,IPV4,必须设置为A,IPV6,必须设置为AAAA。 68 | 7、aliddns_lan_mac,终端设备的MAC地址,为接在路由器后端的终端设备(NAS、PC等),提供域名解析,这个功能是专门为IPV6设置的,对IPV4无效。 69 | 8、有多个域名,aliddns_name、aliddns_domain、aliddns_ttl、aliddns_type和aliddns_lan_mac每行总列数必须都相等,每列之间以空格隔开。 70 | 71 | 只有一个域名IPV4网络的例子: 72 | aliddns_name="www" 73 | aliddns_domain="abc.com" 74 | aliddns_ttl="600" 75 | aliddns_type="A" 76 | aliddns_lan_mac="none" 77 | 78 | 有5个域名IPV4网络的例子(注意每行总列数必须都是5列,每列之间以空格隔开,下面的例子要求相同): 79 | aliddns_name="www home office router my" 80 | aliddns_domain="abc.com abc.com abc.com abc.com abc.com" 81 | aliddns_ttl="600 600 600 600 600" 82 | aliddns_type="A A A A A" 83 | aliddns_lan_mac="none none none none none" 84 | 85 | 关于每行总列数必须都相等,每列之间以空格隔开,看下面的例子就会明白: 86 | aliddns_name="www home office router my nas" 87 | aliddns_domain="abc.com abc.com abc.com abc.com abc.com abc.com" 88 | aliddns_ttl="600 600 600 600 600 600" 89 | aliddns_type="A A A A A A" 90 | aliddns_lan_mac="none none none none none none" 91 | 6个域名列表,每行总列数必须都是6列,每列之间以空格隔开。 92 | 93 | 有多个域名IPV4网络,支持直通符@, 通配符*的例子: 94 | aliddns_name="@ * www home office router my" 95 | aliddns_domain="abc.com abc.com abc.com abc.com abc.com abc.com abc.com" 96 | aliddns_ttl="600 600 600 600 600 600 600" 97 | aliddns_type="A A A A A A A" 98 | aliddns_lan_mac="none none none none none none none" 99 | 100 | 只有一个域名IPV6网络的例子: 101 | aliddns_name="www" 102 | aliddns_domain="abc.com" 103 | aliddns_ttl="600" 104 | aliddns_type="AAAA" 105 | aliddns_lan_mac="none" 106 | 107 | 有多个域名IPV6网络,支持直通符@, 通配符*的例子: 108 | aliddns_name="@ * www home office router my" 109 | aliddns_domain="abc.com abc.com abc.com abc.com abc.com abc.com abc.com" 110 | aliddns_ttl="600 600 600 600 600 600 600" 111 | aliddns_type="AAAA AAAA AAAA AAAA AAAA AAAA AAAA" 112 | aliddns_lan_mac="none none none none none none none" 113 | 114 | 为终端设备提供IPV6域名解析的例子(aliddns_name必须有一个具体的值,如nas,home,两个终端设备网卡MAC假设是 115 | 33:D7:7A:2B:DE:6B和65:D0:7B:2A:DE:4A): 116 | aliddns_name="@ * www home office router my nas" 117 | aliddns_domain="abc.com abc.com abc.com abc.com abc.com abc.com abc.com abc.com" 118 | aliddns_ttl="600 600 600 600 600 600 600 600" 119 | aliddns_type="AAAA AAAA AAAA AAAA AAAA AAAA AAAA AAAA" 120 | aliddns_lan_mac="none none none 33:D7:7A:2B:DE:6B none none none 65:D0:7B:2A:DE:4A" 121 | 122 | 远程访问: 123 | 终端1: http://home.abc.com(有证书:https://home.abc.com) 124 | 终端2: http://nas.abc.com(有证书:https://nas.abc.com) 125 | 如果域名解析已经成功,但终端设备还是无法访问,这是因为windows操作系统对IPV6支持还不完善,你需要在windows command下运行: 126 | ipconfig/flushdns 127 | 128 | 路由器同时支持IPV4和IPV6双网络的例子: 129 | aliddns_name="www home office router my" 130 | aliddns_domain="abc.com abc.com abc.com abc.com abc.com" 131 | aliddns_ttl="600 600 600 600 600" 132 | aliddns_type="A AAAA A AAAA A" 133 | aliddns_lan_mac="none none none none none" 134 | 135 | 路由器有不同域名IPV4网络的例子: 136 | aliddns_name="www home office router my" 137 | aliddns_domain="aaa.com bbb.com ccc.com ddd.com eee.com" 138 | aliddns_ttl="600 600 600 600 600" 139 | aliddns_type="A A A A A" 140 | aliddns_lan_mac="none none none none none" 141 | 142 | 路由器有不同域名IPV6网络的例子: 143 | aliddns_name="www home office router my" 144 | aliddns_domain="aaa.com bbb.com ccc.com ddd.com eee.com" 145 | aliddns_ttl="600 600 600 600 600" 146 | aliddns_type="AAAA AAAA AAAA AAAA AAAA" 147 | aliddns_lan_mac="none none none none none" 148 | ====================================================================================== 149 | 安装方法: 150 | 1、准备好winscp和xshell工具软件,如国产FinalShell免费版软件。 151 |   2、要求固件的wget必须支持https,如不支持,必须升级,否则无法从github下载脚本和运行本脚本。 152 |     对pandorabox、lede/openwrt固件,可能还要安装https协议所需的软件包,在xshell或FinalShell 153 |     命令行窗口中粘贴下面安装软件包指令: 154 |     opkg update && opkg install wget openssl-util libustream-openssl 155 | 如只安装或升级wget,则粘贴下面的指令: 156 | opkg update && opkg install wget 157 |     耐心等待直至安装完成。 158 |   3、拷贝下面的安装脚本指令并粘贴到xshell或FinalShell命令行窗口中,回车: 159 | -----------------------------------------------------分割线下是安装脚本指令---------------------------------------------------------- 160 | cd /tmp/ && wget --no-check-certificate https://raw.githubusercontent.com/zwmscorm/sharealiddns/master/myscripts/sharealiddns/etc/init.d/sharealiddns-install.sh -O /tmp/sharealiddns-install.sh && chmod 0755 /tmp/sharealiddns-install.sh && sh /tmp/sharealiddns-install.sh 161 | -----------------------------------------------------分割线上是安装脚本指令---------------------------------------------------------- 162 |   如果固件有curl, 也可以用curl下载脚本: 163 | -----------------------------------------------------分割线下是安装脚本指令---------------------------------------------------------- 164 | cd /tmp/ && curl -k https://raw.githubusercontent.com/zwmscorm/sharealiddns/master/myscripts/sharealiddns/etc/init.d/sharealiddns-install.sh -o /tmp/sharealiddns-install.sh && chmod 0755 /tmp/sharealiddns-install.sh && sh /tmp/sharealiddns-install.sh 165 | -----------------------------------------------------分割线上是安装脚本指令---------------------------------------------------------- 166 | 如果wget和curl都无法下载,可以先将sharealiddns-install.sh单独以web方式下载到本地,用winscp上传到路由器的tmp目录,然后将 167 | sharealiddns-install.sh权限提到0755, 在xshell或FinalShell命令行窗口中粘贴下面安装脚本指令: 168 | sh /tmp/sharealiddns-install.sh  169 | 170 | 接着按提示进行操作: 171 |   4、将脚本安装到nand,则输入nand,将脚本安装到usb,则输入usb,删除脚本,则输入uninstall。 172 |   5、接着是设置aliddns.conf参数,请按readme.txt文档中的说明认真填写。 173 |   6、稍候脚本会自动运行,请注意观察脚本运行情况。如出现错误,会有提示。 174 |     如果aliddns.conf参数设置错误,请运行下面的指令(假设脚本安装到asuswrt-merlin固件nand的jffs)重新设置参数: 175 |     sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh setconf 176 |     或者使用winscp直接进入/jffs/myscripts/sharealiddns/conf目录对aliddns.conf进行修改。 177 |     大部分情况都是参数设置不正确,使得脚本运行出现错误。 178 |     至此,脚本已经安装完毕。 179 |     一行指令就完成了脚本的安装工作,是不是很简单! 180 | 7、如脚本安装到asuswrt-merlin固件的nand,则脚本的的路径是: 181 | /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh 182 | 8、如脚本安装到padavan固件的nand,则脚本的的路径是: 183 | /etc/storage/myscripts/sharealiddns/etc/init.d/sharealiddns.sh 184 | 9、如脚本安装到pandorabox、lede/openwrt固件的的nand,则脚本的的路径是: 185 | /etc/myscripts/sharealiddns/etc/init.d/sharealiddns.sh 186 | 10、如脚本安装到各固件的usb,则脚本的的路径视具体的情况而定。 187 | ====================================================================================== 188 | 部分运行脚本指令: 189 | 下面以脚本安装到asuswrt-merlin固件的nand为例: 190 | 修改或设置aliddns.conf参数: 191 | sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh setconf 192 | 检测aliddns.conf所有域名是否成功解析: 193 | sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh check 194 | 或 195 | sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh check 0 196 | 检测aliddns.conf第3个域名是否成功解析: 197 | sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh check 3 198 | 增加或更新aliddns.conf所有域名: 199 | sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh restart 200 | 或 201 | sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh restart 0 202 | 增加或更新aliddns.conf第3个域名: 203 | sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh restart 3 204 | 删除aliddns.conf所有域名: 205 | sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh remove 0 206 | 或 207 | sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh removeall 208 | 删除aliddns.conf第3域名: 209 | sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh remove 3 210 | 设置aliddns.conf第3域名解析记录为禁用: 211 | sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh status 3 0 212 | 设置aliddns.conf第3域名解析记录为启用: 213 | sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh status 3 1 214 | 设置aliddns.conf所有域名解析记录为启用: 215 | sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh status 0 1 216 | 设置aliddns.conf所有域名解析记录为禁用: 217 | sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh status 0 0 218 | 对aliddns.conf所有域名进行兼容性和压力测试(开发模式专用): 219 | sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh monitor 220 | 对aliddns.conf第3域名进行兼容性和压力测试(开发模式专用): 221 | sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh monitor 3 222 | 对aliddns.conf所有域名进行兼容性和压力测试(开发模式专用): 223 | sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh monitor 224 | 检测客户端状态: 225 | sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh client ipv4 226 | 或 227 | sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh client ipv6 228 | 检测公网IP: 229 | sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh checkwanip 230 | 显示日志: 231 | sh /jffs/myscripts/sharealiddns/etc/init.d/sharealiddns.sh showlog 232 | ====================================================================================== 233 | ====================================================================================== 234 | -------------------------------------------------------------------------------- /myscripts/sharealiddns/etc/init.d/sharealiddns-install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | export PATH=/bin:/sbin:/usr/bin:/usr/sbin:$PATH 3 | TAR=`which tar`;MOUNT=`which mount`;BN=`which basename`;OPENSSL=`which openssl`;NSLOOKUP=`which nslookup` 4 | SORT=`which sort`;IP=`which ip`;WGET=`which wget`;CURL=`which curl`;OS_TYPE="";PT="";isIPV6=0 5 | logs(){ 6 | Y_COLOR="\033[0;33;40m" 7 | YB_COLOR="\033[1;33;40m" 8 | INFO="${Y_COLOR}INFO:${N_COLOR}" 9 | N_COLOR="\033[0m" 10 | echo -e "${INFO}${YB_COLOR}${1}${N_COLOR}" 11 | logger "$1" 12 | return 0 13 | } 14 | 15 | get_os_type(){ 16 | logs "========>>" 17 | if $(uname -a | tr 'A-Z' 'a-z' | grep -q 'merlin') && [ -d "/jffs" ] ;then 18 | OS_TYPE="merlin" 19 | [ "$(nvram get ipv6_service | tr 'A-Z' 'a-z')" == "disabled" ] && isIPV6=1 20 | PT="/jffs" 21 | elif [ -n $(which restart_wan) ] && [ -f "/etc/storage/post_wan_script.sh" ];then 22 | OS_TYPE="padavan" 23 | [ -z "$(nvram get ip6_service | tr 'A-Z' 'a-z')" ] && isIPV6=1 24 | PT="/etc/storage" 25 | elif $(uname -a | tr 'A-Z' 'a-z' | grep -q 'pandorabox');then 26 | OS_TYPE="pandorabox" 27 | PT="/etc" 28 | [ $(cat /etc/config/network | tr 'A-Z' 'a-z' | grep -w 'ipv6' | awk '{print $3}' | sed "s/'//g" | sed 's/"//g') == "0" ] && isIPV6=1 29 | elif $(uname -a | tr 'A-Z' 'a-z' | grep -q 'openwrt');then 30 | OS_TYPE="openwrt" 31 | PT="/etc" 32 | [ $(cat /etc/config/network | tr 'A-Z' 'a-z' | grep -w 'ipv6' | awk '{print $3}' | sed "s/'//g" | sed 's/"//g') == "0" ] && isIPV6=1 33 | elif [ -f "/etc/config/network" -a -d "/etc/hotplug.d/iface" ];then 34 | OS_TYPE="openwrt" 35 | [ $(cat /etc/config/network | tr 'A-Z' 'a-z' | grep -w 'ipv6' | awk '{print $3}' | sed "s/'//g" | sed 's/"//g') == "0" ] && isIPV6=1 36 | PT="/etc" 37 | else 38 | logs "The script does not support this firmware[脚本不支持此固件]" "" "ra" "e" 39 | fi 40 | if [ -n "$OS_TYPE" ];then 41 | logs "Your router firmware is $OS_TYPE[你的路由器固件是${OS_TYPE}]" 42 | if [ "$isIPV6" == "0" ];then 43 | logs "Router is IPV6 enabled[路由器已启用IPV6]" 44 | else 45 | logs "Router is IPV6 disabled[路由器已禁用IPV6]" 46 | fi 47 | sleep 3 48 | logs "Going..." 49 | return 0 50 | else 51 | return 1 52 | fi 53 | } 54 | 55 | do_check(){ 56 | [ -z "$TAR" ] && logs "You have to install tar[你必须安装tar]" && exit 0 57 | [ -z "$MOUNT" ] && logs "You have to install mount[你必须安装mount]" && exit 0 58 | [ -z "$BN" ] && logs "You have to install basename[你必须安装basename]" && exit 0 59 | [ -z "$NSLOOKUP" ] && logs "You have to install nslookup[你必须安装nslookup]" && exit 0 60 | [ -z "$SORT" ] && logs "You have to install sort[你必须安装sort]" && exit 0 61 | [ -z "$IP" ] && logs "You have to install ip[你必须安装ip]" && exit 0 62 | [ -z "$OPENSSL" ] && logs "You have to install openssl[你必须安装openssl]" && exit 0 63 | [ -z "$OPENSSL" ] && logs "You have to install openssl[你必须安装openssl]" && exit 0 64 | [ -z "$WGET" ] && logs "You have to install wget[你必须安装wget]" && exit 0 65 | return 0 66 | } 67 | 68 | do_install(){ 69 | local INSTALL_PATH="$1";local SH="$2" 70 | local DOWN_URL="https://codeload.github.com/zwmscorm/sharealiddns/tar.gz/master" 71 | local TMP_PATH="/tmp/sharealiddns-master" 72 | local TAR_GZ="$TMP_PATH.tar.gz" 73 | local SCRIPTS_PATH="" 74 | local i=1;local m="";local s="";local l="";local n=0;local p4="";local p6="";local isWGETV4=1;local isCURLV4=1;local isWGETV6=1;local isCURLV6=1 75 | local u4="http://ipv4.ident.me http://ipv4.icanhazip.com http://nsupdate.info/myip http://whatismyip.akamai.com http://ipv4.myip.dk/api/info/IPv4Address" 76 | local u6="http://ipv6.ident.me http://ipv6.icanhazip.com http://ipv6.ident.me http://ipv6.icanhazip.com http://ipv6.yunohost.org" 77 | 78 | trap "rm -rf $TMP_PATH;rm -f $TAR_GZ;echo '';logs 'Exit installation.';logs '<<========';exit 0" HUP INT QUIT PIPE ALRM TERM 79 | 80 | chmod -R 777 . 81 | if [ "$OS_TYPE" == "merlin" ];then 82 | nvram set jffs2_enable=1 83 | nvram set jffs2_scripts=1 84 | nvram commit 85 | [ -d "/jffs/scripts" ] && chmod -R 777 /jffs/scripts 86 | fi 87 | 88 | #check INSTALL_PATH vlue 89 | if [ -z "$INSTALL_PATH" ];then 90 | logs "Next you need to type from the keyboard. To interrupt the operation, press ctrl+c[以下需要你从键盘输入, 如想中断操作, 请按ctrl+c]" 91 | echo -en "${INFO}${YB_COLOR}Please enter nand, USB or uninstall[请输入nand, usb或uninstall]${N_COLOR}" 92 | echo -en "$YB_COLOR=>[nand, usb, uninstall]:${N_COLOR}" 93 | while :;do 94 | read v 95 | v=$(echo "$v" | sed 's/[[:space:]]//g' | tr 'A-Z' 'a-z') 96 | if [ "$v" == "nand" -o "$v" == "usb" -o "$v" == "uninstall" ];then 97 | INSTALL_PATH="$v" 98 | break 99 | else 100 | echo -en "${INFO}${YB_COLOR}Please enter nand, USB or uninstall[请输入nand, usb或uninstall]${N_COLOR}" 101 | echo -en "$YB_COLOR=>[nand, usb, uninstall]:${N_COLOR}" 102 | fi 103 | done 104 | fi 105 | INSTALL_PATH=$(echo "$INSTALL_PATH" | sed 's/[[:space:]]//g' | tr 'A-Z' 'a-z') 106 | if [ "$INSTALL_PATH" != "nand" -a "$INSTALL_PATH" != "usb" -a "$INSTALL_PATH" != "uninstall" ];then 107 | logs "Parameters must be nand, usb or uninstall[参数必须是nand、usb或uninstall]" 108 | logs "Installation to nand example[安装到nand示例]: sh $SH nand" 109 | logs "Installation to usb example[安装到usb示例]: sh $SH usb" 110 | logs "Uninstallation all example[卸载示例]: sh $SH uninstall" 111 | exit 0 112 | fi 113 | #uninstall all 114 | if [ "$INSTALL_PATH" == "uninstall" ];then 115 | _uninstall_ "all" 116 | exit 0 117 | fi 118 | #selecte nand or usb 119 | logs "Installing to $INSTALL_PATH[将安装到${INSTALL_PATH}]" 120 | if [ "$INSTALL_PATH" == "nand" ];then 121 | SCRIPTS_PATH="$PT/myscripts" 122 | elif [ "$INSTALL_PATH" == "usb" ];then 123 | logs "Find available active partitions[查找可用的活动分区]" 124 | if [ "$OS_TYPE" == "merlin" -o "$OS_TYPE" == "padavan" ];then 125 | n=5 126 | else 127 | n=4 128 | fi 129 | for j in $($MOUNT | grep -v 'tmpfs' | grep -wE 'mnt|media|opt' | cut -d ' ' -f3);do 130 | if [ -n $($BN $j) ];then 131 | logs "$i=>$j" 132 | eval m$i=$j 133 | i=$(($i+1)) 134 | fi 135 | done 136 | if [ "$i" -eq 1 ];then 137 | logs "No active partition was found available[找不到可用的活动分区]" 138 | rm -f "$TAR_GZ" 139 | rm -rf "$TMP_PATH" 140 | exit 0 141 | fi 142 | echo -en "${INFO}${YB_COLOR}Please enter the partition number and press 0 to exit[请输入分区号按0将退出]${N_COLOR}" 143 | echo -en "$YB_COLOR=>[0~$(($i-1))]:${N_COLOR}" 144 | while :;do 145 | read v 146 | if [ "$v" -ge 0 2>/dev/null ];then 147 | [ "$v" == "0" ] && break 148 | if [ "$v" -gt $(($i-1)) ];then 149 | logs "Invalid partition number, reinput[分区号无效, 重输]" 150 | echo -en "${INFO}${YB_COLOR}Please enter the partition number and press 0 to exit[请输入分区号按0将退出]${N_COLOR}" 151 | echo -en "$YB_COLOR=>[0~$(($i-1))]:${N_COLOR}" 152 | else 153 | eval s=\$m$v 154 | l=$($BN $s) 155 | if echo -e "$l" | grep -q '^[a-zA-Z0-9]\+$' && [ $(echo ${#l}) -ge "$n" ];then 156 | logs "The selected active partition is ${s}[选定的活动分区是${s}]" 157 | SCRIPTS_PATH="$s/myscripts" 158 | break 159 | else 160 | logs "USB partition volume label must be set to English or numeric, and the total number must exceed 4 digits[usb分区卷标必须设置为英文或数字,总数必须超过4位]" 161 | echo -en "${INFO}${YB_COLOR}Please enter the partition number and press 0 to exit[请输入分区号按0将退出]${N_COLOR}" 162 | echo -en "$YB_COLOR=>[0~$(($i-1))]:${N_COLOR}" 163 | fi 164 | 165 | fi 166 | else 167 | logs "The partition number must be a number, reinput[分区号必须是数字, 重输]" 168 | echo -en "${INFO}${YB_COLOR}Please enter the partition number and press 0 to exit[请输入分区号按0将退出]${N_COLOR}" 169 | echo -en "$YB_COLOR=>[0~$(($i-1))]:${N_COLOR}" 170 | fi 171 | done 172 | fi 173 | if [ -z "$SCRIPTS_PATH" ];then 174 | logs "Installation path is not determined[安装路径没确定好]" 175 | rm -f "$TAR_GZ" 176 | rm -rf "$TMP_PATH" 177 | exit 0 178 | fi 179 | 180 | #Firmware compatibility is being check 181 | logs "Firmware compatibility is being check openssl...[正在检测固件$OPENSSL兼容性...]" 182 | local str1="A";local str2="a" 183 | if [ -z "$(echo $str1 | $OPENSSL dgst -sha1 -hmac $str2 -binary | $OPENSSL base64)" ];then 184 | logs "$OPENSSL is unavailable[${OPENSSL}无法使用]" 185 | exit 0 186 | fi 187 | 188 | for u in $u4;do 189 | logs "Firmware compatibility is being check wget ipv4...[正在检测固件$WGET ipv4兼容性...]-[$u]" 190 | [ -n "$($WGET -4 -q --no-check-certificate -T 5 -t 3 -O- $u)" ] && isWGETV4=0 && break 191 | done 192 | if [ "$isIPV6" -eq 0 ] && [ "$isWGETV4" -eq 0 ];then 193 | for u in $u6;do 194 | logs "Firmware compatibility is being check wget ipv6...[正在检测固件$WGET ipv6兼容性...]-[$u]" 195 | [ -n "$($WGET -6 -q --no-check-certificate -T 5 -t 3 -O- $u)" ] && isWGETV6=0 && break 196 | done 197 | fi 198 | 199 | for u in $u4;do 200 | logs "Firmware compatibility is being check curl ipv4...[正在检测固件$CURL ipv4兼容性...]-[$u]" 201 | [ -n "$($CURL -4 -k -f -s --connect-timeout 5 --retry 3 $u)" ] && isCURLV4=0 && break 202 | done 203 | if [ "$isIPV6" -eq 0 ] && [ "$isCURLV4" -eq 0 ];then 204 | for u in $u6;do 205 | logs "Firmware compatibility is being check curl ipv6...[正在检测固件$CURL ipv6兼容性...]-[$u]" 206 | [ -n "$($CURL -6 -k -f -s --connect-timeout 5 --retry 3 $u)" ] && isCURLV6=0 && break 207 | done 208 | fi 209 | 210 | if [ "$isIPV6" -eq 1 ];then 211 | [ "$isWGETV4" -eq 1 ] && logs "$WGET version is too low or firmware is not supported, please upgrade[${WGET}版本太低或固件不支持, 请升级。]" 212 | [ "$isCURLV4" -eq 1 ] && logs "$CURL version is too low or firmware is not supported, please upgrade[${CURL}版本太低或固件不支持, 请升级。]" 213 | elif [ "$isIPV6" -eq 0 ];then 214 | [ "$isWGETV6" -eq 1 ] && logs "$WGET version is too low or firmware is not supported, please upgrade[${WGET}版本太低或固件不支持, 请升级。]" 215 | [ "$isCURLV6" -eq 1 ] && logs "$CURL version is too low or firmware is not supported, please upgrade[${CURL}版本太低或固件不支持, 请升级。]" 216 | fi 217 | 218 | if [ "$isWGETV4" -eq 1 ] && [ "$isCURLV4" -eq 1 ] && [ "$isWGETV6" -eq 1 ] && [ "$isCURLV6" -eq 1 ];then 219 | logs "其他插件使wget和curl无法获取外网IP, 脚本终止运行。" 220 | exit 1 221 | fi 222 | 223 | #Download and tar 224 | logs "Please wait while you download it[正在下载脚本, 请稍候...]" 225 | rm -f "$TAR_GZ" 226 | rm -rf "$TMP_PATH" 227 | i=1;r="1" 228 | while [ $i -le 10 ];do 229 | if [ "$r" == "1" -a -n "$WGET" ];then 230 | "$WGET" --no-check-certificate -c -q -O "$TAR_GZ" "$DOWN_URL" 231 | [ $? -eq 0 -a -f "$TAR_GZ" ] && r="0" 232 | fi 233 | if [ "$r" == "1" -a -n "$CURL" ];then 234 | "$CURL" -k "$DOWN_URL" -o "$TAR_GZ" 235 | [ $? -eq 0 -a -f "$TAR_GZ" ] && r="0" 236 | fi 237 | [ "$r" == "0" ] && break 238 | i=$((i+1)) 239 | done 240 | if [ "$r" == "0" ];then 241 | logs "Download successful[下载成功]" 242 | "$TAR" -xzf "$TAR_GZ" -C "/tmp/" 243 | if [ $? -ne 0 -o ! -d "$TMP_PATH/myscripts/lib" -o ! -d "$TMP_PATH/myscripts/sharealiddns" ];then 244 | logs "Tar failed, Please reinstall[tar解压失败, 请重新安装]" 245 | rm -f "$TAR_GZ" 246 | rm -rf "$TMP_PATH" 247 | exit 0 248 | fi 249 | else 250 | logs "The download failed because of slow network or because HTTPS was rejected by GitHub[下载失败, 因网络慢,或因https被github拒绝]" && exit 0 251 | fi 252 | 253 | #Install 254 | mkdir -p "$SCRIPTS_PATH" 255 | chmod +x "$SCRIPTS_PATH" 256 | 257 | if [ "$INSTALL_PATH" == "nand" ];then 258 | _uninstall_ "usb" 259 | elif [ "$INSTALL_PATH" == "usb" ];then 260 | _uninstall_ "nand" 261 | fi 262 | 263 | [ -f "$SCRIPTS_PATH/sharealiddns/conf/aliddns.conf" ] && mv -f "$SCRIPTS_PATH/sharealiddns/conf/aliddns.conf" "$SCRIPTS_PATH/sharealiddns/conf/aliddns.conf.backup" 264 | cp -af "$TMP_PATH/myscripts/lib" "$SCRIPTS_PATH" 265 | cp -af "$TMP_PATH/myscripts/sharealiddns" "$SCRIPTS_PATH" 266 | [ -f "$SCRIPTS_PATH/sharealiddns/conf/aliddns.conf.backup" ] && mv -f "$SCRIPTS_PATH/sharealiddns/conf/aliddns.conf.backup" "$SCRIPTS_PATH/sharealiddns/conf/aliddns.conf" 267 | 268 | rm -f "$TAR_GZ" 269 | rm -rf "$TMP_PATH" 270 | 271 | if [ -f "$SCRIPTS_PATH/lib/share.lib" -a -f "$SCRIPTS_PATH/sharealiddns/etc/init.d/sharealiddns.sh" -a -f "$SCRIPTS_PATH/sharealiddns/conf/aliddns.conf" ];then 272 | chmod +x "$SCRIPTS_PATH/lib/share.lib" 273 | chmod +x "$SCRIPTS_PATH/sharealiddns/etc/init.d/sharealiddns.sh" 274 | logs "Successfully install to $SCRIPTS_PATH[成功安装到${SCRIPTS_PATH}]" 275 | logs "<<========" 276 | if [ -x "$SCRIPTS_PATH/sharealiddns/etc/init.d/sharealiddns.sh" ];then 277 | sleep 3 278 | "$SCRIPTS_PATH/sharealiddns/etc/init.d/sharealiddns.sh" "setconf_unlock" 279 | fi 280 | else 281 | logs "Installation script failed, Please check[安装脚本失败, 请检查]" 282 | rm -f "$TAR_GZ" 283 | rm -rf "$TMP_PATH" 284 | fi 285 | logs "<<========" 286 | } 287 | 288 | _uninstall_(){ 289 | #uninstall 290 | local s="$1";local r=0 291 | if [ "$s" == "nand" ];then 292 | if [ -d "$PT/myscripts/sharealiddns" ];then 293 | rm -rf "$PT/myscripts/sharealiddns" 294 | fi 295 | elif [ "$s" == "usb" ];then 296 | for j in $($MOUNT | grep -wE 'mnt|media|opt' | cut -d ' ' -f3);do 297 | if [ -d "$j/myscripts/sharealiddns" ];then 298 | rm -rf "$j/myscripts/sharealiddns" 299 | fi 300 | i=$(($i+1)) 301 | done 302 | elif [ "$s" == "all" ];then 303 | if [ -d "$PT/myscripts/sharealiddns" ];then 304 | r=1 305 | rm -rf "$PT/myscripts/sharealiddns" 306 | logs "Successful uninstallation from $PT/myscripts/sharealiddns[已成功从$PT/myscripts/sharealiddns卸载]" 307 | fi 308 | for j in $($MOUNT | grep -wE 'mnt|media|opt' | cut -d ' ' -f3);do 309 | if [ -d "$j/myscripts/sharealiddns" ];then 310 | r=1 311 | rm -rf "$j/myscripts/sharealiddns" 312 | logs "Successful uninstallation from $j/myscripts/sharealiddns[已成功从${j}/myscripts/sharealiddns卸载]" 313 | fi 314 | i=$(($i+1)) 315 | done 316 | [ "$r" == "0" ] && logs "Has been uninstallation[已卸载]" 317 | fi 318 | if [ "$OS_TYPE" == "merlin" ];then 319 | for v in "/jffs/scripts/wan-start" "/jffs/scripts/ddns-start" "/jffs/scripts/post-mount";do 320 | if [ -f "$v" ];then 321 | _rmspacekeyfile_ "$v" "myshell" 322 | _rmspacerowfile_ "$v" 323 | if [ "$v" == "/jffs/scripts/wan-start" ];then 324 | _rmcurrowtolistfile_ "$v" "myshell" 14 325 | else 326 | _rmrowfile_ "$v" "myshell" 327 | _rmrowfile_ "$v" "myshellname" 328 | _rmrowfile_ "$v" "myshellproc" 329 | #del old 330 | _rmrowfile_ "$v" "myservice" 331 | _rmrowfile_ "$v" "wan_start" 332 | _rmrowfile_ "$v" "restart_dhcp6c" 333 | _rmspacerowfile_ "$v" 334 | fi 335 | fi 336 | done 337 | elif [ "$OS_TYPE" == "padavan" ];then 338 | if [ -f "/etc/storage/post_wan_script.sh" ];then 339 | _rmspacekeyfile_ "/etc/storage/post_wan_script.sh" "myshell" 340 | _rmspacerowfile_ "/etc/storage/post_wan_script.sh" 341 | _rmcurrowtolistfile_ "/etc/storage/post_wan_script.sh" "myshell" 14 342 | _rmspacerowfile_ "/etc/storage/post_wan_script.sh" 343 | fi 344 | elif [ "$OS_TYPE" == "openwrt" -o "$OS_TYPE" == "pandorabox" ];then 345 | for f in `ls /etc/hotplug.d/iface/99-sharealiddns* 2>&1 | grep -E '99-sharealiddns'`;do 346 | if [ -f "$f" ];then 347 | rm -f "$f" 348 | fi 349 | done 350 | for f in `ls /etc/init.d/sharealiddns* 2>&1 | grep -E 'sharealiddns'`;do 351 | if [ -f "$f" ];then 352 | rm -f "$f" 353 | fi 354 | done 355 | fi 356 | } 357 | 358 | _rmspacekeyfile_(){ 359 | local f="$1";local w="$2" 360 | sed -i "s~ *${w}~${w}~g" "$f" 361 | sed -i "s~${w} *~${w}~g" "$f" 362 | } 363 | 364 | _rmspacerowfile_(){ 365 | sed -i '/^\s*$/d' "$1" 366 | } 367 | 368 | _rmcurrowtolistfile_(){ 369 | local f="$1";local w="$2";local n="$3" 370 | sed -i "/${w}/,+${n}d" "$f" 371 | } 372 | 373 | _rmrowfile_(){ 374 | local f="$1";local w="$2" 375 | sed -i "/${w}/d" "$f" 376 | } 377 | 378 | get_os_type && do_check && do_install "$1" "$0" 379 | #=========================================the end====================================# 380 | -------------------------------------------------------------------------------- /myscripts/lib/share.lib: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | export PATH=/bin:/sbin:/lib:/usr/bin:/usr/sbin:/usr/lib:$PATH 3 | 4 | N_COLOR="\033[0m" 5 | 6 | R_COLOR="\033[0;31;40m" 7 | RB_COLOR="\033[1;31;40m" 8 | RF_COLOR="\033[5;31;40m" 9 | RA_COLOR="\033[7;31;47m" 10 | RS_COLOR="\033[4;31;40m" 11 | RL_COLOR="\033[3;31;40m" 12 | 13 | G_COLOR="\033[0;32;40m" 14 | GB_COLOR="\033[1;32;40m" 15 | GF_COLOR="\033[5;32;40m" 16 | GA_COLOR="\033[7;32;47m" 17 | GS_COLOR="\033[4;32;40m" 18 | GL_COLOR="\033[3;32;40m" 19 | 20 | Y_COLOR="\033[0;33;40m" 21 | YB_COLOR="\033[1;33;40m" 22 | YF_COLOR="\033[5;33;40m" 23 | YA_COLOR="\033[7;33;47m" 24 | YS_COLOR="\033[4;33;40m" 25 | YL_COLOR="\033[3;33;40m" 26 | 27 | B_COLOR="\033[0;34;40m" 28 | BB_COLOR="\033[1;34;40m" 29 | BF_COLOR="\033[5;34;40m" 30 | BA_COLOR="\033[7;34;47m" 31 | BS_COLOR="\033[4;34;40m" 32 | BL_COLOR="\033[3;34;40m" 33 | 34 | V_COLOR="\033[0;35;40m" 35 | VB_COLOR="\033[1;35;40m" 36 | VF_COLOR="\033[5;35;40m" 37 | VA_COLOR="\033[7;35;47m" 38 | VS_COLOR="\033[4;35;40m" 39 | VL_COLOR="\033[3;35;40m" 40 | 41 | INFO="${Y_COLOR}INFO:${N_COLOR}" 42 | TIPS="${YF_COLOR}TIPS:${N_COLOR}" 43 | ERROR="${RF_COLOR}ERROR:${N_COLOR}" 44 | WARNING="${YF_COLOR}WARNING:${N_COLOR}" 45 | INPUT="${RB_COLOR}=>${N_COLOR}" 46 | logsplit="=================================================================================" 47 | logs(){ 48 | local v1="$1";local v2="$2";local v3="$3";local v4="" 49 | case "$4" in 50 | t|T|TIPS)v4="$TIPS";; 51 | e|E|ERROR)v4="$ERROR";; 52 | w|W|WARNING)v4="$WARNING";; 53 | i|I|INFO|*)v4="$INFO";; 54 | esac 55 | [ -n "$v2" ] && echo -e "${v2}" 56 | if [ -n "$v1" ];then 57 | case "$v3" in 58 | r|R)echo -e "${v4}${R_COLOR}${v1}${N_COLOR}";; 59 | rb|RB)echo -e "${v4}${RB_COLOR}${v1}${N_COLOR}";; 60 | rf|RF)echo -e "${v4}${RF_COLOR}${v1}${N_COLOR}";; 61 | ra|RA)echo -e "${v4}${RA_COLOR}${v1}${N_COLOR}";; 62 | rs|RS)echo -e "${v4}${RS_COLOR}${v1}${N_COLOR}";; 63 | rl|RL)echo -e "${v4}${RL_COLOR}${v1}${N_COLOR}";; 64 | 65 | g|G)echo -e "${v4}${G_COLOR}${v1}${N_COLOR}";; 66 | gb|GB)echo -e "${v4}${GB_COLOR}${v1}${N_COLOR}";; 67 | gf|GF)echo -e "${v4}${GF_COLOR}${v1}${N_COLOR}";; 68 | ga|GA)echo -e "${v4}${GA_COLOR}${v1}${N_COLOR}";; 69 | gs|GS)echo -e "${v4}${GS_COLOR}${v1}${N_COLOR}";; 70 | gl|GL)echo -e "${v4}${GL_COLOR}${v1}${N_COLOR}";; 71 | 72 | y|Y)echo -e "${v4}${Y_COLOR}${v1}${N_COLOR}";; 73 | yb|YB)echo -e "${v4}${YB_COLOR}${v1}${N_COLOR}";; 74 | yf|YF)echo -e "${v4}${YF_COLOR}${v1}${N_COLOR}";; 75 | ya|YA)echo -e "${v4}${YA_COLOR}${v1}${N_COLOR}";; 76 | ys|YS)echo -e "${v4}${YS_COLOR}${v1}${N_COLOR}";; 77 | yl|YL)echo -e "${v4}${YL_COLOR}${v1}${N_COLOR}";; 78 | 79 | b|B)echo -e "${v4}${B_COLOR}${v1}${N_COLOR}";; 80 | bA|BA)echo -e "${v4}${BB_COLOR}${v1}${N_COLOR}";; 81 | bf|BF)echo -e "${v4}${BF_COLOR}${v1}${N_COLOR}";; 82 | ba|BA)echo -e "${v4}${BA_COLOR}${v1}${N_COLOR}";; 83 | bs|BS)echo -e "${v4}${BS_COLOR}${v1}${N_COLOR}";; 84 | bl|BL)echo -e "${v4}${BL_COLOR}${v1}${N_COLOR}";; 85 | 86 | v|V)echo -e "${v4}${V_COLOR}${v1}${N_COLOR}";; 87 | vb|VB)echo -e "${v4}${VB_COLOR}${v1}${N_COLOR}";; 88 | vf|VF)echo -e "${v4}${VF_COLOR}${v1}${N_COLOR}";; 89 | va|VA)echo -e "${v4}${VA_COLOR}${v1}${N_COLOR}";; 90 | vs|VS)echo -e "${v4}${VS_COLOR}${v1}${N_COLOR}";; 91 | vl|VL)echo -e "${v4}${VL_COLOR}${v1}${N_COLOR}";; 92 | 93 | *)echo -e "${v4}${v1}";; 94 | esac 95 | [ -n "$v2" ] && echo -e "${v2}" 96 | fi 97 | #-------------------------------# 98 | [ -n "$v2" ] && logger "$v2" 99 | [ -n "$v1" ] && logger "$v1" 100 | [ -n "$v2" ] && logger "$v2" 101 | #-------------------------------# 102 | return 0 103 | } 104 | 105 | if $(uname -a | tr 'A-Z' 'a-z' | grep -q 'merlin') && [ -d "/jffs" ] ;then 106 | OS_TYPE="merlin" 107 | elif [ -n $(which restart_wan) ] && [ -f "/etc/storage/post_wan_script.sh" ];then 108 | OS_TYPE="padavan" 109 | elif $(uname -a | tr 'A-Z' 'a-z' | grep -q 'pandorabox');then 110 | OS_TYPE="pandorabox" 111 | elif $(uname -a | tr 'A-Z' 'a-z' | grep -q 'openwrt');then 112 | OS_TYPE="openwrt" 113 | elif [ -f "/etc/config/network" -a -d "/etc/hotplug.d/iface" ];then 114 | OS_TYPE="openwrt" 115 | else 116 | logs "The script does not support this firmware[脚本不支持此固件]" "" "ra" "e" 117 | OS_TYPE="" 118 | fi 119 | 120 | VERSION="12.0" 121 | if [ "$OS_TYPE" == "merlin" ];then 122 | COMPUTER_NAME=$(nvram get computer_name) 2>/dev/null 123 | ROUTER_MODEL=$(nvram get model) 2>/dev/null 124 | FIRMWARE=$(nvram get firmver) 2>/dev/null 125 | BUILDNO=$(nvram get buildno) 2>/dev/null 126 | WEBS_STATE_INFO=$(nvram get webs_state_info) 2>/dev/null 127 | PRODUCTID=$(nvram get productid) 2>/dev/null 128 | else 129 | COMPUTER_NAME="" 130 | ROUTER_MODEL="" 131 | FIRMWARE="" 132 | BUILDNO="" 133 | WEBS_STATE_INFO="" 134 | PRODUCTID="" 135 | fi 136 | MACHINE_TYPE=$(uname -m) 137 | HOSTNAME=$(uname -n) 138 | KERNEL_RELEASE=$(uname -r) 139 | OS=$(uname -o) 140 | KERNEL_VER=$(expr substr `uname -r` 1 3) 141 | 142 | if [ -n "$COMPUTER_NAME" ];then 143 | ROUTER_MODEL="$COMPUTER_NAME" 144 | elif [ -n "$HOSTNAME" ];then 145 | ROUTER_MODEL="$HOSTNAME" 146 | else 147 | ROUTER_MODEL="ROUTER" 148 | fi 149 | 150 | STRLSP(){ 151 | local str="$1";local n1="$2";local n2="$3" 152 | if isNotEmpty "$str" check_number "$n1" && check_number "$n2";then 153 | echo ${str:$n1:$n2} 154 | else 155 | echo "" 156 | fi 157 | } 158 | 159 | LSP(){ 160 | local str1="$1";local str2="$2" 161 | echo ${str1%%$str2*} 162 | } 163 | 164 | RSP(){ 165 | local str1="$1";local str2="$2" 166 | echo ${str1#*$str2} 167 | } 168 | 169 | LTRIM(){ 170 | sed 's/^[ \t]*//g' 171 | } 172 | 173 | RTRIM(){ 174 | sed 's/[ \t]*$//g' 175 | } 176 | 177 | TRIM(){ 178 | LTRIM | RTRIM 179 | } 180 | 181 | TRIMALL(){ 182 | sed 's/[[:space:]]//g' 183 | } 184 | 185 | ROWTOCOLUMN(){ 186 | sed 's/ /\n/g' | sed '/^\s*$/d' 187 | } 188 | 189 | GETCOLUMN(){ 190 | echo $(echo "$1" | awk -F ' ' "{print $"$2"}") 191 | } 192 | 193 | RMSURPLUSSPACE(){ 194 | sed 's/ */ /g' 195 | } 196 | 197 | RMSTRING(){ 198 | sed "s/$1//g" 199 | } 200 | 201 | REPLACESTRING(){ 202 | sed "s/$1/$2/g" 203 | } 204 | 205 | RMSURPLUSSPACEFILE(){ 206 | sed -i 's/ */ /g' "$1" 207 | } 208 | 209 | TRIMALLFILE(){ 210 | sed -i 's/[[:space:]]//g' "$1" 211 | } 212 | 213 | LTRIMFILE(){ 214 | sed -i 's/^[ \t]*//g' "$1" 215 | } 216 | 217 | RTRIMFILE(){ 218 | sed -i 's/[ \t]*$//g' "$1" 219 | } 220 | 221 | REPLACESTRINGFILE(){ 222 | sed -i "s/$1/$2/g" "$3" 223 | } 224 | 225 | RMSPACEROWFILE(){ 226 | sed -i '/^\s*$/d' "$1" 227 | } 228 | 229 | RMSPACEKEYFILE(){ 230 | local f="$1";local w="$2" 231 | sed -i "s~ *${w}~${w}~g" "$f" 232 | sed -i "s~${w} *~${w}~g" "$f" 233 | } 234 | 235 | RMCURROWTOLISTFILE(){ 236 | local f="$1";local w="$2";local n="$3" 237 | sed -i "/${w}/,+${n}d" "$f" 238 | } 239 | 240 | RMCURROWTOENDFILE(){ 241 | local f="$1";local w="$2";local n=0 242 | n=$(sed -n '$=' $f) 243 | sed -i "/${w}/,+${n}d" "$f" 244 | } 245 | 246 | RMBETWEENROWFILE(){ 247 | local f="$1";local n1="$2";local n2="$3" 248 | sed -i ${n1},${n2}d "$f" 249 | } 250 | 251 | RMROWFILE(){ 252 | local f="$1";local w="$2" 253 | sed -i "/${w}/d" "$f" 254 | } 255 | 256 | RMNOROWFILE(){ 257 | local f="$1";local n="$2" 258 | sed -i "${n}d" "$f" 259 | } 260 | 261 | RMENDROWFILE(){ 262 | local f="$1" 263 | sed -i '$d' "$f" 264 | } 265 | 266 | GETROWNO(){ 267 | local w="$1";local f="$2";local m="$3";local n=0 268 | n=$(sed -n "/${w}/=" $f) 269 | if [ -n "$n" ];then 270 | if [ -z "$m" ];then 271 | echo "$n" 272 | elif [ "$m" == "top" ];then 273 | echo "$n" | awk "NR==1{print}" 274 | elif [ "$m" == "end" ];then 275 | echo "$n" | awk "END {print}" 276 | elif [ "$m" -ge 0 2>/dev/null ];then 277 | echo "$n" | awk "NR==$m{print}" 278 | fi 279 | else 280 | echo "" 281 | fi 282 | } 283 | 284 | del_tmpfile(){ 285 | local p="$1";local n="$2" 286 | for f in `ls $p/$n* 2>&1 | grep -E $n`;do 287 | if [ -f "$f" -a "$f" != "$p/$n" ];then 288 | rm -f "$f" 289 | fi 290 | done 291 | } 292 | 293 | urlencode() { 294 | while read -n1 v;do 295 | case $v in 296 | [a-zA-Z0-9.~_-]) printf "%s" "$v";; 297 | *) printf "%%%02X" "'$v";; 298 | esac 299 | done 300 | printf '\n' 301 | } 302 | 303 | domainencode() { 304 | local r=1 305 | while read -n1 v;do 306 | case $v in 307 | [a-zA-Z0-9.-]) r=0;; 308 | *) r=1;break;; 309 | esac 310 | done 311 | return $r 312 | } 313 | 314 | do_urlencode() { 315 | echo -n "$1" | urlencode 316 | } 317 | 318 | do_removerow(){ 319 | local file="$1";local n0="$2";local n1=0;local n2=0 320 | if [ -f "$1" ];then 321 | RMSPACEROWFILE "$file" 322 | n1=`wc -l $file | awk '{print $1}'` >/dev/null 2>&1 323 | if isgt "$n1" "$2";then 324 | n2=$(sdec $n1 $n0) 325 | isgt "$n2" 1 && sed -i "1,${n2}d" "$file" >/dev/null 2>&1 326 | fi 327 | fi 328 | } 329 | 330 | set_struppercase(){ 331 | local r=$(echo $1 | awk '{print toupper($0)}') 332 | echo "$r" 333 | } 334 | 335 | set_strlowercase(){ 336 | local r=$(echo $1 | awk '{print tolower($0)}') 337 | echo "$r" 338 | } 339 | 340 | set_uppercase(){ 341 | tr 'a-z' 'A-Z' 342 | } 343 | 344 | set_lowercase() { 345 | tr 'A-Z' 'a-z' 346 | } 347 | 348 | isstarts(){ 349 | local s1="$1";local s2="$2" 350 | echo "$s1" | grep "^$s2" >/dev/null 2>&1 351 | } 352 | 353 | isend() { 354 | local s1="$1";local s2="$2" 355 | echo "$s1" | grep -- "$s2\$" >/dev/null 2>&1 356 | } 357 | iscontains(){ 358 | local s1="$1";local s2="$2" 359 | echo "$s1" | grep -- "$s2" >/dev/null 2>&1 360 | } 361 | 362 | math(){ 363 | local n="$@" 364 | printf "%s" "$(($n))" 365 | } 366 | 367 | isexists() { 368 | local cmd="$1";local s="$2";local r="" 369 | #-------------# 370 | #global variable 371 | existspath="" 372 | #-------------# 373 | if [ -z "$cmd" ];then 374 | logs "Usage: exists cmd" "" "y" 375 | return 1 376 | fi 377 | r=$(which $cmd) 378 | if isNotEmpty "$r";then 379 | isNotEmpty "$s" && logs "$cmd exists=0" "" "y" 380 | existspath="$r" 381 | return 0 382 | else 383 | isNotEmpty "$s" && logs "$cmd exists=1, no found." "" "rf" 384 | existspath="" 385 | return 1 386 | fi 387 | } 388 | 389 | do_ether_wake(){ 390 | isEmpty $1 || isEmpty $2 && return 1 391 | ! isexists "ether-wake" && return 1 392 | local EW="$existspath" 393 | "$EW" -i $2 $1 394 | if iseq $? 0;then 395 | return 0 396 | else 397 | return 1 398 | fi 399 | } 400 | 401 | do_ping4(){ 402 | local r="" 403 | ! isexists "ping" && return 1 404 | if isEmpty "$3";then 405 | r=$(ping -c $2 $1 | tr 'A-Z' 'a-z' | grep -w 'time' | awk '{print $7}' | sed "s/time=//" 2>&1) 406 | else 407 | r=$(ping -c $2 -w $3 $1 | tr 'A-Z' 'a-z' | grep -w 'time' | awk '{print $7}' | sed "s/time=//" 2>&1) 408 | fi 409 | if isNotEmpty "$r";then 410 | return 0 411 | else 412 | return 1 413 | fi 414 | } 415 | 416 | do_ping6(){ 417 | local r="" 418 | ! isexists "ping6" && return 1 419 | if isEmpty "$3";then 420 | r=$(ping6 -c $2 $1 | tr 'A-Z' 'a-z' | grep -w 'time' | awk '{print $7}' | sed "s/time=//" 2>&1) 421 | else 422 | r=$(ping6 -c $2 -w $3 $1 | tr 'A-Z' 'a-z' | grep -w 'time' | awk '{print $7}' | sed "s/time=//" 2>&1) 423 | fi 424 | if isNotEmpty "$r";then 425 | return 0 426 | else 427 | return 1 428 | fi 429 | } 430 | 431 | do_nslookup(){ 432 | local HOST="$1";local SERVER="$2";local NSLOOKUP=`which nslookup`;local R="" 433 | if [ -z "$NSLOOKUP" ];then 434 | echo "" 435 | else 436 | for P in $($NSLOOKUP $HOST $SERVER 2>/dev/null);do 437 | if [ -n "$P" ] && [ "${#P}" -ge 7 ] && [ "$P" != "$SERVER" ] && [ -z "$(echo $P | tr 'A-Z' 'a-z' | grep -o 'address')" ] && [ -z "$(echo $P | tr 'A-Z' 'a-z' | grep -o 'server')" ];then 438 | if [ -z "$R" ];then 439 | R="${P}" 440 | else 441 | R="${R} ${P}" 442 | fi 443 | fi 444 | done 445 | echo "$R" 446 | fi 447 | } 448 | 449 | is_nslookup(){ 450 | local HOST="$1";local SERVER="$2";local NSLOOKUP=`which nslookup` 451 | [ -z "$NSLOOKUP" ] && return 1 452 | "$NSLOOKUP" "$HOST" "$SERVER" 2>/dev/null 453 | return $? 454 | } 455 | 456 | go_sleep() { 457 | local s="$1";local n="1";local t=0 458 | if [ "$n" ];then 459 | t="$s" 460 | while :;do 461 | printf "\r \r" 462 | echo -ne "${INPUT} ${RB_COLOR}${t} ${N_COLOR}" 463 | t=$(sdec $t 1) 464 | iseq "$t" 0 && break 465 | sleep 1 466 | done 467 | printf "\r" 468 | else 469 | sleep "$s" 470 | fi 471 | } 472 | 473 | do_cron(){ 474 | local cron_id="$1";local option="$2";local cf="$3";local Timer="$4";local interval="$5";local cmd="$6";local action="$7" 475 | local ct=0;local month=0;local week=0;local day=0;local min=0;local action_unlock="${action}_unlock" 476 | local CRU="";local b="";local sn="" 477 | 478 | isEmpty "$cron_id" && return 1 479 | if iseq "$option" "a" || iseq "$option" "d" || iseq "$option" "l";then 480 | ct=1 481 | else 482 | logs "option has a, d, or l, please check." "" "rf" 483 | return 1 484 | fi 485 | 486 | if isexists "basename";then 487 | b="$existspath" 488 | if isNotEmpty "$cmd";then 489 | sn=$($b $cmd) 490 | fi 491 | fi 492 | 493 | if isNotEmpty "$Timer";then 494 | month=$(echo "$Timer" | set_lowercase | grep -w 'month' | awk '{print $1}' | RMSTRING 'month' | RMSTRING '=' | TRIM) 495 | week=$(echo "$Timer" | set_lowercase | grep -w 'week' | awk '{print $2}' | RMSTRING 'week' | RMSTRING '=' | TRIM) 496 | day=$(echo "$Timer" | set_lowercase | grep -w 'day' | awk '{print $3}' | RMSTRING 'day' | RMSTRING '=' | TRIM) 497 | hour=$(echo "$Timer" | set_lowercase | grep -w 'hour' | awk '{print $4}' | RMSTRING 'hour' | RMSTRING '=' | TRIM) 498 | min=$(echo "$Timer" | set_lowercase | grep -w 'min' | awk '{print $5}' | RMSTRING 'min' | RMSTRING '=' | TRIM) 499 | 500 | if iseq "$month" "*";then 501 | ct=1 502 | elif check_number "$month";then 503 | if isge "$month" 1 && isle "$month" 12;then 504 | ct=1 505 | else 506 | logs "month has 1~12 or *, please check." "" "rf" 507 | return 1 508 | fi 509 | else 510 | logs "month has 1~12 or *, please check." "" "rf" 511 | return 1 512 | fi 513 | if iseq "$week" "*";then 514 | ct=1 515 | elif check_number "$week";then 516 | if isge "$week" 0 && isle "$week" 6;then 517 | ct=1 518 | else 519 | logs "week has 0~6 or *, please check." "" "rf" 520 | return 1 521 | fi 522 | else 523 | logs "week has 0~6 or *, please check." "" "rf" 524 | return 1 525 | fi 526 | if iseq "$day" "*";then 527 | ct=1 528 | elif check_number "$day";then 529 | if isge "$day" 1 && isle "$day" 31;then 530 | ct=1 531 | else 532 | logs "day has 1~31 or *, please check." "" "rf" 533 | return 1 534 | fi 535 | else 536 | logs "day has 1~31 or *, please check." "" "rf" 537 | return 1 538 | fi 539 | if iseq "$hour" "*";then 540 | ct=1 541 | elif check_number "$hour";then 542 | if isge "$hour" 0 && isle "$hour" 24;then 543 | ct=1 544 | else 545 | logs "hour has 0~24 or *, please check." "" "rf" 546 | return 1 547 | fi 548 | else 549 | logs "hour has 0~24 or *, please check." "" "rf" 550 | return 1 551 | fi 552 | if iseq "$min" "*";then 553 | ct=1 554 | elif check_number "$min";then 555 | if isge "$min" 0 && isle "$min" 59;then 556 | ct=1 557 | else 558 | logs "min has 0~59 or *, please check." "" "rf" 559 | return 1 560 | fi 561 | else 562 | logs "min has 0~59 or *, please check." "" "rf" 563 | return 1 564 | fi 565 | 566 | if iseq "$month" "*" && iseq "$week" "*" && iseq "$day" "*" && iseq "$hour" "*" && iseq "$min" "*";then 567 | logs "month week day hour min values cannot be all *, please check." "" "rf" 568 | return 1 569 | fi 570 | if iseq "$month" 0 && iseq "$week" 0 && iseq "$day" 0 && iseq "$hour" 0 && iseq "$min" 0;then 571 | logs "month week day hour min values cannot be all 0, please check." "" "rf" 572 | return 1 573 | fi 574 | 575 | if iseq "$interval" "none" || iseq "$interval" "month" || iseq "$interval" "week" || iseq "$interval" "day" || iseq "$interval" "hour" || iseq "$interval" "min";then 576 | ct=1 577 | else 578 | logs "interval has month, week, day, hour, min, or none, please check." "" "rf" 579 | return 1 580 | fi 581 | 582 | iseq "$interval" "month" && ! check_number "$month" && logs "interval must be set to none, please check." "" "rf" && return 1 583 | iseq "$interval" "week" && ! check_number "$week" && logs "interval must be set to none, please check." "" "rf" && return 1 584 | iseq "$interval" "day" && ! check_number "$day" && logs "interval must be set to none, please check." "" "rf" && return 1 585 | iseq "$interval" "hour" && ! check_number "$hour" && logs "interval must be set to none, please check." "" "rf" && return 1 586 | iseq "$interval" "min" && ! check_number "$min" && logs "interval must be set to none, please check." "" "rf" && return 1 587 | 588 | iseq "$interval" "month" && check_number "$month" && month="*/$month" 589 | iseq "$interval" "week" && check_number "$week" && week="*/$week" 590 | iseq "$interval" "day" && check_number "$day" && day="*/$day" 591 | iseq "$interval" "hour" && check_number "$hour" && hour="*/$hour" 592 | iseq "$interval" "min" && check_number "$min" && min="*/$min" 593 | 594 | iseq "$min" "*" && min="0" 595 | fi 596 | 597 | if isexists "cru" >/dev/null 2>&1;then 598 | CRU="$existspath" 599 | #add 600 | if iseq "$option" "a" && isNotEmpty "$cmd";then 601 | "$CRU" d "$cron_id" >/dev/null 2>&1 602 | sleep 1 603 | "$CRU" a "$cron_id" "$min $hour $day $month $week /bin/sh $cmd $action_unlock" >/dev/null 2>&1 604 | return 0 605 | fi 606 | #del 607 | if iseq "$option" "d";then 608 | "$CRU" d "$cron_id" >/dev/null 2>&1 609 | return 0 610 | fi 611 | #list 612 | if iseq "$option" "l";then 613 | "$CRU" l 614 | return 0 615 | fi 616 | elif [ -f "$cf" ];then 617 | #add 618 | if iseq "$option" "a" && isNotEmpty "$cmd" && isNotEmpty "$sn";then 619 | sed -i "/$sn.*/d" "$cf" 620 | sleep 1 621 | echo "$min $hour $day $month $week $cmd update" >> "$cf" 622 | return 0 623 | fi 624 | #del 625 | if iseq "$option" "d" && isNotEmpty "$cmd" && isNotEmpty "$sn";then 626 | sed -i "/$sn.*/d" "$cf" 627 | return 0 628 | fi 629 | #list 630 | if iseq "$option" "l";then 631 | cat "$cf" 632 | return 0 633 | fi 634 | fi 635 | return 0 636 | } 637 | 638 | del_cron(){ 639 | local CRU="" 640 | if isexists "cru" >/dev/null 2>&1;then 641 | CRU="$existspath" 642 | "$CRU" d "$1" >/dev/null 2>&1 643 | return 0 644 | else 645 | return 1 646 | fi 647 | } 648 | 649 | isEmpty(){ 650 | if [ "$1"x = x ] || [ -z "$1" ];then 651 | return 0 652 | else 653 | return 1 654 | fi 655 | } 656 | 657 | isNotEmpty(){ 658 | if isEmpty "$1";then 659 | return 1 660 | else 661 | return 0 662 | fi 663 | } 664 | 665 | isNumber(){ 666 | if [ "$1" -ge 0 2>/dev/null ];then 667 | return 0 668 | else 669 | return 1 670 | fi 671 | } 672 | 673 | check_number(){ 674 | if echo -e "$1" | grep -q '^[0-9]\+$';then 675 | return 0 676 | else 677 | return 1 678 | fi 679 | } 680 | 681 | check_alphabet(){ 682 | if echo -e "$1" | grep -q '^[a-zA-Z]\+$';then 683 | return 0 684 | else 685 | return 1 686 | fi 687 | } 688 | 689 | check_space(){ 690 | local s="$1" 691 | if [ "${s/ /}" = "$s" ];then 692 | return 0 693 | else 694 | return 1 695 | fi 696 | } 697 | 698 | str_total(){ 699 | local str=$1 700 | echo ${#str} 701 | } 702 | 703 | iseq(){ 704 | if isNumber "$1" && isNumber "$2";then 705 | if [ "$1" -eq "$2" >/dev/null 2>&1 ];then 706 | return 0 707 | else 708 | return 1 709 | fi 710 | else 711 | if [ "$1"x = "$2"x -a "$1" == "$2" ];then 712 | return 0 713 | else 714 | return 1 715 | fi 716 | fi 717 | } 718 | 719 | isnoteq(){ 720 | if iseq "$1" "$2";then 721 | return 1 722 | else 723 | return 0 724 | fi 725 | } 726 | 727 | isne(){ 728 | if iseq "$1" "$2";then 729 | return 1 730 | else 731 | return 0 732 | fi 733 | } 734 | 735 | isge(){ 736 | if isNumber "$1" && isNumber "$2";then 737 | if [ "$1" -ge "$2" >/dev/null 2>&1 ];then 738 | return 0 739 | fi 740 | fi 741 | return 1 742 | } 743 | 744 | isgt(){ 745 | if isNumber "$1" && isNumber "$2";then 746 | if [ "$1" -gt "$2" >/dev/null 2>&1 ];then 747 | return 0 748 | fi 749 | fi 750 | return 1 751 | } 752 | 753 | isle(){ 754 | if isNumber "$1" && isNumber "$2";then 755 | if [ "$1" -le "$2" >/dev/null 2>&1 ];then 756 | return 0 757 | fi 758 | fi 759 | return 1 760 | } 761 | 762 | islt(){ 763 | if isNumber "$1" && isNumber "$2";then 764 | if [ "$1" -lt "$2" >/dev/null 2>&1 ];then 765 | return 0 766 | fi 767 | fi 768 | return 1 769 | } 770 | 771 | isGEbetween(){ 772 | if isNumber "$1" && isNumber "$2" && isNumber "$3";then 773 | if isge "$2" "$1" && isle "$2" "$3";then 774 | return 0 775 | fi 776 | fi 777 | return 1 778 | } 779 | 780 | isGTbetween(){ 781 | if isNumber "$1" && isNumber "$2" && isNumber "$3";then 782 | if isgt "$2" "$1" && islt "$2" "$3";then 783 | return 0 784 | fi 785 | fi 786 | return 1 787 | } 788 | 789 | sadd(){ 790 | echo $(($1+$2)) 791 | } 792 | 793 | sdec(){ 794 | echo $(($1-$2)) 795 | } 796 | 797 | remainder(){ 798 | echo $(($1 % $2)) 799 | } 800 | 801 | public_ipv6_check(){ 802 | #fe80:: 803 | #fec0:: 804 | echo "$1" | set_lowercase | grep -v '^fe80' | grep -v '^fec0' | egrep '^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))' > /dev/null 805 | } 806 | 807 | private_ipv6_check(){ 808 | if public_ipv6_check "$1";then 809 | return 1 810 | else 811 | return 0 812 | fi 813 | } 814 | 815 | valid_ipv6(){ 816 | echo "$1" | egrep '^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))' > /dev/null 817 | if iseq $? 0;then 818 | return 0 819 | else 820 | return 1 821 | fi 822 | } 823 | 824 | public_ipv4_check(){ 825 | #private ip 826 | #A:10.0.0.0-10.255.255.255 827 | #B:172.16.0.0-172.31.255.255 828 | #C:192.168.0.0-192.168.255.255 829 | echo "$1" | egrep -v '[A-Za-z]' | grep '^[0-9]\{1,3\}\.\([0-9]\{1,3\}\.\)\{2\}[0-9]\{1,3\}$' | grep -v '127.0.0.1' | egrep '\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}\b' | egrep -v '(^127\.)|(^169\.)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^192\.168\.)' > /dev/null 830 | if iseq $? 0;then 831 | return 0 832 | else 833 | return 1 834 | fi 835 | } 836 | 837 | private_ipv4_check(){ 838 | #private ip 839 | #A:10.0.0.0-10.255.255.255 840 | #B:172.16.0.0-172.31.255.255 841 | #C:192.168.0.0-192.168.255.255 842 | if public_ipv4_check "$1";then 843 | return 1 844 | else 845 | return 0 846 | fi 847 | } 848 | 849 | valid_ipv4(){ 850 | echo "$1" | egrep '^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])$' > /dev/null 851 | if iseq $? 0;then 852 | return 0 853 | else 854 | return 1 855 | fi 856 | } 857 | 858 | valid_ip(){ 859 | if valid_ipv4 "$1";then 860 | return 0 861 | elif valid_ipv6 "$1";then 862 | return 0 863 | else 864 | return 1 865 | fi 866 | } 867 | 868 | valid_mac(){ 869 | echo "$1" | egrep '[0-9a-fA-F:]' | grep -o '[0-9a-fA-F]\{2\}\:[0-9a-fA-F]\{2\}\:[0-9a-fA-F]\{2\}\:[0-9a-fA-F]\{2\}\:[0-9a-fA-F]\{2\}\:[0-9a-fA-F]\{2\}' > /dev/null 870 | if iseq $? 0;then 871 | return 0 872 | else 873 | return 1 874 | fi 875 | } 876 | 877 | progressbar(){ 878 | local nc1=0;local nc2=0;local nc3="" 879 | while [ $nc1 -lt 100 >/dev/null 2>&1 ];do 880 | case $nc2 in 0) nc3='-';; 1) nc3='\';; 2) nc3='|';; 3) nc3='/';; esac 881 | printf " %s\r" "$nc3" 882 | sleep 1 883 | nc1=$(sadd $nc1 1) 884 | nc2=$(remainder $nc1 4) 885 | done 886 | } 887 | 888 | do_progress(){ 889 | local i=0;local k=0;j="=" 890 | ! isNumber "$1" && return 1 891 | ! isEmpty "$2" && j="$2" 892 | while [ $i -lt $1 >/dev/null 2>&1 ];do 893 | iseq $k 0 && echo -ne "$j" 894 | i=$(sadd $i 1) 895 | k=$(remainder $i 2) 896 | done 897 | echo "" 898 | return 0 899 | } 900 | 901 | get_file_size(){ 902 | #[ $(get_file_size "/tmp/syslog.log") -ge 200000 ] && rm -rf "/tmp/syslog.log" 903 | if [ -f "$1" ];then 904 | echo `wc -c "$1" | awk '{print $1}'` 905 | else 906 | echo 0 907 | fi 908 | } 909 | 910 | get_devname(){ 911 | local r=0 912 | if [ -n "$1" ];then 913 | r=$(mount | grep -w "$1" | awk '{print $1}') 914 | fi 915 | echo $r 916 | } 917 | 918 | get_mntname(){ 919 | local r="" 920 | if [ -n "$1" ];then 921 | r=$(mount | grep -w "$1" | awk '{print $3}') 922 | fi 923 | echo -e "$r" 924 | } 925 | 926 | do_backup_Directory(){ 927 | local i=0;local t=$(date "+%Y-%m-%d-%H-%M-%S");local d=$(basename "$2")-$t.tar.gz 928 | if [ ! -d "$2" ];then 929 | logs "Not Path $2." "$logsplit" "y" 930 | exit 1 931 | fi 932 | 933 | mkdir -p "$3" 2>/dev/null 934 | 935 | if [ ! -d "$3" ];then 936 | logs "Not Path $3." "$logsplit" "y" 937 | exit 1 938 | fi 939 | 940 | logs "Backuping..." "$logsplit" "y" 941 | logs "Taring $d..." "$logsplit" "y" 942 | tar -zcf "$3/$d" "$2" 2>/dev/null 943 | 944 | for FILE in `ls -c "$3" 2>/dev/null`;do 945 | i=$(sadd $i 1) 946 | isgt "$i" "$1" && rm -rf "$3/$FILE" 947 | done 948 | if isgt "$i" 0;then 949 | logs "Backup Finish." "$logsplit" "y" 950 | return 0 951 | else 952 | logs "Backup Not Finish." "$logsplit" "y" 953 | return 1 954 | fi 955 | } 956 | 957 | exurl(){ 958 | echo $(echo $1 | sed -e 's/\//\\\//g') 959 | } 960 | 961 | do_sed(){ 962 | if [ -n "$1" ];then 963 | local v1=$(exurl "$1") 964 | local v2=$(exurl "$2") 965 | sed -i "s/$v1/$v2/g" "$3" 966 | return 0 967 | fi 968 | return 1 969 | } 970 | 971 | check_tcp_port(){ 972 | local s=`iptables -vxn -L | grep -i "tcp dpt:$1" | grep -w "ACCEPT" | grep -o "$1"` 973 | if isEmpty "$s";then 974 | return 1 975 | else 976 | return 0 977 | fi 978 | } 979 | 980 | check_udp_port(){ 981 | local s=`iptables -vxn -L | grep -i "udp dpt:$1" | grep -w "ACCEPT" | grep -o "$1"` 982 | if isEmpty "$s";then 983 | return 1 984 | else 985 | return 0 986 | fi 987 | } 988 | 989 | check_tcps_port(){ 990 | local s=`iptables -vxn -L | grep -i "tcp dpts:$1" | grep -w "ACCEPT" | grep -o "$1"` 991 | if isEmpty "$s";then 992 | return 1 993 | else 994 | return 0 995 | fi 996 | } 997 | 998 | check_udps_port(){ 999 | local s=`iptables -vxn -L | grep -i "udp dpts:$1" | grep -w "ACCEPT" | grep -o "$1"` 1000 | if isEmpty "$s";then 1001 | return 1 1002 | else 1003 | return 0 1004 | fi 1005 | } 1006 | 1007 | createln(){ 1008 | [ -L "$1" ] && rm -rf "$1" 1009 | [ -x "$2" -o -f "$2" ] && ln -sf "$2" "$1" 1010 | } 1011 | 1012 | get_basename(){ 1013 | echo $(basename $(echo "$1" | awk -F ' ' '{print $1}') | awk -F '.' '{print $1}') 1014 | } 1015 | 1016 | check_shellproc(){ 1017 | local s="$1" 1018 | [ -z "$s" ] && return 0 1019 | if $(ps | grep -v grep | grep -q $s);then 1020 | return 1 1021 | else 1022 | return 0 1023 | fi 1024 | } 1025 | 1026 | _delfilelock(){ 1027 | iseq "$_islockkeep" 1 && rm -f "$1" 1028 | if [ -f "$1" ];then 1029 | return 1 1030 | else 1031 | return 0 1032 | fi 1033 | } 1034 | 1035 | _lock(){ 1036 | flock -$1 $2 1037 | } 1038 | 1039 | _unlocking(){ 1040 | _lock u $1 1041 | _ulock_info $2 $3 1042 | } 1043 | 1044 | _locking(){ 1045 | _islockkeep=1 && [ -n "$4" ] && _delfilelock "$2" 1046 | trap "_unlocking $1 $2 $3" EXIT HUP INT QUIT PIPE ALRM TERM 1047 | eval "exec $1>\"$2\"" 1048 | } 1049 | 1050 | fflock (){ 1051 | _islockkeep=1 && [ -n "$4" ] && _delfilelock "$2" 1052 | trap "_ulock_info $2 $3" EXIT HUP INT QUIT PIPE ALRM TERM 1053 | if [ ! -f "$2" ];then 1054 | eval "exec $1>\"$2\"" 1055 | return 0 1056 | else 1057 | return 1 1058 | fi 1059 | } 1060 | 1061 | xnlock(){ 1062 | _locking $1 $2 $3 $4 1063 | _lock xn $1 1064 | } 1065 | 1066 | xlock(){ 1067 | _locking $1 $2 $3 $4 1068 | _lock x $1 1069 | } 1070 | 1071 | slock(){ 1072 | _locking $1 $2 $3 $4 1073 | _lock s $1 1074 | } 1075 | 1076 | ulock(){ 1077 | _locking $1 $2 $3 $4 1078 | _lock u $1 1079 | } 1080 | 1081 | _ulock_info(){ 1082 | if iseq "$_islockkeep" 1 && _delfilelock "$1";then 1083 | _islockkeep=0 1084 | echo "" 1085 | logs "$2 has exited." "" "rl" "w" 1086 | fi 1087 | exit 0 1088 | } 1089 | 1090 | lock_info(){ 1091 | logs "$1 has running or locked." "" "rl" "w" 1092 | _islockkeep=0 1093 | exit 1 1094 | } 1095 | 1096 | check_url(){ 1097 | local u="$1";local t="$2";local n="$3";local r="";local WGET="" 1098 | [ -z "$t" ] && t=10 1099 | [ -z "$n" ] && n=10 1100 | if isexists "wget";then 1101 | WGET="$existspath" 1102 | else 1103 | return 1 1104 | fi 1105 | r=$($WGET --no-check-certificate --spider T $t t $n $u 2>&1 | grep -o '200') 1106 | if isNotEmpty "$r";then 1107 | return 0 1108 | else 1109 | return 1 1110 | fi 1111 | } 1112 | 1113 | kill_process(){ 1114 | killall -9 $1 2>/dev/null 1115 | if [ -n "`pidof $1`" ]; then 1116 | logs "$1 failed." "" "rb" 1117 | return 255 1118 | else 1119 | logs "$1 done." "" "yb" 1120 | return 0 1121 | fi 1122 | } 1123 | 1124 | do_Free_Memory(){ 1125 | sync 1126 | echo 3 > /proc/sys/vm/drop_caches 1127 | } 1128 | -------------------------------------------------------------------------------- /myscripts/sharealiddns/etc/init.d/sharealiddns.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | #====================================================================================== 3 | export PATH=/usr/bin:/usr/sbin:/usr/lib:/bin:/sbin:/lib:$PATH 4 | #====================================================================================== 5 | get_scripts_path(){ 6 | local d=`which dirname` 7 | local p=`which pwd` 8 | local r=`which readlink` 9 | if [ -n "$d" -a -n "$r" ];then 10 | echo $($d $($r -f $1)) 11 | elif [ -n "$d" -a -n "$p" ];then 12 | echo $(cd $($d $1);$p) 13 | else 14 | echo "" 15 | fi 16 | } 17 | #====================================================================================== 18 | get_scripts_folder(){ 19 | echo `echo $1 | awk -F "/etc/init.d" '{print $1}'` 20 | } 21 | #====================================================================================== 22 | get_scripts_folder_name(){ 23 | local b=`which basename` 24 | if [ -n "$b" ];then 25 | echo $($b $1) 26 | else 27 | echo "" 28 | fi 29 | } 30 | #====================================================================================== 31 | get_scripts_mount_path(){ 32 | local d=`which dirname` 33 | if [ -n "$d" ];then 34 | echo $($d $1) 35 | else 36 | echo "" 37 | fi 38 | } 39 | #====================================================================================== 40 | get_scripts_mount_name(){ 41 | local d=`which dirname` 42 | if [ -n "$d" ];then 43 | echo $($d $1) 44 | else 45 | echo "" 46 | fi 47 | } 48 | #====================================================================================== 49 | get_scripts_name(){ 50 | local b=`which basename` 51 | if [ -n "$b" ];then 52 | echo $($b $1) 53 | else 54 | echo "" 55 | fi 56 | } 57 | #====================================================================================== 58 | get_scripts_sh(){ 59 | if [ -z "$(echo $1 | grep -o "/")" ];then 60 | echo "$2/$3" 61 | else 62 | echo "$1" 63 | fi 64 | } 65 | #====================================================================================== 66 | scripts_path=$(get_scripts_path $0) 67 | scripts_folder=$(get_scripts_folder $scripts_path) 68 | scripts_folder_name=$(get_scripts_folder_name $scripts_folder) 69 | scripts_mount_path=$(get_scripts_mount_path $scripts_folder) 70 | scripts_mount_name=$(get_scripts_mount_name $scripts_mount_path) 71 | scripts_name=$(get_scripts_name $0) 72 | scripts_sh=$(get_scripts_sh $0 $scripts_path $scripts_name) 73 | #====================================================================================== 74 | aliddns_title="aliddns_plugin" 75 | aliddns_version="12.0" 76 | aliddns_dcu="/sbin/ddns_custom_updated" 77 | aliddns_root="$scripts_folder" 78 | aliddns_conf="$aliddns_root/conf/aliddns.conf" 79 | aliddns_log="$aliddns_root/log/log.txt" 80 | aliddns_msg="/tmp/aliddns_msg.txt" 81 | #====================================================================================== 82 | chmod -R 0755 $scripts_path >/dev/null 2>&1 83 | #====================================================================================== 84 | share_path="$scripts_mount_path/lib/share.lib" 85 | if [ -f "$share_path" ];then 86 | [ ! -x "$share_path" ] && chmod 0755 "$share_path" >/dev/null 2>&1 87 | source "$share_path" 88 | else 89 | echo -e "Can't find $share_path." 90 | logger "Can't find $share_path." 91 | exit 0 92 | fi 93 | #====================================================================================== 94 | ARGS0="$0";ARGS2="$2";ARGS3="$3";ARGS4="$4";LS="$logsplit" 95 | #====================================================================================== 96 | ARGS1=$(echo $1 | awk -F '_' '{print $1}') 97 | FU=$(echo $1 | awk -F '_' '{print $2}');FL="/tmp/$scripts_name.lock";FS="$scripts_sh";FD=100 98 | if isexists "flock";then 99 | xnlock "$FD" "$FL" "$FS" "$FU" || lock_info "$FS" 100 | else 101 | fflock "$FD" "$FL" "$FS" "$FU" || lock_info "$FS" 102 | fi 103 | #====================================================================================== 104 | logs "" "$LS" 105 | [ -n "$KERNEL_RELEASE" ] && logs "$ROUTER_MODEL KERNEL_RELEASE IS $KERNEL_RELEASE" "" "yb" 106 | [ -n "$KERNEL_VER" ] && logs "$ROUTER_MODEL KERNEL_VER IS $KERNEL_VER" "" "yb" 107 | [ -n "$MACHINE_TYPE" ] && logs "$ROUTER_MODEL MACHINE_TYPE IS $MACHINE_TYPE" "" "yb" 108 | [ -n "$BUILDNO" ] && logs "$ROUTER_MODEL BUILDNO IS $BUILDNO" "" "yb" 109 | [ -n "$OS_TYPE" ] && logs "$ROUTER_MODEL FIRMWARE IS $OS_TYPE" "" "yb" 110 | #====================================================================================== 111 | logs "SHAREALIDDNS VERSION IS $aliddns_version" "" "yb" 112 | #====================================================================================== 113 | #====================================================================================== 114 | #====================================================================================== 115 | logs "$ARGS0 $ARGS1 $ARGS2 $ARGS3 $ARGS4" "$LS" "rb" 116 | #====================================================================================== 117 | #0:close debug 118 | #1:get_aliddns_options 119 | #2:aliddns_domain_api and get_Record 120 | ndebug=0 121 | #====================================================================================== 122 | isGEbetween 0 "$ARGS4" 2 && ndebug="$ARGS4" 123 | #====================================================================================== 124 | islog=0 125 | isipv4_domain=0 126 | isipv6_domain=0 127 | pppoe_ifname="any" 128 | cron_Time=1 129 | cron_Time_type="hour" 130 | cron_File="" 131 | #====================================================================================== 132 | routerddns_no=1 133 | routerddns_name="" 134 | routerddns_domain="" 135 | #====================================================================================== 136 | #ipv4 external url 137 | u4="" 138 | #ipv6 external url 139 | u6="" 140 | #nslookup server 141 | dns="" 142 | #====================================================================================== 143 | #First use wage, curl Can not be installed 144 | OPENSSL="" 145 | NSLOOKUP="" 146 | IP2="" 147 | CURL="" 148 | WGET="" 149 | SORT="" 150 | #====================================================================================== 151 | wan_no=0 152 | wan_ifname="" 153 | wan_proto="" 154 | wan_ipvx_IP="" 155 | wan_ipv4_IP="" 156 | wan_ipv6_IP="" 157 | lan_ipvx_IP="" 158 | lan_ipv4_IP="" 159 | lan_ipv6_IP="" 160 | xIP="" 161 | xan_ipvx_IP="" 162 | issuccess="" 163 | isfailed="" 164 | isdnsExist="false" 165 | isdnsWhois=0 166 | isPublic_network=1 167 | isFirst_level_router=1 168 | iscurl=1 169 | iswget=1 170 | isgetexternalipv4=1 171 | isgetexternalipv6=1 172 | num_getRecord=1 173 | Count=1 174 | SP="&" 175 | currtimer=0 176 | lasttimer=0 177 | actions="checked" 178 | operation="success" 179 | ID_CRU=ID_aliddns_update 180 | nslookup_ipvx="" 181 | iseui64=1 182 | ipv6_eui64="" 183 | ipv6_prefix="" 184 | nslookup_dns="" 185 | isfailed_again="/tmp/isfailed_again_aliddns" 186 | isfailed_again_num="/tmp/isfailed_again_aliddns.num" 187 | iswan_start="/tmp/wan_start.pid" 188 | #====================================================================================== 189 | Record_TotalCount=0 190 | Record_Id="" 191 | Record_IP="" 192 | Record_name="" 193 | Record_domain="" 194 | Record_Status="" 195 | Record_type="" 196 | Record_Locked="" 197 | Record_ttl="" 198 | Record_RequestId="" 199 | Record_Priority="" 200 | Record_Weight="" 201 | Record_Line="" 202 | Record_Ids="" 203 | Record_RecordCount=1 204 | #====================================================================================== 205 | aliddns_domain_list="" 206 | aliddns_name_list="" 207 | aliddns_ttl_list="" 208 | aliddns_type_list="" 209 | aliddns_lan_mac_list="" 210 | #====================================================================================== 211 | aliddns_TotalCount=0 212 | aliddns_name="" 213 | aliddns_domain="" 214 | aliddns_ttl="" 215 | aliddns_type="" 216 | aliddns_AccessKeyId="" 217 | aliddns_AccessKeySecret="" 218 | aliddns_lan_mac="" 219 | aliddns_url_ok="" 220 | aliddns_url="http://alidns.aliyuncs.com" 221 | #====================================================================================== 222 | dhcp6cPID=0 223 | wanstartPID=0 224 | externalIP4="" 225 | externalIP6="" 226 | ETH="" 227 | isIPV6=0 228 | isRUN=0 229 | #====================================================================================== 230 | get_url_cmd(){ 231 | local u="$1";local t="$2";local m="$3";local g="$4";local p="" 232 | if iseq "$m" "ipv4";then 233 | m=-4 234 | elif iseq "$m" "ipv6";then 235 | m=-6 236 | else 237 | m="" 238 | fi 239 | isEmpty "$t" && t=30 240 | if [ -z "$g" ];then 241 | if [ -n "$u" ];then 242 | if [ -n "$WGET" ];then 243 | p=$($WGET $m --no-check-certificate -q -T $t -O- $u) 2>/dev/null 244 | elif [ -n "$CURL" ];then 245 | p=$($CURL $m -k -s --connect-timeout $t $u) 2>/dev/null 246 | fi 247 | fi 248 | elif [ "$g" == "wget" ];then 249 | p=$($WGET $m --no-check-certificate -T $t -O- $u) 2>/dev/null 250 | elif [ "$g" == "curl" ];then 251 | p=$($CURL $m -k --connect-timeout $t $u) 2>/dev/null 252 | fi 253 | echo "$p" 254 | } 255 | #====================================================================================== 256 | get_ip_wget(){ 257 | local u="$1";local t="$2";local m="$3";local wp="" 258 | isEmpty "$t" && t=30 259 | if [ -n "$WGET" -a -n "$u" ];then 260 | p=$($WGET --no-check-certificate -q -T $t -O- $u) 2>/dev/null 261 | if iseq $? 0;then 262 | if iseq "$m" "ipv4";then 263 | public_ipv4_check "$p" && wp="$p" 264 | elif iseq "$m" "ipv6";then 265 | public_ipv6_check "$p" && wp="$p" 266 | else 267 | wp="$p" 268 | fi 269 | fi 270 | fi 271 | echo "$wp" 272 | } 273 | #====================================================================================== 274 | get_ip_curl(){ 275 | local u="$1";local t="$2";local m="$3";local wp="" 276 | isEmpty "$t" && t=30 277 | if [ -n "$CURL" -a -n "$u" ];then 278 | p=$($CURL -k -s --connect-timeout $t $u) 2>/dev/null 279 | if iseq $? 0;then 280 | if iseq "$m" "ipv4";then 281 | public_ipv4_check "$p" && wp="$p" 282 | elif iseq "$m" "ipv6";then 283 | public_ipv6_check "$p" && wp="$p" 284 | else 285 | wp="$p" 286 | fi 287 | fi 288 | fi 289 | echo "$wp" 290 | } 291 | #====================================================================================== 292 | isgetexternalIPV46(){ 293 | local m="$1";local r="";local u4="http://ipv4.ident.me";local u6="http://ipv6.ident.me" 294 | local f4="/tmp/isgetexternalIPV4.success";local f6="/tmp/isgetexternalIPV6.success" 295 | if iseq "$m" "ipv4";then 296 | if [ -f "$f4" ];then 297 | r=$(cat "$f4" | grep -w 'success' | RMSTRING 'success=') 298 | return "$r" 299 | else 300 | r=$($WGET --no-check-certificate -T 15 -O- $u4) 2>/dev/null 301 | if isNotEmpty "$r" ;then 302 | echo "success=0" > "$f4" 303 | return 0 304 | else 305 | echo "success=1" > "$f4" 306 | return 1 307 | fi 308 | fi 309 | elif iseq "$m" "ipv6";then 310 | if [ -f "$f6" ];then 311 | r=$(cat "$f6" | grep -w 'success' | RMSTRING 'success=') 312 | return "$r" 313 | else 314 | r=$($WGET --no-check-certificate -T 15 -O- $u6) 2>/dev/null 315 | if isNotEmpty "$r" ;then 316 | echo "success=0" > "$f6" 317 | return 0 318 | else 319 | echo "success=1" > "$f6" 320 | return 1 321 | fi 322 | fi 323 | fi 324 | } 325 | #====================================================================================== 326 | get_aliddns_options(){ 327 | local ct=0;local n1=0;local n2=0;local n3=0;local n4=0;local n5=0;local m='"' 328 | local s0="$aliddns_conf";local s1="isipv4_domain";local s2="isipv6_domain";local s3="pppoe_ifname" 329 | local s4="cron_Time";local s5="cron_Time_type";local s6="islog";local s7="aliddns_AccessKeyId" 330 | local s8="aliddns_AccessKeySecret";local s9="routerddns_no" 331 | local s10="aliddns_name";local s11="aliddns_domain";local s12="aliddns_ttl";local s13="aliddns_type";local s14="aliddns_lan_mac" 332 | 333 | LTRIMFILE "$s0" 334 | RTRIMFILE "$s0" 335 | RMSPACEROWFILE "$s0" 336 | sed -i 's/ *=/=/g' "$s0" 337 | sed -i 's/= */=/g' "$s0" 338 | 339 | isipv4_domain=$(cat $s0 | grep -w $s1 | RMSTRING "$s1=" | RMSTRING '"' | RMSTRING "''" | TRIMALL) 340 | isipv6_domain=$(cat $s0 | grep -w $s2 | RMSTRING "$s2=" | RMSTRING '"' | RMSTRING "''" | TRIMALL) 341 | pppoe_ifname=$(cat $s0 | grep -w $s3 | RMSTRING "$s3=" | RMSTRING '"' | RMSTRING "''" | TRIMALL) 342 | cron_Time=$(cat $s0 | grep -w $s4 | RMSTRING "$s4=" | RMSTRING '"' | RMSTRING "''" | TRIMALL) 343 | cron_Time_type=$(cat $s0 | grep -w $s5 | RMSTRING "$s5=" | RMSTRING '"' | RMSTRING "''" | TRIMALL) 344 | islog=$(cat $s0 | grep -w $s6 | RMSTRING "$s6=" | RMSTRING '"' | RMSTRING "''" | TRIMALL) 345 | aliddns_AccessKeyId=$(cat $s0 | grep -w $s7 | RMSTRING "$s7=" | RMSTRING '"' | RMSTRING "''" | TRIMALL) 346 | aliddns_AccessKeySecret=$(cat $s0 | grep -w $s8 | RMSTRING "$s8=" | RMSTRING '"' | RMSTRING "''" | TRIMALL) 347 | routerddns_no=$(cat $s0 | grep -w $s9 | RMSTRING "$s9=" | RMSTRING '"' | RMSTRING "''" | TRIMALL) 348 | aliddns_name_list=$(cat $s0 | grep -w $s10 | RMSTRING "$s10=" | RMSTRING '"' | RMSTRING "''") 349 | aliddns_domain_list=$(cat $s0 | grep -w $s11 | RMSTRING "$s11=" | RMSTRING '"' | RMSTRING "''") 350 | aliddns_ttl_list=$(cat $s0 | grep -w $s12 | RMSTRING "$s12=" | RMSTRING '"' | RMSTRING "''") 351 | aliddns_type_list=$(cat $s0 | grep -w $s13 | RMSTRING "$s13=" | RMSTRING '"' | RMSTRING "''") 352 | aliddns_lan_mac_list=$(cat $s0 | grep -w $s14 | RMSTRING "$s14=" | RMSTRING '"' | RMSTRING "''") 353 | n1=$(echo "$aliddns_name_list" | ROWTOCOLUMN | awk 'END{print NR}') 354 | n2=$(echo "$aliddns_domain_list" | ROWTOCOLUMN | awk 'END{print NR}') 355 | n3=$(echo "$aliddns_ttl_list" | ROWTOCOLUMN | awk 'END{print NR}') 356 | n4=$(echo "$aliddns_type_list" | ROWTOCOLUMN | awk 'END{print NR}') 357 | n5=$(echo "$aliddns_lan_mac_list" | ROWTOCOLUMN | awk 'END{print NR}') 358 | 359 | u4=$(cat $s0 | grep -w 'u4' | RMSTRING 'u4=' | RMSTRING '"' | RMSTRING "''") 360 | u6=$(cat $s0 | grep -w 'u6' | RMSTRING 'u6=' | RMSTRING '"' | RMSTRING "''") 361 | dns=$(cat $s0 | grep -w 'dns' | RMSTRING 'dns=' | RMSTRING '"' | RMSTRING "''") 362 | 363 | if iseq "$islog" 0 || iseq "$islog" 1;then 364 | ct=1 365 | else 366 | logs "The value of islog must be 0 or 1, Please check." "" "rb" "e" 367 | return 1 368 | fi 369 | 370 | if iseq "$isipv4_domain" 0 || iseq "$isipv4_domain" 1;then 371 | ct=1 372 | else 373 | logs "The value of isipv4_domain must be 0 or 1, Please check." "" "rb" "e" 374 | return 1 375 | fi 376 | if iseq "$isipv6_domain" 0 || iseq "$isipv6_domain" 1;then 377 | ct=1 378 | else 379 | logs "The value of isipv6_domain must be 0 or 1, Please check." "" "rb" "e" 380 | return 1 381 | fi 382 | 383 | if iseq "$pppoe_ifname" "wan0" || iseq "$pppoe_ifname" "wan1" || iseq "$pppoe_ifname" "auto" || iseq "$pppoe_ifname" "any";then 384 | ct=1 385 | else 386 | logs "The value of PPPoE must be wan0, wan1, auto or any, Please check." "" "rb" "e" 387 | return 1 388 | fi 389 | 390 | if iseq "$cron_Time_type" "hour" || iseq "$cron_Time_type" "min";then 391 | ct=1 392 | else 393 | logs "The value of cron_Time_type must be hour or min, Please check." "" "rb" "e" 394 | return 1 395 | fi 396 | if iseq "$cron_Time_type" "min";then 397 | if isge "$cron_Time" 5 && isle "$cron_Time" 59;then 398 | ct=1 399 | else 400 | logs "The value of cron_Time must be 5~59, Please check." "" "rb" "e" 401 | return 1 402 | fi 403 | elif iseq "$cron_Time_type" "hour";then 404 | if isge "$cron_Time" 1 && isle "$cron_Time" 23;then 405 | ct=1 406 | else 407 | logs "The value of cron_Time must be 1~23, Please check." "" "rb" "e" 408 | return 1 409 | fi 410 | fi 411 | 412 | if isNotEmpty "$u4" && isNotEmpty "$u6" && isNotEmpty "$dns";then 413 | ct=1 414 | else 415 | logs "The value of u4, u6 or dns is wrong, Please check." "" "rb" "e" 416 | return 1 417 | fi 418 | 419 | if isNotEmpty "$aliddns_AccessKeyId";then 420 | ct=1 421 | else 422 | logs "The value of aliddns_AccessKeyId is wrong, Please check." "" "rb" "e" 423 | return 1 424 | fi 425 | 426 | if isNotEmpty "$aliddns_AccessKeySecret";then 427 | ct=1 428 | else 429 | logs "The value of aliddns_AccessKeySecret is wrong, Please check." "" "rb" "e" 430 | return 1 431 | fi 432 | 433 | if isle "$n1" 0 || isle "$n2" 0 || isle "$n3" 0 || isle "$n4" 0 || isle "$n5" 0;then 434 | logs "aliddns.conf does not set parameters, Please check." "" "rb" "e" 435 | logs "aliddns_name=$m$aliddns_name_list$m" "" "yb" 436 | logs "aliddns_domain=$m$aliddns_domain_list$m" "" "yb" 437 | logs "aliddns_ttl=$m$aliddns_ttl_list$m" "" "yb" 438 | logs "aliddns_type=$m$aliddns_type_list$m" "" "yb" 439 | logs "aliddns_lan_mac=$m$aliddns_lan_mac_list$m" "" "yb" 440 | return 1 441 | elif isNotEmpty "$n1" && check_number "$n1" && iseq "$n1" "$n2" && iseq "$n1" "$n3" && iseq "$n1" "$n4" && iseq "$n1" "$n5" && isge "$n1" 1;then 442 | aliddns_TotalCount="$n1" 443 | else 444 | logs "The total number of aliddns_name, aliddns_domain, aliddns_ttl, aliddns_type or aliddns_lan_mac lists is different, Please check." "" "rb" "e" 445 | logs "aliddns_name column number=$n1" "" "yb" 446 | logs "aliddns_domain column number=$n2" "" "yb" 447 | logs "aliddns_ttl column number=$n3" "" "yb" 448 | logs "aliddns_type column number=$n4" "" "yb" 449 | logs "aliddns_lan_mac column number=$n5" "" "yb" 450 | return 1 451 | fi 452 | 453 | if isNotEmpty "$routerddns_no" && check_number "$routerddns_no";then 454 | if isle "$routerddns_no" 0 || isgt "$routerddns_no" "$aliddns_TotalCount";then 455 | logs "The value of routerddns_no must be 1~$aliddns_TotalCount, Please check." "" "rb" "e" 456 | return 1 457 | fi 458 | else 459 | logs "The value of routerddns_no must be 1~$aliddns_TotalCount, Please check." "" "rb" "e" 460 | return 1 461 | fi 462 | 463 | routerddns_name=$(echo "$aliddns_name_list" | awk "{print $"$routerddns_no"}" | TRIMALL) 464 | routerddns_domain=$(echo "$aliddns_domain_list" | awk "{print $"$routerddns_no"}" | TRIMALL) 465 | 466 | if iseq "$ndebug" 1;then 467 | logs "*********************************************************************" 468 | logs "islog=$islog" "" "yb" 469 | logs "isipv4_domain=$isipv4_domain" "" "yb" 470 | logs "isipv6_domain=$isipv6_domain" "" "yb" 471 | logs "pppoe_ifname=$pppoe_ifname" "" "yb" 472 | logs "cron_Time=$cron_Time" "" "yb" 473 | logs "cron_Time_type=$cron_Time_type" "" "yb" 474 | logs "aliddns_AccessKeyId=$aliddns_AccessKeyId" "" "yb" 475 | logs "aliddns_AccessKeySecret=$aliddns_AccessKeySecret" "" "yb" 476 | logs "routerddns_no=$routerddns_no" "" "yb" 477 | logs "routerddns_name=$routerddns_name" "" "yb" 478 | logs "routerddns_domain=$routerddns_domain" "" "yb" 479 | logs "*********************************************************************" 480 | fi 481 | 482 | if isNotEmpty "$routerddns_domain" && isNotEmpty "routerddns_name";then 483 | ct=1 484 | else 485 | logs "routerddns_domain or routerddns_name has a formatted error, Please check." "" "rb" "e" 486 | return 1 487 | fi 488 | 489 | return 0 490 | } 491 | #====================================================================================== 492 | get_aliddns_conf(){ 493 | local c="$1";local s0="$aliddns_conf";local s1="aliddns_domain";local s2="aliddns_name" 494 | local s3="aliddns_ttl";local s4="aliddns_type";local s5="aliddns_lan_mac" 495 | 496 | LTRIMFILE "$s0" 497 | RTRIMFILE "$s0" 498 | RMSPACEROWFILE "$s0" 499 | sed -i 's/ *=/=/g' "$s0" 500 | sed -i 's/= */=/g' "$s0" 501 | 502 | aliddns_domain="";aliddns_name="";aliddns_ttl="";aliddns_type="";aliddns_lan_mac="" 503 | aliddns_name=$(echo "$aliddns_name_list" | awk "{print $"$c"}" | TRIMALL) 504 | aliddns_domain=$(echo "$aliddns_domain_list" | awk "{print $"$c"}" | TRIMALL) 505 | aliddns_ttl=$(echo "$aliddns_ttl_list" | awk "{print $"$c"}" | TRIMALL) 506 | aliddns_type=$(echo "$aliddns_type_list" | awk "{print $"$c"}" | TRIMALL) 507 | aliddns_lan_mac=$(echo "$aliddns_lan_mac_list" | awk "{print $"$c"}" | TRIMALL | set_lowercase) 508 | 509 | if iseq "$aliddns_type" "A" || iseq "$aliddns_lan_mac" ":" || iseq "$aliddns_lan_mac" "''" || iseq "$aliddns_lan_mac" '""' || iseq "$aliddns_lan_mac" "no" || iseq "$aliddns_lan_mac" "none" || isEmpty "$aliddns_lan_mac";then 510 | aliddns_lan_mac="" 511 | fi 512 | if isNotEmpty "$aliddns_lan_mac" && ! valid_mac "$aliddns_lan_mac";then 513 | logs "The value of aliddns_lan_mac[${aliddns_lan_mac}] is wrong, Please check." "" "rb" "e" 514 | return 1 515 | fi 516 | 517 | if ! check_number "$aliddns_ttl" || isle "$aliddns_ttl" 0;then 518 | logs "The value of aliddns_ttl[${aliddns_ttl}] is wrong, Please check." "" "rb" "e" 519 | return 1 520 | fi 521 | if isEmpty "$aliddns_name";then 522 | logs "The value of aliddns_name is wrong, Please check." "" "rb" "e" 523 | return 1 524 | fi 525 | if isEmpty "$aliddns_domain";then 526 | logs "The value of aliddns_domain is wrong, Please check." "" "rb" "e" 527 | return 1 528 | fi 529 | if iseq "$aliddns_type" "A" || iseq "$aliddns_type" "AAAA";then 530 | return 0 531 | else 532 | logs "The value of aliddns_type must be A or AAAA, Please check." "" "rb" "e" 533 | return 1 534 | fi 535 | } 536 | #====================================================================================== 537 | set_aliddns_conf(){ 538 | local s0="$aliddns_conf" 539 | local v="";local r='"';local t="";local n=1;local j=0 540 | local tc=0;local s1="isipv4_domain";local s2="isipv6_domain";local s3="pppoe_ifname" 541 | local s4="cron_Time";local s5="cron_Time_type";local s6="islog";local s7="aliddns_AccessKeyId" 542 | local s8="aliddns_AccessKeySecret";local s9="routerddns_no";local s10="aliddns_name" 543 | local s11="aliddns_domain";local s12="aliddns_ttl";local s13="aliddns_type";local s14="aliddns_lan_mac" 544 | logs "1、中断所有输入操作请按ctrl+c, 跳过当前输入操作请按shift+#, 再按回车。" "" "rb" "w" 545 | logs "2、为避免错误,可以采用粘贴方式, 或者打开${s0}配置文件直接编辑。" "" "rb" "w" 546 | logs "3、${s10}, ${s11}, ${s12}, ${s13}和${s14}列表数必须都相等, 如本示例中的列表数都是3个。" "" "RB" "w" 547 | logs "4、关于${s14}:在IPV6中如想为终端设备进行域名解析, 则需要此终端设备MAC, 格式为ff:ff:ff:ff:ff:ff, 不需要为终端设备进行域名解析, 则设置为none。" "" "RB" "w" 548 | logs "5、在IPV4中${s14}要设置为none。" "" "rb" "w" 549 | logs "6、关于routerddns_no:选择哪个${s10}.${s11}为远程访问路由器域名地址, 其值为列表号。" "" "rb" "w" 550 | 551 | LTRIMFILE "$s0" 552 | RTRIMFILE "$s0" 553 | RMSPACEROWFILE "$s0" 554 | sed -i 's/ *=/=/g' "$s0" 555 | sed -i 's/= */=/g' "$s0" 556 | 557 | #aliddns_AccessKeyId 558 | v="" 559 | while :;do 560 | echo -en "${INFO}${YB_COLOR}阿里云key-${s7}[必须真实有效并通过阿里云审核]:${N_COLOR}" 561 | read v 562 | v=$(echo "$v" | TRIMALL) 563 | if echo "$v" | grep -q '^[#]\+$';then 564 | break 565 | elif isEmpty "$v";then 566 | echo -e "${INFO}${RB_COLOR}输入值不能为空值, 重输! ${N_COLOR}" 567 | elif echo "$v" | grep -q '^[a-zA-Z0-9]\+$';then 568 | sed -i "s/^${s7}=.*/${s7}=${r}${v}${r}/g" "$s0" 569 | break 570 | else 571 | echo -e "${INFO}${RB_COLOR}非法字符, 重输! ${N_COLOR}" 572 | fi 573 | done 574 | #aliddns_AccessKeySecret 575 | v="" 576 | while :;do 577 | echo -en "${INFO}${YB_COLOR}阿里云cret-${s8}[必须真实有效并通过阿里云审核]:${N_COLOR}" 578 | read v 579 | v=$(echo "$v" | TRIMALL) 580 | if echo "$v" | grep -q '^[#]\+$';then 581 | break 582 | elif isEmpty "$v";then 583 | echo -e "${INFO}${RB_COLOR}输入值不能为空值, 重输! ${N_COLOR}" 584 | elif echo "$v" | grep -q '^[a-zA-Z0-9]\+$';then 585 | sed -i "s/^${s8}=.*/${s8}=${r}${v}${r}/g" "$s0" 586 | break 587 | else 588 | echo -e "${INFO}${RB_COLOR}非法字符, 重输! ${N_COLOR}" 589 | fi 590 | done 591 | #islog 592 | v="" 593 | while :;do 594 | echo -en "${INFO}${YB_COLOR}运行日志-${s6}[启用为1 禁用为0]:${N_COLOR}" 595 | read v 596 | v=$(echo "$v" | TRIMALL) 597 | if echo "$v" | grep -q '^[#]\+$';then 598 | break 599 | else 600 | if iseq "$v" 0 || iseq "$v" 1;then 601 | sed -i "s/^${s6}=.*/${s6}=${r}${v}${r}/g" "$s0" 602 | break 603 | else 604 | echo -e "${INFO}${RB_COLOR}输入值必须为0或1, 重输! ${N_COLOR}" 605 | fi 606 | fi 607 | done 608 | #isipv4_domain 609 | v="" 610 | while :;do 611 | echo -en "${INFO}${YB_COLOR}IPV4-域名解析${s1}[启用为1 禁用为0]:${N_COLOR}" 612 | read v 613 | v=$(echo "$v" | TRIMALL) 614 | if echo "$v" | grep -q '^[#]\+$';then 615 | break 616 | else 617 | if iseq "$v" 0 || iseq "$v" 1;then 618 | sed -i "s/^${s1}=.*/${s1}=${r}${v}${r}/g" "$s0" 619 | break 620 | else 621 | echo -e "${INFO}${RB_COLOR}输入值必须为0或1, 重输! ${N_COLOR}" 622 | fi 623 | fi 624 | done 625 | #isipv6_domain 626 | v="" 627 | while :;do 628 | echo -en "${INFO}${YB_COLOR}IPV6-域名解析${s2}[启用为1 禁用为0]:${N_COLOR}" 629 | read v 630 | v=$(echo "$v" | TRIMALL) 631 | if echo "$v" | grep -q '^[#]\+$';then 632 | break 633 | else 634 | if iseq "$v" 0 || iseq "$v" 1;then 635 | sed -i "s/^${s2}=.*/${s2}=${r}${v}${r}/g" "$s0" 636 | break 637 | else 638 | echo -e "${INFO}${RB_COLOR}输入值必须为0或1, 重输! ${N_COLOR}" 639 | fi 640 | fi 641 | done 642 | #pppoe_ifname 643 | v="" 644 | while :;do 645 | echo -en "${INFO}${YB_COLOR}PPPOE接口-${s3}[一级路由单线为any, auto或wan0, 一级路由双线第一接口为wan0,第二接口为wan1, 二级路由为any]:${N_COLOR}" 646 | read v 647 | v=$(echo "$v" | TRIMALL | set_lowercase) 648 | if echo "$v" | grep -q '^[#]\+$';then 649 | break 650 | else 651 | if iseq "$v" "any" || iseq "$v" "auto" || iseq "$v" "wan0" || iseq "$v" "wan1";then 652 | sed -i "s/^${s3}=.*/${s3}=${r}${v}${r}/g" "$s0" 653 | break 654 | else 655 | echo -e "${INFO}${RB_COLOR}输入值必须为any, auto, wan0或wan1, 重输! ${N_COLOR}" 656 | fi 657 | fi 658 | done 659 | #cron_Time_type 660 | v="" 661 | while :;do 662 | echo -en "${INFO}${YB_COLOR}定时更新域名时间类型-${s5}[小时为hour, 分钟为min]:${N_COLOR}" 663 | read v 664 | v=$(echo "$v" | TRIMALL | set_lowercase) 665 | if echo "$v" | grep -q '^[#]\+$';then 666 | break 667 | else 668 | if iseq "$v" "hour" || iseq "$v" "min";then 669 | sed -i "s/^${s5}=.*/${s5}=${r}${v}${r}/g" "$s0" 670 | break 671 | else 672 | echo -e "${INFO}${RB_COLOR}输入值必须为hour或min, 重输! ${N_COLOR}" 673 | fi 674 | fi 675 | done 676 | #cron_Time 677 | v="" 678 | t=$(cat $s0 | grep -w "${s5}" | RMSTRING "${s5}=" | RMSTRING '"' | RMSTRING "''" | TRIMALL) 679 | while :;do 680 | echo -en "${INFO}${YB_COLOR}定时更新域名时间-${s4}[小时为1~23, 分钟为5~59]:${N_COLOR}" 681 | read v 682 | v=$(echo "$v" | TRIMALL) 683 | if echo "$v" | grep -q '^[#]\+$';then 684 | break 685 | else 686 | if iseq "$t" "min";then 687 | if check_number "$v" && isge "$v" 5 && isle "$v" 59;then 688 | sed -i "s/^${s4}=.*/${s4}=${r}${v}${r}/g" "$s0" 689 | break 690 | else 691 | echo -e "${INFO}${RB_COLOR}输入值必须为5~59, 重输! ${N_COLOR}" 692 | fi 693 | elif iseq "$t" "hour";then 694 | if check_number "$v" && isge "$v" 1 && isle "$v" 23;then 695 | sed -i "s/^${s4}=.*/${s4}=${r}${v}${r}/g" "$s0" 696 | break 697 | else 698 | echo -e "${INFO}${RB_COLOR}输入值必须为1~23, 重输! ${N_COLOR}" 699 | fi 700 | fi 701 | fi 702 | done 703 | #aliddns_name 704 | v="" 705 | while :;do 706 | echo -en "${INFO}${YB_COLOR}主机-${s10}[支持@和*, 多个主机以空格为分隔符, 例:@ * www]:${N_COLOR}" 707 | read v 708 | v=$(echo "$v" | LTRIM | RTRIM | set_lowercase) 709 | if echo "$v" | grep -q '^[#]\+$';then 710 | break 711 | elif isEmpty "$v";then 712 | echo -e "${INFO}${RB_COLOR}输入值不能为空值, 重输! ${N_COLOR}" 713 | elif echo "$v" | grep -q '^[a-zA-Z0-9@* ]\+$';then 714 | sed -i "s/^${s10}=.*/${s10}=${r}${v}${r}/g" "$s0" 715 | break 716 | else 717 | echo -e "${INFO}${RB_COLOR}非法字符, 重输! ${N_COLOR}" 718 | fi 719 | done 720 | #aliddns_domain 721 | v="" 722 | while :;do 723 | echo -en "${INFO}${YB_COLOR}域名-${s11}[多个域名以空格为分隔符, 例:abc.com abc.com abc.com]:${N_COLOR}" 724 | read v 725 | v=$(echo "$v" | LTRIM | RTRIM | set_lowercase) 726 | if echo "$v" | grep -q '^[#]\+$';then 727 | break 728 | elif isEmpty "$v";then 729 | echo -e "${INFO}${RB_COLOR}输入值不能为空值, 重输! ${N_COLOR}" 730 | else 731 | j=1 732 | for i in $v;do 733 | if echo -n "$i" | grep -v '\--' > /dev/null && echo -n "$i" | domainencode && echo -n "$i" | grep -q '^[a-zA-Z0-9].*[a-zA-Z0-9]$' > /dev/null;then 734 | j=0 735 | else 736 | j=1 737 | break 738 | fi 739 | done 740 | if iseq "$j" 0;then 741 | sed -i "s/^${s11}=.*/${s11}=${r}${v}${r}/g" "$s0" 742 | break 743 | else 744 | echo -e "${INFO}${RB_COLOR}非法字符, 重输! ${N_COLOR}" 745 | fi 746 | fi 747 | done 748 | #aliddns_ttl 749 | v="" 750 | while :;do 751 | echo -en "${INFO}${YB_COLOR}解析生效时间-${s12}[多个解析生效时间以空格为分隔符, 例:600 600 600]:${N_COLOR}" 752 | read v 753 | v=$(echo "$v" | LTRIM | RTRIM) 754 | if echo "$v" | grep -q '^[#]\+$';then 755 | break 756 | elif isEmpty "$v";then 757 | echo -e "${INFO}${RB_COLOR}输入值不能为空值, 重输! ${N_COLOR}" 758 | else 759 | j=1 760 | for i in $v;do 761 | if check_number "$i" && isge "$i" 1;then 762 | j=0 763 | else 764 | j=1 765 | break 766 | fi 767 | done 768 | if iseq "$j" 0;then 769 | sed -i "s/^${s12}=.*/${s12}=${r}${v}${r}/g" "$s0" 770 | break 771 | else 772 | echo -e "${INFO}${RB_COLOR}输入值必须为1以上的数字, 重输! ${N_COLOR}" 773 | fi 774 | fi 775 | done 776 | #aliddns_type 777 | v="" 778 | while :;do 779 | echo -en "${INFO}${YB_COLOR}域名记录类型-${s13}[IPV4为A, IPV6为AAAA, 多个域名记录类型以空格为分隔符, 例IPV4:A A A或IPV6:AAAA AAAA AAAA]:${N_COLOR}" 780 | read v 781 | v=$(echo "$v" | LTRIM | RTRIM | set_uppercase) 782 | if echo "$v" | grep -q '^[#]\+$';then 783 | break 784 | elif isEmpty "$v";then 785 | echo -e "${INFO}${RB_COLOR}输入值不能为空值, 重输! ${N_COLOR}" 786 | else 787 | j=1 788 | for i in $v;do 789 | if iseq "$i" "A";then 790 | j=0 791 | elif iseq "$i" "AAAA";then 792 | j=0 793 | else 794 | j=1 795 | break 796 | fi 797 | done 798 | if iseq "$j" 0;then 799 | sed -i "s/^${s13}=.*/${s13}=${r}${v}${r}/g" "$s0" 800 | break 801 | else 802 | echo -e "${INFO}${RB_COLOR}输入值必须为A或AAAA, 重输! ${N_COLOR}" 803 | fi 804 | fi 805 | done 806 | #aliddns_lan_mac 807 | v="" 808 | while :;do 809 | echo -en "${INFO}${YB_COLOR}终端设备MAC-${s14}[IPV4为none, IPV6为none或终端设备MAC, 多个终端设备MAC以空格为分隔符, 例:none 78:da:c9:2b:de:1a none]:${N_COLOR}" 810 | read v 811 | v=$(echo "$v" | LTRIM | RTRIM | set_lowercase) 812 | if echo "$v" | grep -q '^[#]\+$';then 813 | break 814 | elif isEmpty "$v";then 815 | echo -e "${INFO}${RB_COLOR}输入值不能为空值, 重输! ${N_COLOR}" 816 | else 817 | j=1 818 | for i in $v;do 819 | if iseq "$i" "none";then 820 | j=0 821 | elif valid_mac "$i";then 822 | j=0 823 | else 824 | j=1 825 | break 826 | fi 827 | done 828 | if iseq "$j" 0;then 829 | sed -i "s/^${s14}=.*/${s14}=${r}${v}${r}/g" "$s0" 830 | break 831 | else 832 | echo -e "${INFO}${RB_COLOR}输入值必须为none或终端设备MAC, 重输! ${N_COLOR}" 833 | fi 834 | fi 835 | done 836 | #routerddns_no 837 | v="" 838 | while :;do 839 | echo -en "${INFO}${YB_COLOR}远程访问路由器列表号-${s9}[其值为${s10}等之列表号, 例:选择第1列输入1, 选择第3列输入3]:${N_COLOR}" 840 | read v 841 | v=$(echo "$v" | TRIMALL) 842 | if echo "$v" | grep -q '^[#]\+$';then 843 | break 844 | else 845 | if check_number "$v" && isge "$v" 1;then 846 | sed -i "s/^${s9}=.*/${s9}=${r}${v}${r}/g" "$s0" 847 | break 848 | else 849 | echo -e "${INFO}${RB_COLOR}输入值必须为1以上的数字, 重输! ${N_COLOR}" 850 | fi 851 | fi 852 | done 853 | #all check 854 | logs "开始对所有输入操作进行验证..." "" "rb" "w" 855 | local v4d=$(cat $s0 | grep -w $s1 | RMSTRING "$s1=" | RMSTRING '"' | RMSTRING "''" | TRIMALL) 856 | local v6d=$(cat $s0 | grep -w $s2 | RMSTRING "$s2=" | RMSTRING '"' | RMSTRING "''" | TRIMALL) 857 | local pif=$(cat $s0 | grep -w $s3 | RMSTRING "$s3=" | RMSTRING '"' | RMSTRING "''" | TRIMALL) 858 | local cnt=$(cat $s0 | grep -w $s4 | RMSTRING "$s4=" | RMSTRING '"' | RMSTRING "''" | TRIMALL) 859 | local cnty=$(cat $s0 | grep -w $s5 | RMSTRING "$s5=" | RMSTRING '"' | RMSTRING "''" | TRIMALL) 860 | local iog=$(cat $s0 | grep -w $s6 | RMSTRING "$s6=" | RMSTRING '"' | RMSTRING "''" | TRIMALL) 861 | local key=$(cat $s0 | grep -w $s7 | RMSTRING "$s7=" | RMSTRING '"' | RMSTRING "''" | TRIMALL) 862 | local cret=$(cat $s0 | grep -w $s8 | RMSTRING "$s8=" | RMSTRING '"' | RMSTRING "''" | TRIMALL) 863 | local rno=$(cat $s0 | grep -w $s9 | RMSTRING "$s9=" | RMSTRING '"' | RMSTRING "''" | TRIMALL) 864 | local anl=$(cat $s0 | grep -w $s10 | RMSTRING "$s10=" | RMSTRING '"' | RMSTRING "''") 865 | local adl=$(cat $s0 | grep -w $s11 | RMSTRING "$s11=" | RMSTRING '"' | RMSTRING "''") 866 | local atl=$(cat $s0 | grep -w $s12 | RMSTRING "$s12=" | RMSTRING '"' | RMSTRING "''") 867 | local atpl=$(cat $s0 | grep -w $s13 | RMSTRING "$s13=" | RMSTRING '"' | RMSTRING "''") 868 | local aml=$(cat $s0 | grep -w $s14 | RMSTRING "$s14=" | RMSTRING '"' | RMSTRING "''") 869 | local n1=$(echo "$anl" | ROWTOCOLUMN | awk 'END{print NR}') 870 | local n2=$(echo "$adl" | ROWTOCOLUMN | awk 'END{print NR}') 871 | local n3=$(echo "$atl" | ROWTOCOLUMN | awk 'END{print NR}') 872 | local n4=$(echo "$atpl" | ROWTOCOLUMN | awk 'END{print NR}') 873 | local n5=$(echo "$aml" | ROWTOCOLUMN | awk 'END{print NR}') 874 | if isNotEmpty "$n1" && check_number "$n1" && iseq "$n1" "$n2" && iseq "$n1" "$n3" && iseq "$n1" "$n4" && iseq "$n1" "$n5";then 875 | tc="$n1" 876 | if isEmpty "$rno" || ! check_number "$rno" || isle "$rno" 0 || isgt "$rno" "$tc";then 877 | logs "routerddns_no必须设置在1~${tc}之间, 重输!" "" "rb" "e" 878 | else 879 | local rn=$(echo "$anl" | awk "{print $"$rno"}" | TRIMALL) 880 | local rd=$(echo "$adl" | awk "{print $"$rno"}" | TRIMALL) 881 | logs "" "$LS" 882 | logs "运行日志-${s6}=${r}${iog}${r}" "" "yb" 883 | logs "IPV4域名解析-${s1}=${r}${v4d}${r}" "" "yb" 884 | logs "IPV6域名解析-${s2}=${r}${v6d}${r}" "" "yb" 885 | logs "PPPOE接口-${s3}=${r}${pif}${r}" "" "yb" 886 | logs "定时更新域名时间-${s4}=${r}${cnt}${r}" "" "yb" 887 | logs "定时更新域名时间类型-${s5}=${r}${cnty}${r}" "" "yb" 888 | logs "阿里云key-${s7}=${r}${key}${r}" "" "yb" 889 | logs "阿里云cret-${s8}=${r}${cret}${r}" "" "yb" 890 | logs "远程访问路由器列表号-${s9}=${r}${rno}${r}" "" "yb" 891 | logs "远程访问路由器地址=[${rn}.${rd}]" "" "yb" 892 | n=1 893 | until [ "$n" -gt "$tc" ];do 894 | local an=$(echo "$anl" | awk "{print $"$n"}" | TRIMALL) 895 | local ad=$(echo "$adl" | awk "{print $"$n"}" | TRIMALL) 896 | local at=$(echo "$atl" | awk "{print $"$n"}" | TRIMALL) 897 | local ay=$(echo "$atpl" | awk "{print $"$n"}" | TRIMALL) 898 | local am=$(echo "$aml" | awk "{print $"$n"}" | TRIMALL | set_lowercase) 899 | logs "第${n}列==========>" "" "rl" 900 | logs "主机-${s10}=${r}${an}${r}" "" "yb" 901 | logs "域名-${s11}=${r}${ad}${r}" "" "yb" 902 | logs "记录类型-${s13}=${r}${ay}${r}" "" "yb" 903 | logs "解析生效时间-${s12}=${r}${at}${r}" "" "yb" 904 | logs "终端设备MAC-${s14}=${r}${am}${r}" "" "yb" 905 | logs "第${n}列<==========" "" "rl" 906 | n=$(sadd $n 1) 907 | done 908 | logs "" "$LS" 909 | logs "经过初步验证,所有输入操作看起来是正确的, 请认真核对!" "" "rb" "w" 910 | logs "10秒后, 脚本将自动运行, 请注意观察运行是否正常!" "" "rb" "w" 911 | set_scripts "a" 912 | go_sleep 10 913 | sh "$scripts_sh" "start_unlock" 914 | j=0 915 | fi 916 | else 917 | logs "${s10}, ${s11}, ${s12}, ${s13}和${s14}列表数必须都相等, 重输!" "" "rb" "e" 918 | logs "${s10} 列表数=$n1" "" "yb" 919 | logs "${s11} 列表数=$n2" "" "yb" 920 | logs "${s12} 列表数=$n3" "" "yb" 921 | logs "${s13} 列表数=$n4" "" "yb" 922 | logs "${s14} 列表数=$n5" "" "yb" 923 | j=1 924 | fi 925 | return $j 926 | } 927 | #====================================================================================== 928 | get_Record_list() { 929 | local s1=$1;local s2=$2;local n=1 930 | isNotEmpty $s2 && n=$s2 931 | echo "$(echo -e $s1 | TRIMALL | awk -F '[' '{print $2}' | awk -F ']' '{print $1}' | awk -F '},' "{print $"$n"}" | RMSTRING '{' | RMSTRING '}')" 932 | } 933 | #====================================================================================== 934 | get_Record_value(){ 935 | local s1=$1;local s2=$2 936 | echo "$(echo $s1 | TRIMALL | awk -F $s2 '{print $2}' | awk -F ',' '{print $1}' | RMSTRING '"' | RMSTRING '^:' | TRIMALL)" 937 | } 938 | #====================================================================================== 939 | get_Record(){ 940 | local Type="$aliddns_type";local jk=9;local n=0;local q="";local r=0;local j=0 941 | Record_RequestId="";Record_Ids="";Record_TotalCount=0;Record_Id="";Record_IP="";Record_name="" 942 | Record_domain="";Record_Status="";Record_type="";Record_Locked="";Record_ttl="";num_getRecord=1 943 | if iseq "$isRUN" 1 || ! do_run_check;then 944 | do_cron "$ID_CRU" "a" "$cron_File" "month=* week=* day=* hour=* min=2" "min" "$scripts_sh" "update" 945 | rm -f "$FL" 946 | exit 1 947 | fi 948 | until [ "$num_getRecord" -gt "$jk" ];do 949 | if isNotEmpty "$aliddns_url_ok";then 950 | aliddns_url="$aliddns_url_ok" 951 | else 952 | n=$(($num_getRecord % 2)) 953 | if iseq "$n" 1;then 954 | aliddns_url="http://alidns.aliyuncs.com" 955 | else 956 | aliddns_url="https://alidns.aliyuncs.com" 957 | fi 958 | fi 959 | logs "$num_getRecord/$jk:Select this address[$aliddns_url] to link aliyun and Geting domain name Record, please wait..." "" "y" 960 | q=$(aliddns_subdomain_Records "$aliddns_name" "$aliddns_domain" "$Type") 961 | 962 | if iseq "$ndebug" 2;then 963 | logs "*********************************************************************************" 964 | if iseq "$num_getRecord" 1;then 965 | logs "aliyun domain name Record Query=$q" "" "yb" 966 | q="" 967 | else 968 | logs "aliyun domain name Record Value=$q" "" "yb" 969 | fi 970 | logs "*********************************************************************************" 971 | fi 972 | if aliddns_response_check "$q" >/dev/null 2>&1;then 973 | Record_RequestId=$(get_Record_value $q "RequestId") >/dev/null 2>&1 974 | Record_TotalCount=$(get_Record_value "$q" "TotalCount") >/dev/null 2>&1 975 | if isNotEmpty "$Record_RequestId" && isgt "$Record_TotalCount" 0;then 976 | logs "$num_getRecord/$jk:Geting aliyun Record successfully[获取阿里云记录成功]" "" "vl" "t" 977 | aliddns_url_ok="$aliddns_url" 978 | break 979 | else 980 | #aliyun domain name Record is null value, with add 981 | return 0 982 | fi 983 | else 984 | if isge "$num_getRecord" "$jk";then 985 | logs "Failed to obtain aliyun domain name Record, Check whether your domain name has passed the audit," "" "ra" "e" 986 | logs "aliddns_AccessKeyId and aliddns_AccessKeySecret are correct and valid." "" "ra" "e" 987 | logs "获取阿里云域名记录失败, 检查您的域名是否通过审核," "" "ra" "e" 988 | logs "aliddns-accesskeyid和aliddns-accesskeysecret是否正确有效。" "" "ra" "e" 989 | rm -f "$FL" 990 | exit 1 991 | fi 992 | fi 993 | num_getRecord=$(sadd $num_getRecord 1) 994 | done 995 | 996 | until [ "$j" -eq "$Record_TotalCount" -o "$r" -eq 1 ];do 997 | j=$(sadd $j 1) 998 | s=$(get_Record_list "$q" "$j") >/dev/null 2>&1 999 | if iseq "$ndebug" 2;then 1000 | logs "*********************************************************************************" 1001 | logs "$s" "" "yb" 1002 | logs "*********************************************************************************" 1003 | fi 1004 | Record_Id=$(get_Record_value $s "RecordId") >/dev/null 2>&1 1005 | Record_IP=$(get_Record_value $s "Value") >/dev/null 2>&1 1006 | Record_type=$(get_Record_value $s "Type") >/dev/null 2>&1 1007 | Record_name=$(get_Record_value $s "RR") >/dev/null 2>&1 1008 | Record_domain=$(get_Record_value $s "DomainName") >/dev/null 2>&1 1009 | Record_Status=$(get_Record_value $s "Status") >/dev/null 2>&1 1010 | Record_Locked=$(get_Record_value $s "Locked") >/dev/null 2>&1 1011 | Record_ttl=$(get_Record_value $s "TTL") >/dev/null 2>&1 1012 | Record_Line=$(get_Record_value $s "Line") >/dev/null 2>&1 1013 | Record_Priority=$(get_Record_value $s "Priority") >/dev/null 2>&1 1014 | Record_Weight=$(get_Record_value $s "Weight") >/dev/null 2>&1 1015 | if isEmpty "$Record_Ids";then 1016 | Record_Ids="$Record_Id" 1017 | else 1018 | Record_Ids="$Record_Ids $Record_Id" 1019 | fi 1020 | if iseq "$aliddns_type" "AAAA";then 1021 | logs "Record_ipv6_IP=[$Record_IP]" "" "ys" 1022 | elif iseq "$aliddns_type" "A";then 1023 | logs "Record_ipv4_IP=[$Record_IP]" "" "ys" 1024 | fi 1025 | logs "Record_type=[$Record_type]" "" "y" 1026 | logs "Record_name=[$Record_name]" "" "y" 1027 | logs "Record_domain=[$Record_domain]" "" "y" 1028 | logs "Record_Status=[$Record_Status]" "" "y" 1029 | logs "Record_Ids=[$Record_Ids]" "" "y" 1030 | if iseq "$ndebug" 2;then 1031 | logs "Record_Locked=[$Record_Locked]" "" "y" 1032 | logs "Record_ttl=[$Record_ttl]" "" "y" 1033 | logs "Record_Line=[$Record_Line]" "" "y" 1034 | logs "Record_Priority=[$Record_Priority]" "" "y" 1035 | logs "Record_Weight=[$Record_Weight]" "" "y" 1036 | logs "Record_TotalCount=[$Record_TotalCount]" "" "y" 1037 | logs "Record_RecordCount=[$j]" "" "y" 1038 | logs "Record_Id=[$Record_Id]" "" "y" 1039 | logs "Record_RequestId=[$Record_RequestId]" "" "y" 1040 | fi 1041 | if iseq "$j" "$Record_TotalCount";then 1042 | r=1 1043 | break 1044 | fi 1045 | done 1046 | if iseq "$isRUN" 1 || ! do_run_check;then 1047 | do_cron "$ID_CRU" "a" "$cron_File" "month=* week=* day=* hour=* min=2" "min" "$scripts_sh" "update" 1048 | rm -f "$FL" 1049 | exit 1 1050 | fi 1051 | if iseq "$r" 1;then 1052 | return 0 1053 | else 1054 | return 1 1055 | fi 1056 | } 1057 | #====================================================================================== 1058 | get_Records(){ 1059 | local q=$(aliddns_domain_Records "$1") 1060 | if ! aliddns_response_check "$q" >/dev/null 2>&1;then 1061 | logs "aliddns_domain_Records Error, please check." "" "rb" "e" 1062 | logs "$q" "" "r" "e" 1063 | fi 1064 | } 1065 | #====================================================================================== 1066 | get_domain_Info(){ 1067 | local q=$(aliddns_domain_Info "$1") 1068 | if ! aliddns_response_check "$q" >/dev/null 2>&1;then 1069 | logs "aliddns_domain_Info Error, please check." "" "rb" "e" 1070 | logs "$q" "" "rb" "e" 1071 | fi 1072 | } 1073 | #====================================================================================== 1074 | get_DescribeDomains(){ 1075 | local q=$(aliddns_DescribeDomains "$1") 1076 | if ! aliddns_response_check "$q" >/dev/null 2>&1;then 1077 | logs "aliddns_DescribeDomains Error, please check." "" "rb" "e" 1078 | logs "$q" "" "rb" "e" 1079 | fi 1080 | } 1081 | #====================================================================================== 1082 | set_syslogd(){ 1083 | isexists "syslogd" && "$existspath" -m 0 -S -O "/tmp/syslog.log" -s 256 -l 8 1084 | nvram set log_level=8 1085 | nvram set log_size=256 1086 | nvram set message_loglevel=5 1087 | nvram set console_loglevel=5 1088 | nvram commit 1089 | } 1090 | #====================================================================================== 1091 | set_ddns_show(){ 1092 | if iseq "$OS_TYPE" "merlin";then 1093 | if iseq "$1" 1;then 1094 | nvram set ddns_enable_x=1 1095 | nvram set ddns_server_x="CUSTOM" 1096 | nvram set ddns_ipaddr="$3" 1097 | nvram set ddns_cache=1528160609,"$3" 1098 | nvram set ddns_hostname_old="$2" 1099 | nvram set ddns_hostname_x_old="$2" 1100 | nvram set ddns_hostname_x="$2" 1101 | nvram set ddns_status=1 1102 | nvram set le_enable=0 1103 | else 1104 | nvram set ddns_enable_x=0 1105 | fi 1106 | nvram commit 1107 | fi 1108 | return 0 1109 | } 1110 | #====================================================================================== 1111 | set_ipv6_config(){ 1112 | if iseq "$OS_TYPE" "merlin" && isne "$(nvram get ipv6_service | tr 'A-Z' 'a-z')" "disabled";then 1113 | if [ -d /proc/sys/net/ipv6 ];then 1114 | #change 1115 | echo 300 > /proc/sys/net/ipv6/neigh/br0/base_reachable_time #30 1116 | echo 300 > /proc/sys/net/ipv6/neigh/default/base_reachable_time #30 1117 | 1118 | #change 1119 | echo 60 > /proc/sys/net/ipv6/neigh/br0/gc_stale_time #60 1120 | echo 60 > /proc/sys/net/ipv6/neigh/default/gc_stale_time #60 1121 | 1122 | echo 512 > /proc/sys/net/ipv6/neigh/default/gc_thresh1 #512 1123 | echo 1024 > /proc/sys/net/ipv6/neigh/default/gc_thresh2 #1024 1124 | echo 2048 > /proc/sys/net/ipv6/neigh/default/gc_thresh3 #2048 1125 | echo 0 > /proc/sys/net/ipv6/neigh/br0/locktime #0 1126 | 1127 | echo 4096 > /proc/sys/net/ipv6/route/max_size #4096 1128 | 1129 | echo 3 > /proc/sys/net/ipv6/conf/default/router_solicitations #3 1130 | echo 3 > /proc/sys/net/ipv6/conf/br0/router_solicitations #3 1131 | 1132 | #change 1133 | echo 60 > /proc/sys/net/ipv6/ip6frag_time #60 1134 | echo 262144 > /proc/sys/net/ipv6/ip6frag_high_thresh #262144 1135 | echo 196608 > /proc/sys/net/ipv6/ip6frag_low_thresh #196608 1136 | echo 600 > /proc/sys/net/ipv6/ip6frag_secret_interval #600 1137 | echo 64 > /proc/sys/net/ipv6/mld_max_msf #64 1138 | 1139 | #enable ifconfig ipv6 1140 | echo 0 > /proc/sys/net/ipv6/conf/all/disable_ipv6 1141 | fi 1142 | nvram set ipv6_ns_drop=0 1143 | nvram set misc_ping_x=1 1144 | nvram commit 1145 | fi 1146 | return 0 1147 | } 1148 | #====================================================================================== 1149 | aliddns_name_escape(){ 1150 | local s=$1;local r="" 1151 | case ${s} in 1152 | \*) 1153 | r=%2A;; 1154 | \@) 1155 | r=%40;; 1156 | *) 1157 | r=${s} 1158 | esac 1159 | echo ${r} 1160 | } 1161 | #====================================================================================== 1162 | aliddns_name_real(){ 1163 | local s1=$1;local s2=$2 1164 | if iseq ${s1} '@' || isEmpty ${s1};then 1165 | echo ${s2} 1166 | else 1167 | echo ${s1}.${s2} 1168 | fi 1169 | } 1170 | #====================================================================================== 1171 | aliddns_encode() { 1172 | echo -n "$1" | urlencode 1173 | } 1174 | #====================================================================================== 1175 | aliddns_domain_Timestamp(){ 1176 | #ISO8601 UTC:YYYY-MM-DDThh:mm:ssZ, eg:2015-01-09T12:00:00Z 1177 | echo `date -u +"%Y-%m-%dT%H:%M:%SZ"` 1178 | } 1179 | #====================================================================================== 1180 | aliddns_domain_Nonce(){ 1181 | local ui="/proc/sys/kernel/random/uuid" 1182 | if [ -f "$ui" ];then 1183 | echo $(cat $ui) 1184 | else 1185 | echo $(date -u +"%Y%m%d%H%M%S") 1186 | fi 1187 | } 1188 | #====================================================================================== 1189 | aliddns_response_check(){ 1190 | ########################################################################### 1191 | #IF ERROR aliddns_response_check RETURN https://error-center.aliyun.com... 1192 | ########################################################################### 1193 | isEmpty "$1" && return 1 1194 | if isEmpty "$(echo $1 | set_lowercase | grep -o 'error-center')";then 1195 | return 0 1196 | else 1197 | return 1 1198 | fi 1199 | } 1200 | #====================================================================================== 1201 | aliddns_domain_api(){ 1202 | local UR="";local US="";QU="";local HM="GET"; 1203 | local KS="${aliddns_AccessKeySecret}" 1204 | local KI="${aliddns_AccessKeyId}" 1205 | local SE=$(aliddns_encode '/') 1206 | if iseq "$isRUN" 1 || ! do_run_check;then 1207 | do_cron "$ID_CRU" "a" "$cron_File" "month=* week=* day=* hour=* min=2" "min" "$scripts_sh" "update" 1208 | rm -f "$FL" 1209 | exit 1 1210 | fi 1211 | UR="${UR}AccessKeyId=${KI}" 1212 | UR="${UR}${SP}Format=json" 1213 | UR="${UR}${SP}SignatureNonce=$(aliddns_domain_Nonce)" 1214 | UR="${UR}${SP}SignatureMethod=HMAC-SHA1" 1215 | UR="${UR}${SP}SignatureVersion=1.0" 1216 | UR="${UR}${SP}Timestamp=$(aliddns_encode $(aliddns_domain_Timestamp))" 1217 | UR="${UR}${SP}Version=2015-01-09" 1218 | UR="${UR}${SP}$1" 1219 | UR=$(echo -n ${UR} | sed 's/\'"${SP}"'/\n/g' | $SORT | sed ':label; N; s/\n/\'"${SP}"'/g; b label') 1220 | 1221 | US="${HM}${SP}${SE}${SP}$(aliddns_encode ${UR})" 1222 | US=$(echo -n ${US} | $OPENSSL dgst -sha1 -hmac ${KS}${SP} -binary | $OPENSSL base64) 1223 | 1224 | QU="${UR}${SP}Signature=$(aliddns_encode ${US})" 1225 | QU="$(get_url_cmd ${aliddns_url}/?${QU})" 1226 | 1227 | if iseq "$ndebug" 2 && iseq "$num_getRecord" 1;then 1228 | echo "$($QU)" 1229 | else 1230 | echo "$QU" 1231 | 1232 | fi 1233 | } 1234 | #====================================================================================== 1235 | aliddns_subdomain_Records(){ 1236 | #use:q=$(aliddns_subdomain_Records "$aliddns_name" "$aliddns_domain" "$Type") 1237 | local UR="";local an="$(aliddns_name_escape "$1")";local sd="$an.$2" 1238 | UR="${UR}Action=DescribeSubDomainRecords" 1239 | UR="${UR}${SP}SubDomain=${sd}" 1240 | UR="${UR}${SP}Type=$3" 1241 | UR="${UR}${SP}TTL=${aliddns_ttl}" 1242 | echo $(aliddns_domain_api ${UR}) 1243 | } 1244 | #====================================================================================== 1245 | aliddns_domain_update(){ 1246 | #use:q=$(aliddns_domain_update "$aliddns_name" "$wan_ipvx_IP" "$Record_Id" "$aliddns_type") 1247 | local UR="" 1248 | UR="${UR}Action=UpdateDomainRecord" 1249 | UR="${UR}${SP}RR=$(aliddns_name_escape "$1")" 1250 | #UR="${UR}${SP}Value=$2" 1251 | UR="${UR}${SP}Value=$(aliddns_encode "$2")" 1252 | UR="${UR}${SP}RecordId=$3" 1253 | UR="${UR}${SP}Type=$4" 1254 | UR="${UR}${SP}TTL=${aliddns_ttl}" 1255 | echo $(aliddns_domain_api ${UR}) 1256 | } 1257 | #====================================================================================== 1258 | aliddns_domain_add(){ 1259 | #use:q=$(aliddns_domain_add "$aliddns_name" "$aliddns_domain" "$wan_ipvx_IP" "$aliddns_type") 1260 | local UR="" 1261 | UR="${UR}Action=AddDomainRecord" 1262 | UR="${UR}${SP}DomainName=$2" 1263 | UR="${UR}${SP}RR=$(aliddns_name_escape "$1")" 1264 | #UR="${UR}${SP}Value=$3" 1265 | UR="${UR}${SP}Value=$(aliddns_encode "$3")" 1266 | UR="${UR}${SP}Type=$4" 1267 | UR="${UR}${SP}TTL=${aliddns_ttl}" 1268 | echo $(aliddns_domain_api ${UR}) 1269 | } 1270 | #====================================================================================== 1271 | aliddns_domain_del(){ 1272 | #use:q=$(aliddns_domain_del "$i" "$aliddns_type") 1273 | local UR="" 1274 | UR="${UR}Action=DeleteDomainRecord" 1275 | UR="${UR}${SP}RecordId=$1" 1276 | UR="${UR}${SP}Type=$2" 1277 | UR="${UR}${SP}TTL=${aliddns_ttl}" 1278 | echo $(aliddns_domain_api ${UR}) 1279 | } 1280 | #====================================================================================== 1281 | aliddns_subdomain_del(){ 1282 | #use:q=$(aliddns_subdomain_del "$aliddns_name" "$aliddns_domain" "$aliddns_type") 1283 | local UR="";local an="$(aliddns_name_escape "$1")";local sd="$an.$2" 1284 | UR="${UR}Action=DeleteSubDomainRecords" 1285 | UR="${UR}${SP}DomainName=$2" 1286 | UR="${UR}${SP}Value=${sd}" 1287 | UR="${UR}${SP}RR=$(aliddns_name_escape "$1")" 1288 | UR="${UR}${SP}Type=$3" 1289 | UR="${UR}${SP}TTL=${aliddns_ttl}" 1290 | echo $(aliddns_domain_api ${UR}) 1291 | } 1292 | #====================================================================================== 1293 | aliddns_domain_Status(){ 1294 | #use:q=$(aliddns_domain_Status "$Record_Id" "$status" "$aliddns_type") 1295 | local UR="" 1296 | UR="${UR}Action=SetDomainRecordStatus" 1297 | UR="${UR}${SP}RR=$(aliddns_name_escape "$1")" 1298 | UR="${UR}${SP}RecordId=$1" 1299 | UR="${UR}${SP}Status=$2" 1300 | UR="${UR}${SP}Type=$3" 1301 | UR="${UR}${SP}TTL=${aliddns_ttl}" 1302 | echo $(aliddns_domain_api ${UR}) 1303 | } 1304 | #====================================================================================== 1305 | aliddns_domain_Record_check(){ 1306 | #use:q=$(aliddns_domain_Record_check "$Record_name" "$Record_domain" "$wan_ipvx_IP" "$aliddns_type") 1307 | #RR * has bug, use nslookup check 1308 | local UR="" 1309 | UR="${UR}Action=CheckDomainRecord" 1310 | UR="${UR}${SP}DomainName=$2" 1311 | UR="${UR}${SP}RR=$(aliddns_name_escape "$1")" 1312 | #UR="${UR}${SP}Value=$3" 1313 | UR="${UR}${SP}Value=$(aliddns_encode "$3")" 1314 | UR="${UR}${SP}Type=$4" 1315 | echo $(aliddns_domain_api ${UR}) 1316 | } 1317 | #====================================================================================== 1318 | aliddns_domain_Whois_Info(){ 1319 | #use:q=$(aliddns_domain_Whois_Info "$1") 1320 | local UR="" 1321 | UR="${UR}Action=DescribeDomainWhoisInfo" 1322 | UR="${UR}${SP}DomainName=$1" 1323 | echo $(aliddns_domain_api ${UR}) 1324 | } 1325 | #====================================================================================== 1326 | aliddns_domain_Records(){ 1327 | #use:s=$(aliddns_domain_Records "$aliddns_domain") 1328 | local UR="" 1329 | UR="${UR}Action=DescribeDomainRecords" 1330 | UR="${UR}${SP}DomainName=$1" 1331 | echo $(aliddns_domain_api ${UR}) 1332 | } 1333 | #====================================================================================== 1334 | aliddns_domain_Record_Info(){ 1335 | #user:s=$(aliddns_domain_Record_Info "$Record_Id" "$Record_type") 1336 | local UR="" 1337 | UR="${UR}Action=DescribeDomainRecordInfo" 1338 | UR="${UR}${SP}RecordId=$1" 1339 | UR="${UR}${SP}Type=$2" 1340 | UR="${UR}${SP}TTL=${aliddns_ttl}" 1341 | echo $(aliddns_domain_api ${UR}) 1342 | } 1343 | #====================================================================================== 1344 | aliddns_domain_Info(){ 1345 | #user:s=$(aliddns_domain_Info "$aliddns_domain") 1346 | local UR="" 1347 | UR="${UR}Action=DescribeDomainInfo" 1348 | UR="${UR}${SP}DomainName=$1" 1349 | echo $(aliddns_domain_api ${UR}) 1350 | } 1351 | #====================================================================================== 1352 | aliddns_DescribeDomains(){ 1353 | #user:s=$(aliddns_DescribeDomains "$aliddns_name") 1354 | local UR="" 1355 | UR="${UR}Action=DescribeDomains" 1356 | UR="${UR}${SP}KeyWord=$(aliddns_name_escape "$1")" 1357 | echo $(aliddns_domain_api ${UR}) 1358 | } 1359 | #====================================================================================== 1360 | aliddns_AddDomain(){ 1361 | #user:s=$(aliddns_AddDomain "$aliddns_domain") 1362 | local UR="" 1363 | UR="${UR}Action=AddDomain" 1364 | UR="${UR}${SP}DomainName=$1" 1365 | echo $(aliddns_domain_api ${UR}) 1366 | } 1367 | #====================================================================================== 1368 | do_aliddns_domain_Record_check(){ 1369 | #not use 1370 | logs "$Count:[$aliddns_type]-[$aliddns_name.$aliddns_domain] Use CheckDomainRecord Check." "" "y" 1371 | isdnsExist="false" 1372 | local q="";local s="";local c="" 1373 | q=$(aliddns_domain_Record_check "$1" "$2" "$3" "$4") 1374 | if ! aliddns_response_check "$q" >/dev/null 2>&1;then 1375 | logs "aliddns_domain_Record_check Error, please check." "" "rb" "e" 1376 | logs "$q" "" "r" "e" 1377 | fi 1378 | 1379 | isEmpty "$q" && return 1 1380 | s=$(echo -e "$q" | sed 's/{//g' | sed 's/}//g') 1381 | c=$(get_Record_value $s "IsExist") >/dev/null 2>&1 1382 | isdnsExist=$(set_strlowercase "$c") 1383 | if iseq "$isdnsExist" "true";then 1384 | return 0 1385 | else 1386 | return 1 1387 | fi 1388 | } 1389 | #====================================================================================== 1390 | do_aliddns_domain_Whois_Info(){ 1391 | local r=0;local q="" 1392 | isdnsWhois=0 1393 | q=$(aliddns_domain_Whois_Info "$1") 1394 | if ! aliddns_response_check "$q" >/dev/null 2>&1;then 1395 | logs "aliddns_domain_Whois_Info Error, please check." "" "rb" "e" 1396 | logs "$q" "" "rb" "e" 1397 | fi 1398 | isEmpty "$q" && return 1 1399 | for i in "Pendingdelete" "redemption period" "Clienthold" "serverhold" "Inactive";do 1400 | if isNotEmpty "$(echo $q | grep -Eo $i)";then 1401 | r=1 1402 | break 1403 | fi 1404 | done 1405 | if iseq "$r" 1;then 1406 | isdnsWhois=0 1407 | return 1 1408 | else 1409 | isdnsWhois=1 1410 | return 0 1411 | fi 1412 | } 1413 | #====================================================================================== 1414 | do_subdomain_del(){ 1415 | #not use 1416 | local q=$(aliddns_subdomain_del "$aliddns_name" "$aliddns_domain" "$aliddns_type") >/dev/null 2>&1 1417 | if ! aliddns_response_check "$q" >/dev/null 2>&1;then 1418 | logs "do_subdomain_del Error, please check." "" "rb" "e" 1419 | fi 1420 | isEmpty "$q" && return 1 1421 | ! get_Record >/dev/null 2>&1 && return 1 1422 | if isNotEmpty "$Record_Ids";then 1423 | logs "$Count:[$aliddns_type]-[$aliddns_name.$aliddns_domain] remove Failed." "" "rb" "e" 1424 | goto_remove "$Count" 1425 | return 1 1426 | else 1427 | if do_router_ddns_check;then 1428 | [ -x "$aliddns_dcu" ] && "$aliddns_dcu" 0 1429 | fi 1430 | logs "$Count:[$aliddns_type]-[$aliddns_name.$aliddns_domain] is does not exist or remove success." "" "gb" "t" 1431 | return 0 1432 | fi 1433 | } 1434 | #====================================================================================== 1435 | do_Record_Only_check(){ 1436 | local n=0 1437 | for i in $Record_Ids;do 1438 | isNotEmpty "$i" && n=$(sadd $n 1) 1439 | done 1440 | if isle "$n" 1;then 1441 | return 0 1442 | else 1443 | logs "check that there are $n Record on aliyun." "" "gb" 1444 | logs "Record_Ids[$Record_Ids]" "" "gb" 1445 | return 1 1446 | fi 1447 | 1448 | } 1449 | #====================================================================================== 1450 | do_checkwanip(){ 1451 | if iseq "$aliddns_type" "AAAA" && iseq "$isipv6_domain" 0;then 1452 | set_success 1 "$actions" "skiped" 1453 | return 1 1454 | elif iseq "$aliddns_type" "A" && iseq "$isipv4_domain" 0;then 1455 | set_success 1 "$actions" "skiped" 1456 | return 1 1457 | fi 1458 | if iseq "$aliddns_type" "A" || iseq "$aliddns_type" "AAAA";then 1459 | logs "Router wan ifname is[${wan_ifname}], wan is[wan${wan_no}], proto is[${wan_proto}]" "" "ys" "t" 1460 | if get_wan_ipv46;then 1461 | do_aliddns_log "checkwanip" "success" 1462 | set_success 1 "$actions" "success" 1463 | else 1464 | do_aliddns_log "checkwanip" "failed" 1465 | set_success 0 "$actions" "failed" 1466 | fi 1467 | fi 1468 | } 1469 | #====================================================================================== 1470 | do_check(){ 1471 | isdnsExist="false" 1472 | 1473 | if iseq "$aliddns_type" "AAAA" && iseq "$isipv6_domain" 0;then 1474 | set_success 1 "$actions" "skiped" 1475 | return 1 1476 | elif iseq "$aliddns_type" "A" && iseq "$isipv4_domain" 0;then 1477 | set_success 1 "$actions" "skiped" 1478 | return 1 1479 | fi 1480 | 1481 | if iseq "$aliddns_type" "AAAA";then 1482 | if iseq "$OS_TYPE" "merlin";then 1483 | if iseq "$isIPV6" 1;then 1484 | logs "Your Router ipv6 is disabled, skip." "" "yb" "t" 1485 | logs "$Count:failed..." "" "rb" "e" 1486 | set_ddns_show 0 "$(aliddns_name_real "$routerddns_name" "$routerddns_domain")" "$wan_ipvx_IP" 1487 | return 1 1488 | fi 1489 | elif iseq "$OS_TYPE" "padavan" || iseq "$OS_TYPE" "openwrt" || iseq "$OS_TYPE" "pandorabox";then 1490 | if iseq "$isIPV6" 1;then 1491 | logs "Your Router ipv6 is disabled, skip." "" "yb" "t" 1492 | logs "$Count:failed..." "" "rb" "e" 1493 | return 1 1494 | fi 1495 | fi 1496 | fi 1497 | if iseq "$aliddns_type" "A" || iseq "$aliddns_type" "AAAA";then 1498 | 1499 | logs "$Count:[$aliddns_type]-[$aliddns_name.$aliddns_domain]Check has a Record on aliyun[检查阿里云是否有记录]" "" "y" 1500 | ! do_wan_ipaddr && return 1 1501 | 1502 | 1503 | if get_Record;then 1504 | isNotEmpty "$Record_Ids" && do_aliddns_log "getrecord" "success" "t" 1505 | else 1506 | return 1 1507 | fi 1508 | 1509 | if ! do_Record_Only_check;then 1510 | logs "Your Must remove the excess Record." "" "vb" "w" 1511 | actions="remove" 1512 | return 0 1513 | fi 1514 | 1515 | if isEmpty "$Record_Id";then 1516 | logs "$Count:[$aliddns_type]-[$aliddns_name.$aliddns_domain][需要添加]" "" "y" "t" 1517 | actions="added" 1518 | return 0 1519 | fi 1520 | 1521 | if isne "$(set_strlowercase "$Record_Status")" "enable";then 1522 | logs "$Count:[$aliddns_type]-[$aliddns_name.$aliddns_domain] status is DISABLE[状态禁用]" "" "y" "t" 1523 | return 1 1524 | fi 1525 | if isne "$Record_IP" "$wan_ipvx_IP";then 1526 | logs "$Count:[$aliddns_type]-[$aliddns_name.$aliddns_domain]Needs to be updated[需要更新]" "" "ys" "t" 1527 | actions="updated" 1528 | return 0 1529 | fi 1530 | 1531 | logs "$Count:[$aliddns_type]-[$aliddns_name.$aliddns_domain]Check the analysis is effect[检查解析已经生效]" "" "ys" 1532 | 1533 | do_nslookup_check "$aliddns_name" "$aliddns_domain" && isdnsExist="true" 1534 | 1535 | logs "[$nslookup_ipvx]=nslookup_$xIP" "" "gb" 1536 | logs "[$Record_IP]=Record_$xIP" "" "gb" 1537 | if isNotEmpty "$aliddns_lan_mac";then 1538 | logs "[$lan_ipvx_IP]=lan_$xIP" "" "gb" 1539 | else 1540 | logs "[$wan_ipvx_IP]=wan_$xIP" "" "gb" 1541 | fi 1542 | 1543 | if iseq "$Record_IP" "$wan_ipvx_IP" && iseq "$isdnsExist" "true";then 1544 | logs "$Count:[$aliddns_type]-[$aliddns_name.$aliddns_domain] The analysis has come into effect[解析已经生效]" "" "ys" "t" 1545 | if do_router_ddns_check;then 1546 | set_ddns_show 1 "$(aliddns_name_real "$routerddns_name" "$routerddns_domain")" "$wan_ipvx_IP" 1547 | [ -x "$aliddns_dcu" ] && "$aliddns_dcu" 1 1548 | fi 1549 | do_aliddns_log "dnsExist" "success" 1550 | set_success 1 "$actions" "success" 1551 | return 1 1552 | fi 1553 | 1554 | if iseq "$Record_IP" "$wan_ipvx_IP" && isne "$isdnsExist" "true";then 1555 | logs "$Count:[$aliddns_type]-[$aliddns_name.$aliddns_domain]The analysis takes 10 minutes to take effect[解析需要10分钟后才生效]" "" "ys" "w" 1556 | do_aliddns_log "dnsExist" "wait" 1557 | set_success 1 "$actions" "success" 1558 | return 1 1559 | fi 1560 | else 1561 | logs "$Count:[$aliddns_type]-[$aliddns_name.$aliddns_domain]type error, Please check $aliddns_conf." "" "rb" "e" 1562 | logs "$Count:failed..." "" "rb" "e" 1563 | return 1 1564 | fi 1565 | } 1566 | #====================================================================================== 1567 | do_start(){ 1568 | local q="";local id="" 1569 | if iseq "$aliddns_type" "AAAA" && iseq "$isipv6_domain" 0;then 1570 | set_success 1 "$actions" "skiped" 1571 | return 1 1572 | elif iseq "$aliddns_type" "A" && iseq "$isipv4_domain" 0;then 1573 | set_success 1 "$actions" "skiped" 1574 | return 1 1575 | fi 1576 | logs "$Count:[$aliddns_type]-[$aliddns_name.$aliddns_domain] $actions operations will be performed..." "" "y" 1577 | if iseq "$actions" "added";then 1578 | q=$(aliddns_domain_add "$aliddns_name" "$aliddns_domain" "$wan_ipvx_IP" "$aliddns_type") 1579 | if aliddns_response_check "$q" >/dev/null 2>&1;then 1580 | id=$(get_Record_value $q "RecordId") >/dev/null 2>&1 1581 | isNotEmpty "$id" && do_Record_verification "$id" "$wan_ipvx_IP" && return 0 1582 | fi 1583 | elif iseq "$actions" "updated";then 1584 | q=$(aliddns_domain_update "$aliddns_name" "$wan_ipvx_IP" "$Record_Id" "$aliddns_type") 1585 | if aliddns_response_check "$q" >/dev/null 2>&1;then 1586 | id=$(get_Record_value $q "RecordId") >/dev/null 2>&1 1587 | isNotEmpty "$id" && do_Record_verification "$id" "$wan_ipvx_IP" && return 0 1588 | fi 1589 | elif iseq "$actions" "remove";then 1590 | goto_remove "$Count" && goto_start "$Count" 1591 | else 1592 | return 1 1593 | fi 1594 | return 1 1595 | } 1596 | #====================================================================================== 1597 | do_status(){ 1598 | local id="";local st="" 1599 | if iseq "$1" 0;then 1600 | Status="Disable" 1601 | elif iseq "$1" 1;then 1602 | Status="Enable" 1603 | fi 1604 | if isEmpty "$Record_Id";then 1605 | logs "$Count:[$aliddns_type]-[$aliddns_name.$aliddns_domain] is does not exist or has been remove." "" "y" 1606 | return 1 1607 | fi 1608 | q=$(aliddns_domain_Status "$Record_Id" "$Status" "$aliddns_type") 1609 | if ! aliddns_response_check "$q" >/dev/null 2>&1;then 1610 | logs "aliddns_domain_Status Error, please check." "" "rb" "e" 1611 | fi 1612 | 1613 | isEmpty "$q" && return 1 1614 | id=$(get_Record_value $q "RecordId") >/dev/null 2>&1 1615 | st=$(get_Record_value $q "Status") >/dev/null 2>&1 1616 | st=$(echo $st | set_uppercase) 1617 | 1618 | if iseq "$id" "$Record_Id";then 1619 | logs "$Count:[$aliddns_type]-[$aliddns_name.$aliddns_domain] status settings are success, and the current status is $st." "" "gb" 1620 | do_aliddns_log "status" "$st" 1621 | set_success 1 "$actions" "success" 1622 | return 0 1623 | else 1624 | logs "$Count:[$aliddns_type]-[$aliddns_name.$aliddns_domain] status setting Failed." "" "rb" "e" 1625 | do_aliddns_log "status" "$st" 1626 | set_success 0 "$actions" "failed" 1627 | return 1 1628 | fi 1629 | } 1630 | #====================================================================================== 1631 | do_remove(){ 1632 | ! get_Record >/dev/null 2>&1 && return 1 1633 | isEmpty "$Record_Ids" && logs "$Count:[$aliddns_type]-[$aliddns_name.$aliddns_domain] is does not exist or has been remove." "" "gb" "t" && return 1 1634 | for i in $Record_Ids;do 1635 | q=$(aliddns_domain_del "$i" "$aliddns_type") 1636 | if ! aliddns_response_check "$q" >/dev/null 2>&1;then 1637 | logs "aliddns_domain_del Error, please check." "" "rb" "e" 1638 | return 1 1639 | fi 1640 | id=$(get_Record_value $q "RecordId") 1641 | if iseq "$i" "$id";then 1642 | if do_router_ddns_check;then 1643 | [ -x "$aliddns_dcu" ] && "$aliddns_dcu" 0 1644 | fi 1645 | logs "$Count:[$aliddns_type]-[$aliddns_name.$aliddns_domain]-[$i] remove success." "" "gb" 1646 | else 1647 | logs "$Count:[$aliddns_type]-[$aliddns_name.$aliddns_domain]-[$i] remove Failed." "" "rb" "e" 1648 | goto_remove "$Count" 1649 | break 1650 | fi 1651 | done 1652 | return 0 1653 | } 1654 | #====================================================================================== 1655 | do_Record_verification(){ 1656 | #actions has added or updated 1657 | local id="$1";local ip="$2";local r=0;local msg="" 1658 | if [ "$actions" == "added" -a -n "$id" ] || [ "$actions" == "updated" -a -n "$id" -a "$id" == "$Record_Id" ];then 1659 | logs "$Count:[$aliddns_type]-[$aliddns_name.$aliddns_domain]-[$ip] $actions success." "" "ys" "t" 1660 | logs "$Count:[$aliddns_type]-[$aliddns_name.$aliddns_domain]analysis takes effect after about 10 minutes[解析大约10分钟后生效]" "" "ys" "w" 1661 | if do_router_ddns_check;then 1662 | set_ddns_show 1 "$(aliddns_name_real "$routerddns_name" "$routerddns_domain")" "$wan_ipvx_IP" 1663 | [ -x "$aliddns_dcu" ] && "$aliddns_dcu" 1 1664 | fi 1665 | do_aliddns_log "$actions" "success" 1666 | do_aliddns_log "dnsExist" "wait" 1667 | set_success 1 "$actions" "success" 1668 | return 0 1669 | else 1670 | logs "$Count:[$aliddns_type]-[$aliddns_name.$aliddns_domain]-[$ip] $actions Failed, $actions operation again..." "" "rb" "e" 1671 | logs "$Count:failed..." "" "rb" "e" 1672 | [ -x "$aliddns_dcu" ] && "$aliddns_dcu" 0 1673 | do_aliddns_log "$actions" "failed" 1674 | set_success 0 "$actions" "failed" 1675 | goto_start "$Count" 1676 | return 1 1677 | fi 1678 | } 1679 | #====================================================================================== 1680 | set_wake_host(){ 1681 | if iseq "$OS_TYPE" "merlin";then 1682 | local r=0 1683 | local s=$(nvram get wollist) 1684 | local l=$(nvram get lan_domain) 1685 | local b=".$l" 1686 | local a=$(echo "$(arp -a -i $ETH)" | grep -v 'incomplete' | awk '{print $1,$4}' | RMSTRING $b ) 1687 | local n=$(echo "$a" | awk 'END{print NR}') 1688 | local i=1;local wollist='';local sl='<';local sr='>' 1689 | isEmpty "$a" && return 0 1690 | until [ "$i" -gt "$n" ];do 1691 | m=$(echo "$a" | awk "NR==$i{print}" | awk '{print $2}' | TRIMALL | set_uppercase) 1692 | h=$(echo "$a" | awk "NR==$i{print}" | awk '{print $1}' | TRIMALL) 1693 | iseq "$h" "?" && h="client_$i" 1694 | if isNotEmpty "$h" && isNotEmpty "$m";then 1695 | wollist="$sl$h$sr$m$wollist" 1696 | iseq "$r" 0 && isEmpty "$(echo $s | grep -o $m)" && r=1 1697 | fi 1698 | i=$(sadd $i 1) 1699 | done 1700 | if isNotEmpty "$wollist" && iseq "$r" 1;then 1701 | nvram set wollist="$wollist" 1702 | nvram commit 1703 | fi 1704 | fi 1705 | return 0 1706 | } 1707 | #====================================================================================== 1708 | goto_ping_wake(){ 1709 | iseq "$isipv6_domain" 0 && return 0 1710 | isne "$OS_TYPE" "merlin" && return 0 1711 | local ml="$1";local s0="$aliddns_conf";local s1="aliddns_lan_mac" 1712 | local p4="";local p6="";local at="";local i=1;local r=0 1713 | local sl='<';local sr='>';local h="" 1714 | local wollist=$(nvram get wollist) 1715 | iseq "$isIPV6" 1 && return 0 1716 | isEmpty "$ml" && ml=$(cat $s0 | grep -w $s1 | RMSTRING "$s1=" | RMSTRING '"' | RMSTRING "''" | set_lowercase) 1717 | isEmpty "$ml" && return 0 1718 | for m in $ml;do 1719 | if isne "$m" "none" && isEmpty "$(echo $wollist | grep -o $m)";then 1720 | h="client_$i" 1721 | wollist="$sl$h$sr$m$wollist" 1722 | fi 1723 | if isne "$m" "none";then 1724 | p4=$(echo "$($IP2 -4 neigh show dev $ETH)" | set_lowercase | grep -w $m | grep -v '^169' | awk '{print $1}' | tail -n1 | awk '{print $NF}') 1725 | p6=$(echo "$($IP2 -6 neigh show dev $ETH)" | set_lowercase | grep -w $m | grep -v '^fe80' | awk '{print $1}' | tail -n1 | awk '{print $NF}') 1726 | at=$(echo "$($IP2 -6 neigh show dev $ETH)" | set_lowercase | grep -w $m | grep -v '^fe80' | awk '{print $4}' | tail -n1 | awk '{print $NF}') 1727 | isEmpty "$p4" && isEmpty "$p6" && break 1728 | valid_ipv4 "$p4" && ! valid_ipv6 "$p6" && r=1 && break 1729 | valid_ipv4 "$p4" && valid_ipv6 "$p6" && isNotEmpty "$at" && r=2 && break 1730 | fi 1731 | i=$(sadd $i 1) 1732 | 1733 | done 1734 | if isNotEmpty "$wollist";then 1735 | nvram set wollist="$wollist" 1736 | nvram commit 1737 | fi 1738 | if iseq "$r" 1;then 1739 | logs "" "$LS" 1740 | logs "attempt to activate client host[$p4]-[$m]" "" "y" "t" 1741 | do_ping4 "$p4" 3 3 >/dev/null 2>&1 1742 | do_ether_wake "$m" "$ETH" >/dev/null 2>&1 1743 | logs "" "$LS" 1744 | return 0 1745 | elif iseq "$r" 2;then 1746 | logs "" "$LS" 1747 | logs "activate client host[$p6]-[$m]-[$at]" "" "y" "t" 1748 | do_ping4 "$p4" 3 3 >/dev/null 2>&1 1749 | do_ether_wake "$m" "$ETH" >/dev/null 2>&1 1750 | logs "" "$LS" 1751 | return 0 1752 | fi 1753 | return 0 1754 | } 1755 | #====================================================================================== 1756 | goto_check(){ 1757 | issuccess="";isfailed="";rm -rf "$aliddns_msg" 1758 | currtimer=$(date +%s) 1759 | if isEmpty "$1" || iseq "$1" 0 || ! isNumber "$1";then 1760 | Count=1 1761 | until [ "$Count" -gt "$aliddns_TotalCount" ];do 1762 | logs "$Count:going..." "" "rb" 1763 | get_aliddns_conf "$Count" && do_check 1764 | Count=$(sadd $Count 1) 1765 | done 1766 | return 0 1767 | elif isNumber "$1";then 1768 | if islt "$1" 1 || isgt "$1" "$aliddns_TotalCount";then 1769 | logs "please enter a specific value is 0 or 1~$aliddns_TotalCount." "" "rb" "e" 1770 | return 1 1771 | fi 1772 | Count="$1" 1773 | logs "$Count:going..." "" "rb" 1774 | get_aliddns_conf "$Count" && do_check 1775 | return 0 1776 | else 1777 | logs "please enter a specific value is 0 or 1~$aliddns_TotalCount." "" "rb" "e" 1778 | return 1 1779 | fi 1780 | } 1781 | #====================================================================================== 1782 | goto_start(){ 1783 | issuccess="";isfailed="";rm -rf "$aliddns_msg" 1784 | currtimer=$(date +%s) 1785 | if isEmpty "$1" || iseq "$1" 0 || ! isNumber "$1";then 1786 | Count=1 1787 | until [ "$Count" -gt "$aliddns_TotalCount" ];do 1788 | logs "$Count:going..." "" "rb" 1789 | get_aliddns_conf "$Count" && do_check && do_start 1790 | Count=$(sadd $Count 1) 1791 | done 1792 | return 0 1793 | elif isNumber "$1";then 1794 | if islt "$1" 1 || isgt "$1" "$aliddns_TotalCount";then 1795 | logs "please enter a specific value is 0 or 1~$aliddns_TotalCount." "" "rb" "e" 1796 | return 1 1797 | fi 1798 | Count="$1" 1799 | logs "$Count:going..." "" "rb" 1800 | get_aliddns_conf "$Count" && do_check && do_start 1801 | return 0 1802 | else 1803 | logs "please enter a specific value is 0 or 1~$aliddns_TotalCount." "" "rb" "e" 1804 | return 1 1805 | fi 1806 | } 1807 | #====================================================================================== 1808 | goto_again(){ 1809 | local jc=3;local again_num=0;local lCount="";local p4="" 1810 | currtimer=$(date +%s) 1811 | if [ ! -f "$isfailed_again" ] || [ ! -f "$isfailed_again_num" ];then 1812 | logs "No processable domain name resolution[没有可处理的域名解析]" "" "gb" "w" 1813 | return 1 1814 | fi 1815 | again_num=$(cat "$isfailed_again_num" | grep -w "again_num" | RMSTRING "again_num=" | TRIM) 1816 | lCount=$(cat "$isfailed_again" | grep -w "lCount" | RMSTRING "lCount=" | TRIM) 1817 | if isEmpty "$lCount" || isEmpty "$again_num" || ! check_number "$again_num";then 1818 | logs "No processable domain name resolution[没有可处理的域名解析]" "" "gb" "w" 1819 | rm -rf "$isfailed_again_num" >/dev/null 2>&1 1820 | rm -rf "$isfailed_again" >/dev/null 2>&1 1821 | do_realupdate "a" "" "$1" 1822 | logs "" "$LS" 1823 | return 1 1824 | fi 1825 | if isge "$again_num" "$jc" ;then 1826 | logs "Unable to handle domain name resolution, please check[无法处理的域名解析, 请检查]" "" "gb" "w" 1827 | for c in $lCount;do 1828 | get_aliddns_conf "$c" 1829 | m="$c:[$aliddns_type]-[$aliddns_name.$aliddns_domain]$1 $again_num/$jc for failed operation" 1830 | logs "$m" "" "gb" 1831 | done 1832 | rm -rf "$isfailed_again_num" >/dev/null 2>&1 1833 | rm -rf "$isfailed_again" >/dev/null 2>&1 1834 | do_realupdate "a" "" "$1" 1835 | logs "" "$LS" 1836 | return 1 1837 | fi 1838 | for c in $lCount;do 1839 | get_aliddns_conf "$c" 1840 | if isEmpty "$aliddns_lan_mac";then 1841 | goto_start $c 1842 | else 1843 | p4=`echo "$($IP2 -4 neigh show dev $ETH)" | set_lowercase | grep -w $aliddns_lan_mac | grep -v '^169' | awk '{print $1}'` 1844 | if valid_mac "$aliddns_lan_mac" && isNotEmpty "$p4" && do_ping4 "$p4" 3 3 >/dev/null 2>&1;then 1845 | goto_start $c 1846 | else 1847 | logs "[$aliddns_lan_mac]client is not active and unable to resolve domain name[客户端不在活跃状态, 无法进行域名解析]" "" "yb" "w" 1848 | #******************** 1849 | isfailed="$lCount" 1850 | #******************** 1851 | fi 1852 | fi 1853 | done 1854 | show_success "$1 $again_num/$jc" 1855 | do_realupdate "a" "$isfailed" "$1" 1856 | return 0 1857 | } 1858 | #====================================================================================== 1859 | goto_checkwanip(){ 1860 | issuccess="";isfailed="";rm -rf "$aliddns_msg" 1861 | currtimer=$(date +%s) 1862 | if isNumber "$1";then 1863 | if isgt "$1" 0 && isle "$1" "$aliddns_TotalCount";then 1864 | Count="$1" 1865 | logs "$Count:going..." "" "rb" 1866 | get_aliddns_conf "$Count" && do_checkwanip 1867 | return 0 1868 | fi 1869 | else 1870 | Count=1 1871 | until [ "$Count" -gt "$aliddns_TotalCount" ];do 1872 | logs "$Count:going..." "" "rb" 1873 | get_aliddns_conf "$Count" && do_checkwanip 1874 | Count=$(sadd $Count 1) 1875 | done 1876 | return 0 1877 | fi 1878 | return 1 1879 | } 1880 | #====================================================================================== 1881 | goto_status(){ 1882 | local ct=0 1883 | issuccess="";isfailed="";rm -rf "$aliddns_msg" 1884 | currtimer=$(date +%s) 1885 | if isEmpty "$1" || isEmpty "$2";then 1886 | logs "The parameters are wrong and the correct are Three parameters, exit." "" "rb" "e" 1887 | return 1 1888 | fi 1889 | if ! isNumber "$1" || islt "$1" 0 || isgt "$1" "$aliddns_TotalCount";then 1890 | logs "please enter a specific value is 0 or 1~$aliddns_TotalCount, exit." "" "rb" "e" 1891 | return 1 1892 | fi 1893 | if iseq "$2" 0 || iseq "$2" 1;then 1894 | ct=1 1895 | else 1896 | logs "please enter a specific value is 0 or 1, exit." "" "rb" "e" 1897 | return 1 1898 | fi 1899 | if isgt "$1" 0 && isle "$1" "$aliddns_TotalCount";then 1900 | Count="$1" 1901 | logs "$Count:going..." "" "rb" 1902 | get_aliddns_conf "$Count" && get_Record && do_Record_Only_check && do_status "$2" 1903 | return 0 1904 | elif iseq "$1" 0;then 1905 | Count=1 1906 | until [ "$Count" -gt "$aliddns_TotalCount" ];do 1907 | logs "$Count:going..." "" "rb" 1908 | get_aliddns_conf "$Count" && get_Record && do_Record_Only_check && do_status "$2" 1909 | Count=$(sadd $Count 1) 1910 | done 1911 | return 0 1912 | fi 1913 | } 1914 | #====================================================================================== 1915 | goto_remove(){ 1916 | actions="remove";issuccess="";isfailed="";rm -rf "$aliddns_msg" 1917 | currtimer=$(date +%s) 1918 | local res=0 1919 | if ! isNumber "$1" || isEmpty "$1" || islt "$1" 0 || isgt "$1" "$aliddns_TotalCount";then 1920 | logs "please enter a specific value is 0 or 1~$aliddns_TotalCount." "" "rb" "e" 1921 | return 1 1922 | fi 1923 | if iseq "$1" 0;then 1924 | #remove all 1925 | Count=1 1926 | until [ "$Count" -gt "$aliddns_TotalCount" ];do 1927 | logs "$Count:going..." "" "rb" 1928 | if get_aliddns_conf "$Count";then 1929 | if do_remove;then 1930 | do_aliddns_log "$actions" "success" 1931 | set_success 1 "$actions" "success" 1932 | else 1933 | do_aliddns_log "$actions" "failed" 1934 | set_success 1 "$actions" "failed" 1935 | fi 1936 | fi 1937 | Count=$(sadd $Count 1) 1938 | done 1939 | return 0 1940 | elif isgt "$1" 0 && isle "$1" "$aliddns_TotalCount";then 1941 | #remove one 1942 | Count=1 1943 | until [ "$Count" -gt "$aliddns_TotalCount" ];do 1944 | iseq "$1" "$Count" && res=1 && break 1945 | Count=$(sadd $Count 1) 1946 | done 1947 | if iseq "$res" 1;then 1948 | logs "$Count:going..." "" "rb" 1949 | if get_aliddns_conf "$Count";then 1950 | if do_remove;then 1951 | do_aliddns_log "$actions" "success" 1952 | set_success 1 "$actions" "success" 1953 | else 1954 | do_aliddns_log "$actions" "failed" 1955 | set_success 1 "$actions" "failed" 1956 | fi 1957 | fi 1958 | fi 1959 | return 0 1960 | else 1961 | return 1 1962 | fi 1963 | } 1964 | #====================================================================================== 1965 | find_wan_info(){ 1966 | local prefixes=$1;local primary="0";local prefix="";local wans_mode="" 1967 | if iseq "$OS_TYPE" "merlin";then 1968 | wans_mode=$(nvram get wans_mode) 1969 | wan_ifname="";wan_no=0;wan_proto="" 1970 | if iseq "$wans_mode" "lb" 2>&1;then 1971 | for prefix in $prefixes;do 1972 | proto=$(nvram get ${prefix}proto) 1973 | wan_proto="$proto" 1974 | if [ "$proto" == "pppoe" -o "$proto" == "pptp" -o "$proto" == "l2tp" ];then 1975 | wan_ifname=$(nvram get ${prefix}pppoe_ifname) 1976 | else 1977 | wan_ifname=$(nvram get ${prefix}wan_ifname) 1978 | fi 1979 | done 1980 | else 1981 | for prefix in $prefixes;do 1982 | primary=$(nvram get ${prefix}primary) 1983 | iseq "$primary" "1" 2>&1 && break 1984 | done 1985 | if iseq "$primary" "1" 2>&1;then 1986 | proto=$(nvram get ${prefix}proto) 1987 | wan_proto="$proto" 1988 | if [ "$proto" == "pppoe" -o "$proto" == "pptp" -o "$proto" == "l2tp" ];then 1989 | wan_ifname=$(nvram get ${prefix}pppoe_ifname) 1990 | else 1991 | wan_ifname=$(nvram get ${prefix}wan_ifname) 1992 | fi 1993 | fi 1994 | fi 1995 | wan_no=$(echo $prefix | sed 's/^wan//' | sed 's/_//' 2>&1) 1996 | iseq "$pppoe_ifname" "any" 2>&1 && return 0 1997 | if [ "$proto" == "pppoe" -o "$proto" == "pptp" -o "$proto" == "l2tp" ];then 1998 | isNotEmpty "$wan_ifname" && check_number "$wan_no" && isNotEmpty "$wan_no" && isNotEmpty "$wan_proto" && return 0 1999 | fi 2000 | elif iseq "$OS_TYPE" "padavan";then 2001 | proto=$(nvram get wan_proto) 2002 | wan_proto="$proto" 2003 | wan_ifname="ppp0" 2004 | return 0 2005 | elif iseq "$OS_TYPE" "pandorabox" || iseq "$OS_TYPE" "openwrt";then 2006 | local p="";local u="" 2007 | for w in wan wan6;do 2008 | { 2009 | p=$(uci get network.${w}.proto) 2010 | u=$(uci get network.${w}.username) 2011 | } 2>/dev/null 2012 | if [ "$p" == "pppoe" -a -n "$u" ];then 2013 | proto="$p" 2014 | wan_proto="$proto" 2015 | wan_ifname="pppoe-${w}" 2016 | if iseq "$w" "wan";then 2017 | wan_no="" 2018 | elif iseq "$w" "wan";then 2019 | wan_no="6" 2020 | fi 2021 | break 2022 | fi 2023 | done 2024 | #proto=$(uci -P /var/state get network.wan.proto) 2025 | #wan_proto="$proto" 2026 | #wan_ifname=$(uci -P /var/state get network.wan.ifname) 2027 | #wan_no="" 2028 | return 0 2029 | fi 2030 | return 1 2031 | } 2032 | #====================================================================================== 2033 | get_wan_info(){ 2034 | local r=1;local i=1;local n=10 2035 | until [ "$i" -gt "$n" ];do 2036 | if iseq "$pppoe_ifname" "auto" || iseq "$pppoe_ifname" "any";then 2037 | find_wan_info "wan0_ wan1_" && r=0 && break 2038 | elif iseq "$pppoe_ifname" "wan0";then 2039 | find_wan_info "wan0_" && r=0 && break 2040 | elif iseq "$pppoe_ifname" "wan1";then 2041 | find_wan_info "wan1_" && r=0 && break 2042 | fi 2043 | i=$(sadd $i 1) 2044 | sleep 1 2045 | done 2046 | if iseq "$r" 0;then 2047 | logs "Router wan ifname is[${wan_ifname}], wan is[wan${wan_no}], proto is[${wan_proto}]" "" "ys" "t" 2048 | return 0 2049 | else 2050 | logs "Router wan ifname is[${wan_ifname}], wan is[wan${wan_no}], proto is[${wan_proto}], wan is incorrect, please check." "" "rl" "w" 2051 | return 1 2052 | fi 2053 | } 2054 | #====================================================================================== 2055 | get_lan_ipv46(){ 2056 | local m="";local e;local n=1;local p4;local p6;local at 2057 | lan_ipvx_IP="";lan_ipv4_IP="";lan_ipv6_IP="" 2058 | isEmpty "$1" || isEmpty "$2" && return 1 2059 | m=$(echo $1 | set_lowercase);e="$2" 2060 | until [ "$n" -gt 3 ];do 2061 | p4=$(echo "$($IP2 -4 neigh show dev $e)" | set_lowercase | grep -w $m | grep -v '^169' | awk '{print $1}' | tail -n1 | awk '{print $NF}') 2062 | p6=$(echo "$($IP2 -6 neigh show dev $e)" | set_lowercase | grep -w $m | grep -v '^fe80' | awk '{print $1}' | tail -n1 | awk '{print $NF}') 2063 | at=$(echo "$($IP2 -6 neigh show dev $e)" | set_lowercase | grep -w $m | grep -v '^fe80' | awk '{print $4}' | tail -n1 | awk '{print $NF}') 2064 | valid_ipv4 "$p4" && lan_ipv4_IP="$p4" 2065 | valid_ipv6 "$p6" && lan_ipv6_IP="$p6" 2066 | isNotEmpty "$lan_ipv4_IP" && isNotEmpty "$lan_ipv6_IP" && lan_ipvx_IP="$lan_ipv6_IP" && break 2067 | n=$(sadd $n 1) 2068 | done 2069 | if isNotEmpty "$lan_ipvx_IP";then 2070 | logs "[$lan_ipvx_IP]The lan_$xIP selected from lan macaddress[$m]-[$at]" "" "y" 2071 | return 0 2072 | else 2073 | return 1 2074 | fi 2075 | } 2076 | #====================================================================================== 2077 | get_wan_ipv46(){ 2078 | xIP="ipv4_IP";xan_ipvx_IP="";wan_ipv4_IP="";wan_ipv6_IP="";wan_ipvx_IP="";lan_ipv6_IP="";lan_ipvx_IP="" 2079 | local k="-4";local r=1;local wp="";local IP_I="";local IP_E="";local pl="" 2080 | iseq "$aliddns_type" "AAAA" && k="-6" && xIP="ipv6_IP" && xan_ipvx_IP="wan_$xIP" 2081 | if iseq "$isRUN" 1 || ! do_run_check;then 2082 | do_cron "$ID_CRU" "a" "$cron_File" "month=* week=* day=* hour=* min=2" "min" "$scripts_sh" "update" 2083 | rm -f "$FL" 2084 | exit 1 2085 | fi 2086 | #get internal Public IP 2087 | if iseq "$wan_ifname" "";then 2088 | pl=$($IP2 $k addr show | sed -n '/inet/{s!.*inet6* !!;s!/.*!!p}' | sed 's/peer.*//' | grep -v '^fe80') 2089 | else 2090 | pl=$($IP2 $k addr show dev $wan_ifname | sed -n '/inet/{s!.*inet6* !!;s!/.*!!p}' | sed 's/peer.*//' | grep -v '^fe80') 2091 | fi 2092 | for p in $pl;do 2093 | wp=$(echo $p | TRIMALL) 2094 | if iseq "$aliddns_type" "AAAA";then 2095 | isNotEmpty "$wp" && public_ipv6_check "$wp" && IP_I="$wp" && break 2096 | elif iseq "$aliddns_type" "A";then 2097 | isNotEmpty "$wp" && public_ipv4_check "$wp" && IP_I="$wp" && break 2098 | fi 2099 | done 2100 | #get external Public IP 2101 | if iseq "$aliddns_type" "AAAA";then 2102 | IP_E="$externalIP6" 2103 | elif iseq "$aliddns_type" "A";then 2104 | IP_E="$externalIP4" 2105 | fi 2106 | if isNotEmpty "$IP_I" || isNotEmpty "$IP_E";then 2107 | logs "[$IP_E]The IP obtained from router external" "" "y" 2108 | logs "[$IP_I]The IP obtained from router internal" "" "y" 2109 | fi 2110 | if [ "$proto" == "pppoe" -o "$proto" == "pptp" -o "$proto" == "l2tp" ];then 2111 | #First level router 2112 | isFirst_level_router=1 2113 | if iseq "$IP_I" "$IP_E" && isNotEmpty "$IP_I" && isNotEmpty "$IP_E";then 2114 | #Public network 2115 | isPublic_network=1 2116 | wan_ipvx_IP="$IP_E" 2117 | r=0 2118 | else 2119 | #not Public network 2120 | isPublic_network=0 2121 | if isNotEmpty "$IP_E";then 2122 | wan_ipvx_IP="$IP_E" 2123 | elif isNotEmpty "$IP_I";then 2124 | wan_ipvx_IP="$IP_I" 2125 | fi 2126 | r=0 2127 | fi 2128 | else 2129 | #Second level router 2130 | #not Public network 2131 | isFirst_level_router=0 2132 | isPublic_network=0 2133 | 2134 | if isNotEmpty "$IP_E";then 2135 | wan_ipvx_IP="$IP_E" 2136 | elif isNotEmpty "$IP_I";then 2137 | wan_ipvx_IP="$IP_I" 2138 | fi 2139 | r=0 2140 | fi 2141 | if iseq "$aliddns_type" "AAAA";then 2142 | wan_ipv6_IP="$wan_ipvx_IP" 2143 | elif iseq "$aliddns_type" "A";then 2144 | wan_ipv4_IP="$wan_ipvx_IP" 2145 | fi 2146 | return "$r" 2147 | } 2148 | #====================================================================================== 2149 | do_wan_ipaddr(){ 2150 | logs "Router wan ifname is[${wan_ifname}], wan is[wan${wan_no}], proto is[${wan_proto}]" "" "ys" "t" 2151 | if iseq "$aliddns_type" "AAAA";then 2152 | logs "Geting wan_ipv6_IP, Please wait..." "" "y" 2153 | elif iseq "$aliddns_type" "A";then 2154 | logs "Geting wan_ipv4_IP, Please wait..." "" "y" 2155 | fi 2156 | 2157 | if get_wan_ipv46;then 2158 | if iseq "$aliddns_type" "AAAA";then 2159 | if isNotEmpty "$aliddns_lan_mac";then 2160 | if ! get_lan_ipv46 "$aliddns_lan_mac" "$ETH";then 2161 | logs "[$aliddns_lan_mac]client is not active, so it cannot get IPv6 IP, skip[客户端不在活跃状态, 因此无法获取IPv6 IP]" "" "gb" "t" 2162 | set_success 0 "$actions" "failed" 2163 | return 1 2164 | fi 2165 | 2166 | wan_ipvx_IP="$lan_ipv6_IP" 2167 | xan_ipvx_IP="lan_$xIP" 2168 | else 2169 | wan_ipvx_IP="$wan_ipv6_IP" 2170 | xan_ipvx_IP="wan_$xIP" 2171 | fi 2172 | fi 2173 | 2174 | do_aliddns_log "getwanip" "success" 2175 | 2176 | if iseq "$isFirst_level_router" 1;then 2177 | logs "Your router is First level[一级路由]" "" "vl" 2178 | else 2179 | logs "Your router is Second level[二级路由]" "" "vl" 2180 | fi 2181 | if iseq "$isPublic_network" 1;then 2182 | #Public network 2183 | if iseq "$wan_no" 0 || iseq "$wan_no" 1;then 2184 | iseq "$OS_TYPE" "merlin" && nvram set "wan${wan_no}_ipaddr"="$wan_ipvx_IP" 2185 | fi 2186 | logs "The $xan_ipvx_IP[$wan_ipvx_IP] is public IP, and definitely Your complete possession[公网IP并独占]" "" "vl" "t" 2187 | return 0 2188 | else 2189 | #Private network 2190 | if iseq "$aliddns_type" "AAAA";then 2191 | if iseq "$isipv6_domain" 1;then 2192 | #domain analysis 2193 | logs "The $xan_ipvx_IP[$wan_ipvx_IP] is public IP, and uncertainty Your complete possession[公网IP非独占]" "" "vl" "t" 2194 | return 0 2195 | else 2196 | #not domain analysis 2197 | logs "You don't have to do domain analysis on $xan_ipvx_IP[$wan_ipvx_IP], skip." "" "vl" "t" 2198 | return 1 2199 | fi 2200 | elif iseq "$aliddns_type" "A";then 2201 | if iseq "$isipv4_domain" 1;then 2202 | #domain analysis 2203 | logs "The $xan_ipvx_IP[$wan_ipvx_IP] is public IP, and uncertainty Your complete possession[公网IP非独占]" "" "vl" "t" 2204 | return 0 2205 | else 2206 | #not domain analysis 2207 | logs "You don't have to do domain analysis on $xan_ipvx_IP[$wan_ipvx_IP], skip." "" "vl" "t" 2208 | return 1 2209 | fi 2210 | fi 2211 | fi 2212 | else 2213 | do_aliddns_log "getwanip" "failed" 2214 | set_success 0 "$actions" "failed" 2215 | if iseq "$aliddns_type" "AAAA";then 2216 | if isNotEmpty "$aliddns_lan_mac";then 2217 | logs "[$aliddns_lan_mac]client is not active, so it cannot get IPv6 IP, skip[客户端不在活跃状态, 因此无法获取IPv6 IP]" "" "yb" "t" 2218 | else 2219 | logs "Your router IPV6 IP cannot be obtained, skip." "" "yb" "w" 2220 | fi 2221 | elif iseq "$aliddns_type" "A";then 2222 | logs "Your router IPV4 IP is empty value or is private ip, skip." "" "yb" "w" 2223 | fi 2224 | return 1 2225 | fi 2226 | } 2227 | #====================================================================================== 2228 | do_speed_dns(){ 2229 | local t="";local r="";local s=",";local PING4=`which ping` 2230 | if [ -z "$PING4" ];then 2231 | echo "1.1.1.1" 2232 | else 2233 | for p in $1;do 2234 | t=$($PING4 -4 -c 1 -W 5 -w 5 $p | tr 'A-Z' 'a-z' | grep -w 'time' | awk '{print $7}' | sed "s/time=//" 2>&1 | awk -F '.' '{print $1}') 2235 | if [ $? -eq 0 ] && [ "$t" -ge 0 2>/dev/null ];then 2236 | if [ -z "$r" ];then 2237 | r="$t $p" 2238 | else 2239 | r="${r}${s}${t} ${p}" 2240 | fi 2241 | fi 2242 | done 2243 | if [ -z "$SORT" ];then 2244 | r=$(echo $r | sed 's/,/\n/g' | awk "NR==1{print}" | awk '{print $2}') 2245 | else 2246 | if iseq "$OS_TYPE" "merlin";then 2247 | r=$(echo $r | sed 's/,/\n/g' | $SORT -g -k1 -t ' ' | awk '{print $2}' | awk "NR==1{print}") 2248 | else 2249 | r=$(echo $r | sed 's/,/\n/g' | $SORT -n | awk "NR==1{print}" | awk '{print $2}') 2250 | fi 2251 | fi 2252 | if [ -n "$r" ];then 2253 | echo "$r" 2254 | else 2255 | echo "1.1.1.1" 2256 | fi 2257 | fi 2258 | } 2259 | #====================================================================================== 2260 | do_nslookup_check(){ 2261 | local name="$1";local n="";local domain="$2";local SERVER="$3";local ip="";local r=1;local HOST=$(aliddns_name_real "$name" "$domain") 2262 | nslookup_ipvx="";isdnsExist="false" 2263 | if iseq "$isRUN" 1 || ! do_run_check;then 2264 | do_cron "$ID_CRU" "a" "$cron_File" "month=* week=* day=* hour=* min=2" "min" "$scripts_sh" "update" 2265 | rm -f "$FL" 2266 | exit 1 2267 | fi 2268 | logs "$Count:[$aliddns_type]-[$name"."$domain]-public_dns[$nslookup_dns] Use nslookup check." "" "vl" 2269 | logs "Getting the parsed IP address from nslookup can take a long time. Please wait patiently..." "" "vl" "w" 2270 | logs "从nslookup获取解析的IP地址,时间可能很长,请耐心等待..." "" "vl" "w" 2271 | n=$(do_nslookup "$HOST" "$nslookup_dns") 2272 | for ip in $n;do 2273 | if isNotEmpty "$ip" && isne "$ip" "$nslookup_dns";then 2274 | iseq "$aliddns_type" "A" && public_ipv4_check "$ip" && iseq "$ip" "$wan_ipvx_IP" && nslookup_ipvx="$ip" && r=0 && break 2275 | iseq "$aliddns_type" "AAAA" && public_ipv6_check "$ip" && iseq "$ip" "$wan_ipvx_IP" && nslookup_ipvx="$ip" && r=0 && break 2276 | fi 2277 | done 2278 | 2279 | return $r 2280 | } 2281 | #====================================================================================== 2282 | do_router_ddns_check(){ 2283 | if iseq "$routerddns_name" "$aliddns_name" && iseq "$routerddns_domain" "$aliddns_domain";then 2284 | return 0 2285 | else 2286 | return 1 2287 | fi 2288 | } 2289 | #====================================================================================== 2290 | set_cron(){ 2291 | if iseq "$1" "a";then 2292 | if isNotEmpty "$2";then 2293 | #isfailed 2294 | #start|restart|update|add 2295 | #Retry every 2 minutes 2296 | if [ "$3" == "start" -o "$3" == "restart" -o "$3" == "update" -o "$3" == "add" ];then 2297 | do_cron "$ID_CRU" "a" "$cron_File" "month=* week=* day=* hour=* min=2" "min" "$scripts_sh" "again" 2298 | fi 2299 | else 2300 | #issuccess 2301 | #Retry every cron_Time 2302 | if iseq "$cron_Time_type" "hour";then 2303 | do_cron "$ID_CRU" "a" "$cron_File" "month=* week=* day=* hour=$cron_Time min=0" "hour" "$scripts_sh" "update" 2304 | elif iseq "$cron_Time_type" "min";then 2305 | do_cron "$ID_CRU" "a" "$cron_File" "month=* week=* day=* hour=* min=$cron_Time" "min" "$scripts_sh" "update" 2306 | fi 2307 | fi 2308 | elif iseq "$1" "d";then 2309 | do_cron "$ID_CRU" "d" "$cron_File" 2310 | fi 2311 | } 2312 | #====================================================================================== 2313 | set_scripts(){ 2314 | #remove old scripts 2315 | if iseq "$OS_TYPE" "merlin";then 2316 | if iseq "$1" "a";then 2317 | del_tmpfile "/jffs/scripts" "wan-start" 2>/dev/null 2318 | del_tmpfile "/jffs/scripts" "ddns-start" 2>/dev/null 2319 | del_tmpfile "/jffs/scripts" "post-mount" 2>/dev/null 2320 | do_create_scripts "a" "/jffs/scripts/wan-start" "$scripts_sh" 2321 | do_create_scripts "a" "/jffs/scripts/ddns-start" "$scripts_sh" 2322 | do_create_scripts "a" "/jffs/scripts/post-mount" "$scripts_sh" 2323 | elif iseq "$1" "d";then 2324 | do_create_scripts "d" "/jffs/scripts/wan-start" "$scripts_sh" 2325 | do_create_scripts "d" "/jffs/scripts/ddns-start" "$scripts_sh" 2326 | do_create_scripts "d" "/jffs/scripts/post-mount" "$scripts_sh" 2327 | fi 2328 | elif iseq "$OS_TYPE" "padavan";then 2329 | if iseq "$1" "a";then 2330 | del_tmpfile "/etc/storage" "post_wan_script.sh" 2>/dev/null 2331 | do_create_scripts "a" "/etc/storage/post_wan_script.sh" "$scripts_sh" 2332 | elif iseq "$1" "d";then 2333 | do_create_scripts "d" "/etc/storage/post_wan_script.sh" "$scripts_sh" 2334 | fi 2335 | elif iseq "$OS_TYPE" "openwrt" || iseq "$OS_TYPE" "pandorabox";then 2336 | if iseq "$1" "a";then 2337 | del_tmpfile "/etc/hotplug.d/iface" "99-sharealiddns" 2>/dev/null 2338 | del_tmpfile "/etc/init.d" "sharealiddns" 2>/dev/null 2339 | do_create_scripts "a" "/etc/hotplug.d/iface/99-sharealiddns" "$scripts_sh" 2340 | do_create_scripts "a" "/etc/init.d/sharealiddns" "$scripts_sh" 2341 | elif iseq "$1" "d";then 2342 | do_create_scripts "d" "/etc/hotplug.d/iface/99-sharealiddns" "$scripts_sh" 2343 | do_create_scripts "d" "/etc/init.d/sharealiddns" "$scripts_sh" 2344 | fi 2345 | fi 2346 | } 2347 | #====================================================================================== 2348 | do_end(){ 2349 | if iseq "$isRUN" 1 || ! do_run_check;then 2350 | do_cron "$ID_CRU" "a" "$cron_File" "month=* week=* day=* hour=* min=2" "min" "$scripts_sh" "update" 2351 | rm -f "$FL" 2352 | exit 1 2353 | fi 2354 | } 2355 | #====================================================================================== 2356 | do_realupdate(){ 2357 | set_cron "$1" "$2" "$3" 2358 | set_scripts "$1" "$2" "$3" 2359 | do_end 2360 | rm -rf "$FL" 2361 | } 2362 | #====================================================================================== 2363 | do_aliddns_log(){ 2364 | local v1="$1";local v2="$2";local log="";local t=`date '+%Y-%m-%d-%H:%M:%S'` 2365 | local m="$Count:[$aliddns_type]-[$aliddns_name.$aliddns_domain]" 2366 | iseq "$islog" 0 && return 0 2367 | case "$v1" in 2368 | "added") 2369 | if iseq "$aliddns_type" "A";then 2370 | log="[$t]-$m-$xan_ipvx_IP[$wan_ipvx_IP]-[$v1-$v2]" 2371 | elif iseq "$aliddns_type" "AAAA";then 2372 | if isEmpty "$aliddns_lan_mac";then 2373 | log="[$t]-$m-$xan_ipvx_IP[$wan_ipvx_IP]-[$v1-$v2]" 2374 | else 2375 | log="[$t]-$m-$xan_ipvx_IP[$wan_ipvx_IP]-[$aliddns_lan_mac]-[$v1-$v2]" 2376 | fi 2377 | fi 2378 | ;; 2379 | "update") 2380 | if iseq "$aliddns_type" "A";then 2381 | log="[$t]-$m-$xan_ipvx_IP[$wan_ipvx_IP]-[$v1-$v2]" 2382 | elif iseq "$aliddns_type" "AAAA";then 2383 | if isEmpty "$aliddns_lan_mac";then 2384 | log="[$t]-$m-$xan_ipvx_IP[$wan_ipvx_IP]-[$v1-$v2]" 2385 | else 2386 | log="[$t]-$m-$xan_ipvx_IP[$wan_ipvx_IP]-[$aliddns_lan_mac]-[$v1-$v2]" 2387 | fi 2388 | fi 2389 | ;; 2390 | "remove") 2391 | if iseq "$aliddns_type" "A";then 2392 | log="[$t]-$m-Record_Ids[$Record_Ids]-[$v1-$v2]" 2393 | elif iseq "$aliddns_type" "AAAA";then 2394 | if isEmpty "$aliddns_lan_mac";then 2395 | log="[$t]-$m-Record_Ids[$Record_Ids]-[$v1-$v2]" 2396 | else 2397 | log="[$t]-$m-Record_Ids[$Record_Ids]-[$aliddns_lan_mac]-[$v1-$v2]" 2398 | fi 2399 | fi 2400 | ;; 2401 | "getwanip") 2402 | if iseq "$aliddns_type" "A";then 2403 | log="[$t]-$m-$xan_ipvx_IP[$wan_ipvx_IP]-[$v1-$v2]" 2404 | elif iseq "$aliddns_type" "AAAA";then 2405 | if isEmpty "$aliddns_lan_mac";then 2406 | log="[$t]-$m-$xan_ipvx_IP[$wan_ipvx_IP]-[$v1-$v2]" 2407 | else 2408 | v1='getlanip' 2409 | log="[$t]-$m-$xan_ipvx_IP[$wan_ipvx_IP]-[$aliddns_lan_mac]-[$v1-$v2]" 2410 | fi 2411 | fi 2412 | ;; 2413 | "dnsExist") 2414 | if iseq "$aliddns_type" "A";then 2415 | log="[$t]-$m-$xan_ipvx_IP[$wan_ipvx_IP]-[$v1-$v2]" 2416 | elif iseq "$aliddns_type" "AAAA";then 2417 | if isEmpty "$aliddns_lan_mac";then 2418 | log="[$t]-$m-$xan_ipvx_IP[$wan_ipvx_IP]-[$v1-$v2]" 2419 | else 2420 | log="[$t]-$m-$xan_ipvx_IP[$wan_ipvx_IP]-[$aliddns_lan_mac]-[$v1-$v2]" 2421 | fi 2422 | fi 2423 | ;; 2424 | "status") 2425 | if iseq "$aliddns_type" "A";then 2426 | log="[$t]-$m-[$v1 $v2]" 2427 | elif iseq "$aliddns_type" "AAAA";then 2428 | if isEmpty "$aliddns_lan_mac";then 2429 | log="[$t]-$m-[$v1-$v2]" 2430 | else 2431 | log="[$t]-$m-[$v1-$v2]" 2432 | fi 2433 | fi 2434 | ;; 2435 | "getrecord") 2436 | log="[$t]-$m-Record_Ids[$Record_Ids]-[$v1-$v2]" 2437 | ;; 2438 | "checkwanip") 2439 | log="[$t]-$m-$xan_ipvx_IP[$wan_ipvx_IP]-[$v1-$v2]" 2440 | ;; 2441 | *) 2442 | esac 2443 | if [ ! -f "$aliddns_log" ];then 2444 | echo "$log" > "$aliddns_log" 2445 | else 2446 | echo "$log" >> "$aliddns_log" 2447 | fi 2448 | 2449 | if [ ! -f "$aliddns_msg" ];then 2450 | echo "$log" > "$aliddns_msg" 2451 | else 2452 | echo "$log" >> "$aliddns_msg" 2453 | fi 2454 | return 0 2455 | } 2456 | #====================================================================================== 2457 | do_showlog(){ 2458 | local msg="";local m="";local n=0;local i=1 2459 | if [ -f "$aliddns_log" ];then 2460 | RMSPACEROWFILE "$aliddns_log" 2461 | msg=$(cat "$aliddns_log") 2462 | if [ -n "$msg" ];then 2463 | n=$(echo "$msg" | awk 'END{print NR}') 2464 | until [ "$i" -gt "$n" ];do 2465 | m=$(echo "$msg" | awk "NR==$i{print}") 2466 | logs "$m" 2467 | i=$(sadd $i 1) 2468 | done 2469 | logs "" "$LS" 2470 | fi 2471 | fi 2472 | } 2473 | #====================================================================================== 2474 | set_success(){ 2475 | if iseq "$1" 1;then 2476 | issuccess="$issuccess $Count" 2477 | logs "$Count:$3..." "" "rb" 2478 | elif iseq "$1" 0;then 2479 | isfailed="$isfailed $Count" 2480 | logs "$Count:$3..." "" "rb" 2481 | fi 2482 | return 0 2483 | } 2484 | #====================================================================================== 2485 | show_success(){ 2486 | local again_num=0;local m="";local msg="";local n=0;local i=1 2487 | if iseq "$isRUN" 1 || ! do_run_check;then 2488 | do_cron "$ID_CRU" "a" "$cron_File" "month=* week=* day=* hour=* min=2" "min" "$scripts_sh" "update" 2489 | rm -f "$FL" 2490 | exit 1 2491 | fi 2492 | logs "" "$LS" 2493 | if isne "$currtimer" 0;then 2494 | lasttimer=$(($(date +%s) - $currtimer)) 2495 | logs "time consuming:${lasttimer}s" "" "rb" "t" 2496 | fi 2497 | if isNotEmpty "$issuccess";then 2498 | for c in $issuccess;do 2499 | get_aliddns_conf "$c" 2500 | m="$c:[$aliddns_type]-[$aliddns_name.$aliddns_domain]$1 for success operation" 2501 | logs "$m" "" "ys" "t" 2502 | done 2503 | fi 2504 | if isNotEmpty "$isfailed";then 2505 | if [ -f "$isfailed_again_num" ];then 2506 | again_num=$(cat "$isfailed_again_num" | grep -w "again_num" | RMSTRING "again_num=" | TRIM) 2507 | if check_number "$again_num";then 2508 | again_num=$(sadd $again_num 1) 2509 | else 2510 | again_num=1 2511 | fi 2512 | echo "again_num=$again_num" > "$isfailed_again_num" 2513 | else 2514 | echo "again_num=1" > "$isfailed_again_num" 2515 | fi 2516 | echo "lCount=$isfailed" > "$isfailed_again" 2517 | for c in $isfailed;do 2518 | get_aliddns_conf "$c" 2519 | m="$c:[$aliddns_type]-[$aliddns_name.$aliddns_domain]$1 for failed operation" 2520 | logs "$m" "" "vs" "w" 2521 | done 2522 | else 2523 | rm -rf "$isfailed_again_num" 2524 | rm -rf "$isfailed_again" 2525 | fi 2526 | logs "" "$LS" 2527 | if [ -f "$aliddns_msg" ];then 2528 | RMSPACEROWFILE "$aliddns_msg" 2529 | msg=$(cat "$aliddns_msg") 2530 | if [ -n "$msg" ];then 2531 | n=$(echo "$msg" | awk 'END{print NR}') 2532 | until [ "$i" -gt "$n" ];do 2533 | m=$(echo "$msg" | awk "NR==$i{print}") 2534 | logs "$m" 2535 | i=$(sadd $i 1) 2536 | done 2537 | logs "" "$LS" 2538 | fi 2539 | fi 2540 | do_removerow "$aliddns_log" 300 2541 | return 0 2542 | } 2543 | #====================================================================================== 2544 | eui64() { 2545 | local m0=$1 2546 | local m1=`echo $m0 |cut -f1 -d:` 2547 | local m2=`echo $m0 |cut -f2 -d:` 2548 | local m3=`echo $m0 |cut -f3 -d:` 2549 | local m4=`echo $m0 |cut -f4 -d:` 2550 | local m5=`echo $m0 |cut -f5 -d:` 2551 | local m6=`echo $m0 |cut -f6 -d:` 2552 | local m1_xor=$((0x$m1 ^ 2)) 2553 | printf "%02x%02x:%02xff:fe%02x:%02x%02x" ${m1_xor} 0x${m2} 0x${m3} 0x${m4} 0x${m5} 0x${m6} 2554 | } 2555 | #====================================================================================== 2556 | do_geneui64(){ 2557 | local m="$1";local e="$2" 2558 | if iseq "$iseui64" 1;then 2559 | ipv6_eui64=$(eui64 $m) 2560 | local v0=$(echo $wan_ipv6_IP | cut -d ':' -f 1) 2561 | local v1=$($IP2 -6 addr show dev $e | grep -w $v0 | grep -w "inet6" | grep -v "^fe80" | awk "NR==1{print}" | sed -n '/inet/{s!.*inet6* !!;s!s.*!!p}') 2562 | local v2=$(echo $v1 | cut -d ':' -f 1,2,3,4) 2563 | local v3=$(echo $v1 | cut -d '/' -f 2) 2564 | local v4="$v2::" 2565 | local v5="$v2::1" 2566 | if isNotEmpty "$ipv6_eui64" isNotEmpty "$v2" && isNotEmpty "$v3" && isNotEmpty "$v4" isNotEmpty "$v5";then 2567 | nvram set ipv6_prefix_length="$v3" 2568 | nvram set ipv6_prefix="$v4" 2569 | nvram set ipv6_rtr_addr="$v5" 2570 | lan_ipv6_IP_custom="$v2:$ipv6_eui64" 2571 | fi 2572 | fi 2573 | } 2574 | #====================================================================================== 2575 | do_remove_client(){ 2576 | local v;local p;local m 2577 | while :;do 2578 | v=`ip -6 neigh show dev $ETH | grep -v '^fe80'` 2579 | p=$(echo $v | cut -d ' ' -f 1) 2580 | m=$(echo $v | cut -d ' ' -f 3) 2581 | isEmpty "$p" && isEmpty "$m" && break 2582 | logs "remove permanent for client[$v]" "" "gb" 2583 | ip -6 neigh del "$p" lladdr "$m" dev $ETH 2584 | done 2585 | return 0 2586 | } 2587 | #====================================================================================== 2588 | do_client(){ 2589 | local jj="";local pl;local ml;local sl;local nn;local ii=1;local p;local m;local s;local t 2590 | if iseq "$2" "ipv4";then 2591 | jj=-4 2592 | elif iseq "$2" "ipv6";then 2593 | jj=-6 2594 | else 2595 | logs "Usage of ipv4:[sh $scripts_sh $1 ipv4]" "" "rb" "w" 2596 | logs "Usage of ipv6:[sh $scripts_sh $1 ipv6]" "" "rb" "w" 2597 | rm -f "$FL" 2598 | exit 1 2599 | fi 2600 | while :;do 2601 | ii=1 2602 | t=`date '+%Y-%m-%d-%H:%M:%S'` 2603 | pl=$(ip $jj neigh show dev $ETH | grep -v '^fe80' | grep -v '::1' | awk '{print $1}') 2604 | ml=$(ip $jj neigh show dev $ETH | grep -v '^fe80' | grep -v '::1' | awk '{print $3}') 2605 | sl=$(ip $jj neigh show dev $ETH | grep -v '^fe80' | grep -v '::1' | awk '{print $4}') 2606 | nn=$(echo "$pl" | awk 'END{print NR}') 2607 | [ -z "$pl" ] && logs "No client was found[没有发现客户端]" "" "yb" && rm -f "$FL" && exit 1 2608 | until [ "$ii" -gt "$nn" ];do 2609 | p=$(echo "$pl" | awk "NR==$ii{print}") 2610 | m=$(echo "$ml" | awk "NR==$ii{print}") 2611 | s=$(echo "$sl" | awk "NR==$ii{print}" | set_lowercase) 2612 | if [ -n "$p" -a -n "$m" -a "$s" ];then 2613 | if [ "$s" == "delay" ];then 2614 | logs "[$t]-[$p]-[$m]-[$s]-[延时邻居]" "" "y" 2615 | elif [ "$s" == "stale" ];then 2616 | logs "[$t]-[$p]-[$m]-[$s]-[过时邻居]" "" "y" 2617 | elif [ "$s" == "reachable" ];then 2618 | logs "[$t]-[$p]-[$m]-[$s]-[可达邻居]" "" "y" 2619 | elif [ "$s" == "used" ];then 2620 | logs "[$t]-[$p]-[$m]-[$s]-[使用邻居]" "" "y" 2621 | elif [ "$s" == "probe" ];then 2622 | logs "[$t]-[$p]-[$m]-[$s]-[探查邻居]" "" "y" 2623 | elif [ "$s" == "failed" ];then 2624 | logs "[$t]-[$p]-[$m]-[$s]-[废弃邻居]" "" "y" 2625 | elif [ "$s" == "empty" ];then 2626 | logs "[$t]-[$p]-[$m]-[$s]-[空闲邻居]" "" "y" 2627 | elif [ "$s" == "incomplete" ];then 2628 | logs "[$t]-[$p]-[$m]-[$s]-[未完成邻居]" "" "y" 2629 | elif [ "$s" == "ref" ];then 2630 | logs "[$t]-[$p]-[$m]-[$s]-[刷新邻居]" "" "y" 2631 | else 2632 | logs "[$t]-[$p]-[$m]-[$s]-[消失邻居]" "" "g" "t" 2633 | fi 2634 | 2635 | else 2636 | logs "[$t]-[$p]-[$m]-[$s]-[消失邻居]" "" "g" "t" 2637 | fi 2638 | ii=$(sadd $ii 1) 2639 | done 2640 | sleep 5 2641 | done 2642 | } 2643 | #====================================================================================== 2644 | do_create_scripts(){ 2645 | local mymode="$1";local myscripts="$2";local myshell="$3";local myshellproc="" 2646 | if iseq "$mymode" "a";then 2647 | if [ ! -f "$myscripts" ];then 2648 | if iseq "$OS_TYPE" "openwrt" || iseq "$OS_TYPE" "pandorabox";then 2649 | echo "#!/bin/sh /etc/rc.common" > "$myscripts" 2650 | else 2651 | echo "#!/bin/sh" > "$myscripts" 2652 | fi 2653 | fi 2654 | if isEmpty "$(cat $myscripts | grep -o 'myshell')";then 2655 | echo '' >> "$myscripts" 2656 | if iseq "$myscripts" "/jffs/scripts/wan-start";then 2657 | echo "myshell=$myshell" >> "$myscripts" 2658 | echo "myshellname=$(echo $myshell| awk -F '/' '{print $NF}')" >> "$myscripts" 2659 | echo "myready=1" >> "$myscripts" 2660 | echo "mynum=0" >> "$myscripts" 2661 | echo 'echo "pid=$$" > "/tmp/wan_start.pid"' >> "$myscripts" 2662 | echo 'while [ "$mynum" -lt 120 ];do' >> "$myscripts" 2663 | echo ' [ -x "$myshell" ] && myready=0 && break' >> "$myscripts" 2664 | echo " mynum=\$((\$mynum+1))" >> "$myscripts" 2665 | echo " sleep 1" >> "$myscripts" 2666 | echo "done" >> "$myscripts" 2667 | echo "myshellproc=\$(ps | grep -v grep | grep -o \$myshellname)" >> "$myscripts" 2668 | echo 'if [ "$myready" -eq 0 -a -z "$myshellproc" ];then' >> "$myscripts" 2669 | echo " [ \$(nvram get ipv6_service | tr 'A-Z' 'a-z') != 'disabled' ] && service restart_dhcp6c" >> "$myscripts" 2670 | echo ' "$myshell" update' >> "$myscripts" 2671 | echo "fi" >> "$myscripts" 2672 | elif iseq "$myscripts" "/jffs/scripts/ddns-start" || iseq "$myscripts" "/jffs/scripts/post-mount";then 2673 | echo "myshell=$myshell" >> "$myscripts" 2674 | echo "myshellname=$(echo $myshell| awk -F '/' '{print $NF}')" >> "$myscripts" 2675 | echo "myshellproc=\$(ps | grep -v grep | grep -o \$myshellname)" >> "$myscripts" 2676 | echo '[ -z "$myshellproc" -a -x "$myshell" ] && "$myshell" update' >> "$myscripts" 2677 | elif iseq "$myscripts" "/etc/storage/post_wan_script.sh";then 2678 | echo "myshell=$myshell" >> "$myscripts" 2679 | echo "myshellname=$(echo $myshell| awk -F '/' '{print $NF}')" >> "$myscripts" 2680 | echo "myready=1" >> "$myscripts" 2681 | echo "mynum=0" >> "$myscripts" 2682 | echo "myup=\$1" >> "$myscripts" 2683 | echo 'echo "pid=$$" > "/tmp/wan_start.pid"' >> "$myscripts" 2684 | echo 'while [ "$mynum" -lt 120 ];do' >> "$myscripts" 2685 | echo ' [ -x "$myshell" ] && myready=0 && break' >> "$myscripts" 2686 | echo " mynum=\$((\$mynum+1))" >> "$myscripts" 2687 | echo " sleep 1" >> "$myscripts" 2688 | echo "done" >> "$myscripts" 2689 | echo "myshellproc=\$(ps | grep -v grep | grep -o \$myshellname)" >> "$myscripts" 2690 | echo 'if [ "$myup" == "up" -a "$myready" -eq 0 -a -z "$myshellproc" ];then' >> "$myscripts" 2691 | echo ' "$myshell" update' >> "$myscripts" 2692 | echo "fi" >> "$myscripts" 2693 | elif iseq "$myscripts" "/etc/hotplug.d/iface/99-sharealiddns";then 2694 | echo 'logger "ACTION==========$ACTION==========INTERFACE==========$INTERFACE"' >> "$myscripts" 2695 | echo "myshell=$myshell" >> "$myscripts" 2696 | echo "myshellname=$(echo $myshell| awk -F '/' '{print $NF}')" >> "$myscripts" 2697 | echo "myready=1" >> "$myscripts" 2698 | echo "mynum=0" >> "$myscripts" 2699 | echo '[ "$ACTION" == "ifup" -a "$INTERFACE" == "wan" ] || exit 0' >> "$myscripts" 2700 | echo 'echo "pid=$$" > "/tmp/wan_start.pid"' >> "$myscripts" 2701 | echo 'while [ "$mynum" -lt 120 ];do' >> "$myscripts" 2702 | echo ' [ -x "$myshell" ] && myready=0 && break' >> "$myscripts" 2703 | echo " mynum=\$((\$mynum+1))" >> "$myscripts" 2704 | echo " sleep 1" >> "$myscripts" 2705 | echo "done" >> "$myscripts" 2706 | echo "myshellproc=\$(ps | grep -v grep | grep -o \$myshellname)" >> "$myscripts" 2707 | echo 'if [ "$myready" -eq 0 -a -z "$myshellproc" ];then' >> "$myscripts" 2708 | echo ' "$myshell" update' >> "$myscripts" 2709 | echo "fi" >> "$myscripts" 2710 | elif iseq "$myscripts" "/etc/init.d/sharealiddns";then 2711 | echo "START=99" >> "$myscripts" 2712 | echo "STOP=50" >> "$myscripts" 2713 | echo "myshell=$myshell" >> "$myscripts" 2714 | echo 'logger "$myshell==========runing"' >> "$myscripts" 2715 | echo 'restart() { "$myshell" restart; }' >> "$myscripts" 2716 | echo 'start() { "$myshell" start; }' >> "$myscripts" 2717 | echo 'stop() { "$myshell" stop; }' >> "$myscripts" 2718 | fi 2719 | else 2720 | RMSPACEKEYFILE "$myscripts" "myshell" 2721 | myshell=$(exurl $myshell) 2722 | sed -i "s/^myshell=.*/myshell=${myshell}/g" "$myscripts" 2723 | fi 2724 | RMSPACEKEYFILE "$myscripts" "myshell" 2725 | RMSPACEROWFILE "$myscripts" 2726 | chmod +x "$myscripts" 2727 | elif iseq "$mymode" "d";then 2728 | RMSPACEKEYFILE "$myscripts" "myshell" 2729 | RMSPACEROWFILE "$myscripts" 2730 | 2731 | if [ -f "$myscripts" ];then 2732 | if iseq "$myscripts" "/etc/storage/post_wan_script.sh";then 2733 | RMCURROWTOLISTFILE "$myscripts" "myshell" 14 2734 | elif iseq "$myscripts" "/jffs/scripts/wan-start";then 2735 | RMCURROWTOLISTFILE "$myscripts" "myshell" 14 2736 | elif iseq "$myscripts" "/etc/hotplug.d/iface/99-sharealiddns";then 2737 | for f in `ls /etc/hotplug.d/iface/99-sharealiddns* 2>&1 | grep -E '99-sharealiddns'`;do 2738 | if [ -f "$f" ];then 2739 | rm -f "$f" 2740 | fi 2741 | done 2742 | elif iseq "$myscripts" "/etc/init.d/sharealiddns";then 2743 | for f in `ls /etc/init.d/sharealiddns* 2>&1 | grep -E 'sharealiddns'`;do 2744 | if [ -f "$f" ];then 2745 | rm -f "$f" 2746 | fi 2747 | done 2748 | else 2749 | RMROWFILE "$myscripts" "myshell" 2750 | RMROWFILE "$myscripts" "myshellname" 2751 | RMROWFILE "$myscripts" "myshellproc" 2752 | #del old 2753 | RMROWFILE "$myscripts" "myservice" 2754 | RMROWFILE "$myscripts" "wan_start" 2755 | RMROWFILE "$myscripts" "restart_dhcp6c" 2756 | RMSPACEROWFILE "$myscripts" 2757 | fi 2758 | fi 2759 | fi 2760 | } 2761 | #====================================================================================== 2762 | get_wan_startPID(){ 2763 | local pid="0" 2764 | if iseq "$OS_TYPE" "merlin" || iseq "$OS_TYPE" "padavan" || iseq "$OS_TYPE" "openwrt" || iseq "$OS_TYPE" "pandorabox";then 2765 | if [ -f "$iswan_start" ];then 2766 | pid=$(cat "$iswan_start" | grep -w "pid" | RMSTRING "pid=" | TRIM) 2767 | if isNotEmpty "$pid" && check_number "$pid";then 2768 | echo "$pid" 2769 | else 2770 | echo "0" 2771 | fi 2772 | else 2773 | echo "999" 2774 | fi 2775 | else 2776 | echo "999" 2777 | fi 2778 | } 2779 | #====================================================================================== 2780 | get_dhcp6cPID(){ 2781 | local PID="" 2782 | PID=$(ps | grep -v grep | tr 'A-Z' 'a-z' | grep -wE 'odhcp6c|dhcp6c' | awk -F ' ' '{print $1}' | tail -n1) 2783 | if isNotEmpty "$PID" && check_number "$PID";then 2784 | echo "$PID" 2785 | else 2786 | echo "0" 2787 | fi 2788 | } 2789 | #====================================================================================== 2790 | do_pppoe(){ 2791 | if iseq "$OS_TYPE" "merlin";then 2792 | if iseq "$1" "ipv46";then 2793 | logs "=========================restart_wan=========================" "" "rl" "w" 2794 | service restart_wan >/dev/null 2>&1 2795 | if isne "$(nvram get ipv6_service | tr 'A-Z' 'a-z')" "disabled" && iseq "$isipv6_domain" 1 && iseq "$isIPV6" 0;then 2796 | logs "Force restart dhcp6c to get the correct IPV6 IP[强制重启dhcp6c以获取正确的IPV6 IP]" "" "rl" "w" 2797 | logs "FIX=========================restart_dhcp6c=========================FIX" "" "rl" "w" 2798 | service restart_dhcp6c >/dev/null 2>&1 2799 | fi 2800 | elif iseq "$1" "ipv4";then 2801 | logs "=========================restart_wan=========================" "" "rl" "w" 2802 | service restart_wan >/dev/null 2>&1 2803 | elif iseq "$1" "ipv6";then 2804 | if isne "$(nvram get ipv6_service | tr 'A-Z' 'a-z')" "disabled" && iseq "$isipv6_domain" 1 && iseq "$isIPV6" 0;then 2805 | logs "Force restart dhcp6c to get the correct IPV6 IP[强制重启dhcp6c以获取正确的IPV6 IP]" "" "rl" "w" 2806 | logs "FIX=========================restart_dhcp6c=========================FIX" "" "rl" "w" 2807 | service restart_dhcp6c >/dev/null 2>&1 2808 | fi 2809 | fi 2810 | elif iseq "$OS_TYPE" "padavan";then 2811 | logs "=========================restart_wan=========================" "" "rl" "w" 2812 | restart_wan >/dev/null 2>&1 2813 | elif iseq "$OS_TYPE" "openwrt" || iseq "$OS_TYPE" "pandorabox";then 2814 | logs "=========================ifup wan=========================" "" "rl" "w" 2815 | ifup wan >/dev/null 2>&1 2816 | fi 2817 | } 2818 | #====================================================================================== 2819 | get_externalIP(){ 2820 | local r=1;local i=1;local j=3;local wp="";local pl="";local n=1;local g="" 2821 | externalIP4="";externalIP6="";wanstartPID=0;dhcp6cPID=0 2822 | #get external IP4 2823 | if iseq "$isipv4_domain" 1;then 2824 | logs "Detecting external IPV4 IP[正在探测外网IPV4 IP]" "" "yb" "t" 2825 | wp="";r=1;i=1;n=1;j=$(echo "$u4" | ROWTOCOLUMN | RMSURPLUSSPACE | awk 'END{print NR}') 2826 | for u in $u4;do 2827 | n=$(sadd $n 1) 2828 | if iseq $(($n % 2)) 1;then 2829 | g="wget" 2830 | logs "Try to get external IPv4 IP with $g..." "" "vl" "t" 2831 | else 2832 | g="curl" 2833 | logs "Try to get external IPv4 IP with $g..." "" "vl" "t" 2834 | fi 2835 | wp=$(get_url_cmd $u 3 ipv4 $g) 2836 | wanstartPID=$(get_wan_startPID) 2837 | if isNotEmpty "$wp" && public_ipv4_check "$wp" && isgt "$wanstartPID" 0;then 2838 | logs "RIGHT=>$i/$j:externalIP4[${wp}]-wanstartPID[${wanstartPID}]-[$u]" "" "yl" "t" 2839 | externalIP4="$wp" && r=0 && break 2840 | else 2841 | logs "ERROR=>$i/$j:externalIP4[${wp}]-wanstartPID[${wanstartPID}]-[$u]" "" "yl" "t" 2842 | if isgt "$i" 10;then 2843 | do_pppoe "ipv46" 2844 | go_sleep 15 2845 | logs "Continue to detection the network..." "" "yb" "t" 2846 | fi 2847 | fi 2848 | isge "$i" "$j" && break 2849 | i=$(sadd $i 1) 2850 | done 2851 | if isEmpty "$wp";then 2852 | r=1;i=1;j=3 2853 | while :;do 2854 | if iseq "$wan_ifname" "";then 2855 | pl=$($IP2 addr show | sed -n '/inet/{s!.*inet* !!;s!/.*!!p}' | sed 's/peer.*//' | grep -v 'inet6') 2856 | else 2857 | pl=$($IP2 addr show dev $wan_ifname | sed -n '/inet/{s!.*inet* !!;s!/.*!!p}' | sed 's/peer.*//' | grep -v 'inet6') 2858 | fi 2859 | for p in $pl;do 2860 | p=$(echo $p | TRIMALL) 2861 | isNotEmpty "$p" && public_ipv4_check "$p" && wp="$p" && break 2862 | done 2863 | wanstartPID=$(get_wan_startPID) 2864 | if isNotEmpty "$wp" && isgt "$wanstartPID" 0;then 2865 | logs "RIGHT=>$i/$j:externalIP4[${wp}]-wanstartPID[${wanstartPID}]" "" "yl" "t" 2866 | externalIP4="$wp" && r=0 && break 2867 | else 2868 | logs "ERROR=>$i/$j:externalIP4[${wp}]-wanstartPID[${wanstartPID}]" "" "yl" "t" 2869 | do_pppoe "ipv46" 2870 | go_sleep 15 2871 | logs "Continue to detection the network..." "" "yb" "t" 2872 | fi 2873 | isge "$i" "$j" && break 2874 | i=$(sadd $i 1) 2875 | done 2876 | fi 2877 | if isne "$r" 0;then 2878 | logs "External IPv4 IP undetectable[检测不到外网IPV4 IP]" "" "ra" "w" 2879 | do_cron "$ID_CRU" "a" "$cron_File" "month=* week=* day=* hour=* min=1" "min" "$scripts_sh" 2880 | return 1 2881 | fi 2882 | else 2883 | wanstartPID=$(get_wan_startPID) 2884 | fi 2885 | 2886 | if iseq "$isipv6_domain" 0 || iseq "$isIPV6" 1;then 2887 | dhcp6cPID=$(get_dhcp6cPID) 2888 | return 0 2889 | fi 2890 | #get external IP6 2891 | logs "Detecting external IPV6 IP[正在探测外网IPV6 IP]" "" "yb" "t" 2892 | wp="";r=1;i=1;n=1;j=$(echo "$u6" | ROWTOCOLUMN | RMSURPLUSSPACE | awk 'END{print NR}') 2893 | for u in $u6;do 2894 | n=$(sadd $n 1) 2895 | if iseq $(($n % 2)) 1;then 2896 | g="wget" 2897 | logs "Try to get external IPv6 IP with $g..." "" "vl" "t" 2898 | else 2899 | g="curl" 2900 | logs "Try to get external IPv6 IP with $g..." "" "vl" "t" 2901 | fi 2902 | wp=$(get_url_cmd $u 3 ipv6 $g) 2903 | dhcp6cPID=$(get_dhcp6cPID) 2904 | if isNotEmpty "$wp" && public_ipv6_check "$wp" && isgt "$dhcp6cPID" 0;then 2905 | logs "RIGHT=>$i/$j:externalIP6[${wp}]-dhcp6cPID[${dhcp6cPID}]-[$u]" "" "yl" "t" 2906 | externalIP6="$wp" && r=0 && break 2907 | else 2908 | logs "ERROR=>$i/$j:externalIP6[${wp}]-dhcp6cPID[${dhcp6cPID}]-[$u]" "" "yl" "t" 2909 | if isgt "$i" 10;then 2910 | do_pppoe "ipv6" 2911 | go_sleep 15 2912 | logs "Continue to detection the network..." "" "yb" "t" 2913 | fi 2914 | fi 2915 | isge "$i" "$j" && break 2916 | i=$(sadd $i 1) 2917 | done 2918 | if isEmpty "$wp";then 2919 | r=1;i=1;j=3 2920 | while :;do 2921 | if iseq "$wan_ifname" "";then 2922 | pl=$($IP2 addr show | sed -n '/inet/{s!.*inet6* !!;s!/.*!!p}' | sed 's/peer.*//' | grep -v '^fe80' | grep -v 'inet') 2923 | else 2924 | pl=$($IP2 addr show dev $wan_ifname | sed -n '/inet/{s!.*inet6* !!;s!/.*!!p}' | sed 's/peer.*//' | grep -v '^fe80' | grep -v 'inet') 2925 | fi 2926 | for p in $pl;do 2927 | p=$(echo $p | TRIMALL) 2928 | isNotEmpty "$p" && public_ipv6_check "$p" && wp="$p" && break 2929 | done 2930 | dhcp6cPID=$(get_dhcp6cPID) 2931 | if isNotEmpty "$wp" && isgt "$dhcp6cPID" 0;then 2932 | logs "RIGHT=>$i/$j:externalIP6[${wp}]-dhcp6cPID[${dhcp6cPID}]" "" "yl" "t" 2933 | externalIP6="$wp" && r=0 && break 2934 | else 2935 | logs "ERROR=>$i/$j:externalIP6[${wp}]-dhcp6cPID[${dhcp6cPID}]" "" "yl" "t" 2936 | do_pppoe "ipv6" 2937 | go_sleep 15 2938 | logs "Continue to detection the network..." "" "yb" "t" 2939 | fi 2940 | isge "$i" "$j" && break 2941 | i=$(sadd $i 1) 2942 | done 2943 | fi 2944 | iseq "$r" 0 && return 0 2945 | logs "External not have IPV6 IP..." "" "ra" "w" 2946 | logs "外网确实没有IPV6 IP,请检查:" "" "ra" "w" 2947 | logs " 1、路由器或光猫设置是否正确。" "" "ra" "w" 2948 | logs " 2、通信运营商是否推送IPV6 IP。" "" "ra" "w" 2949 | logs " 3、其他未知原因导致无法探测到IPV6 IP。" "" "ra" "w" 2950 | rm -f "$FL" 2951 | exit 1 2952 | } 2953 | #====================================================================================== 2954 | do_run_check(){ 2955 | iseq "$wanstartPID" "$(get_wan_startPID)" && return 0 2956 | logs "FIX======[External IP has changed, scripts automatically enter the background mode, please do not intervene.]======FIX" "" "rl" "w" 2957 | logs "FIX======[外网IP已经发生改变,脚本自动进入后台运行模式,请不要做任何干预。]======FIX" "" "rl" "w" 2958 | isRUN=1 2959 | return 1 2960 | } 2961 | #====================================================================================== 2962 | do_wan_state_check(){ 2963 | 2964 | local n="$1";local rs="";local rp="";local ep=2 2965 | if [ "$n" == "0" ];then 2966 | rs="$(nvram get wan0_realip_state)" 2967 | if [ "$rs" == "2" ];then 2968 | rp="$(nvram get wan0_realip_ip)" 2969 | if [ "$rp" == "$(nvram get wan0_ipaddr)" ];then 2970 | ep=1 2971 | else 2972 | ep=0 2973 | fi 2974 | else 2975 | ep=2 2976 | fi 2977 | elif [ "$n" == "1" ];then 2978 | rs="$(nvram get wan1_realip_state)" 2979 | if [ "$rs" == "2" ];then 2980 | rp="$(nvram get wan1_realip_ip)" 2981 | if [ "$rp" == "$(nvram get wan1_ipaddr)" ];then 2982 | ep=1 2983 | else 2984 | ep=0 2985 | fi 2986 | else 2987 | ep=2 2988 | fi 2989 | fi 2990 | echo "$rp" 2991 | } 2992 | #====================================================================================== 2993 | do_init(){ 2994 | if [ "$2" != "setconf" -a "$2" != "start" -a "$2" != "stop" -a "$2" != "restart" -a "$2" != "check" -a "$2" != "update" -a "$2" != "again" -a "$2" != "add" -a "$2" != "removeall" -a "$2" != "remove" -a "$2" != "status" -a "$2" != "monitor" -a "$2" != "checkwanip" -a "$2" != "showlog" -a "$2" != "kill" -a "$2" != "client" ];then 2995 | logs "Usage: $1 setconf|start|stop|restart|check|update|again|add|removeall|remove|status|monitor|checkwanip|showlog|kill|client" "" "yb" "w" >&2 2996 | rm -f "$FL" 2997 | exit 1 2998 | fi 2999 | local i=1;local j=30;local r="" 3000 | 3001 | if iseq "$OS_TYPE" "merlin";then 3002 | nvram set jffs2_enable=1 3003 | nvram set jffs2_scripts=1 3004 | nvram commit 3005 | [ -d "/jffs/scripts" ] && chmod +x /jffs/scripts/* 3006 | until [ "$i" -gt "$j" ];do 3007 | [ "$(nvram get success_start_service)" == "1" ] && break 3008 | sleep 1 3009 | i=$(sadd $i 1) 3010 | done 3011 | ETH="br0" 3012 | iseq "$(nvram get ipv6_service | tr 'A-Z' 'a-z')" "disabled" && isIPV6=1 3013 | elif iseq "$OS_TYPE" "padavan";then 3014 | if [ "$(nvram get wan_ppp_alcp)" != "1" -o "$(nvram get wan_ppp_echo_en)" != "1" ];then 3015 | nvram set wan_ppp_alcp=1 3016 | nvram set wan_ppp_echo_en=1 3017 | nvram set wan_ppp_echo_failure=6 3018 | nvram set wan_ppp_echo_interval=30 3019 | nvram commit 3020 | restart_wan >/dev/null 2>&1 3021 | fi 3022 | cron_File=$(ls /etc/storage/cron/crontabs) 3023 | if [ -n "/etc/storage/cron/crontabs/$cron_File" ];then 3024 | cron_File="/etc/storage/cron/crontabs/$cron_File" 3025 | fi 3026 | ETH="br0" 3027 | isEmpty "$(nvram get ip6_service | tr 'A-Z' 'a-z')" && isIPV6=1 3028 | elif iseq "$OS_TYPE" "openwrt" || iseq "$OS_TYPE" "pandorabox";then 3029 | r="1" 3030 | for w in wan wan6;do 3031 | { 3032 | local p=$(uci get network.${w}.proto) 3033 | local u=$(uci get network.${w}.username) 3034 | local k=$(uci get network.${w}.keepalive) 3035 | } 2>/dev/null 3036 | if [ "$p" == "pppoe" -a -n "$u" ];then 3037 | if isEmpty "$k";then 3038 | uci set network.${w}.keepalive='3 5' 3039 | r="0" 3040 | fi 3041 | fi 3042 | done 3043 | if iseq "$r" 0;then 3044 | uci commit 3045 | /etc/init.d/network restart 3046 | fi 3047 | cron_File=$(ls /etc/crontabs) 3048 | if [ -n "/etc/crontabs/$cron_File" ];then 3049 | cron_File="/etc/crontabs/$cron_File" 3050 | else 3051 | cron_File="/etc/crontabs/root" 3052 | echo "" > "$cron_File" 3053 | fi 3054 | ETH="br-lan" 3055 | iseq "$(cat /etc/config/network | set_lowercase | grep -w 'ipv6' | awk '{print $3}' | RMSTRING "'" | RMSTRING '"')" 0 && isIPV6=1 3056 | fi 3057 | 3058 | if isexists "sort";then 3059 | SORT="$existspath" 3060 | logs "$SORT exists=0" "" "y" 3061 | else 3062 | logs "You have to install sort[你必须安装sort]" "" "rb" "e" 3063 | rm -f "$FL" 3064 | exit 1 3065 | fi 3066 | 3067 | if isexists "nslookup";then 3068 | NSLOOKUP="$existspath" 3069 | logs "$NSLOOKUP exists=0" "" "y" 3070 | else 3071 | logs "You have to install nslookup[你必须安装nslookup]" "" "rb" "e" 3072 | rm -f "$FL" 3073 | exit 1 3074 | fi 3075 | 3076 | if isexists "/usr/bin/openssl";then 3077 | OPENSSL="$existspath" 3078 | elif isexists "/usr/sbin/openssl";then 3079 | OPENSSL="$existspath" 3080 | elif isexists "/bin/openssl";then 3081 | OPENSSL="$existspath" 3082 | elif isexists "/sbin/openssl";then 3083 | OPENSSL="$existspath" 3084 | elif isexists "openssl";then 3085 | OPENSSL="$existspath" 3086 | else 3087 | logs "You have to install openssl[你必须安装openssl]" "" "rb" "e" 3088 | rm -f "$FL" 3089 | exit 1 3090 | fi 3091 | 3092 | local str1="A";local str2="a" 3093 | if [ -n "$(echo $str1 | $OPENSSL dgst -sha1 -hmac $str2 -binary | $OPENSSL base64)" ];then 3094 | logs "$OPENSSL exists=0" "" "y" 3095 | else 3096 | logs "$OPENSSL is unavailable[${OPENSSL}无法使用]" "" "rb" "e" 3097 | rm -f "$FL" 3098 | exit 1 3099 | fi 3100 | 3101 | if isexists "/usr/bin/ip";then 3102 | IP2="$existspath" 3103 | logs "$IP2 exists=0" "" "y" 3104 | elif isexists "/usr/sbin/ip";then 3105 | IP2="$existspath" 3106 | logs "$IP2 exists=0" "" "y" 3107 | elif isexists "/bin/ip";then 3108 | IP2="$existspath" 3109 | logs "$IP2 exists=0" "" "y" 3110 | elif isexists "/sbin/ip";then 3111 | IP2="$existspath" 3112 | logs "$IP2 exists=0" "" "y" 3113 | elif isexists "ip";then 3114 | IP2="$existspath" 3115 | logs "$IP2 exists=0" "" "y" 3116 | else 3117 | logs "You have to install ip[你必须安装ip]" "" "rb" "e" 3118 | rm -f "$FL" 3119 | exit 1 3120 | fi 3121 | 3122 | if isexists "/usr/bin/wget";then 3123 | WGET="$existspath" 3124 | logs "$WGET exists=0" "" "y" 3125 | iswget=0 3126 | elif isexists "/usr/sbin/wget";then 3127 | WGET="$existspath" 3128 | logs "$WGET exists=0" "" "y" 3129 | iswget=0 3130 | elif isexists "/bin/wget";then 3131 | WGET="$existspath" 3132 | logs "$WGET exists=0" "" "y" 3133 | iswget=0 3134 | elif isexists "/sbin/wget";then 3135 | WGET="$existspath" 3136 | logs "$WGET exists=0" "" "y" 3137 | iswget=0 3138 | elif isexists "wget";then 3139 | WGET="$existspath" 3140 | logs "$WGET exists=0" "" "y" 3141 | iswget=0 3142 | else 3143 | logs "You did not install wget[你没有安装wget]" "" "y" "w" 3144 | fi 3145 | 3146 | if isexists "/usr/bin/curl";then 3147 | CURL="$existspath" 3148 | logs "$CURL exists=0" "" "y" 3149 | iscurl=0 3150 | elif isexists "/usr/sbin/curl";then 3151 | CURL="$existspath" 3152 | logs "$CURL exists=0" "" "y" 3153 | iscurl=0 3154 | elif isexists "/bin/curl";then 3155 | CURL="$existspath" 3156 | logs "$CURL exists=0" "" "y" 3157 | iscurl=0 3158 | elif isexists "/sbin/curl";then 3159 | CURL="$existspath" 3160 | logs "$CURL exists=0" "" "y" 3161 | iscurl=0 3162 | elif isexists "curl";then 3163 | CURL="$existspath" 3164 | logs "$CURL exists=0" "" "y" 3165 | iscurl=0 3166 | else 3167 | logs "You did not install curl[你没有安装curl]" "" "y" "w" 3168 | fi 3169 | 3170 | if isEmpty "$WGET" && isEmpty "$CURL";then 3171 | logs "You have to install wget or curl[你必须安装wget或curl]" "" "rb" "e" 3172 | rm -f "$FL" 3173 | exit 1 3174 | fi 3175 | 3176 | if iseq "$OS_TYPE" "merlin" || iseq "$OS_TYPE" "padavan";then 3177 | if isNotEmpty "$(echo $scripts_mount_name | grep -oE 'mnt|media')";then 3178 | r=$(basename $scripts_mount_name) 3179 | if echo -e "$r" | grep -q '^[a-zA-Z0-9]\+$' && isge $(str_total "$r") 5;then 3180 | r="" 3181 | else 3182 | logs "Low-level error: USB partition volume label must be set to English or numeric, and the total number must exceed 4 digits." "" "ra" "e" 3183 | logs "低级错误:USB分区卷标必须设置为英文或数字,而且总数必须超过4位!" "" "ra" "e" 3184 | rm -f "$FL" 3185 | exit 1 3186 | fi 3187 | fi 3188 | fi 3189 | 3190 | if [ "$2" == "setconf" ];then 3191 | set_aliddns_conf 3192 | rm -f "$FL" 3193 | exit 1 3194 | fi 3195 | 3196 | if iseq "$2" "showlog";then 3197 | do_showlog 3198 | rm -f "$FL" 3199 | exit 1 3200 | fi 3201 | 3202 | if [ ! -f "$aliddns_conf" ];then 3203 | logs "No configuration file [account.conf] can be found, exit." "" "rb" "e" 3204 | rm -f "$FL" 3205 | exit 1 3206 | fi 3207 | 3208 | mkdir -p "$aliddns_root/conf" 3209 | mkdir -p "$aliddns_root/log" 3210 | del_tmpfile "$aliddns_root/conf" "aliddns.conf" 2>/dev/null 3211 | 3212 | if iseq "$OS_TYPE" "merlin" || iseq "$OS_TYPE" "padavan";then 3213 | for s in "/tmp/syslog.log" "/tmp/syslog.log-1" "/jffs/syslog.log" "/jffs/syslog.log-1";do 3214 | [ -f "$s" ] && [ `wc -c "$s" | awk '{print $1}'` -ge 262191 ] && rm -rf "$s" 3215 | done 3216 | fi 3217 | 3218 | if [ -d "/root" ];then 3219 | rm -rf "/root/$scripts_name" 3220 | ln -sf "$scripts_sh" "/root/$scripts_name" 3221 | chmod +x "/root/$scripts_name" 3222 | elif [ -d "/home/root" ];then 3223 | rm -rf "/home/root/$scripts_name" 3224 | ln -sf "$scripts_sh" "/home/root/$scripts_name" 3225 | chmod +x "/home/root/$scripts_name" 3226 | fi 3227 | 3228 | set_scripts "a" 3229 | 3230 | return 0 3231 | } 3232 | #====================================================================================== 3233 | do_begin(){ 3234 | if do_init "$1" "$2" "$3" && logs "" "$LS" && get_aliddns_options && set_ipv6_config && get_wan_info && get_externalIP;then 3235 | goto_ping_wake 3236 | nslookup_dns=$(do_speed_dns "$dns") 3237 | case "$2" in 3238 | check) 3239 | goto_check "$3" 3240 | show_success "$2" 3241 | do_realupdate "a" "$isfailed" "$2" 3242 | ;; 3243 | start|restart|update|add) 3244 | goto_start "$3" 3245 | show_success "$2" 3246 | do_realupdate "a" "$isfailed" "$2" 3247 | ;; 3248 | stop) 3249 | do_realupdate "d" "$isfailed" "$2" 3250 | ;; 3251 | again) 3252 | goto_again "$2" 3253 | ;; 3254 | status) 3255 | goto_status "$3" "$4" 3256 | show_success "$2" 3257 | do_realupdate "a" "$isfailed" "$2" 3258 | ;; 3259 | monitor) 3260 | while :;do 3261 | goto_start "$3" 3262 | show_success "$2" 3263 | go_sleep 30 3264 | echo "" 3265 | done 3266 | do_realupdate "a" "$isfailed" "$2" 3267 | ;; 3268 | remove) 3269 | goto_remove "$3" 3270 | show_success "$2" 3271 | do_realupdate "a" "$isfailed" "$2" 3272 | iseq "$3" 0 && do_realupdate "d" "$isfailed" "$2" 3273 | ;; 3274 | removeall) 3275 | goto_remove 0 3276 | show_success "$2" 3277 | do_realupdate "d" "$isfailed" "$2" 3278 | ;; 3279 | checkwanip) 3280 | goto_checkwanip "$3" 3281 | show_success "$2" 3282 | do_realupdate "a" "$isfailed" "$2" 3283 | ;; 3284 | kill) 3285 | do_realupdate "d" "$isfailed" "$2" 3286 | ;; 3287 | client) 3288 | do_client "$2" "$3" 3289 | ;; 3290 | *) 3291 | esac 3292 | fi 3293 | } 3294 | #====================================================================================== 3295 | do_begin "$ARGS0" "$ARGS1" "$ARGS2" "$ARGS3" 3296 | rm -f "$FL" 3297 | exit 0 3298 | #====================================================================================== 3299 | #====================================================================================== 3300 | --------------------------------------------------------------------------------