#!/usr/bin/python # -*- python -*- import sys,time,os,pickle,string,popen2,random FORKLEN = 5 TIMEOUT = 15 # une machine a 15 secondes pour recevoir un popup ! def do_bomb(Machines): time.sleep(random.random()) if len(Machines) < FORKLEN: for mach in Machines: begin = time.time() print "ré-expédition SMBpopup à ",mach fd = popen2.Popen3("/etc/CRANS/code/SMBMessage %s %s %s" % (from_whom,mach,msgfile)) while 1: time.sleep(1) if fd.poll() != -1: break # fini ! (cool) if (time.time() - begin) > TIMEOUT: break del fd else: Half = len(Machines) / 2 pid = os.fork() if pid == 0: # child do_bomb(Machines[:Half]) else: # parent do_bomb(Machines[Half:]) try: os.waitpid(pid,0) except: pass # à ce stade, on a éliminé toute récursion, tant pile que process... # croisons les doigts !!! if len(sys.argv) < 4: sys.stderr.write('Attend 3 arguments !\n') sys.exit(1) Zone = pickle.load(open(CFG_READ_DIR+"Zone.db","r")) from_whom = sys.argv[1] from_where = sys.argv[2] msgfile = sys.argv[3]+"-red" message = open(sys.argv[3],"r").readlines() message.insert(0,("Message de %s (@%s) à ALL : \n-----\n" % (from_whom,from_where))) open(msgfile,"w").writelines(message) # pour gagner du temps, on n'envoie le message qu'aux machines qui sont # (probablement) vivantes. Pour gagner encore plus de temps, on fait # confiance au cache ARP (15 minutes) Alive = [] arp = os.popen("arp -a","r") while 1: s = arp.readline() if not s: break mach = string.split(string.split(s)[0],'.')[0] if mach[:5] == 'zamok': continue # évitons les boucles infininies... if Zone.has_key(mach): Alive.append(mach) print Alive arp.close() #maintenant, au boulot... do_bomb(Alive) unlink(msgfile) unlink(sys.argv[3])