Created
February 25, 2020 10:53
-
-
Save uavana/33fdd2be2b41949e0c9b503bcd94409b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/sh | |
| # | |
| ############################################################# | |
| # AnripDdns v6.0.0 | |
| # | |
| # Dynamic DNS using DNSPod API | |
| # | |
| # Author: anrip<mail@anrip.com>, www.anrip.com/post/872 | |
| # Collaborators: ProfFan, https://github.com/ProfFan | |
| # | |
| # Usage: please refer to `ddnspod.sh` | |
| # | |
| ############################################################# | |
| # TokenID,Token | |
| arToken="" | |
| # Get WAN-IP | |
| arWanIp() { | |
| echo `ifconfig eth2.2 | grep 'inet addr' | cut -d: -f2 | awk '{print $1}'` | |
| } | |
| arWan0Ip() { | |
| local hostIp | |
| local lanIps="^$" | |
| lanIps="$lanIps|(^10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$)" | |
| lanIps="$lanIps|(^127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$)" | |
| lanIps="$lanIps|(^169\.254\.[0-9]{1,3}\.[0-9]{1,3}$)" | |
| lanIps="$lanIps|(^172\.(1[6-9]|2[0-9]|3[0-1])\.[0-9]{1,3}\.[0-9]{1,3}$)" | |
| lanIps="$lanIps|(^192\.168\.[0-9]{1,3}\.[0-9]{1,3}$)" | |
| case $(uname) in | |
| 'Linux') | |
| hostIp=$(ip -o -4 addr list | grep -Ev '\s(docker|lo)' | awk '{print $4}' | cut -d/ -f1 | grep -Ev "$lanIps") | |
| ;; | |
| 'Darwin') | |
| hostIp=$(ifconfig | grep "inet " | grep -v 127.0.0.1 | awk '{print $2}' | grep -Ev "$lanIps") | |
| ;; | |
| esac | |
| if [ -z "$hostIp" ]; then | |
| if type wget >/dev/null 2>&1; then | |
| hostIp=$(wget --quiet --output-document=- http://members.3322.org/dyndns/getip) | |
| else | |
| hostIp=$(curl -s http://members.3322.org/dyndns/getip) | |
| fi | |
| fi | |
| echo $hostIp | |
| } | |
| # Dnspod Bridge | |
| # Arg: type data | |
| arDdnsApi() { | |
| local agent="AnripDdns/6.0.0(mail@anrip.com)" | |
| local apiurl="https://dnsapi.cn/${1:?'Info.Version'}" | |
| local params="login_token=$arToken&format=json&$2" | |
| if type wget >/dev/null 2>&1; then | |
| wget --quiet --no-check-certificate --output-document=- --user-agent=$agent --post-data $params $apiurl | |
| else | |
| curl -s -A $agent -d $params $apiurl | |
| fi | |
| } | |
| # Fetch Domain Ip | |
| # Arg: domain | |
| arDdnsInfo() { | |
| local domainId | |
| local recordId | |
| local recordIp | |
| # Get domain ID | |
| domainId=$(arDdnsApi "Domain.Info" "domain=$1") | |
| domainId=$(echo $domainId | sed 's/.*"id":"\([0-9]*\)".*/\1/') | |
| # Get Record ID | |
| recordId=$(arDdnsApi "Record.List" "domain_id=$domainId&sub_domain=$2") | |
| recordId=$(echo $recordId | sed 's/.*"id":"\([0-9]*\)".*/\1/') | |
| # Last IP | |
| recordIp=$(arDdnsApi "Record.Info" "domain_id=$domainId&record_id=$recordId") | |
| recordIp=$(echo $recordIp | sed 's/.*,"value":"\([0-9\.]*\)".*/\1/') | |
| # Output IP | |
| case "$recordIp" in | |
| [1-9]*) | |
| echo $recordIp | |
| return 0 | |
| ;; | |
| *) | |
| echo "Get Record Info Failed!" | |
| return 1 | |
| ;; | |
| esac | |
| } | |
| # Update Domain Ip | |
| # Arg: main-domain sub-domain | |
| arDdnsUpdate() { | |
| local domainId | |
| local recordId | |
| local recordRs | |
| local recordIp | |
| local recordCd | |
| local hostIp=$(arWanIp) | |
| # Get domain ID | |
| domainId=$(arDdnsApi "Domain.Info" "domain=$1") | |
| domainId=$(echo $domainId | sed 's/.*"id":"\([0-9]*\)".*/\1/') | |
| # Get Record ID | |
| recordId=$(arDdnsApi "Record.List" "domain_id=$domainId&sub_domain=$2") | |
| recordId=$(echo $recordId | sed 's/.*"id":"\([0-9]*\)".*/\1/') | |
| # Update IP | |
| recordRs=$(arDdnsApi "Record.Ddns" "domain_id=$domainId&record_id=$recordId&sub_domain=$2&record_type=A&value=$hostIp&record_line=默认") | |
| recordIp=$(echo $recordRs | sed 's/.*,"value":"\([0-9\.]*\)".*/\1/') | |
| recordCd=$(echo $recordRs | sed 's/.*{"code":"\([0-9]*\)".*/\1/') | |
| # Output IP | |
| if [ "$recordIp" = "$hostIp" ]; then | |
| if [ "$recordCd" = "1" ]; then | |
| echo $recordIp | |
| return 0 | |
| fi | |
| # Echo error message | |
| echo $recordRs | sed 's/.*,"message":"\([^"]*\)".*/\1/' | |
| return 1 | |
| else | |
| echo "Update Failed! Please check your network." | |
| return 1 | |
| fi | |
| } | |
| # DDNS Check | |
| # Arg: Main Sub | |
| arDdnsCheck() { | |
| local postRs | |
| local lastIP | |
| local hostIp=$(arWanIp) | |
| echo "Updating Domain: $2.$1" | |
| echo "Host Ip: $hostIp" | |
| lastIP=$(arDdnsInfo "$1" "$2") | |
| if [ $? -eq 0 ]; then | |
| echo "lastIP: $lastIP" | |
| if [ "$lastIP" != "$hostIp" ]; then | |
| postRs=$(arDdnsUpdate "$1" "$2") | |
| if [ $? -eq 0 ]; then | |
| echo "postRs: $postRs" | |
| return 0 | |
| else | |
| echo "$postRs" | |
| return 1 | |
| fi | |
| fi | |
| echo "Last IP is the same as current IP!" | |
| return 1 | |
| fi | |
| echo "$lastIP" | |
| return 1 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment