dibbler-2.py
dibbler-2.py
— 2 KB
Contenu du fichier
#!/usr/bin/python
import os, sys, select, time, random
root = 'dibbler.dir'
tmpfile = 'dibbler.tmp'
count = 100
dirfudge = 0.2
delay = 1
timeout = 10
if not os.path.isdir(root):
os.mkdir(root)
if os.listdir(root):
print "Warning : %s not empty"%repr(root)
class client:
def __init__(self, client_program):
self.fd = os.pipe()
self.pid = os.fork()
self.client_program = client_program
if self.pid:
os.close(self.fd[1])
self.buffer = ""
self.expected = 1
self.score = 0
else:
os.dup2(self.fd[1],1)
os.close(self.fd[0])
os.close(self.fd[1])
log("Starting client %s..."%repr(client_program))
os.execlp(client_program, client_program, root)
def err(self, msg, line=""):
log("%s from %s - %s"%(msg, self.client_program, line))
def fileno(self):
return self.fd[0]
def handle_read(self):
self.buffer += os.read(self.fd[0], 1024)
while "\n" in self.buffer:
line, self.buffer = self.buffer.split("\n", 1)
line = line.strip()
if ":" not in line:
self.err("Discarding invalid line", line)
continue
index, value = line.split(":", 1)
if not index.isdigit():
self.err("Invalid index", line)
continue
index = int(index)
if index<self.expected:
self.err("Low index", line)
continue
self.expected = index
if index not in pebbles:
self.err("Early value", line)
continue
if pebbles[index] != value:
self.err("Invalid value (expected %s)"%pebbles[index], line)
continue
self.score += 1
log("Valid data from %s (i=%s, score=%s)"%(self.client_program, index, self.score))
def log(msg):
print >>sys.stderr, msg
def check_clients(deadline):
while time.time() < deadline:
rfds, wfds, efds = select.select(clients, [], [], max(deadline-time.time(),0))
for client in rfds:
client.handle_read()
def make_directory():
rootdir = random.choice(dirs)
dirname = "%f"%random.random()
dirpath = os.path.join(rootdir, dirname)
try:
log("Creating directory : %s"%repr(dirpath))
os.mkdir(dirpath)
dirs.append(dirpath)
except:
print "Could not make "+repr(dirname)
def make_pebble(i):
rootdir = random.choice(dirs)
filename = str(i)
filepath = os.path.join(rootdir, filename)
value = "%03d"%random.randint(0,999)
log("Creating file : %s (data : %s)"%(repr(filepath), value))
f = open(tmpfile,"w")
f.write(value)
f.close()
pebbles[i]=value
os.rename(tmpfile, filepath)
i = 1
pebbles = {}
dirs = [root]
clients = []
for arg in sys.argv[1:]:
clients.append(client(arg))
next = time.time()
while i<count:
check_clients(next)
if random.random()<dirfudge:
make_directory()
else:
make_pebble(i)
i += 1
next += delay
next += timeout
log("Waiting %d second(s) before exitting..."%timeout)
check_clients(next)
for c in clients:
print c.client_program, c.score