#!/usr/bin/env python # isalive6.py is provided by 0x4D722E20446F6E # Thread is modified from: # Tutorial on Threads Programming with Python by Norman Matloff & Francis Hsu import sys,os,re,time,threading class ping6(threading.Thread): ping6list = [] maxthreads = 10 #Increasing this number is bad idea :) evnt = threading.Event() lck = threading.Lock() def __init__(self,cnt,ip): threading.Thread.__init__(self); self.ip = ip self.status = -1 self.count = cnt def run(self): logfile = open("isalive6.log","a") pin,pout,perr = os.popen3("ping6 -c2 -s 0 "+self.ip,"r") pin.close() cmdout = pout.readlines() igot = re.search("8 bytes from",cmdout[1]) if igot: print str(self.count)+" : [REACHED] "+self.ip record = str(self.count)+" : [REACHED] "+self.ip+"\n" logfile.write(record) else: print str(self.count)+" : [NOT REACHED] "+self.ip logfile.close() ping6.lck.acquire() ping6.ping6list.remove(self) if len(ping6.ping6list) == ping6.maxthreads-1: ping6.evnt.set() ping6.evnt.clear() ping6.lck.release() def newthread(count,hst): ping6.lck.acquire() pg6 = ping6(count,hst) ping6.ping6list.append(pg6) ping6.lck.release() pg6.start() newthread = staticmethod(newthread) def main(): if len(sys.argv) !=2: print "Usage : python " + sys.argv[0] + " " sys.exit(0); os.unlink("isalive6.log") print time.ctime() n = 1 input = open(sys.argv[1],"r") for host in input: ping6.lck.acquire() if len(ping6.ping6list) >= ping6.maxthreads: ping6.lck.release() ping6.evnt.wait() else: ping6.lck.release() ping6.newthread(n,host.rstrip()) n+=1 for pingle in ping6.ping6list: pingle.join() print time.ctime() print "Total Host Scanned : %i"%(n) if __name__ == '__main__': main() # This code is somewhat buggy when route to the unreachable network