前段时间买的树莓派用着一直很爽,不爽的动态DNS解析,这两天总是出现莫名其妙的问题。经过仔细排查与联系客服后,最终还是解决了问题。

但是在解决问题的过程中,因为白天要到公司,所以当DNS动态解析失败时,无法准确获得家里的公网IP地址。也就是说当DNS动态解析失败时,根本就无法从公网对家里的TP-LINK路由器进行远程管理。

So,动手写了下面这个脚本,与crontab来配合执行,实现了PPPOE拨号宽带IP地址变更后,将新IP地址推送到Prowl手机客户端的功能(有了家里路由器的新IP,就可以直接进行远程管理了)。

Prowl是一个Growl的iOS客户端,允许用户从Mac、Windows或其他应用程序向iPhone、iPad或iPod Touch进行消息推送。

脚本中未对各类型的异常进行处理,如有需要,请自行添加。另外,如果不希望使用Prowl,也可以稍微改一下脚本,向支持Push mail的邮箱中发送邮件,也可以达到实时提醒的目的。

代码 ip_push.py:

#!/usr/bin/env python
#coding=utf-8

import os, urllib, urllib2, cPickle

prowl_api_key = 'your_prowl_api_key'

strfilepath = os.path.dirname(os.path.realpath(__file__))

def get_ip():
	_api_addr = 'http://pv.sohu.com/cityjson?ie=utf-8'
	_request = urllib2.Request(_api_addr)
	_res = urllib2.urlopen(_request).readline()
	exec(_res[4:])
	return returnCitySN['cip']

def push_message(content, url):
	_api_addr = 'http://api.prowlapp.com/publicapi/add'
	_data = {
		'apikey':prowl_api_key,
		'application':'服务器IP地址更新',
		'url':url,
		'description':content,
	}
	_request = urllib2.Request(_api_addr)
	return urllib2.urlopen(_request, urllib.urlencode(_data)).read()

def check_up_update(ip_address):
	storefile = strfilepath + '/ip_push.dat'
	if os.path.exists(storefile):
		fp = open(storefile)
		old_ip_address = cPickle.load(fp)
		fp.close()
	else:
		old_ip_address = ''

	if ip_address != old_ip_address:
		fp = open(storefile, 'w')
		cPickle.dump(ip_address, fp)
		fp.close()
		return True
	else:
		return False

if __name__ == '__main__':
	ip_address = get_ip()
	if check_up_update(ip_address):
		message = '新的服务器IP地址更新为:' + ip_address
		url = 'http://' + ip_address + ':8080'
		print(message)
		print(push_message(message, url))

在树莓派的系统环境中编辑crontab:

crontab -e

添加下面行,每分钟执行脚本一次(依个人情况需要):

*/1 * * * * /scripts/ip_push.py