Meraki API Proxy Service

Meraki API Proxy

Use these endpoints instead of requesting Meraki APIs directly.

  • Avoid CORS
  • Define default API key
  • Log Events

The API key will be defined in the Environment Defaults flow

Example:

https://merakidemo.internetoflego.com/meraki/proxy/organizations

https://merakidemo.internetoflego.com/meraki/proxy/organizations/549236/admins

Sample Web Apps

The sample apps demonstrate how you can build HTML frontend applications to utilize the proxy server.

Update SSID Settings

https://merakidemo.internetoflego.com/meraki/ui/updatessid

Create Network Admin

https://merakidemo.internetoflego.com/meraki/ui/createadmin

More Info

https://create.meraki.io

[{"id":"2c750593.98b0d2","type":"inject","z":"c7cddcab.ad2a2","name":"Sets Defaults - Injected at start","topic":"","payload":"Setting Environment Variables","payloadType":"str","repeat":"","crontab":"","once":true,"x":190,"y":180,"wires":[["29373167.4d8f36"]]},{"id":"33f208af.5d493","type":"function","z":"c7cddcab.ad2a2","name":"Set Environment Variables: UPDATE THIS","func":"//  ###### User Defined Variables ######\n\n// Meraki Base URL. the `n149` represent the shard number. This is defined to avoid redirect issues.\nconst BASE_URL = \"https://n149.meraki.com/api/v0/\"; \n\nconst API_KEY = msg.apikey; // from credentials node to keep secret\n\n\n\n// ###### Set Flow Context variables ######\n\nflow.set('apiKey', API_KEY); // pulling API key via \"secret\" node. This avoides publishing the API key when sharing the flow\nflow.set('baseUrl', BASE_URL);\n\n\nmsg.payload = \"Meraki API Environment Set\";\nreturn msg;","outputs":1,"noerr":0,"x":560,"y":220,"wires":[["d06fd888.1ec598"]]},{"id":"d06fd888.1ec598","type":"debug","z":"c7cddcab.ad2a2","name":"Flow Env Variables","active":true,"console":"false","complete":"true","x":870,"y":220,"wires":[]},{"id":"c5be6a8c.61c19","type":"comment","z":"c7cddcab.ad2a2","name":"API Key and Environment variables","info":"","x":160,"y":140,"wires":[]},{"id":"29373167.4d8f36","type":"credentials","z":"c7cddcab.ad2a2","name":"API KEY - UPDATE THIS","props":[{"value":"apikey","type":"msg"}],"x":490,"y":180,"wires":[["33f208af.5d493"]]},{"id":"cf27c246.83f54","type":"http in","z":"c7cddcab.ad2a2","name":"","url":"/meraki/proxy/:endpoint(*)","method":"get","upload":false,"swaggerDoc":"","x":190,"y":320,"wires":[["71d1257e.411eb4","6cb71ee2.d71868"]]},{"id":"71d1257e.411eb4","type":"debug","z":"c7cddcab.ad2a2","name":"Meraki [get] request","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":240,"y":360,"wires":[]},{"id":"d917d25b.4455e","type":"http response","z":"c7cddcab.ad2a2","name":"","statusCode":"","headers":{},"x":930,"y":320,"wires":[]},{"id":"27fafca2.b8df9c","type":"debug","z":"c7cddcab.ad2a2","name":"Meraki [post] request","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","x":240,"y":440,"wires":[]},{"id":"9d93c84b.021528","type":"http response","z":"c7cddcab.ad2a2","name":"","statusCode":"","headers":{},"x":930,"y":400,"wires":[]},{"id":"e6e5aee8.b016f8","type":"debug","z":"c7cddcab.ad2a2","name":"Meraki API [post]","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":890,"y":440,"wires":[]},{"id":"e755df85.06c7c","type":"debug","z":"c7cddcab.ad2a2","name":"Meraki API [get]","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","x":880,"y":360,"wires":[]},{"id":"6cb71ee2.d71868","type":"function","z":"c7cddcab.ad2a2","name":"Meraki API Options","func":"// Set Variables\nvar apiKey = flow.get('apiKey');\nvar baseUrl = flow.get('baseUrl');\nvar endpoint = msg.req.params.endpoint\nvar query = msg.req.query;\n\n\n// API Call\nmsg.headers = {\n    \"X-Cisco-Meraki-API-Key\": msg.req.headers[\"x-cisco-meraki-api-key\"] || apiKey\n};\nmsg.url = baseUrl + endpoint;\n\nif (query){\n    \n    var queryString = \"\"\n    Object.getOwnPropertyNames(query).forEach(\n      function (val, idx, array) {\n        queryString += (val + '=' + query[val]);\n        if (idx < array.length - 1){\n            queryString += \"&\";\n        }\n      }\n    );\n    msg.url = msg.url +\"?\" + queryString;\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":490,"y":320,"wires":[["c4bf5dd1.2e84f8","66a8929d.8e52cc"]]},{"id":"c4bf5dd1.2e84f8","type":"http request","z":"c7cddcab.ad2a2","name":"[get] request","method":"GET","ret":"obj","url":"","tls":"","x":710,"y":320,"wires":[["d917d25b.4455e","e755df85.06c7c","1aef23fc.ece43c"]]},{"id":"e8570b71.13f488","type":"http request","z":"c7cddcab.ad2a2","name":"[post] request","method":"POST","ret":"obj","url":"","tls":"","x":720,"y":400,"wires":[["9d93c84b.021528","e6e5aee8.b016f8","1aef23fc.ece43c"]]},{"id":"cc6bf5b.7a71188","type":"function","z":"c7cddcab.ad2a2","name":"Meraki API Options","func":"// Set Variables\nvar apiKey = flow.get('apiKey');\nvar baseUrl = flow.get('baseUrl');\nvar endpoint = msg.req.params.endpoint\nvar query = msg.req.query;\n\n\n// API Call\nmsg.headers = {\n    \"X-Cisco-Meraki-API-Key\": msg.req.headers[\"x-cisco-meraki-api-key\"] || apiKey\n};\nmsg.url = baseUrl + endpoint;\n\nif (query){\n    \n    var queryString = \"\"\n    Object.getOwnPropertyNames(query).forEach(\n      function (val, idx, array) {\n        queryString += (val + '=' + query[val]);\n        if (idx < array.length - 1){\n            queryString += \"&\";\n        }\n      }\n    );\n    msg.url = msg.url +\"?\" + queryString;\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":490,"y":400,"wires":[["e8570b71.13f488","2c300dce.aae962"]]},{"id":"7cdb8107.c8c708","type":"http in","z":"c7cddcab.ad2a2","name":"","url":"/meraki/proxy/:endpoint(*)","method":"post","upload":false,"swaggerDoc":"","x":190,"y":400,"wires":[["27fafca2.b8df9c","cc6bf5b.7a71188"]]},{"id":"dacfaa4b.deeee","type":"http in","z":"c7cddcab.ad2a2","name":"","url":"/meraki/proxy/:endpoint(*)","method":"put","upload":false,"swaggerDoc":"","x":190,"y":480,"wires":[["de178948.d8abf","217d0197.f09a5e"]]},{"id":"de178948.d8abf","type":"debug","z":"c7cddcab.ad2a2","name":"Meraki [put] request","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","x":240,"y":520,"wires":[]},{"id":"217d0197.f09a5e","type":"function","z":"c7cddcab.ad2a2","name":"Meraki API Options","func":"// Set Variables\nvar apiKey = flow.get('apiKey');\nvar baseUrl = flow.get('baseUrl');\nvar endpoint = msg.req.params.endpoint\nvar query = msg.req.query;\n\n\n// API Call\nmsg.headers = {\n    \"X-Cisco-Meraki-API-Key\": msg.req.headers[\"x-cisco-meraki-api-key\"] || apiKey\n};\nmsg.url = baseUrl + endpoint;\n\nif (query){\n    \n    var queryString = \"\"\n    Object.getOwnPropertyNames(query).forEach(\n      function (val, idx, array) {\n        queryString += (val + '=' + query[val]);\n        if (idx < array.length - 1){\n            queryString += \"&\";\n        }\n      }\n    );\n    msg.url = msg.url +\"?\" + queryString;\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":490,"y":480,"wires":[["dd8c3396.e4a1c8","16903965.4838df"]]},{"id":"dd8c3396.e4a1c8","type":"http request","z":"c7cddcab.ad2a2","name":"[put] request","method":"PUT","ret":"obj","url":"","tls":"","x":710,"y":480,"wires":[["8817a852.dd918","e012e5db.408d4","1aef23fc.ece43c"]]},{"id":"8817a852.dd918","type":"http response","z":"c7cddcab.ad2a2","name":"","statusCode":"","headers":{},"x":930,"y":480,"wires":[]},{"id":"e012e5db.408d4","type":"debug","z":"c7cddcab.ad2a2","name":"Meraki API [put]","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":880,"y":520,"wires":[]},{"id":"6e2939b6.32375","type":"http in","z":"c7cddcab.ad2a2","name":"","url":"/meraki/proxy/:endpoint(*)","method":"delete","upload":false,"swaggerDoc":"","x":200,"y":560,"wires":[["c40449c7.c2bc48","f1e64710.329b2"]]},{"id":"c40449c7.c2bc48","type":"debug","z":"c7cddcab.ad2a2","name":"Meraki [delete] request","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","x":240,"y":600,"wires":[]},{"id":"f1e64710.329b2","type":"function","z":"c7cddcab.ad2a2","name":"Meraki API Options","func":"// Set Variables\nvar apiKey = flow.get('apiKey');\nvar baseUrl = flow.get('baseUrl');\nvar endpoint = msg.req.params.endpoint\nvar query = msg.req.query;\n\n\n// API Call\nmsg.headers = {\n    \"X-Cisco-Meraki-API-Key\": msg.req.headers[\"x-cisco-meraki-api-key\"] || apiKey\n};\nmsg.url = baseUrl + endpoint;\n\nif (query){\n    \n    var queryString = \"\"\n    Object.getOwnPropertyNames(query).forEach(\n      function (val, idx, array) {\n        queryString += (val + '=' + query[val]);\n        if (idx < array.length - 1){\n            queryString += \"&\";\n        }\n      }\n    );\n    msg.url = msg.url +\"?\" + queryString;\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":490,"y":560,"wires":[["87ae7a3d.13379","d2a43092.29b898"]]},{"id":"87ae7a3d.13379","type":"http request","z":"c7cddcab.ad2a2","name":"[delete] request","method":"DELETE","ret":"obj","url":"","tls":"","x":720,"y":560,"wires":[["1e3458ab.57a497","38bb1201.b5c6ce","1aef23fc.ece43c"]]},{"id":"1e3458ab.57a497","type":"http response","z":"c7cddcab.ad2a2","name":"","statusCode":"","headers":{},"x":930,"y":560,"wires":[]},{"id":"38bb1201.b5c6ce","type":"debug","z":"c7cddcab.ad2a2","name":"Meraki API [delete]","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":890,"y":600,"wires":[]},{"id":"66a8929d.8e52cc","type":"debug","z":"c7cddcab.ad2a2","name":"Meraki API [get] options","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":550,"y":360,"wires":[]},{"id":"2c300dce.aae962","type":"debug","z":"c7cddcab.ad2a2","name":"Meraki API [post] options","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":550,"y":440,"wires":[]},{"id":"16903965.4838df","type":"debug","z":"c7cddcab.ad2a2","name":"Meraki API [put] options","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":550,"y":520,"wires":[]},{"id":"d2a43092.29b898","type":"debug","z":"c7cddcab.ad2a2","name":"Meraki API [delete] options","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":540,"y":600,"wires":[]},{"id":"dde1b48c.b87f9","type":"http in","z":"c7cddcab.ad2a2","name":"","url":"/meraki/ui/createAdmin","method":"get","upload":false,"swaggerDoc":"","x":180,"y":860,"wires":[["1807d5cf.2e8c6a"]]},{"id":"bfa7d2dd.8ee498","type":"template","z":"c7cddcab.ad2a2","name":"CSS","field":"payload.style","fieldType":"msg","format":"css","syntax":"mustache","template":"input[type=text], select {\n    width: 100%;\n    padding: 12px 20px;\n    margin: 8px 0;\n    display: inline-block;\n    border: 1px solid #ccc;\n    border-radius: 4px;\n    box-sizing: border-box;\n}\n\ninput[type=email], select {\n    width: 100%;\n    padding: 12px 20px;\n    margin: 8px 0;\n    display: inline-block;\n    border: 1px solid #ccc;\n    border-radius: 4px;\n    box-sizing: border-box;\n}\n\ninput[type=submit] {\n    width: 50%;\n    background-color: #4CAF50;\n    color: white;\n    padding: 14px 20px;\n    margin: 8px 0;\n    border: none;\n    border-radius: 4px;\n    cursor: pointer;\n}\n\ninput[type=submit]:hover {\n    background-color: #45a049;\n}\n\ndiv form {\n    border-radius: 5px;\n    background-color: #f2f2f2;\n    padding: 20px;\n}\n\n.adminform {\n    width: 90%;\n}\n","x":590,"y":860,"wires":[["9c5fba5a.44482"]]},{"id":"1807d5cf.2e8c6a","type":"template","z":"c7cddcab.ad2a2","name":"JQuery","field":"payload.script","fieldType":"msg","format":"javascript","syntax":"mustache","template":"\n$(document).ready(function(e) {\n    \n    \n    $.ajax({\n        url: '/meraki/proxy/organizations',\n        type: 'get',\n        datatype: 'json',\n        success: function(data){\n            var toAppend = '';\n            //if(typeof data === 'object'){\n                for(var i=0;i<data.length;i++){\n                    toAppend += '<option value='+data[i][\"id\"]+'>'+data[i]['name']+'</option>';\n                }\n            //}\n            console.log(\"orgs toAppend\",toAppend);\n            $('#orgs').append(toAppend);\n        }\n    });\n    \n    $(\"form[ajax=true]\").submit(function(e) {\n        \n        e.preventDefault();\n        \n        var form_data = $(this).serialize();\n        //var form_url = $(this).attr(\"action\");\n        //var form_method = $(this).attr(\"method\").toUpperCase();\n        \n        var orgId = $(\"#orgs\").val();\n        \n        $(\"#loadingimg\").show();\n        \n        $.ajax({\n            url: \"/meraki/proxy/organizations/\"+orgId+\"/admins\",  //form_url+\"/\"+orgId, \n            type: \"post\",       \n            data: form_data,     \n            cache: false,\n            success: function(data){\n                \n                // Create simple HTML response\n                var response = \n                    \"<div>\"+\n                        \"<h2>Created Admin!</h2>\"+\n                        \"<h4>Name</h4><p>\"+data.name+\"</p>\"+\n                        \"<h4>E-Mail</h4><p>\"+data.email+\"</p>\"+\n                        \"<h4>ID</h4><p>\"+data.id+\"</p>\"+\n                        \"<h4>Tags</h4><p>\"+data.tags+\"</p>\"+\n                        \"<h4>Org Access</h4><p>\"+data.orgAccess+\"</p>\"+\n                    \"</div>\";\n                \n                console.log(\"response: \"+JSON.stringify(data));\n                \n                \n                $(\"#result\").html(response); \n                \n                $(\"#loadingimg\").hide();\n                $( '#createadmin' ).each(function(){\n                    this.reset();\n                });\n            },\n            error: function(error){\n                $(\"#result\").html(error.responseText);\n            }\n        });    \n        \n    });\n    \n});","x":420,"y":860,"wires":[["bfa7d2dd.8ee498"]]},{"id":"c5cfe4a7.1ef2e8","type":"comment","z":"c7cddcab.ad2a2","name":"Create Admin Form","info":"","x":130,"y":820,"wires":[]},{"id":"d661157f.f1c2b8","type":"http response","z":"c7cddcab.ad2a2","name":"","x":930,"y":860,"wires":[]},{"id":"9c5fba5a.44482","type":"template","z":"c7cddcab.ad2a2","name":"HTML","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"<html>\n  <head>\n    <title>Meraki Dasbhoard API - Admin User</title>\n    <meta name=\"viewport\" content=\"initial-scale=1.0, user-scalable=no\">\n    <meta charset=\"utf-8\">\n    <!--\n    <script src=\"http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.0/jquery.min.js\"></script>\n    -->\n    <script\n      src=\"https://code.jquery.com/jquery-3.2.1.min.js\"\n      integrity=\"sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=\"\n      crossorigin=\"anonymous\"></script>\n      \n    <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\" integrity=\"sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u\" crossorigin=\"anonymous\">  \n    <script>{{{payload.jquery}}}</script>\n    <style>{{{payload.style}}}</style>\n  </head>\n  \n<div class=\"container\">\n    <h2>Create a Meraki Dashboard Administrator</h2>\n    <h4><a href=\"http://developers.meraki.com\">Meraki Developers Portal</a></h4>\n\n<div class=\"col-md-6\">\n<div class=\"adminform\">\n  <form id=\"createadmin\" ajax=\"true\">\n    <select id=\"orgs\" name=\"orgs\">\n        <option>Select Organization..</option>\n    </select>\n    <label>Contact Details</label>\n    <input type=\"text\" id=\"name\" name=\"name\" placeholder=\"Name\" required=true/>\n    <input type=\"email\" id=\"email\" name=\"email\" placeholder=\"E-mail\" required=true/>\n    <br>\n\n    <label>Organization Permissions</label>\n    <select id=\"orgAccess\" name=\"orgAccess\" placeholder=\"Org Access\">\n      <option value=\"full\" disabled>full</option>\n      <option value=\"read-only\" selected>read-only</option>\n    </select>\n    \n  \n    <input type=\"submit\" class=\"button\" value=\"Submit\">\n  </form>\n</div>\n</div>\n\n<div class=\"col-md-6\">\n    <span id=\"result\"></span>\n</div>\n</div>\n</body>\n</html>\n<script>{{{payload.script}}}</script>","x":770,"y":860,"wires":[["d661157f.f1c2b8"]]},{"id":"68388ae.4fc5bf4","type":"comment","z":"c7cddcab.ad2a2","name":"Sample Web Apps","info":"* Create Network Admin\n\n[/meraki/ui/admins](/meraki/ui/admins)\n\n* Update SSID Settings\n\n[/meraki/ui/updateSSID](/meraki/ui/updateSSID)\n","x":110,"y":780,"wires":[]},{"id":"95bbb07b.c7abd","type":"comment","z":"c7cddcab.ad2a2","name":"API Proxy Endpoints","info":"Use these endpoints instead of requesting Meraki APIs directly.\n\nThe API key will be defined in the Environment Defaults flow\n\nExample:\n```\nhttp://merakidemo.internetoflego.com:1880/meraki/proxy/organizations\n\nhttp://merakidemo.internetoflego.com:1880/meraki/proxy/organizations/{{organizationId}}/admins\n```\n\n","x":110,"y":280,"wires":[]},{"id":"fdb3317d.c6ca3","type":"http in","z":"c7cddcab.ad2a2","name":"","url":"/meraki/ui/updateSSID","method":"get","upload":false,"swaggerDoc":"","x":180,"y":960,"wires":[["48d18a41.63e16c"]]},{"id":"3b0a658b.03808a","type":"template","z":"c7cddcab.ad2a2","name":"VueJS Bulma HTML","field":"payload","fieldType":"msg","format":"handlebars","syntax":"plain","template":"<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <title>SSID Updater</title>\n    <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/bulma/0.6.2/css/bulma.min.css\">\n    <script defer src=\"https://use.fontawesome.com/releases/v5.0.6/js/all.js\"></script>\n</head>\n\n<body>\n\n    <section id=\"app\" class=\"section\">\n        <h2 class=\"title is-1\">\n            Wireless Settings\n        </h2>\n        <div class=\"columns\">\n            <div class=\"column\">\n                <form>\n                    <div class=\"field\">\n                        <label class=\"label\">SSID</label>\n                        <div class=\"control\">\n                            <div class=\"select\">\n                                <select v-model=\"ssid\">\n                                    <option v-for=\"ssid in ssids\" :value=\"ssid\">\n                                        {{ssid.name}}\n                                    </option>\n                                </select>\n                            </div>\n                        </div>\n                    </div>\n\n\n                    <div class=\"field\">\n                        <label class=\"label\">Pre-shared Key</label>\n                        <div class=\"control has-icons-left\">\n                            <input class=\"input\" type=\"text\" v-model=\"form.psk\"/>\n                            <span class=\"icon is-small is-left\">\n                            <i class=\"fas fa-lock\"></i>\n                            </span>\n                        </div>\n                    </div>\n\n                    <div class=\"field\">\n                        <label class=\"label\">Enabled</label>\n                        <div class=\"control\">\n                            <label>\n                                <input type=\"radio\" value=true v-model=\"form.enabled\" /> Enabled\n                            </label>\n                            <br>\n                            <label>\n                                <input type=\"radio\" value=false v-model=\"form.enabled\" /> Disabled\n                            </label>\n                            <br>\n                        </div>\n                    </div>\n                    <button class=\"button is-primary\" type=\"submit\" @click.prevent=\"updateSsid\">Update SSID</button>\n\n                </form>\n\n              \n\n                <transition name=\"fade\" mode=\"out-in\">\n                    <article class=\"message\" :class=\"alert.color\" v-show=\"alert.show\">\n                        <div class=\"message-header \">\n                            <p>{{alert.header}}</p>\n                        </div>\n                        <div class=\"message-body\">\n                            {{alert.message}}\n                        </div>\n                    </article>\n                </transition>\n\n                \n            </div>\n            \n            <div class=\"column\" >\n                <button class=\"button is-secondary\" v-on:click=\"details = !details\">View Details</button>\n                <div v-if=\"details\">\n                    <h5>\n                        <h4>SSID Raw Settings</h4>\n                        <i>Network ID: {{net.id}}</i>\n                    </h5>\n                    <pre><code>{{form}}</code></pre>\n                </div>\n            </div>\n        </div>\n    </section>\n\n</body>\n\n</html>\n\n<style>\n    .margin-bottom {\n        margin-bottom: 15px;\n    }\n\n    .fade-enter,\n    .fade-leave-active {\n        opacity: 0;\n    }\n\n    .fade-enter-active,\n    .fade-leave-active {\n        transition: opacity .5s;\n    }\n\n    .input {\n        width: 300px\n    }\n</style>\n\n<script src='https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.15/vue.min.js'></script>\n<script src=\"https://unpkg.com/axios/dist/axios.min.js\"></script>\n<script>\n    new Vue({\n        el: '#app',\n        data: {\n            baseUrl: '/meraki/proxy',\n            form: {\n                name: '',\n                enabled: '',\n                psk: ''\n            },\n            alert: {\n                show: false,\n                header: \"\",\n                message: \"\"\n            },\n            // provided via URL query   ?netId=L_1234567890\n            net: {\n                id: ''\n            },\n            ssid: {},\n            ssids: [],\n            details: false\n        },\n        created: function () {\n            // Checks if a custom network ID was provided in the query and sets it.    \n            if(this.getParameterByName('netId')){\n                this.net.id = this.getParameterByName('netId');\n            }\n            this.fetchSsids();\n        },\n        watch: {\n            ssid: function () {\n                // copy ssid settings to form defaults\n                this.form = this.ssid;\n            }\n        },\n        methods: {\n            getParameterByName: function(name, url) {\n                if (!url) url = window.location.href;\n                name = name.replace(/[\\[\\]]/g, \"\\\\$&\");\n                var regex = new RegExp(\"[?&]\" + name + \"(=([^&#]*)|&|#|$)\"),\n                    results = regex.exec(url);\n                if (!results) return null;\n                if (!results[2]) return '';\n                return decodeURIComponent(results[2].replace(/\\+/g, \" \"));\n            },\n            ssidSelected: function (number) {\n                console.log(\"SSID selected \" + number);\n                this.ssid = this.ssids[number];\n                //this.formEnabled = true;\n            },\n            fetchSsids: function () {\n                if (!this.net) {\n                    return;\n                }\n                if (!this.net.id) { return }\n                var url = this.baseUrl + '/networks/' + this.net.id + '/ssids';\n                console.log(url);\n                console.log('fetching ssids', this.ssids);\n                axios.get(url)\n                    .then(res => {\n                        // store ssids\n                        this.ssids = res.data;\n                        // assign default ssid if not already selected\n                        this.ssid = this.ssids[0];\n                    }, err => {\n                        console.log('error getting ssids', err);\n                    });\n            },\n            updateSsid: function ($index) {\n                console.log(\"updating SSID \", this.ssid.name);\n                axios.put(this.baseUrl + '/networks/' + this.net.id + '/ssids/' + this.ssid.number, this.form)\n                    .then(res => {\n                        console.log('updateSsid res.data', res.data);\n                        var _this = this;\n                        this.alert = {\n                            show: true,\n                            color: \"is-success\",\n                            header: \"Success\",\n                            message: \"The wireless network has been updated.\"\n                        }\n\n                        setTimeout(function () {\n                            _this.alert.show = false;\n                        }, 3000);\n\n                    }, err => {\n                        console.log('put request failed', err);\n                        const response = err.response\n                        console.log(response.data.errors)\n                        var _this = this;\n                        this.alert = {\n                            show: true,\n                            color: \"is-danger\",\n                            header: \"Error\",\n                            message: response.data.errors\n                        }\n                        setTimeout(function () {\n                            _this.alert.show = false;\n                        }, 3000);\n                    });\n            }\n        }\n    });\n</script>","output":"str","x":720,"y":960,"wires":[["fbae76e8.a9ee8"]]},{"id":"fbae76e8.a9ee8","type":"http response","z":"c7cddcab.ad2a2","name":"","x":930,"y":960,"wires":[]},{"id":"f6e7f6f2.f21358","type":"comment","z":"c7cddcab.ad2a2","name":"Configure SSID","info":"","x":120,"y":920,"wires":[]},{"id":"1aef23fc.ece43c","type":"link out","z":"c7cddcab.ad2a2","name":"API Proxy Events","links":["92519c3b.397"],"x":1055,"y":440,"wires":[]},{"id":"155cb29d.1a9675","type":"comment","z":"c7cddcab.ad2a2","name":"API Event Log","info":"Use this Link node to connect to other flows.","x":1090,"y":400,"wires":[]},{"id":"172fb58d.0234e2","type":"comment","z":"c7cddcab.ad2a2","name":"Event Workflows","info":"","x":100,"y":640,"wires":[]},{"id":"92519c3b.397","type":"link in","z":"c7cddcab.ad2a2","name":"","links":["1aef23fc.ece43c"],"x":75,"y":680,"wires":[["8769f03.34a061","37a9c65d.14c4ea"]]},{"id":"8769f03.34a061","type":"debug","z":"c7cddcab.ad2a2","name":"API Event Received","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":230,"y":720,"wires":[]},{"id":"37a9c65d.14c4ea","type":"function","z":"c7cddcab.ad2a2","name":"Format Event Message","func":"var response = msg.payload;\n\nif(msg.payload.hasOwnProperty('errors')){\n    response = msg.payload['errors'][0];\n}\n\nmsg.payload = {\n    \"method\": msg.req.method,\n    \"url\": msg.req.url,\n    \"statusCode\": msg.statusCode,\n    \"response\": response\n}\nreturn msg;","outputs":1,"noerr":0,"x":250,"y":680,"wires":[["8c676d73.328eb","347e8d46.0d9ba2"]]},{"id":"8c676d73.328eb","type":"debug","z":"c7cddcab.ad2a2","name":"Format Event Message","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":510,"y":720,"wires":[]},{"id":"347e8d46.0d9ba2","type":"switch","z":"c7cddcab.ad2a2","name":"Filter [get] requests","property":"payload.method","propertyType":"msg","rules":[{"t":"neq","v":"GET","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":490,"y":680,"wires":[["c5b456ab.5febb","fc1279ec.096c3"]]},{"id":"c5b456ab.5febb","type":"debug","z":"c7cddcab.ad2a2","name":"API Change Event Received","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":820,"y":720,"wires":[]},{"id":"fc1279ec.096c3","type":"link out","z":"c7cddcab.ad2a2","name":"API Proxy Change Event","links":["6ab342ef.d3d784"],"x":715,"y":680,"wires":[]},{"id":"44ccd304.f13d44","type":"comment","z":"c7cddcab.ad2a2","name":"Send Event to Messaging Service","info":"This is where you can link change events to a messaging service (i.e. mail, Spark, syslog, etc)","x":890,"y":680,"wires":[]},{"id":"5d3c0913.ed73d","type":"debug","z":"c7cddcab.ad2a2","name":"updateSSID netId","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":710,"y":1000,"wires":[]},{"id":"48d18a41.63e16c","type":"function","z":"c7cddcab.ad2a2","name":"Default Network ID: UPDATE THIS","func":"// Set the default Network ID\nvar netId = 'L_646829496481092083'\n\n// Or supplied by user:  \n// https://server/meraki/ui/updatessid?netId=L_646829496481092083\n\n\n\nif (!msg.req.query['netId']){\n    msg.statusCode = 302;\n    msg.headers = {\n      'Location': msg.req.url + '?netId='+netId\n    };\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":460,"y":960,"wires":[["5d3c0913.ed73d","3b0a658b.03808a"]]},{"id":"2b7afa4b.2a3ea6","type":"comment","z":"c7cddcab.ad2a2","name":"Meraki API Proxy","info":"","x":550,"y":100,"wires":[]}]

Flow Info

Created 7 years, 10 months ago
Rating: not yet rated

Owner

Actions

Rate:

Node Types

Core
  • comment (x9)
  • debug (x17)
  • function (x7)
  • http in (x6)
  • http request (x4)
  • http response (x6)
  • inject (x1)
  • link in (x1)
  • link out (x2)
  • switch (x1)
  • template (x4)
Other

Tags

  • cisco
  • meraki
  • dashboard
  • network
  • wireless
  • switch
  • firewall
Copy this flow JSON to your clipboard and then import into Node-RED using the Import From > Clipboard (Ctrl-I) menu option