# -*- 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("打开文件失败,可能是文件内型错误")