diff --git a/meraki-captive-portal/external_captive_portal.py b/meraki-captive-portal/external_captive_portal.py index 1d46333..88e0290 100755 --- a/meraki-captive-portal/external_captive_portal.py +++ b/meraki-captive-portal/external_captive_portal.py @@ -3,6 +3,7 @@ from flask import Flask, redirect, render_template, request from waitress import serve +import os # Module Variables @@ -21,16 +22,18 @@ def get_click(): global user_continue_url global success_url - host = request.host_url + if 'DEVENV_APP_8080_URL' not in os.environ: + host = request.host_url + host = host.replace('https', 'http') + else: + host = os.environ['DEVENV_APP_8080_URL'] + base_grant_url = request.args.get('base_grant_url') user_continue_url = request.args.get('user_continue_url') node_mac = request.args.get('node_mac') client_ip = request.args.get('client_ip') client_mac = request.args.get('client_mac') - success_url = host + "success" - - if base_grant_url != None and base_grant_url.startswith('http://'): - base_grant_url = base_grant_url.replace("http://", "https://", 1) #hack to run excap in LL2.0 + success_url = host + "/success" return render_template( "click.html", @@ -62,6 +65,6 @@ def get_success(): # If this script is the main script being executed, start the web server. if __name__ == "__main__": - # app.run(host="0.0.0.0", port=5004, debug=True) - serve(app, host='0.0.0.0', port=5004, url_scheme='https') + app.run(host="0.0.0.0", port=5004, debug=True) + #serve(app, host='0.0.0.0', port=5004, url_scheme='https') diff --git a/meraki-location-scanning-python/static/sample.js b/meraki-location-scanning-python/static/sample.js index a0656dd..ef0838a 100644 --- a/meraki-location-scanning-python/static/sample.js +++ b/meraki-location-scanning-python/static/sample.js @@ -8,11 +8,10 @@ allMarkers = [], // The markers when we are in "View All" mode lastMac = "", // The last requested MAC to follow infoWindow = new google.maps.InfoWindow(), // The marker tooltip - markerImage = new google.maps.Marker({ - icon: { - size: new google.maps.Size(15, 15), - origin: new google.maps.Point(0, 0), - anchor: new google.maps.Point(4.5, 4.5)}}); + markerImage = new google.maps.MarkerImage('/5002/static/blue_circle.png', + new google.maps.Size(15, 15), + new google.maps.Point(0, 0), + new google.maps.Point(4.5, 4.5)); MerakiOverlay.prototype = new google.maps.OverlayView(); diff --git a/meraki-mission-1/mxfirewallcontrol.py b/meraki-mission-1/mxfirewallcontrol.py index 0546c9c..e600e98 100644 --- a/meraki-mission-1/mxfirewallcontrol.py +++ b/meraki-mission-1/mxfirewallcontrol.py @@ -39,7 +39,7 @@ teamsapi = WebexTeamsAPI(access_token=env_user.WT_ACCESS_TOKEN) # MERAKI BASE URL -base_url = "https://api.meraki.com/api/v0" +base_url = "https://api.meraki.com/api/v1" def getnetworklist(): orgs = "" diff --git a/meraki-mission-2/webhookreceiver.py b/meraki-mission-2/webhookreceiver.py index 4abfb56..4b4abbf 100644 --- a/meraki-mission-2/webhookreceiver.py +++ b/meraki-mission-2/webhookreceiver.py @@ -40,7 +40,7 @@ teamsapi = WebexTeamsAPI(access_token=env_user.WT_ACCESS_TOKEN) # MERAKI BASE URL -base_url = "http://localhost:5001" +base_url = "http://localhost:5001/api/v1" # Flask App app = Flask(__name__) diff --git a/meraki-mission-3/mission_captive_portal.py b/meraki-mission-3/mission_captive_portal.py index a50c5d2..f38090b 100644 --- a/meraki-mission-3/mission_captive_portal.py +++ b/meraki-mission-3/mission_captive_portal.py @@ -27,6 +27,7 @@ import os import sys from pprint import pprint +from waitress import serve import requests from flask import Flask, json, redirect, render_template, request @@ -41,10 +42,14 @@ sys.path.insert(0, project_root) import env_user # noqa - # Module Variables -base_url = "http://localhost:5001" # Using lab simulator -captive_portal_base_url = "http://localhost:5004" +if 'DEVENV_APP_8080_URL' not in os.environ: + host = "http://localhost:8080" +else: + host = os.environ['DEVENV_APP_8080_URL'] + +base_url = f"{host}/api/v1" # Using lab simulator +captive_portal_base_url = f"{host}" base_grant_url = "" user_continue_url = "" success_url = "" @@ -111,9 +116,11 @@ def set_splash_page_settings(network_id, captive_portal_base_url): "Content-Type": "application/json", }, json={ - "splashPage": "Click-through splash page", - "splashUrl": captive_portal_base_url + '/click', - "useCustomUrl": True + "splashPage": "Click-through splash page", + "splashUrl": captive_portal_base_url + '/click', + "useSplashUrl": True, + "redirectUrl" : "https://developer.cisco.com/meraki", + "useRedirectUrl": True }, ) # END MISSION SECTION @@ -162,14 +169,13 @@ def get_click(): global base_grant_url global user_continue_url global success_url - - host = request.host_url + base_grant_url = request.args.get('base_grant_url') user_continue_url = request.args.get('user_continue_url') node_mac = request.args.get('node_mac') client_ip = request.args.get('client_ip') client_mac = request.args.get('client_mac') - success_url = host + "success" + success_url = captive_portal_base_url + "/success" return render_template( "click.html", @@ -281,3 +287,4 @@ def parse_cli_args(argv): # Start the External Captive Portal web server app.run(host="0.0.0.0", port=5004, debug=False) + #serve(app, host='0.0.0.0', port=5004, url_scheme='https') diff --git a/meraki-mv-sense/mv_mqtt.py b/meraki-mv-sense/mv_mqtt.py index ca4eedb..50849b0 100644 --- a/meraki-mv-sense/mv_mqtt.py +++ b/meraki-mv-sense/mv_mqtt.py @@ -114,7 +114,7 @@ def collect_zone_information(topic, payload): def notify(serial_number): # Get video link - url = "https://api.meraki.com/api/v0/networks/{1}/cameras/{0}/snapshot".format(serial_number, NETWORK_ID) + url = "https://api.meraki.com/api/v1/devices/{0}/camera/generateSnapshot".format(serial_number) # current timestamp # ts = str(time.time()).split(".")[0] + "000" @@ -162,7 +162,7 @@ def get_network_id(network_wh): try: # MISSION TODO orgs = requests.get( - "https://api.meraki.com/api/v0/organizations", + "https://api.meraki.com/api/v1/organizations", headers={ "X-Cisco-Meraki-API-Key": env_user.MERAKI_API_KEY, } @@ -182,7 +182,7 @@ def get_network_id(network_wh): try: # MISSION TODO networks = requests.get( - "https://api.meraki.com/api/v0/organizations/"+org["id"]+"/networks", + "https://api.meraki.com/api/v1/organizations/"+org["id"]+"/networks", headers={ "X-Cisco-Meraki-API-Key": env_user.MERAKI_API_KEY, }) diff --git a/meraki-python-sdk/meraki_python_sdk_lab.py b/meraki-python-sdk/meraki_python_sdk_lab.py new file mode 100644 index 0000000..f8ff82d --- /dev/null +++ b/meraki-python-sdk/meraki_python_sdk_lab.py @@ -0,0 +1,48 @@ +import meraki +import json +from pprint import pprint + +# Configuration parameters and credentials for MERAKI +API_KEY = '6bec40cf957de430a6f1f2baa056b99a4fac9ea0' + +client = meraki.DashboardAPI(api_key=API_KEY) +params={} + + +orgs = "" +try: + orgs = client.organizations.getOrganizations() + pprint(orgs) +except Exception as e: + pprint(e) + +params["organization_id"] = "" +networks = "" +if orgs != "": + for org in orgs: + if org["name"] == "DevNet Sandbox": + params["organization_id"] = org["id"] + pprint(params["organization_id"]) + +if params["organization_id"] != "": + try: + networks = client.organizations.getOrganizationNetworks(params["organization_id"]) + pprint(networks) + except Exception as e: + pprint(e) + +# Now get a list of devices for that network +network_id = "" +devices = "" +if networks != "": + for network in networks: + if network["name"] == "DevNet Sandbox ALWAYS ON": + network_id = network["id"] + pprint(network_id) + +if network_id != "": + try: + devices = client.networks.getNetworkDevices(network_id) + pprint(devices) + except Exception as e: + pprint(e) \ No newline at end of file diff --git a/meraki_cloud_simulator/meraki-sample-captive-portal/meraki_sample_captive_portal.py b/meraki_cloud_simulator/meraki-sample-captive-portal/meraki_sample_captive_portal.py index da7f0eb..ea90364 100644 --- a/meraki_cloud_simulator/meraki-sample-captive-portal/meraki_sample_captive_portal.py +++ b/meraki_cloud_simulator/meraki-sample-captive-portal/meraki_sample_captive_portal.py @@ -40,7 +40,7 @@ ## If using docker-compose # base_url = "http://meraki_cloud_simulator:5001" # Using lab simulator ## If using stand alone -base_url = "http://localhost:5001" +base_url = "http://localhost:5001/api/v1" captive_portal_base_url = "http://localhost:5004" base_grant_url = "" user_continue_url = "" diff --git a/meraki_cloud_simulator/meraki-sample-webhook-receiver/meraki_sample_webhook_receiver.py b/meraki_cloud_simulator/meraki-sample-webhook-receiver/meraki_sample_webhook_receiver.py index 0f476ca..1001851 100644 --- a/meraki_cloud_simulator/meraki-sample-webhook-receiver/meraki_sample_webhook_receiver.py +++ b/meraki_cloud_simulator/meraki-sample-webhook-receiver/meraki_sample_webhook_receiver.py @@ -36,7 +36,7 @@ # MERAKI BASE URL # if running in docker-compose base_url = "http://meraki_cloud_simulator:5001" # if running seperately -base_url = "http://localhost:5001" +base_url = "http://localhost:5001/api/v1" # Flask App app = Flask(__name__) diff --git a/meraki_cloud_simulator/meraki_cloud_simulator.py b/meraki_cloud_simulator/meraki_cloud_simulator.py index acf8ab4..7961673 100644 --- a/meraki_cloud_simulator/meraki_cloud_simulator.py +++ b/meraki_cloud_simulator/meraki_cloud_simulator.py @@ -14,13 +14,13 @@ def meraki_simulator_go(): return render_template("index.html") # Flask micro-webservice API/URI endpoints -@merakicloudsimulator.route("/organizations", methods=["GET"]) +@merakicloudsimulator.route("/api/v1/organizations", methods=["GET"]) def get_org_id(): """Get a list of simulated organizations.""" return jsonify(ORGANIZATIONS) -@merakicloudsimulator.route("/organizations//networks", methods=["GET"]) +@merakicloudsimulator.route("/api/v1/organizations//networks", methods=["GET"]) def get_networks(organization_id): """Get the list of networks for an organization.""" organization_networks = NETWORKS.get(organization_id) @@ -39,4 +39,4 @@ def get_networks(organization_id): ) # Start the web server - merakicloudsimulator.run(host=WEB_SERVER_BIND_IP, port=WEB_SERVER_BIND_PORT, threaded=True, debug=False) \ No newline at end of file + merakicloudsimulator.run(host=WEB_SERVER_BIND_IP, port=WEB_SERVER_BIND_PORT, threaded=True, debug=False) diff --git a/meraki_cloud_simulator/merakicloudsimulator/excapsimulator.py b/meraki_cloud_simulator/merakicloudsimulator/excapsimulator.py index 6372b1b..0cec4f0 100755 --- a/meraki_cloud_simulator/merakicloudsimulator/excapsimulator.py +++ b/meraki_cloud_simulator/merakicloudsimulator/excapsimulator.py @@ -4,6 +4,7 @@ import random import requests from datetime import datetime +import os # Module Variables captive_portal_url = "" @@ -24,7 +25,7 @@ def random_byte(): # Flask micro-webservice API/URI endpoints -@merakicloudsimulator.route("/networks//wireless/ssids/", methods=["PUT"]) +@merakicloudsimulator.route("/api/v1/networks//wireless/ssids/", methods=["PUT"]) def put_ssid(network_id, ssid_id): """Simulate setting SSID configurations.""" print(f"Settings updated for network {network_id} ssid {ssid_id}.") @@ -32,16 +33,50 @@ def put_ssid(network_id, ssid_id): @merakicloudsimulator.route( - "/networks//wireless/ssids//splash/settings", + "/api/v1/networks//wireless/ssids//splash/settings", methods=["PUT"], ) def put_splash(network_id, ssid_id): + global captive_portal_url + global user_continue_url """Simulate setting Splash Page configurations.""" print(f"Splash settings updated for network {network_id} ssid {ssid_id}.") - return jsonify(request.json) - - -@merakicloudsimulator.route("/networks//splashLoginAttempts", methods=["GET"]) + new_settings = request.json + new_settings_keys = new_settings.keys() + print(new_settings_keys) + + + if 'DEVENV_APP_8080_URL' not in os.environ: + host = request.host_url + host = host.replace('https', 'http') + else: + host = os.environ['DEVENV_APP_8080_URL'] + + + if "splashPage" in new_settings_keys and "splashUrl" in new_settings_keys and "redirectUrl" in new_settings_keys: + captive_portal_url = new_settings["splashUrl"] + base_grant_url = host + "/splash/grant" + user_continue_url = new_settings["redirectUrl"] + node_mac = generate_fake_mac() + client_ip = request.remote_addr + client_mac = generate_fake_mac() + splash_click_time = datetime.utcnow().isoformat() + full_url = ( + captive_portal_url + + "?base_grant_url=" + base_grant_url + + "&user_continue_url=" + user_continue_url + + "&node_mac=" + node_mac + + "&client_ip=" + client_ip + + "&client_mac=" + client_mac + ) + print(captive_portal_url) + print(user_continue_url) + return jsonify(new_settings) + else: + abort(400) + + +@merakicloudsimulator.route("/api/v1/networks//splashLoginAttempts", methods=["GET"]) def get_splash_logins(network_id): """Get list of Splash Page logins.""" # We aren't associating specific logins with a network ID @@ -51,16 +86,28 @@ def get_splash_logins(network_id): @merakicloudsimulator.route("/excap", methods=["GET"]) def excap_go(): + global captive_portal_url + global user_continue_url """Process GET requests to the /excap URI; render the index.html page.""" - return render_template("excap.html") + print(captive_portal_url) + print(user_continue_url) + return render_template("excap.html", captive_portal_url = captive_portal_url, user_continue_url = user_continue_url) @merakicloudsimulator.route("/connecttowifi", methods=["POST"]) def connect_to_wifi(): """Save captive portal details; redirect to the External Captive Portal.""" - + global captive_portal_url + global user_continue_url + + if 'DEVENV_APP_8080_URL' not in os.environ: + host = request.host_url + host = host.replace('https', 'http') + else: + host = os.environ['DEVENV_APP_8080_URL'] + captive_portal_url = request.form["captive_portal_url"] - base_grant_url = request.host_url + "splash/grant" + base_grant_url = host + "/splash/grant" user_continue_url = request.form["user_continue_url"] node_mac = generate_fake_mac() client_ip = request.remote_addr diff --git a/meraki_cloud_simulator/merakicloudsimulator/templates/excap.html b/meraki_cloud_simulator/merakicloudsimulator/templates/excap.html index dfe3f9f..6a4a427 100644 --- a/meraki_cloud_simulator/merakicloudsimulator/templates/excap.html +++ b/meraki_cloud_simulator/merakicloudsimulator/templates/excap.html @@ -17,10 +17,10 @@
-

Meraki Captive Portal Simulator

+

Meraki Captive Portal Simulator

- Enter Captive Portal URL:

- Enter Post Authorization URL:

+ Enter Captive Portal URL:

+ Enter Post Authorization URL:

diff --git a/meraki_cloud_simulator/merakicloudsimulator/webhooksimulator.py b/meraki_cloud_simulator/merakicloudsimulator/webhooksimulator.py index eeaf374..a573c40 100755 --- a/meraki_cloud_simulator/merakicloudsimulator/webhooksimulator.py +++ b/meraki_cloud_simulator/merakicloudsimulator/webhooksimulator.py @@ -16,14 +16,14 @@ def post_webhook_alerts(): while True: - print("in big while") + #print("in big while") global stop_post_thread if stop_post_thread: - print("breaking while") + #print("breaking while") break for alert in alert_settings["alerts"]: if stop_post_thread: - print("breaking for loop") + #print("breaking for loop") break if alert["enabled"] == True: alert_message = alert_messages[alert["type"]] @@ -49,13 +49,13 @@ def generate_fake_http_server_id(): # Flask micro-webservice API/URI endpoints -@merakicloudsimulator.route("/networks//webhooks/httpServers", methods=["GET"]) +@merakicloudsimulator.route("/api/v1/networks//webhooks/httpServers", methods=["GET"]) def get_http_servers(network_id): """Simulate getting httpServers configurations.""" print(f"Getting httpServers for {network_id}.") return jsonify(http_servers) -@merakicloudsimulator.route("/networks//webhooks/httpServers", methods=["POST"]) +@merakicloudsimulator.route("/api/v1/networks//webhooks/httpServers", methods=["POST"]) def post_httpServers(network_id): """Simulate setting httpServers configurations.""" print(f"Settings updated for network {network_id}.") @@ -70,7 +70,7 @@ def post_httpServers(network_id): abort(400) -@merakicloudsimulator.route("/networks//alerts/settings", +@merakicloudsimulator.route("/api/v1/networks//alerts/settings", methods=["GET"], ) def get_alert_settings(network_id): @@ -78,7 +78,7 @@ def get_alert_settings(network_id): print(f"Getting alertSettings for {network_id}.") return jsonify(alert_settings) -@merakicloudsimulator.route("/networks//alerts/settings", +@merakicloudsimulator.route("/api/v1/networks//alerts/settings", methods=["PUT"], ) def put_alert_settings(network_id): diff --git a/requirements.txt b/requirements.txt index 9b88e98..07d71ae 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,3 +5,4 @@ paho-mqtt==1.5.1 requests==2.25.1 requests-toolbelt==0.9.1 webexteamssdk==1.6 +meraki==1.15.0 \ No newline at end of file