From 1370bd88755e5563cb99ac5690661de1fcfed0f9 Mon Sep 17 00:00:00 2001 From: Babak Farrokhi Date: Sat, 18 Jun 2016 19:43:35 +0430 Subject: [PATCH] Add initial version --- meas-ids.json | 1 + root-reachability.py | 132 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100644 meas-ids.json create mode 100644 root-reachability.py diff --git a/meas-ids.json b/meas-ids.json new file mode 100644 index 0000000..2f5082f --- /dev/null +++ b/meas-ids.json @@ -0,0 +1 @@ +{"IR": [4212086, 4212087], "TR": [4212108, 4212109], "IQ": [4212121, 4212122], "SA": [4212133, 4212134], "SY": [4212985, 4212986], "AE": [4212997, 4212998], "IL": [4213010, 4213011], "JO": [4213435, 4213436], "PS": [4213437, 4213438], "LB": [4213440, 4213441], "OM": [4213443, 4213444], "KW": [4213783, 4213784], "QA": [4213786, 4213787], "BH": [4213789, 4213790]} diff --git a/root-reachability.py b/root-reachability.py new file mode 100644 index 0000000..0d39572 --- /dev/null +++ b/root-reachability.py @@ -0,0 +1,132 @@ +import json +import os +import sys +from datetime import datetime + +from ripe.atlas.cousteau import Traceroute, Dns, AtlasCreateRequest, AtlasSource, AtlasResultsRequest + +# Globals +COUNTRIES = ['IR', 'EG', 'TR', 'IQ', 'SA', 'YE', 'SY', 'AE', 'IL', 'JO', 'PS', 'LB', 'OM', 'KW', 'QA', 'BH', 'AF'] +API_CREATE_KEY = '' + + +def create_measurement(cc): + global API_CREATE_KEY + + traceroute = Traceroute(af=4, target="193.0.14.129", protocol="ICMP", + description="Traceroute from %s to K Root" % cc) + dns = Dns(af=4, target="193.0.14.129", query_argument="com.", query_type="NS", query_class="IN", + description="DNS Response time fromt %s to K Root" % cc) + + source = AtlasSource(value=cc, + requested=50, + type="country", + action="add") + request = AtlasCreateRequest(start_time=datetime.utcnow(), + key=API_CREATE_KEY, + measurements=[traceroute, dns], + sources=[source], + is_oneoff=True) + + (is_success, response) = request.create() + + if is_success: + print("- Created measurement for %s" % cc) + return list(response['measurements']) + else: + print("- Failed to create measurement for %s: %s" % (cc, response)) + return None + + +def load_ids(fn): + ids = {} + + if os.path.exists(fn): + with open(fn, "r") as fp: # save all ids to json + try: + ids = json.load(fp) + except Exception as e: + print(e) + exit(1) + return ids + + +def save_ids(fn, ids): + with open(fn, "w") as fp: # save all ids to json + json.dump(ids, fp) + fp.flush() + + +def create_all(countries, ids): + for cc in countries: + if cc in ids: + print("- measurement for %s already exists" % cc) + else: + res = create_measurement(cc) + if res is not None: + ids[cc] = res + + return ids + + +def dump_dns(ids): + print("cc, num_probes, avg_rtt") + for cc, mid in ids.items(): + is_success, results = AtlasResultsRequest(msm_id=mid[1]).create() + rt_list = [] + if is_success: + for r in results: + try: + rt = r.get("result")["rt"] + if rt > 0: + rt_list.append(rt) + except: + pass + + average = sum(rt_list) // len(rt_list) + print("%s, %d, %d" % (cc, len(rt_list), average)) + + +def dump_trace(ids): + print("cc, num_probes, num_hops") + for cc, mid in ids.items(): + is_success, results = AtlasResultsRequest(msm_id=mid[0]).create() + hop_counts = [] + if is_success: + for r in results: + try: + trace = r.get("result") + hops = len(trace) + hop_counts.append(hops) + except: + hops = 0 + + average = sum(hop_counts) // len(hop_counts) + print("%s, %d, %d" % (cc, len(hop_counts), average)) + + +def main(): + global COUNTRIES + fn = "meas-ids.json" + + if len(sys.argv) < 2: + print("please run with one of the following parameters: [create|load-dns|load-trace]") + exit(0) + _cmd = sys.argv[1].lower() + if _cmd == 'create': + ids = load_ids(fn) + ids = create_all(countries=COUNTRIES, ids=ids) + save_ids(fn, ids) + elif _cmd == 'load-dns': + ids = load_ids(fn) + dump_dns(ids) + elif _cmd == 'load-trace': + ids = load_ids(fn) + dump_trace(ids) + else: + print("invalid parameter:", _cmd) + exit(1) + + +if __name__ == '__main__': + main()