使用dnspython进行DNS解析并对网站进行轮询检查

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/shishui07/article/details/78991394

最近看了天斯大神的《python自动化运维》,里边有DNSPython的案例感觉写的很实用,想拿过来用。但是我在服务器上装了个python3.6。就打算用Python3来替代原来的检查程序。
首先需要导入的是三个模块,dns.resolver,os,httplib2(天斯大神用的是httplib跟httplib2中实用的方法有所不同)
代码如下:

#!/usr/bin/python3
#-*- coding:UTF-8 -*-
import dns.resolver
import os
import httplib2
iplist = []
#appdomain = '.xn--zfr164b'
appdomain = 'xn--zfr54hdx6e.xn--zfr164b'
def get_iplist(domain = ''):
  try: 
    A = dns.resolver.query(domain,'A')
  except Exception as e:
    print("dns resolver error %s" % str(e))
    return
  for i in A.response.answer:
    for j in i.items:
      iplist.append(j.address)
  return True

def checkip(ip):
  #for ip in iplist:
  checkurl =ip+":80" 
  getcontent = ""
  httplib2.socket.setdefaulttimeout(5)
  #conn = httplib2.HTTPConnection(checkurl) #httplib和httplib2的区别
  conn = httplib2.Http()
  try:
    #conn.request("GET","/",header = {"Host":appdomain})
    resp,getcontent = conn.request("http://"+checkurl)
    #print("resp is %s" % resp)
    #getcontent = resp.read(15)
  finally:
    #if getcontent == "<!doctype html>":#httplib2和httplib的区别
    if resp['status'] == '200':
      print("%s is OK!" % ip)
    else:
      print("%s is ERROR!" % ip)
if __name__ == "__main__":
  if get_iplist(appdomain) and len(iplist) >0 :
    for ip in iplist:
      checkip(ip)
  else:
    print("dns resolver error.")

总结一下,看见大神书中的代码,就是感觉大神的思路真是很清晰。每一步都不是无的放矢。特别值得我好好学习。


补充内容:最近要做一个针对IPV6网站可用性进行检查的探测程序。将上边的程序稍作修改就正好合用
1、将query方法中向DNS请求的解析类型从“A”变更为“AAAA”,“A”记录代表的是域名的IPV4解析记录,“AAAA”代表的是域名的IPV6解析记录。国内的话服务器上的nameserver可以配成“114.114.114.114”或者“8.8.8.8”这两个都是支持IPV6地址查询的。
2、在我要探测的网站中有很多域名是经过多重CNAME的。用上边的程序直接执行,在执行到有CNAME记录的域名时会因为缺少address属性而报错。后来也是自己测试了几次,而且也在网上查了查,各种域名记录的rdtype属性是不一致的,其中“A”记录的rdtype属性是1,“CNAME”记录的rdtype是5,“AAAA”记录的rdtype是28.所以在上述程序中增加了一个rdtype的判断。遇到“CNAME”记录就抛弃,终于解决问题。

for i in ipv6_AAAA.response.answer:
        for j in i.items:
            if j.rdtype == 28:
                iplist.append(j.address)
                return iplist
            else:
                pass    

程序上线,正式运行了三天,没啥问题。完美~~~~
最近三大运营商都要开始建设IPV6网络。以后写程序需要注意IPV4和IPV6两种地址的兼容性了。

展开阅读全文

没有更多推荐了,返回首页