diff --git a/CHANGELOG.md b/CHANGELOG.md index c82206a..ed2da76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,24 @@ # Changelog -## v2.1.0 - (NEXT) +## v3.0.0 - (Aug/7/2019) + +### :warning: Breaking Changes :warning: + +#### API Coverage Tool Changes +The postman docs that are used to fetch additional endpoints are being dropped in favor of exclusively using the official docs. The postman docs required more maintainance due to inconsistencies in formatting and they took a long time to fetch from the network (10 seconds!). Additionally, the blacklist is being dropped since it's original purpose was to account for odd postman endpoints that weren't properly filtered by the tool. + +#### Upgrading to v3.0.0 +* Any endpoints in the 'Analytics' have been moved to 'MV Sense' + * i.e. change `dashboard.analytics` to `dashboard.mv_sense` + +### New API Endpoints +* Added approximately 70 new endpoints + +## v2.1.1 - (Feb/1/2019) +### Bug fixes +* [#7](https://github.com/tejashah88/node-meraki-dashboard/issues/7): Fixed being unable to import the library + +## v2.1.0 - (Jan/29/2019) ### New API Endpoints #### New groups added diff --git a/DOCUMENTATION.md b/DOCUMENTATION.md index 5ff679a..25b9e8d 100644 --- a/DOCUMENTATION.md +++ b/DOCUMENTATION.md @@ -1,9 +1,10 @@ ## Table of Contents * [Table of Contents](#table-of-contents) * [Documentation](#documentation) + * [API Usage](#api-usage) * [Admins](#admins) * [Alert settings](#alert-settings) - * [Analytics](#analytics) + * [Action Batches](#action-batches) * [Bluetooth Clients](#bluetooth-clients) * [Cameras](#cameras) * [Clients](#clients) @@ -15,13 +16,26 @@ * [Firewalled services](#firewalled-services) * [Group policies](#group-policies) * [HTTP servers](#http-servers) + * [Intrusion Settings](#intrusion-settings) + * [Organization](#organization) + * [MX Network](#mx-network) + * [Malware settings](#malware-settings) + * [Management interface settings](#management-interface-settings) * [Meraki Auth](#meraki-auth) * [MR L3 Firewall](#mr-l3-firewall) + * [MV Sense](#mv-sense) + * [MX 1:1 NAT Rules](#mx-11-nat-rules) + * [MX 1:Many NAT Rules](#mx-1many-nat-rules) * [MX L3 Firewall](#mx-l3-firewall) + * [MX L7 application categories](#mx-l7-application-categories) + * [MX L7 firewall](#mx-l7-firewall) * [MX VPN Firewall](#mx-vpn-firewall) * [MX Cellular Firewall](#mx-cellular-firewall) + * [MX port forwarding rules](#mx-port-forwarding-rules) * [Named tag scope](#named-tag-scope) + * [NetFlow settings](#netflow-settings) * [Networks](#networks) + * [OpenAPI Spec](#openapi-spec) * [Organizations](#organizations) * [Phone announcements](#phone-announcements) * [Phone assignments](#phone-assignments) @@ -37,7 +51,10 @@ * [Cisco Polaris](#cisco-polaris) * [Device](#device) * [Misc. Functions](#misc-functions) + * [Radio Settings](#radio-settings) + * [SNMP Settings](#snmp-settings) * [SSIDs](#ssids) + * [Security Events](#security-events) * [Splash Page](#splash-page) * [Static routes](#static-routes) * [Switch ports](#switch-ports) @@ -45,6 +62,7 @@ * [Syslog servers](#syslog-servers) * [Uplink settings](#uplink-settings) * [VLANs](#vlans) + * [Webhook logs](#webhook-logs) * [Wireless Health](#wireless-health) * [Connectivity Info](#connectivity-info) * [Latency Info](#latency-info) @@ -55,9 +73,15 @@ * Official Documentation: https://api.meraki.com/api_docs * Postman Documentation: https://documenter.getpostman.com/view/897512/2To9xm -**Note**: All functions return a promise, which either resolves to the data received, or rejects with an error. +All functions return a promise, which either resolves to the data received, or rejects with an error. -**Note**: Despite the prescence of types in the documentation, they are NOT enforced in the library. They are more useful as a guide but passing the wrong kind of data can cause unexpected behavior. +**Note**: Despite the presence of types in the documentation, they are NOT enforced in the library. Passing the wrong kind of data can cause unexpected behavior. + +### API Usage +```javascript +// List the API requests made by an organization. +Array dashboard.api_usage.api_requests(String organization_id, Object params) +``` ### Admins ```javascript @@ -83,22 +107,22 @@ Object dashboard.alert_settings.get(String network_id) Object dashboard.alert_settings.update(String network_id, Object params) ``` -### Analytics +### Action Batches ```javascript -// Returns an overview of aggregate analytics data for a timespan. -Object dashboard.analytics.overview(String serial) +// Return the list of action batches in the organization. +Array dashboard.action_batches.list(String organization_id) -// Returns all configured analytic zones for this camera. -Object dashboard.analytics.zones(String serial) +// Return an action batch. +Object dashboard.action_batches.get(String organization_id, String action_batch_id) -// Return historical records for analytic zones. -Object dashboard.analytics.historicalRecords(String serial, String zone_id, Object params) +// Create an action batch. +Object dashboard.action_batches.create(String organization_id, Object params) -// Returns most recent record for analytics zones. -Object dashboard.analytics.recentRecords(String serial) +// Update an action batch. +Object dashboard.action_batches.update(String organization_id, String action_batch_id, Object params) -// Returns live state from camera of analytics zones. -Object dashboard.analytics.liveRecords(String serial) +// Delete an action batch. +dashboard.action_batches.delete(String organization_id, String action_batch_id) ``` ### Bluetooth Clients @@ -114,6 +138,9 @@ Object dashboard.bluetooth_clients.get(String network_id, String client_mac, Obj ```javascript // Returns video link for the specified camera. If a timestamp supplied, it links to that time. Object dashboard.cameras.videoLink(String network_id, String serial, Number timestamp) + +// Generate a snapshot of what the camera sees at the specified time and return a link to that image. +Object dashboard.cameras.snapshot(String network_id, String serial, Number timestamp) ``` ### Clients @@ -155,6 +182,9 @@ Object dashboard.clients.getSplashAuth(String network_id, String client_mac) // Update a client's splash authorization. Object dashboard.clients.updateSplashAuth(String network_id, String client_mac, Object params) + +// List the clients that have used this network in the timespan. +Array dashboard.clients.usedNetwork(String network_id, Object params) ``` ### Config templates @@ -167,7 +197,6 @@ dashboard.config_templates.remove(String organization_id, String template_id) ``` ### Content Filtering - #### Categories ```javascript // List all available content filtering categories for an MX network. @@ -212,6 +241,12 @@ Array dashboard.devices.lossAndLatencyHistory(String network_id, String serial, // Return the performance score for a single device (MX). // Extra documentation: https://documentation.meraki.com/MX/Monitoring_and_Reporting/Device_Utilization Object dashboard.devices.performanceScore(String network_id, String serial) + +// Blink the LEDs on a device. +Object dashboard.devices.blinkLeds(String network_id, String serial, Object params) + +// Reboot a device. +Object dashboard.devices.reboot(String network_id, String serial) ``` ### Firewalled services @@ -230,6 +265,18 @@ Object dashboard.firewalled_services.update(String network_id, String service, O ```javascript // List the group policies in a network. Array dashboard.group_policies.list(String network_id) + +// Display a group policy. +Object dashboard.group_policies.get(String network_id, String group_policy_id) + +// Create a group policy. +Object dashboard.group_policies.create(String network_id, Object params) + +// Update a group policy. +Object dashboard.group_policies.update(String network_id, String group_policy_id, Object params) + +// Delete a group policy. +dashboard.group_policies.delete(String network_id, String group_policy_id) ``` ### HTTP servers @@ -256,6 +303,43 @@ Object dashboard.http_servers.test(String network_id, String url) Object dashboard.http_servers.testStatus(String network_id, String test_id) ``` +### Intrusion Settings +#### Organization +```javascript +// Returns all supported intrusion settings for an organization. +Object dashboard.intrusion_settings.organization.get(String organization_id) + +// Sets supported intrusion settings for an organization. +Object dashboard.intrusion_settings.organization.update(String organization_id, Object params) +``` + +#### MX Network +```javascript +// Returns all supported intrusion settings for an MX Network. +Object dashboard.intrusion_settings.mx_network.get(String network_id) + +// Sets supported intrusion settings for an MX Network. +Object dashboard.intrusion_settings.mx_network.update(String network_id, Object params) +``` + +### Malware settings +```javascript +// Returns all supported malware settings for an MX network. +Object dashboard.malware_settings.get(String network_id) + +// Set the supported malware settings for an MX network. +Object dashboard.malware_settings.update(String network_id, Object params) +``` + +### Management interface settings +```javascript +// Return the management interface settings for a device. +Object dashboard.management_settings.get(String network_id, String serial) + +// Update the management interface settings for a device. +Object dashboard.management_settings.update(String network_id, String serial, Object params) +``` + ### Meraki Auth ```javascript // List the splash or RADIUS users configured under Meraki Authentication for a network. @@ -274,6 +358,42 @@ Array dashboard.mr_l3_firewall.getRules(String network_id, Number ssid) Array dashboard.mr_l3_firewall.updateRules(String network_id, Number ssid, Object params) ``` +### MV Sense +```javascript +// Returns an overview of aggregate analytics data for a timespan. +Object dashboard.mv_sense.overview(String serial) + +// Returns all configured analytic zones for this camera. +Object dashboard.mv_sense.zones(String serial) + +// Return historical records for analytic zones. +Object dashboard.mv_sense.historicalRecords(String serial, String zone_id, Object params) + +// Returns most recent record for analytics zones. +Object dashboard.mv_sense.recentRecords(String serial) + +// Returns live state from camera of analytics zones. +Object dashboard.mv_sense.liveRecords(String serial) +``` + +### MX 1:1 NAT Rules +```javascript +// Return the 1:1 NAT mapping rules for an MX network. +Object dashboard.mx_nat_rules.one_to_one.get(String network_id) + +// Set the 1:1 NAT mapping rules for an MX network. +Object dashboard.mx_nat_rules.one_to_one.update(String network_id, Object params) +``` + +### MX 1:Many NAT Rules +```javascript +// Return the 1:Many NAT mapping rules for an MX network. +Object dashboard.mx_nat_rules.one_to_many.get(String network_id) + +// Set the 1:Many NAT mapping rules for an MX network. +Object dashboard.mx_nat_rules.one_to_many.update(String network_id, Object params) +``` + ### MX L3 Firewall ```javascript // Return the L3 firewall rules for an MX network. @@ -283,6 +403,21 @@ Array dashboard.mx_l3_firewall.getRules(String network_id) Array dashboard.mx_l3_firewall.updateRules(String network_id, Object params) ``` +### MX L7 application categories +```javascript +// Return the L7 firewall application categories and their associated applications for an MX network. +Array dashboard.mx_l7_app_categories.list(String network_id) +``` + +### MX L7 firewall +```javascript +// List the MX L7 firewall rules for an MX network. +Object dashboard.mx_l7_firewall.getRules(String network_id) + +// Update the MX L7 firewall rules for an MX network. +Object dashboard.mx_l7_firewall.updateRules(String network_id, Object params) +``` + ### MX VPN Firewall ```javascript // Return the firewall rules for an organization's site-to-site VPN. @@ -301,24 +436,42 @@ Array dashboard.mx_cellular_firewall.getRules(String network_id) Array dashboard.mx_cellular_firewall.updateRules(String network_id, Object params) ``` +### MX port forwarding rules +```javascript +// Return the port forwarding rules for an MX network. +Object dashboard.mx_port_forwarding.getRules(String network_id) + +// Update the port forwarding rules for an MX network. +Object dashboard.mx_port_forwarding.updateRules(String network_id, Object params) +``` + ### Named tag scope ```javascript -// List the named tag scopes in this network. +// List the target groups in this network. Array dashboard.named_tag_scope.list(String network_id, Boolean with_details) -// Return a named tag scope. +// Return a target group. Object dashboard.named_tag_scope.get(String network_id, String named_tag_scope_id, Boolean with_details) -// Update a named tag scope. +// Update a target group. Object dashboard.named_tag_scope.update(String network_id, String named_tag_scope_id, Object params) -// Add a named_tag_scope. +// Add a target group. Object dashboard.named_tag_scope.create(String network_id, Object params) -// Delete a named tag scope from a network. +// Delete a target group from a network. dashboard.named_tag_scope.delete(String network_id, String named_tag_scope_id) ``` +### NetFlow settings +```javascript +// Return the NetFlow traffic reporting settings for a network. +Object dashboard.netflow_settings.get(String network_id) + +// Update the NetFlow traffic reporting settings for a network. +Object dashboard.netflow_settings.update(String network_id, Object params) +``` + ### Networks ```javascript // List the networks in an organization. @@ -362,6 +515,18 @@ Object dashboard.networks.getBluetoothSettings(String network_id) // Update the Bluetooth settings for a network. See the docs page for Bluetooth settings. Object dashboard.networks.updateBluetoothSettings(String network_id, Object params) + +// Combine multiple networks into a single network. +Object dashboard.networks.combineNetworks(String organization_id, Object params) + +// Split a combined network into individual networks for each type of device. +Object dashboard.networks.splitNetwork(String network_id) +``` + +### OpenAPI Spec +```javascript +// Return the OpenAPI 2.0 Specification of the organization's API documentation in JSON. +Object dashboard.openapi_spec.get(String organization_id) ``` ### Organizations @@ -372,11 +537,14 @@ Array dashboard.organizations.list() // Return an organization. Object dashboard.organizations.get(String organization_id) +// Create a new organization. +Object dashboard.organizations.create(Object params) + // Update an organization. Object dashboard.organizations.update(String organization_id, Object params) -// Create a new organization. -Object dashboard.organizations.create(Object params) +// Delete an organization. +dashboard.organizations.delete(String organization_id) // Create a new organization by cloning the addressed organization. Object dashboard.organizations.clone(String organization_id, Object params) @@ -401,6 +569,9 @@ Object dashboard.organizations.getSnmpSettings(String organization_id) // Update the SNMP settings for an organization. Object dashboard.organizations.updateSnmpSettings(String organization_id, Object params) +// Return the uplink loss and latency for every MX in the organization from at latest 2 minutes ago. +Array dashboard.organizations.getUplinkLossLatency(String organization_id, Object params) + // Return the third party VPN peers for an organization. Array dashboard.organizations.getThirdPartyVpnPeers(String organization_id) @@ -546,7 +717,6 @@ dashboard.saml_roles.delete(String organization_id, String role_id) ``` ### System Manager - #### Cisco Clarity ```javascript // Create a new profile containing a Cisco Clarity payload. @@ -673,6 +843,27 @@ Object dashboard.sm.moveDevices(String network_id, Object params) Object dashboard.sm.listProfiles(String network_id) ``` +### Radio Settings +```javascript +// Return the radio settings of a device. +Object dashboard.radio_settings.get(String network_id, String serial) + +// Update the radio settings of a device. +Object dashboard.radio_settings.update(String network_id, String serial, Object params) + +// List the non-basic RF profiles for this network. +Array dashboard.radio_settings.listRfProfiles(String network_id, Object params) +``` + +### SNMP Settings +```javascript +// Return the SNMP settings for a network. +dashboard.snmp_settings.get(String network_id) + +// Update the SNMP settings for a network. +dashboard.snmp_settings.update(String network_id, Object params) +``` + ### SSIDs ```javascript // List the SSIDs in a network. @@ -685,6 +876,15 @@ Object dashboard.ssids.get(String network_id, String ssid) Object dashboard.ssids.update(String network_id, String ssid, Object params) ``` +### Security Events +```javascript +// List the security events for a organization. +Array dashboard.security_events.byOrganization(String organization_id, Object params) + +// List the security events for a network. +Array dashboard.security_events.byNetwork(String network_id, Object params) +``` + ### Splash Page ```javascript // List the splash login attempts for a network. @@ -778,6 +978,12 @@ Object dashboard.vlans.isEnabled(String network_id) Object dashboard.vlans.setEnabled(String network_id, Boolean enabled) ``` +### Webhook logs +```javascript +// Return the log of webhook POSTs sent. +Array dashboard.webhook_logs.get(String organization_id, Object params) +``` + ### Wireless Health #### Connectivity Info diff --git a/src/index.js b/src/index.js index 854ad65..ef6ef7e 100644 --- a/src/index.js +++ b/src/index.js @@ -52,6 +52,10 @@ function MerakiDashboard(apiKey) { } }; + dashboard.api_usage = { + api_requests: (organization_id, params) => rest.get(`/organizations/${organization_id}/apiRequests`, params) + }; + dashboard.admins = { list: (organization_id) => rest.get(`/organizations/${organization_id}/admins`), create: (organization_id, params) => rest.post(`/organizations/${organization_id}/admins`, params), @@ -64,12 +68,12 @@ function MerakiDashboard(apiKey) { update: (network_id, params) => rest.put(`/networks/${network_id}/alertSettings`, params) }; - dashboard.analytics = { - overview: (serial) => rest.get(`/devices/${serial}/camera/analytics/overview`), - zones: (serial) => rest.get(`/devices/${serial}/camera/analytics/zones`), - historicalRecords: (serial, zone_id, params) => rest.get(`/devices/${serial}/camera/analytics/zones/${zone_id}/history`, params), - recentRecords: (serial) => rest.get(`/devices/${serial}/camera/analytics/recent`), - liveRecords: (serial) => rest.get(`/devices/${serial}/camera/analytics/live`) + dashboard.action_batches = { + list: (organization_id) => rest.get(`/organizations/${organization_id}/actionBatches`), + get: (organization_id, action_batch_id) => rest.get(`/organizations/${organization_id}/actionBatches/${action_batch_id}`), + create: (organization_id, params) => rest.post(`/organizations/${organization_id}/actionBatches`, params), + update: (organization_id, action_batch_id, params) => rest.put(`/organizations/${organization_id}/actionBatches/${action_batch_id}`, params), + delete: (organization_id, action_batch_id) => rest.delete(`/organizations/${organization_id}/actionBatches/${action_batch_id}`) }; dashboard.bluetooth_clients = { @@ -78,7 +82,8 @@ function MerakiDashboard(apiKey) { }; dashboard.cameras = { - videoLink: (network_id, serial, timestamp) => rest.get(`/networks/${network_id}/cameras/${serial}/videoLink`, ensureValueVerbose(timestamp, { timestamp }, {})) + videoLink: (network_id, serial, timestamp) => rest.get(`/networks/${network_id}/cameras/${serial}/videoLink`, ensureValueVerbose(timestamp, { timestamp }, {})), + snapshot: (network_id, serial, timestamp) => rest.post(`/networks/${network_id}/cameras/${serial}/snapshot`, ensureValueVerbose(timestamp, { timestamp }, {})) }; dashboard.clients = { @@ -93,7 +98,8 @@ function MerakiDashboard(apiKey) { getPolicy: (network_id, client_mac, timespan) => rest.get(`/networks/${network_id}/clients/${client_mac}/policy`, ensureValueVerbose(timespan, { timespan }, {})), updatePolicy: (network_id, client_mac, params) => rest.put(`/networks/${network_id}/clients/${client_mac}/policy`, params), getSplashAuth: (network_id, client_mac) => rest.get(`/networks/${network_id}/clients/${client_mac}/splashAuthorizationStatus`), - updateSplashAuth: (network_id, client_mac, params) => rest.put(`/networks/${network_id}/clients/${client_mac}/splashAuthorizationStatus`, params) + updateSplashAuth: (network_id, client_mac, params) => rest.put(`/networks/${network_id}/clients/${client_mac}/splashAuthorizationStatus`, params), + usedNetwork: (network_id, params) => rest.get(`/networks/${network_id}/clients`, params) }; dashboard.config_templates = { @@ -120,7 +126,9 @@ function MerakiDashboard(apiKey) { remove: (network_id, serial) => rest.post(`/networks/${network_id}/devices/${serial}/remove`), lldpCdpInfo: (network_id, serial, timespan) => rest.get(`/networks/${network_id}/devices/${serial}/lldp_cdp`, ensureValueVerbose(timespan, { timespan }, {})), lossAndLatencyHistory: (network_id, serial, params) => rest.get(`/networks/${network_id}/devices/${serial}/lossAndLatencyHistory`, params), - performanceScore: (network_id, serial) => rest.get(`/networks/${network_id}/devices/${serial}/performance`) + performanceScore: (network_id, serial) => rest.get(`/networks/${network_id}/devices/${serial}/performance`), + blinkLeds: (network_id, serial, params) => rest.post(`/networks/${network_id}/devices/${serial}/blinkLeds`, params), + reboot: (network_id, serial) => rest.post(`/networks/${network_id}/devices/${serial}/reboot`) }; dashboard.firewalled_services = { @@ -130,7 +138,11 @@ function MerakiDashboard(apiKey) { }; dashboard.group_policies = { - list: (network_id) => rest.get(`/networks/${network_id}/groupPolicies`) + list: (network_id) => rest.get(`/networks/${network_id}/groupPolicies`), + get: (network_id, group_policy_id) => rest.get(`/networks/${network_id}/groupPolicies/${group_policy_id}`), + create: (network_id, params) => rest.post(`/networks/${network_id}/groupPolicies`, params), + update: (network_id, group_policy_id, params) => rest.put(`/networks/${network_id}/groupPolicies/${group_policy_id}`, params), + delete: (network_id, group_policy_id) => rest.delete(`/networks/${network_id}/groupPolicies/${group_policy_id}`), }; dashboard.http_servers = { @@ -143,6 +155,27 @@ function MerakiDashboard(apiKey) { testStatus: (network_id, test_id) => rest.get(`/networks/${network_id}/httpServers/webhookTests/${test_id}`) }; + dashboard.intrusion_settings = { + organization: { + get: (organization_id) => rest.get(`/organizations/${organization_id}/security/intrusionSettings`), + update: (organization_id, params) => rest.put(`/organizations/${organization_id}/security/intrusionSettings`, params), + }, + mx_network: { + get: (network_id) => rest.get(`/networks/${network_id}/security/intrusionSettings`), + update: (network_id, params) => rest.put(`/networks/${network_id}/security/intrusionSettings`, params), + }, + }; + + dashboard.malware_settings = { + get: (network_id) => rest.get(`/networks/${network_id}/security/malwareSettings`), + update: (network_id, params) => rest.put(`/networks/${network_id}/security/malwareSettings`, params) + }; + + dashboard.management_settings = { + get: (network_id, serial) => rest.get(`/networks/${network_id}/devices/${serial}/managementInterfaceSettings`), + update: (network_id, serial, params) => rest.put(`/networks/${network_id}/devices/${serial}/managementInterfaceSettings`, params) + }; + dashboard.meraki_auth = { listUsers: (network_id) => rest.get(`/networks/${network_id}/merakiAuthUsers`), getUser: (network_id, user_id) => rest.get(`/networks/${network_id}/merakiAuthUsers/${user_id}`) @@ -153,11 +186,39 @@ function MerakiDashboard(apiKey) { updateRules: (network_id, ssid, params) => rest.put(`/networks/${network_id}/ssids/${ssid}/l3FirewallRules`, params) }; + dashboard.mv_sense = { + overview: (serial) => rest.get(`/devices/${serial}/camera/analytics/overview`), + zones: (serial) => rest.get(`/devices/${serial}/camera/analytics/zones`), + historicalRecords: (serial, zone_id, params) => rest.get(`/devices/${serial}/camera/analytics/zones/${zone_id}/history`, params), + recentRecords: (serial) => rest.get(`/devices/${serial}/camera/analytics/recent`), + liveRecords: (serial) => rest.get(`/devices/${serial}/camera/analytics/live`) + }; + + dashboard.mx_nat_rules = { + one_to_one: { + get: (network_id) => rest.get(`/networks/${network_id}/oneToOneNatRules`), + update: (network_id, params) => rest.put(`/networks/${network_id}/oneToOneNatRules`, params), + }, + one_to_many: { + get: (network_id) => rest.get(`/networks/${network_id}/oneToManyNatRules`), + update: (network_id, params) => rest.put(`/networks/${network_id}/oneToManyNatRules`, params), + }, + }; + dashboard.mx_l3_firewall = { getRules: (network_id) => rest.get(`/networks/${network_id}/l3FirewallRules`), updateRules: (network_id, params) => rest.put(`/networks/${network_id}/l3FirewallRules`, params) }; + dashboard.mx_l7_app_categories = { + list: (network_id) => rest.get(`/networks/${network_id}/l7FirewallRules/applicationCategories`) + }; + + dashboard.mx_l7_firewall = { + getRules: (network_id) => rest.get(`/networks/${network_id}/l7FirewallRules`), + updateRules: (network_id, params) => rest.put(`/networks/${network_id}/l7FirewallRules`, params) + }; + dashboard.mx_vpn_firewall = { getRules: (organization_id) => rest.get(`/organizations/${organization_id}/vpnFirewallRules`), updateRules: (organization_id, params) => rest.put(`/organizations/${organization_id}/vpnFirewallRules`, params) @@ -168,12 +229,22 @@ function MerakiDashboard(apiKey) { updateRules: (network_id, params) => rest.put(`/networks/${network_id}/cellularFirewallRules`, params), }; + dashboard.mx_port_forwarding = { + getRules: (network_id) => rest.get(`/networks/${network_id}/portForwardingRules`), + updateRules: (network_id, params) => rest.put(`/networks/${network_id}/portForwardingRules`, params) + }; + dashboard.named_tag_scope = { - list: (network_id, with_details) => rest.get(`/networks/${network_id}/sm/namedTagScopes`, ensureValueVerbose(with_details, { withDetails: with_details }, {})), - get: (network_id, named_tag_scope_id, with_details) => rest.get(`/networks/${network_id}/sm/namedTagScopes/${named_tag_scope_id}`, ensureValueVerbose(with_details, { withDetails: with_details }, {})), - update: (network_id, named_tag_scope_id, params) => rest.put(`/networks/${network_id}/sm/namedTagScopes/${named_tag_scope_id}`, params), - create: (network_id, params) => rest.post(`/networks/${network_id}/sm/namedTagScopes`, params), - delete: (network_id, named_tag_scope_id) => rest.delete(`/networks/${network_id}/sm/namedTagScopes/${named_tag_scope_id}`) + list: (network_id, with_details) => rest.get(`/networks/${network_id}/sm/targetGroups`, ensureValueVerbose(with_details, { withDetails: with_details }, {})), + get: (network_id, named_tag_scope_id, with_details) => rest.get(`/networks/${network_id}/sm/targetGroups/${named_tag_scope_id}`, ensureValueVerbose(with_details, { withDetails: with_details }, {})), + update: (network_id, named_tag_scope_id, params) => rest.put(`/networks/${network_id}/sm/targetGroups/${named_tag_scope_id}`, params), + create: (network_id, params) => rest.post(`/networks/${network_id}/sm/targetGroups`, params), + delete: (network_id, named_tag_scope_id) => rest.delete(`/networks/${network_id}/sm/targetGroups/${named_tag_scope_id}`) + }; + + dashboard.netflow_settings = { + get: (network_id) => rest.get(`/networks/${network_id}/netflowSettings`), + update: (network_id, params) => rest.put(`/networks/${network_id}/netflowSettings`, params) }; dashboard.networks = { @@ -191,13 +262,20 @@ function MerakiDashboard(apiKey) { listAirMarshalScanResults: (network_id, timespan) => rest.get(`/networks/${network_id}/airMarshal`, ensureValueVerbose(timespan, { timespan }, {})), getBluetoothSettings: (network_id) => rest.get(`/networks/${network_id}/bluetoothSettings`), updateBluetoothSettings: (network_id, params) => rest.put(`/networks/${network_id}/bluetoothSettings`, params), + combineNetworks: (organization_id, params) => rest.post(`/organizations/${organization_id}/networks/combine`, params), + splitNetwork: (network_id) => rest.post(`/networks/${network_id}/split`) + }; + + dashboard.openapi_spec = { + get: (organization_id) => rest.get(`/organizations/${organization_id}/openapiSpec`) }; dashboard.organizations = { list: () => rest.get(`/organizations`), get: (organization_id) => rest.get(`/organizations/${organization_id}`), - update: (organization_id, params) => rest.put(`/organizations/${organization_id}`, params), create: (params) => rest.post(`/organizations`, params), + update: (organization_id, params) => rest.put(`/organizations/${organization_id}`, params), + delete: (organization_id) => rest.delete(`/organizations/${organization_id}`), clone: (organization_id, params) => rest.post(`/organizations/${organization_id}/clone`, params), claimDevice: (organization_id, params) => rest.post(`/organizations/${organization_id}/claim`, params), getLicenseState: (organization_id) => rest.get(`/organizations/${organization_id}/licenseState`), @@ -205,6 +283,7 @@ function MerakiDashboard(apiKey) { getDeviceStatuses: (organization_id) => rest.get(`/organizations/${organization_id}/deviceStatuses`), getSnmpSettings: (organization_id) => rest.get(`/organizations/${organization_id}/snmp`), updateSnmpSettings: (organization_id, params) => rest.put(`/organizations/${organization_id}/snmp`, params), + getUplinkLossLatency: (organization_id, params) => rest.get(`/organizations/${organization_id}/uplinksLossAndLatency`, params), getThirdPartyVpnPeers: (organization_id) => rest.get(`/organizations/${organization_id}/thirdPartyVPNPeers`), updateThirdPartyVpnPeers: (organization_id, params) => rest.put(`/organizations/${organization_id}/thirdPartyVPNPeers`, params) }; @@ -327,12 +406,28 @@ function MerakiDashboard(apiKey) { listProfiles: (network_id) => rest.get(`/networks/${network_id}/sm/profiles`) }; + dashboard.radio_settings = { + get: (network_id, serial) => rest.get(`/networks/${network_id}/devices/${serial}/wireless/radioSettings`), + update: (network_id, serial, params) => rest.put(`/networks/${network_id}/devices/${serial}/wireless/radioSettings`, params), + listRfProfiles: (network_id, params) => rest.get(`/networks/${network_id}/wireless/rfProfiles`, params) + }; + + dashboard.snmp_settings = { + get: (network_id) => rest.get(`/networks/${network_id}/snmpSettings`), + update: (network_id, params) => rest.put(`/networks/${network_id}/snmpSettings`, params) + }; + dashboard.ssids = { list: (network_id) => rest.get(`/networks/${network_id}/ssids`), get: (network_id, ssid) => rest.get(`/networks/${network_id}/ssids/${ssid}`), update: (network_id, ssid, params) => rest.put(`/networks/${network_id}/ssids/${ssid}`, params) }; + dashboard.security_events = { + byOrganization: (organization_id, params) => rest.get(`/organizations/${organization_id}/securityEvents`, params), + byNetwork: (network_id, params) => rest.get(`/networks/${network_id}/securityEvents`, params) + }; + dashboard.splash_page = { loginAttempts: (network_id, params) => rest.get(`/networks/${network_id}/splashLoginAttempts`, params), getSettings: (network_id, ssid) => rest.get(`/networks/${network_id}/ssids/${ssid}/splashSettings`), @@ -378,6 +473,10 @@ function MerakiDashboard(apiKey) { setEnabled: (network_id, enabled) => rest.put(`/networks/${network_id}/vlansEnabledState`, ensureValueVerbose(enabled, { enabled }, {})), }; + dashboard.webhook_logs = { + get: (organization_id, params) => rest.get(`/organizations/${organization_id}/webhookLogs`, params) + }; + dashboard.wireless_health = { connectivity_info: { general: (network_id, params) => rest.get(`/networks/${network_id}/connectionStats`, params), diff --git a/test/1 - utils/retrieve-api-routes.spec.js b/test/1 - utils/retrieve-api-routes.spec.js index b19a94b..ee5991c 100644 --- a/test/1 - utils/retrieve-api-routes.spec.js +++ b/test/1 - utils/retrieve-api-routes.spec.js @@ -21,7 +21,7 @@ describe('utils/retrieve-api-routes.js', function () { }); describe('testing structure of retrieved resources', function () { - const OFFICIAL_DOC_PARAMS = [ 'group', 'path', 'method', 'description', 'alt_path', 'params' ]; + const OFFICIAL_DOC_PARAMS = [ 'group', 'path', 'has_params', 'method', 'description', 'alt_path', 'params' ]; before('retrieving API endpoint resources', function () { const flatten = arr => [].concat(...arr); diff --git a/tools/api-coverage.js b/tools/api-coverage.js index ed7e0d1..b9bba04 100644 --- a/tools/api-coverage.js +++ b/tools/api-coverage.js @@ -36,9 +36,10 @@ retrieveOfficialDocs() )) .then(endpointData => { const coloredEndpointData = endpointData.map( - ({ group, method, path, description }) => ([ + ({ group, method, has_params, path, description }) => ([ group, METHOD_COLORS[method](method), + has_params ? chalk.greenBright('yes') : chalk.redBright('no'), path.replace(/<(\w+)>/g, chalk.cyanBright('<$1>')), wrap(description.endsWith('.') ? description : description + '.', { width: 100, trim: true, indent: '' }) ]) @@ -53,7 +54,7 @@ retrieveOfficialDocs() return a[0].localeCompare(b[0]); }); - const columnTitles = [ 'group', 'method', 'path', 'description']; + const columnTitles = [ 'group', 'method', 'params?', 'path', 'description']; results = `# of potentially unimplemented endpoints: ${endpointData.length}\n`; results += table([columnTitles, ...coloredEndpointData]); } diff --git a/utils/retrieve-api-routes.js b/utils/retrieve-api-routes.js index 8b6313a..c5fb12d 100644 --- a/utils/retrieve-api-routes.js +++ b/utils/retrieve-api-routes.js @@ -27,6 +27,7 @@ function retrieveOfficialDocs() { return { group, method, description, + has_params: params != null, path: path.replace(officialParamRegex, '<$2>'), alt_path: alternate_path ? alternate_path.replace(officialParamRegex, '') : null, params: params || null