Skip to content

Instantly share code, notes, and snippets.

@wolfdancer
Created March 31, 2016 18:11
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wolfdancer/3c05a04a6c5daf364b5d451c76920b76 to your computer and use it in GitHub Desktop.
Save wolfdancer/3c05a04a6c5daf364b5d451c76920b76 to your computer and use it in GitHub Desktop.
Command line to use Monitoring to run traceroute
#!/usr/bin/env python3
"""
https://gist.github.com/wolfdancer/98e1234fff2bcd77a8a0
This script will hit the monitoring API, pull monitoring configuration on the specified entty and check,
then generate yaml config file
To use:
./export.py --user <username> --api-key <api key> --target <target> --target_resolver <target_resolver>
"""
import argparse
from urllib.request import urlopen, Request, HTTPError
import sys
import re
from datetime import datetime
import requests
import json
monitoring_api = 'https://monitoring.api.rackspacecloud.com/v1.0/'
def login(user, key):
auth_payload = {
'auth':{
'RAX-KSKEY:apiKeyCredentials':{
'username': user,
'apiKey': key
}
}
}
try:
auth_req = Request('https://identity.api.rackspacecloud.com/v2.0/tokens')
auth_req.add_header('Content-type', 'application/json')
auth_resp = json.loads(urlopen(auth_req, json.dumps(auth_payload).encode("utf8")).read().decode("utf8"))
except HTTPError:
print('status err Unable to authenticate user {0}'.format(args.user))
sys.exit(1)
else:
auth_token = auth_resp['access']['token']['id']
tenant_id = auth_resp['access']['token']['tenant']['id']
return auth_token, tenant_id
def to_json(data):
return json.dumps(data, sort_keys="True", indent=2, separators=(',', ': '))
def call_api(api, auth_token, target, target_resolver):
payload = {
'target': target
}
if target_resolver:
payload['target_resolver'] = target_resolver
url = monitoring_api + api
print("post {}".format(url))
print(to_json(payload))
request = Request(url)
request.add_header('X-Auth-Token', auth_token)
request.add_header('Content-Type', 'application/json')
return json.loads(urlopen(request, to_json(payload).encode("utf8")).read().decode("utf8"))
def main():
auth_token, tenant_id = login(args.user, args.api_key)
target = args.target
target_resolver = args.target_resolver
monitoring_zone = args.monitoring_zone
traceroutes = call_api("{}/monitoring_zones/{}/traceroute".format(tenant_id, monitoring_zone), auth_token, target, target_resolver)
print("number\tnode\trtts")
for item in traceroutes['result']:
hostname = item['hostname']
if not hostname:
hostname = item['ip']
print("{}\t{}({})\t{}".format(item['number'], hostname, item['ip'], ", ".join(["%.3f" % rtt for rtt in item['rtts']])))
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Monitornig traceroute')
parser.add_argument('--user', dest='user', action='store',
required=True, help='The Rackspace user')
parser.add_argument('--api-key', dest='api_key', action='store',
required=True, help='The Rackspace API key')
parser.add_argument('--monitoring-zone', dest='monitoring_zone', action='store',
required=True, help='The Monitoring zone ID, e.g., mzdfw')
parser.add_argument('--target', dest='target', action='store',
required=True, help='The target IP or hostname')
parser.add_argument('--target-resolver', dest='target_resolver', action='store',
required=False, help='The target resolver IPv4 or IPv6')
args = parser.parse_args()
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment