Skip to content

Instantly share code, notes, and snippets.

@upsuper
Created May 29, 2012 08:17
Show Gist options
  • Save upsuper/2823246 to your computer and use it in GitHub Desktop.
Save upsuper/2823246 to your computer and use it in GitHub Desktop.
将 DNSPod 上指定子域名指向当前本机 IP 的脚本
#!/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 (quanxunzhen@gmail.com)"
# 检查间隔
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