设为首页 收藏本站
查看: 1466|回复: 0

[经验分享] Python 路由器IP变更邮件通知

[复制链接]

尚未签到

发表于 2015-4-24 11:16:29 | 显示全部楼层 |阅读模式
  最近遇到一个问题:实验室内部的网络是通过路由器分配IP的,但是经常又需要通过校园网远程实验室内部的电脑,而路由器的外网IP是由DHCP服务器动态分配的,IP地址无法绑定成静态的。RadminViewer远程的速度比较快,但是没办法穿墙,必须知道直连的IP地址,通过在实验室的路由器上设置转发端口,就可以实现实验室内部多台电脑同时远程。但是由于路由器上IP会变,自然想到在服务器上运行一个程序,每隔一段时间监测下路由器的IP,如果变化,就发送邮件通知。
  使用Python编写,由于是一个后台的程序,自然想到要做出服务,就不会有窗口一直显示。将Python程序以Windows 服务方式启动,需要用到pywin32。
  本来想实现可以获取每一层的IP,因为网络可能经过了多层的IP地址转换。但还不知道怎么做,最后参考了这里的方法后,目前是只能针对TP-Link的路由器获取外网IP,其他路由器没测试过。
  后面还可以进一步扩展,实现很多功能,然后可以发邮件通知。使用的时候,需要先安装服务,然后再启动。服务安装后,默认是手动启动,如果需要设置为自动启动,还需要到Windows管理工具,服务设置中,将该服务设置为自动启动。
  在开发过程中,可能需要不断调试以检测是否有bug,因此可以使用调试模式,Service debug,这样可以看到print输出的内容,用于测试服务是否能正常运行。
  
  以下是代码



  1 #-*- encoding: utf-8 -*-
  2
  3 #Service install 安装
  4 #Service start   启动
  5 #Service stop    停止
  6 #Service debug   调试
  7 #Service remove  删除
  8
  9 import win32serviceutil
10 import win32service
11 import win32event
12 import smtplib
13 import time, traceback
14 import threading
15 import logging
16 import win32evtlogutil
17
18 class Service(win32serviceutil.ServiceFramework):
19     _svc_name_ = "IPDetector"
20     _svc_display_name_ = "IPDetector"
21     _svc_description_ = "Detect the change status of router IP, and send mail to notify user."
22     _svc_deps_ = ["EventLog"]
23     _sleep_time_ = 20 * 60 #时间以秒为单位
24     _username_ = 'admin'#路由器用户名
25     _password_ = 'admin'#路由器密码
26     _routerIP_ = '192.168.1.1'#路由器内部IP
27     _mail_list_ = [
28         "mail1@qq.com",
29         "mail2@qq.com"
30         ]
31     _currentIP_ = ''
32
33     def __init__(self, args):
34         win32serviceutil.ServiceFramework.__init__(self, args)
35         self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
36         print u'Service is running...'
37
38     def SvcDoRun(self):
39         import servicemanager
40         timer = threading.Timer(self._sleep_time_, self.process())
41         timer.start()
42         # Write a 'started' event to the event log...
43         win32evtlogutil.ReportEvent(self._svc_name_,
44                                     servicemanager.PYS_SERVICE_STARTED,
45                                     0, # category
46                                     servicemanager.EVENTLOG_INFORMATION_TYPE,
47                                     (self._svc_name_, ''))
48         # wait for beeing stopped...
49         win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)
50
51         # and write a 'stopped' event to the event log.
52         win32evtlogutil.ReportEvent(self._svc_name_,
53                                     servicemanager.PYS_SERVICE_STOPPED,
54                                     0, # category
55                                     servicemanager.EVENTLOG_INFORMATION_TYPE,
56                                     (self._svc_name_, ''))
57         return
58
59     def SvcStop(self):
60       # Before we do anything, tell SCM we are starting the stop process.
61         self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
62         # And set my event
63         win32event.SetEvent(self.hWaitStop)
64         return
65
66     def send_mail(self, mail_list, msg):
67         try:
68             handle = smtplib.SMTP('smtp.163.com', 25)
69             handle.login('mail@163.com','password')
70             for mail in mail_list:
71                 send_msg = "To:" + mail + "\r\nFrom:mail@163.com\r\nSubject: The latest router IP \r\n\r\n"\
72                            + msg +"\r\n"
73                 handle.sendmail('mail@163.com', mail, send_msg)
74             handle.close()
75             return True
76         except:
77             print traceback.format_exc()
78             return False
79
80     def getRouterPublicIP(self, username, password, routerIP):
81         # this provide a way to get public ip address from tp-link
82         import httplib, re, base64
83         showErrorMessage = 0
84
85         # 192.168.1.1
86         conn = httplib.HTTPConnection(routerIP)
87         # set request headers
88         headers = {"User-Agent": "python host",
89                    "Content-type": "application/x-www-form-urlencoded",
90                    "Authorization": "Basic %s" % base64.encodestring('%s:%s' % (username, password))[:-1],
91                    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
92                    "Accept-Language": "zh-cn,zh;q=0.5",
93                    "Accept-Encoding": "gzip, deflate",
94                    "Accept-Charset": "GB2312,utf-8;q=0.7,*;q=0.7",
95                    "Connection": "keep-alive"}
96
97         # get status page
98         conn.request("GET", "/userRpm/StatusRpm.htm", "", headers)
99         response = conn.getresponse()
100         keyword = re.search(' wanPara [^\)]*?\)', response.read())
101         response.close()
102         conn.close()
103
104         # search the public ip address
105         found = 0
106         publicIP = ""
107         if keyword:
108             arr = re.findall('([\d]*?,)|(\"[^\"]*?\",)', keyword.group(0))
109             if arr:
110                 if len(arr) > 3:
111                     publicIP = re.search('(?

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-60262-1-1.html 上篇帖子: Python的OO思想 下篇帖子: Python基础(6)--条件、循环
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表