Created
March 31, 2016 18:11
-
-
Save wolfdancer/3c05a04a6c5daf364b5d451c76920b76 to your computer and use it in GitHub Desktop.
Command line to use Monitoring to run traceroute
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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