// Runs a DNS lookup on dns-lan's network in Java FILIUS (ScenarioNetwork) // and records what really happens: every frame each card saw, and when the // resolver's call started and what it returned (or that it failed). // // DnsRun // // Server 192.168.0.10 knows web.filius.de, filius.de's mail exchange and // refers schule.de to 192.168.0.11, which knows www.schule.de. The stories, // each the resolver of a client (Resolver, as FILIUS' programs call it): // address 192.168.0.20 asks for web.filius.de (A) // mail 192.168.0.20 asks for filius.de's mail server (MX, then its A) // referral 192.168.0.20 asks for www.schule.de (A), referred to .11 // unknown 192.168.0.20 asks for x.unbekannt.org, which no one knows // noServer 192.168.0.21 asks its DNS server 192.168.0.99, which is not there import filius.software.dns.Resolver; import java.util.ArrayList; import java.util.List; public class DnsRun { static final String CLIENT = "00000000-0000-0000-0000-000000000101"; static final String LOST_CLIENT = "00000000-0000-0000-0000-000000000104"; static ScenarioNetwork network; static final List events = new ArrayList<>(); interface Call { String run() throws Exception; } static void event(String what) { events.add(new Object[] { System.currentTimeMillis() - network.start, what }); } static void call(String label, Call call) { event(label + " called"); try { event(label + " returned " + call.run()); } catch (Exception e) { event(label + " failed " + e.getClass().getSimpleName()); } } public static void main(String[] args) throws Exception { network = ScenarioNetwork.read(args[0]); String story = args[1]; long end = Long.parseLong(args[2]); network.start(); Thread.sleep(500); Resolver client = network.system(CLIENT).holeDNSClient(); switch (story) { case "address": call("holeIPAdresse web.filius.de", () -> client.holeIPAdresse("web.filius.de")); break; case "mail": call("holeIPAdresseMailServer filius.de", () -> client.holeIPAdresseMailServer("filius.de")); break; case "referral": call("holeIPAdresse www.schule.de", () -> client.holeIPAdresse("www.schule.de")); break; case "unknown": call("holeIPAdresse x.unbekannt.org", () -> client.holeIPAdresse("x.unbekannt.org")); break; case "noServer": Resolver lost = network.system(LOST_CLIENT).holeDNSClient(); call("holeIPAdresse web.filius.de", () -> lost.holeIPAdresse("web.filius.de")); break; default: throw new IllegalArgumentException("unknown story " + story); } long rest = network.start + end - System.currentTimeMillis(); if (rest > 0) Thread.sleep(rest); ScenarioNetwork.Json out = new ScenarioNetwork.Json(); out.open('{'); network.writeFrames(out); out.key("events").open('['); for (Object[] each : events) out.open('[').number((Long) each[0]).string((String) each[1]).close(']'); out.close(']'); out.close('}'); network.stop(); ScenarioNetwork.write(args[3], out); System.exit(0); } }