Skip to content

Instantly share code, notes, and snippets.

@JinnLynn
Last active December 14, 2015 11:39
Show Gist options
  • Save JinnLynn/5080616 to your computer and use it in GitHub Desktop.
Save JinnLynn/5080616 to your computer and use it in GitHub Desktop.
监控外部IP,若发生变化则发送邮件到指定邮箱
#!/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