Created
May 29, 2012 08:17
-
-
Save upsuper/2823246 to your computer and use it in GitHub Desktop.
将 DNSPod 上指定子域名指向当前本机 IP 的脚本
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/bash | |
# 将 DNSPOD 上指定子域名指向当前本机 IP 的脚本 | |
# | |
# 依赖: | |
# urlencode: http://www.shelldorado.com/scripts/cmds/urlencode | |
# jsawk: https://github.com/micha/jsawk | |
# 配置信息 | |
EMAIL="" | |
PASSWORD="" | |
DOMAIN="" | |
SUBDOMAIN="" | |
USERAGENT="update self/0.3.2 ([email protected])" | |
# 检查间隔 | |
INTERVAL=30 | |
# 记录文件 | |
LOGFILE="" | |
# 进行 URL 编码 | |
EMAIL="$(echo "$EMAIL" | urlencode)" | |
PASSWORD="$(echo "$PASSWORD" | urlencode)" | |
# 去除字符串首位的引号 | |
remove_quote() | |
{ | |
local str | |
read str | |
echo ${str:1:${#str}-2} | |
} | |
# 发起 API 请求 | |
# 参数:$url $other | |
api_request() | |
{ | |
url="https://dnsapi.cn" | |
url+="$1" | |
shift | |
curl -s -A "$USERAGENT" \ | |
-d login_email="$EMAIL" -d login_password="$PASSWORD" \ | |
-d format=json -d lang=en -d error_on_empty=no \ | |
$@ $url | |
} | |
# 获取当前外网 IP | |
get_current_ip() | |
{ | |
curl -s http://ifconfig.me/ip | grep '^[0-9]\+\(\.[0-9]\+\)\{3\}$' | |
} | |
# 获取 Domain ID | |
# 参数:$domain | |
get_domain_id() | |
{ | |
api_request "/Domain.List" | \ | |
jsawk -q "..domains.[?name='$1']..id" | |
} | |
# 获取 Record ID | |
# 参数:$domain_id $sub_domain | |
get_record_id() | |
{ | |
api_request "/Record.List" -d domain_id="$1" | \ | |
jsawk -q "..records.[?name='$2']..id" | |
} | |
# 创建新记录 | |
# 参数:$domain_id $sub_domain $record_type $record_line $value | |
record_create() | |
{ | |
local result=$( | |
api_request "/Record.Create" \ | |
-d domain_id="$1" \ | |
-d sub_domain="$2" \ | |
-d record_type="$3" \ | |
-d record_line="$4" \ | |
-d value="$5") | |
if [ $? != 0 ] | |
then | |
return -1 | |
fi | |
local code=$(echo $result | jsawk -q "..status..code" | remove_quote) | |
local message=$(echo $result | jsawk -q "..status..message" | remove_quote) | |
echo "$message" | |
if [ "$code" = "1" ] | |
then | |
return 0 | |
else | |
return -$code | |
fi | |
} | |
# 修改存在的记录 | |
# 参数:$domain_id $record_id $sub_domain $record_type $record_line $value | |
record_modify() | |
{ | |
local result=$( | |
api_request "/Record.Modify" \ | |
-d domain_id="$1" \ | |
-d record_id="$2" \ | |
-d sub_domain="$3" \ | |
-d record_type="$4" \ | |
-d record_line="$5" \ | |
-d value="$6") | |
if [ $? != 0 ] | |
then | |
return -1 | |
fi | |
local code=$(echo $result | jsawk -q "..status..code" | remove_quote) | |
local message=$(echo $result | jsawk -q "..status..message" | remove_quote) | |
echo "$message" | |
if [ "$code" = "1" ] | |
then | |
return 0 | |
else | |
return $code | |
fi | |
} | |
# 日志记录 | |
log() | |
{ | |
echo [$(date +%Y-%m-%dT%H:%M:%S)] "$1" | |
} >> $LOGFILE | |
# 自动检测IP变化 | |
check_and_update() | |
{ | |
trap '' HUP | |
trap 'log terminate; exit 0' TERM | |
while true | |
do | |
sleep $INTERVAL | |
new_ip=$(get_current_ip) | |
if [ $? != 0 ] | |
then | |
continue | |
fi | |
if [ "$new_ip" != "$current_ip" -a "$new_ip" != "" ] | |
then | |
log "detect ip change: $current_ip => $new_ip" | |
current_ip="$new_ip" | |
# 如果IP发生变化则修改 | |
result=$(record_modify $domain_id $record_id \ | |
$SUBDOMAIN A 默认 $current_ip) | |
result_code=$? | |
log "modify result: $result_code, $result" | |
fi | |
done | |
} | |
domain_id=$(get_domain_id $DOMAIN) | |
echo domain id: $domain_id | |
record_id=$(get_record_id $domain_id $SUBDOMAIN | remove_quote) | |
echo record id: $record_id | |
current_ip=$(get_current_ip) | |
echo current ip: $current_ip | |
if [ "$record_id" = "" ] | |
then | |
# 记录不存在则创建 | |
result=$(record_create $domain_id \ | |
$SUBDOMAIN A 默认 $current_ip) | |
result_code=$? | |
else | |
# 记录存在则更新一次 | |
result=$(record_modify $domain_id $record_id \ | |
$SUBDOMAIN A 默认 $current_ip) | |
result_code=$? | |
fi | |
echo result: $result_code, $result | |
check_and_update & | |
log "daemon started, pid: $!" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment