#!/bin/bash
python3 -u - <<'PY'
import socket,time,struct,random
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
t0=time.time()
resp=[]
s.settimeout(0.15)
def query(tid):
    return struct.pack('>HHHHHH', tid, 0x0100, 1, 0, 0, 0) + b'\x07example\x03com\x00\x00\x01\x00\x01'
def drain(dur):
    end=time.time()+dur
    while time.time()<end:
        try:
            d,a=s.recvfrom(4096)
            resp.append(round(time.time()-t0,2))
        except socket.timeout:
            pass
def phase(label, n, pps):
    before=len(resp)
    for i in range(n):
        s.sendto(query(random.randint(1,65535)), ('8.8.8.8',53))
        time.sleep(1.0/pps)
        drain(1.0/pps*0.5)
    drain(2.0)
    print(label,'sent',n,'resp',len(resp)-before,'at',round(time.time()-t0,1),flush=True)
phase('A_20pps', 30, 20)
time.sleep(3)
phase('B_2pps', 30, 2)
time.sleep(2)
phase('C_20pps', 30, 20)
print('total_resp',len(resp),flush=True)
print('last5',resp[-5:],flush=True)
PY
