Ping

# -*- coding: utf-8 -*-
"""
Created on Mon Sep 17 19:43:44 2018

@author: WDH
"""

"""
 可在命令行直接带目的IP,也可将IP列表在文本文件中,
 当IP数量大于等于10时启用多线程,线程数10或者11个
  pingip.py -d DestIP 
  DestIP示例: a)单个: 192.168.11.1
               b)多个:  192.168.11.1;172.16.8.1;176.13.18.2
               c)网段:  192.168.11.1-127
    文本文件:ip.txt
            目的IP多行存储
"""
import argparse
import platform
import time
import subprocess
import re
import threading


#定义在不同环境下使用的ping命令
def PingCmd():
    cmdStr = ''
    if platform.system()=='Linux':
        cmdStr = 'ping -c 1 %s '
    else:
        cmdStr =  'ping -n 3 -w 150 %s '
    return cmdStr

def IPV4SegList(aList):
    IPSeg = aList[0].split('.')
    IP4Begin = int(IPSeg[3])
    IP4End   = int(aList[1])
    segList = []
    if IP4End<=IP4Begin:
        IP4End  += IP4Begin
    else:
        IP4End +=1
    for ip in range(IP4Begin,IP4End):
        aIP = IPSeg[0]+'.'+IPSeg[1]+'.'+IPSeg[2]+'.'+str(ip)
        segList += [aIP]
    return  segList

def ParseSeg(aSeg):
    segList = []
    aList = aSeg.split('-')
    if len(aList)==2:
        segList = IPV4SegList(aList)
    else:
        segList = aList
    return segList

def AddLineIP(IPList,aLine):
    LineList = aLine.split(';')
    for aSeg in LineList:
        segList = ParseSeg(aSeg)
        IPList += segList
    return IPList

#从文件中读取IP列表
def GetIPListFromFile(filename):
    IPList = []
    f = open('C:\ip.txt')
    lines = f.readlines()
    for line in lines:
        line = line.strip()
        line = line.replace('\n','')
        IPList = AddLineIP(IPList,line)
    return IPList

def NotifyAdmin(failureIP):
    print('Network error at ',failureIP)
    
#统计ping结果,并打印
def ReportSummary(PingResults):
    pattern = re.compile('success')
    successnum = 0
    failurenum = 0
    for str in PingResults:
        success = pattern.search(str)
        if success:
            successnum += 1
        else:
            failurenum += 1
    print('----DONE! Total: %s nodes, %s success, %s failure. %s ---'%(successnum+failurenum,successnum,failurenum,timeFmt()))


#ping IP列表中的ip地址,并输出ping结果
def PingList(aList):
    PingResult = []
    print('Trying...')
    for ip in aList:
        cmdStr = PingCmd()%ip.replace('\n','')
#        print(cmdStr)
        ping_sub = subprocess.Popen(cmdStr,
                                  stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
        ret = ping_sub.stdout.read()
        str_ret = ret.decode("gbk")
        ret_s = re.search("TTL",str_ret)
#        print(ret_s)
        if ret_s :
            PingResult += ['ping %s success'%ip]
            print('ping %s success'%ip)

        else:
            PingResult += ['ping %s failure'%ip]
            print('ping %s failure'%ip)
        time.sleep(1)  
    return PingResult
          

def timeFmt():
    return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
'''
def writeLog(content):
    print('[%s] %s' % (timeFmt(), content))
    file_object = open('ping.' + time.strftime('%Y-%m-%d', time.localtime(time.time())) + '.log', 'a')
    file_object.write('[%s] %s\n' % (timeFmt(), content));
    file_object.close()
'''

#ping结束后,将结果写入日志
def writeLog(content):
    file_object = open('ping.' + time.strftime('%Y-%m-%d %H%M%S', time.localtime(time.time())) + '.log', 'a')
    for ipresult in content:
        file_object.write('%s\n' %ipresult) 
    file_object.close()

#创建自定义线程类,从Thread继承
class MyThread(threading.Thread):
    def __init__(self, IPList):
        threading.Thread.__init__(self)
        self.IPList = IPList
    
    def run(self):
        self.result = PingList(self.IPList)
    
    def get_result(self):
        return self.result

def IPListSplit(IPList):
    pernum = len(IPList)//10
    IPLists = [IPList[i:i+pernum] for i in range(0,len(IPList),pernum)]
    return IPLists
#运行子线程
def runthread():
    l = len(IPLists)
    ping = []
    PingResult = []
    for i in range(0,l):
        ping.append(MyThread(IPLists[i]))
    for i in range(0,l):
        print ('start subthread %s' %ping[i].name)
        ping[i].start()
    for i in range(0,l):
        ping[i].join()
    for i in range(0,l):
        ping[i].get_result()
    for i in range(0,l):
        PingResult = PingResult+ping[i].get_result()
    return PingResult
    

if __name__ == '__main__':
    parse = argparse.ArgumentParser(description='Batch ping utility.')
    parse.add_argument('-f','--filename',default='ip.txt',help='IP file name(Default IP.txt)')
    parse.add_argument('-d','--destip',type=str,default='',help='destination IPs ');
    args = parse.parse_args()
    if args.destip!='':
        IPList = AddLineIP([],args.destip)
    else:
        if args.filename!='':
            IPFile = args.filename
        else:
            IPFile = 'ip.txt'
        IPList = GetIPListFromFile(IPFile)
    if len(IPList) < 10:
        PingResults = PingList(IPList)
    else:
        IPLists = IPListSplit(IPList)
        PingResults = runthread()
       
    ReportSummary(PingResults)
    writeLog(PingResults)

#def openImage(self):
        #try:
           # fname , _ = QFileDialog.getOpenFileName(self, 'open file', '/',"Image files (*.jpg *.gif *.png)")
            #self.textEdit.setPixmap(QPixmap(fname))
        #except:
            #self.textEdit.setText("打开文件失败,可能是文件内型错误")

  

posted on 2020-01-01 23:52  log01bq  阅读(227)  评论(0)    收藏  举报

导航