#!/usr/bin/env python # ping a list of host with threads for increase speed # design to use data from/to SQL database # use standard linux /bin/ping utility from threading import Thread import mysql.connector import subprocess try: import queue except ImportError: import Queue as queue import time import re # some global vars num_threads = 30 ips_q = queue.Queue() out_q = queue.Queue() # thread code : wraps system ping command def thread_pinger(i, q): """Pings hosts in queue""" while True: # get an IP item form queue item = q.get() # ping it args=['/bin/ping', '-c', '1', '-W', str(item['timeout']), str(item['ip'])] p_ping = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE) # save ping stdout p_ping_out = str(p_ping.communicate()[0]) # ping return 0 if up if (p_ping.wait() == 0): # rtt min/avg/max/mdev = 22.293/22.293/22.293/0.000 ms search = re.search(r'rtt min/avg/max/mdev = (.*)/(.*)/(.*)/(.*) ms', p_ping_out, re.M|re.I) item['up'] = True item['rtt'] = search.group(2) else: item['up'] = False # update output queue out_q.put(item) # update queue : this ip is processed q.task_done() # start the thread pool for i in range(num_threads): worker = Thread(target=thread_pinger, args=(i, ips_q)) worker.setDaemon(True) worker.start() # build IP array ips = [] for i in range(1,200): ips.append("192.168.0."+str(i)) # main loop while True: # retreive data from DB # add SQL here # test start time start = time.time() # fill queue for ip in ips: ips_q.put({'ip': ip, 'timeout': 1}) # wait until worker threads are done to exit ips_q.join() # display result print("next:") while True: try: msg = out_q.get_nowait() except queue.Empty: break if msg['up']: print(msg) # test start end end = time.time() loop_time = round(end - start, 2) print("loop time: %s" % (loop_time)) # update DB #add SQL here # wait 5s before next cycle time.sleep(5.0)