Last active
December 14, 2015 11:39
-
-
Save JinnLynn/5080616 to your computer and use it in GitHub Desktop.
监控外部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
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
#! 强制默认编码为utf-8 | |
import sys | |
reload(sys) | |
sys.setdefaultencoding('utf8') | |
# 配置 | |
# SMTP服务器 用户 密码 | |
smtp_server = 'SMTP SERVER' | |
smtp_port = 25 | |
smtp_usr = 'SMTP USERNAME' | |
smtp_pwd = 'SMTP PASSWORD' | |
# 发送接受邮箱地址 | |
#! 发送邮箱需是smtp_usr有权操作的邮箱 | |
from_addr = 'FROM EMAIL ADDRESS' | |
to_addr = 'TO EMAIL ADDRESS' | |
# 获取外网IP的网址 可以是 | |
# http://ifconfig.me/ip | |
# http://ip.3322.net | |
# http://members.3322.org/dyndns/getip | |
ip_check_server = 'http://ip.3322.net' | |
# 记录文件路径 | |
log_file = '/tmp/ipcheck.log' | |
# 邮件主题 | |
# 内容为新的IP | |
mail_subject = 'IP check message' | |
import os, urllib2, smtplib | |
from datetime import datetime | |
class CheckIP(object): | |
def __init__(self): | |
self.logs = [] | |
self.openLog() | |
def __del__(self): | |
self.saveLog() | |
def openLog(self): | |
if not os.path.isfile(log_file): | |
open(log_file, 'w').close() | |
with open(log_file, 'r') as f: | |
self.logs = f.readlines() | |
if not self.logs or len(self.logs) < 2: | |
self.logs = ['\n', '----\n'] | |
# 确保第二行永远是分隔符 | |
self.logs[1] = '----\n' | |
def saveLog(self): | |
with open(log_file, 'w') as f: | |
f.writelines(self.logs) | |
def getOldIP(self): | |
return self.logs[0].strip() | |
def setNewIP(self, new_ip): | |
if new_ip: | |
self.logs[0] = '{}\n'.format(new_ip) | |
def sendMail(self, msg): | |
if not msg: | |
return | |
data = {'from_addr' : from_addr, | |
'to_addr' : to_addr, | |
'subject' : mail_subject, | |
'msg' : msg } | |
msg = 'From: {from_addr}\r\nTo: {to_addr}\r\nSubject: {subject}\r\n\r\n{msg}'.format(**data) | |
try: | |
smtp = smtplib.SMTP() | |
# smtp.set_debuglevel(1) | |
smtp.connect(smtp_server, smtp_port) | |
smtp.login(smtp_usr, smtp_pwd) | |
smtp.sendmail(from_addr, to_addr, msg) | |
smtp.quit() | |
except Exception, e: | |
return False, 'send mail fail. {}'.format(e) | |
return True, None | |
def log(self, msg, need_mail = False): | |
if not msg: | |
return | |
print(msg) | |
log_msg = '{}\t{}\n'.format(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), msg) | |
# 检查最近的记录,如果相同仅更新时间 | |
try: | |
last_log = self.logs[2].split('\t')[1].strip() | |
if last_log == msg: | |
self.logs[2] = log_msg | |
else: | |
self.logs.insert(2, log_msg) | |
except Exception, e: | |
self.logs.insert(2, log_msg) | |
if need_mail: | |
self.sendMail(msg) | |
def checkIP(self): | |
old_ip = self.getOldIP() | |
try: | |
url = urllib2.Request(ip_check_server) | |
res = urllib2.urlopen(url) | |
new_ip = res.read().strip('\r\n ') | |
except Exception, e: | |
self.log('get ip fail. {}'.format(e), True) | |
return | |
if old_ip == new_ip: | |
return self.log('IP unchanged.') | |
res, msg = self.sendMail('IP Changed. {}'.format(new_ip)) | |
if not res: | |
return self.log(msg) | |
self.setNewIP(new_ip) | |
self.log('IP changed. {}'.format(new_ip)) | |
def cleanLog(self): | |
self.logs[2:] = [] | |
def run(self): | |
if len(sys.argv) == 1: | |
return self.checkIP() | |
if '--clean' in sys.argv: | |
return self.cleanLog() | |
print('argument error.') | |
if __name__ == '__main__': | |
ip = CheckIP() | |
ip.run() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment