逍遥游

原文章在

不过我尝试安装openwrt 路由器上

首先openwrt 的路由器空间必须大,我是安装在u盘上的,可能要10M左右空间 ,python安装也占不少空间.

程序中用到阿里云的库, aliyunsdkcore 和aliyunsdkalidns , 之前有人用pip 安装,但是openwrt 上不能, 所以下载其源码,然后解压后, 把里面核心代码复制到 /usr/lib/python2.7/XXXX (后面路径不记得) ,我看见别人自己提取相关几个文件,放在当前目录也可以.

update_ip.py 这个基本上来自前面那个文章,只不过我因为跑在openwrt上, 所以我改了获取ip的方式,改有get_ip这个脚本获取.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#!/usr/bin/env python
# coding= utf-8

import subprocess
import os
import json
#from urllib2 import urlopen
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkalidns.request.v20150109 import DescribeDomainRecordsRequest
from aliyunsdkalidns.request.v20150109 import UpdateDomainRecordRequest

class DnsHandler:
# 从阿里云开发者后台获取Access_Key_Id和Access_Key_Secret
access_key_id = ""
access_key_secret = ""
region_id = "cn-hangzhou"


# 填入自己的域名
domain_name = ""
# 填入二级域名的RR值
rr_keyword = ""

# 解析记录类型,一般为A记录
record_type = "A"

# 用于储存解析记录的文件名
file_name = ".ip_addr"

client = None
record = None
current_ip = ''

# 初始化,获取client实例
def __init__(self):
self.client = AcsClient(
self.access_key_id,
self.access_key_secret,
self.region_id
)
self.record = self.get_record()
self.current_ip = self.get_current_ip()

# 如果公网IP发生变化,则自动修改阿里云解析记录
def reset(self):
if self.current_ip <> self.get_record_value():
# print self.current_ip
print self.update_record(self.current_ip)
self.get_record()

# 获取阿里云域名解析完整记录,并使用文件缓存
def get_record(self):
if os.path.isfile(self.file_name) :
file_handler = open(self.file_name, 'r')
r = file_handler.read()
file_handler.close()
else :
request = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest()
request.set_PageSize(10)
request.set_action_name("DescribeDomainRecords")
request.set_DomainName(self.domain_name)
request.set_RRKeyWord(self.rr_keyword)
request.set_TypeKeyWord(self.record_type)
r = self.client.do_action_with_exception(request)
file_handler = open(self.file_name, 'w')
file_handler.write(r)
file_handler.close()
return json.loads(r)

# 获取阿里云域名解析记录ID
def get_record_id(self) :
return self.record["DomainRecords"]["Record"][0]["RecordId"]

# 获取当前域名解析记录
def get_record_value(self) :
return self.record["DomainRecords"]["Record"][0]["Value"]

# 修改阿里云解析记录
def update_record(self, value):
request = UpdateDomainRecordRequest.UpdateDomainRecordRequest()
request.set_action_name("UpdateDomainRecord")
request.set_RecordId(self.get_record_id())
request.set_Type(self.record_type)
request.set_RR(self.rr_keyword)
request.set_Value(value)
return self.client.do_action_with_exception(request)

# 获取当前公网IP
def get_current_ip(self):
#ip,retcode=os.system('./get_ip')
out_bytes=subprocess.check_output('/root/get_ip')
out_text= out_bytes.decode('utf8')
out_text=out_text.replace("\n","")
#print out_text
#out_text.replace("\n","").replace("\r","")
return out_text
# //json.load(urlopen('http://jsonip.com'))['ip'


# 实例化类并启动更新程序
dns = DnsHandler()
dns.reset()
1
2
3
4
5
6
7
8
9

#!/bin/sh
# check ip change and update it

ip_regex="[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}"

ipaddr=$(ifconfig pppoe-wan | awk '/inet /{print $2}' |grep -o "$ip_regex" )

echo $ipaddr

然后加到cron 里面
*/15 * * * * python /root/update_ip.py