#!/usr/bin/python

import urllib2
import urllib
import json
import os
import sys
import time

authfile = "%s/.atlas/auth" % os.environ['HOME']
data = { "definitions": [
           { "target": "www.bortzmeyer.org", "description": "Ping my blog",
           "type": "ping", "af": 6, "is_oneoff": True} ],
         "probes": [
             { "requested": 5, "type": "area", "value": "WW" } ] }
url = "https://atlas.ripe.net/api/v1/measurement/"

if not os.path.exists(authfile):
    raise CredentialsNotFound(authfile)
auth = open(authfile)
key = auth.readline()[:-1]
auth.close()

if len(sys.argv) > 2:
    print >>sys.stderr, ("Usage: %s [measurement_id]" % sys.argv[0])
elif len(sys.argv) == 2:
    measure = int(sys.argv[1])
else:
    measure = None
if measure is None:
    request = urllib2.Request("%s?key=%s" % (url, key))
    request.add_header("Content-Type", "application/json")
    request.add_header("Accept", "application/json")
    try:
        conn = urllib2.urlopen(request, json.dumps(data))
        results = json.load(conn)
        measure = int(results["measurements"][0])
        print("Measurement #%s, please wait the result (it may be long)" % (measure))
        conn.close()
    except urllib2.HTTPError as e:
        print >>sys.stderr, ("Fatal error: %s" % e.read())
        raise
over = False
while not over:
    request = urllib2.Request("%s/%i/?key=%s" % (url, measure, key))
    request.add_header("Accept", "application/json")
    try:
        conn = urllib2.urlopen(request)
        results = json.load(conn)
        status = results["status"]["name"]
        if status == "Ongoing" or status == "Specified":
            print("Not yet ready, sleeping...")
            time.sleep(60)
        elif  status == "Stopped":
            over = True
        else:
            print("Unknown status \"%s\"\n" % status)
            time.sleep(120)
        conn.close()
    except urllib2.HTTPError as e:
        print >>sys.stderr, ("Fatal error: %s" % e.read())
        raise

request = urllib2.Request("%s/%i/result/?key=%s" % (url, measure, key))
request.add_header("Accept", "application/json")
try:
    conn = urllib2.urlopen(request)
    results = json.load(conn)
    total_rtt = 0
    num_rtt = 0
    num_error = 0
    for result in results:
        for test in result["result"]:
            if test.has_key("rtt"):
                total_rtt += int(test["rtt"])
                num_rtt += 1
            elif test.has_key("error"):
                num_error += 1
            else:
                raise Exception("Result has no field rtt and not field error")
    conn.close()
except urllib2.HTTPError as e:
    print >>sys.stderr, ("Fatal error: %s" % e.read())
    raise
print("%i successful tests, %i errors, average RTT: %i" % (num_rtt, num_error, total_rtt/num_rtt))

