diff --git a/RestfulClient.py b/RestfulClient.py new file mode 100644 index 0000000..21038a1 --- /dev/null +++ b/RestfulClient.py @@ -0,0 +1,74 @@ +# https://app-13.pm.appneta.com/api/v3/dns/webPath/data?from=1557257776&to=1557258076&api_key=v3 + +#Python 2.7.6 +#RestfulClient.py + +import requests +from requests.auth import HTTPBasicAuth +import json +from credentials import username, password, apm_server +from influxdb import InfluxDBClient +import argparse +import time +from datetime import datetime, timedelta + +datafrom = 1557257776 +datato = 1557258076 +# Replace with the correct URL +url = "https://"+apm_server+"/api/v3/dns/webPath/data?from="+str(datafrom)+"&to="+str(datato)+"&api_key=v3" + +# It is a good practice not to hardcode the credentials. So ask the user to enter credentials at runtime +#myResponse = requests.get(url,auth=HTTPDigestAuth(username, password), verify=True) +myResponse = requests.get(url,auth=HTTPBasicAuth(username, password), verify=True) +#print (myResponse.status_code) + +def main(influxhost, influxport): + # For successful API call, response code will be 200 (OK) + if(myResponse.ok): + + # Loading the response data into a dict variable + # json.loads takes in only binary or string variables so using content to fetch binary content + # Loads (Load String) takes a Json file and converts into python data structure (dict or list, depending on JSON) + jData = json.loads(myResponse.content) + + print("The response contains {0} properties".format(len(jData))) + print("\n") + print jData + # for key in jData: + # print (key , " : " , jData[key]) + else: + # If response code is not ok (200), print the resulting http error code with description + myResponse.raise_for_status() + + +# labels, tags, time, count +def writeinflux(measurement,tags,time,fields,influxhost,influxport): + influxuser = 'CMWrite' + influxpass = 'CMWrite' + databasename = 'help' + client = InfluxDBClient(host=influxhost, port=influxport, username=influxuser, password=influxpass, database=databasename) + json_body = [ + { + "measurement": measurement, + "tags": tags, + "time": time, + "fields": fields + } + ] + print("Write points: {0}".format(json_body)) + client.write_points(json_body) + +# Allow command line overrides for host and port influxDB +def parse_args(): + parser = argparse.ArgumentParser( + description='Sync Jira items with specific tag into InfluxDB database') + parser.add_argument('--host', type=str, required=False, default='itmetricsdb.mathworks.com', + help='hostname of InfluxDB http API') + parser.add_argument('--port', type=int, required=False, default=8086, + help='port of InfluxDB http API') + return parser.parse_args() + +# grab arguments +if __name__ == '__main__': + args = parse_args() + main(influxhost=args.host, influxport=args.port) \ No newline at end of file diff --git a/path-delete.py b/path-delete.py new file mode 100644 index 0000000..2387248 --- /dev/null +++ b/path-delete.py @@ -0,0 +1,35 @@ +# +# Delete paths matching those in "paths.csv" +# (Note: No space before or after commas in paths.csv) +# (Requests status codes - +# https://github.com/requests/requests/blob/master/requests/status_codes.py) +# + +import csv +from api_fns import * + +with open('paths.csv', mode='r') as csv_file: + csv_reader = csv.DictReader(csv_file) + for row in csv_reader: + # pp_json(row) + + r1 = get_network_path(row['org_id']) + if r1.status_code == requests.codes.ok: + for network_path in r1.json(): + if (network_path['sourceAppliance'] == row['source_mp'] + and network_path['target'] == row['target']): + + r2 = delete_network_path(row['org_id'], row['source_mp'], + row['target']) + if r2.status_code == requests.codes.no_content: + print('Deleted: org/src/targ {}/{}/{} -> id/name {}/{}' + .format(row['org_id'], + network_path['sourceAppliance'], + network_path['target'], + network_path['id'], + network_path['pathName'])) + else: + print('Unable to delete: {}' + .format(r2.json()['messages'][0])) + else: + print_err(r1) diff --git a/path-show.py b/path-show.py new file mode 100644 index 0000000..4fefff5 --- /dev/null +++ b/path-show.py @@ -0,0 +1,26 @@ +# +# Show any paths that match those found in the "paths.csv" file +# + +import csv +from api_fns import * + +with open('paths.csv', mode='r') as csv_file: + csv_reader = csv.DictReader(csv_file) + for row in csv_reader: + # pp_json(row) + + r1 = get_network_path(row['org_id']) + if r1.status_code == requests.codes.ok: + for network_path in r1.json(): + if (network_path['sourceAppliance'] == row['source_mp'] + and network_path['target'] == row['target']): + print('Match: org/src/targ {}/{}/{} -> id/name {}/{}' + .format(row['org_id'], + network_path['sourceAppliance'], + network_path['target'], + network_path['id'], + network_path['pathName'])) + # pp_json(network_path) + else: + print_err(r1) diff --git a/web-path-info.py b/web-path-info.py new file mode 100644 index 0000000..1e2ef6f --- /dev/null +++ b/web-path-info.py @@ -0,0 +1,25 @@ +# +# Print web path info (grouped by web app group) +# +from api_fns import * +webpathconvert = {} +r1 = get_web_app_group() +if r1.status_code == requests.codes.ok: + for group in r1.json(): + print('Web app group ({}) name - {} -- org id ({})'.format(group['id'], + group['name'], group['orgId'])) + + r2 = get_web_path(group['id']) + if r2.status_code == requests.codes.ok: + for web_path in r2.json(): + webpathconvert[web_path['id']]=web_path['target']['url'] + print(' Web path id ({}) MP ({}), target ({}), workflow ({})' + .format(web_path['id'], + web_path['location']['applianceName'], + web_path['target']['url'], + web_path['userFlow']['name'])) + # pp_json(web_path) + else: + print_err(r2) +else: + print_err(r1)