Browse Source

Add some more API support.

* Support for SSID availability tags
* Add support for network-wide traffic shaping
Joe Clarke 2 years ago
parent
commit
77412445f5
2 changed files with 49 additions and 4 deletions
  1. 26 2
      meraki_api/meraki_api.py
  2. 23 2
      setup-meraki-nets.py

+ 26 - 2
meraki_api/meraki_api.py

@@ -1,7 +1,7 @@
 from __future__ import print_function
 
 #
-# Copyright (c) 2018-2020  Joe Clarke <jclarke@cisco.com>
+# Copyright (c) 2018-2021  Joe Clarke <jclarke@cisco.com>
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions
@@ -350,6 +350,27 @@ class Network(Meraki):
 
         return vlan_obj
 
+    def apply_shaping(self, client_limit):
+        if not self._check_obj():
+            return False
+
+        payload = {"globalBandwidthLimits": {"limitUp": client_limit, "limitDown": client_limit}}
+
+        url = self.NET_API + "/" + self._id + "/networks/appliance/trafficShaping"
+        try:
+            response = requests.request("POST", url, json=payload, headers=self._headers)
+            response.raise_for_status()
+        except Exception as e:
+            msg = "Error setting traffic shaping limit in network {}: {} ({})".format(self._name, e, Meraki._get_json_errors(response))
+            if self._logit:
+                logging.error(msg)
+            else:
+                print(msg)
+
+            return False
+
+        return True
+
 
 class SSID(Meraki):
     _id_prop = "number"
@@ -370,7 +391,7 @@ class SSID(Meraki):
             return False
 
         payload = {}
-        for key in ["name", "enabled", "auth_mode", "encryption_mode", "psk", "ip_assignment_mode"]:
+        for key in ["name", "enabled", "auth_mode", "encryption_mode", "psk", "ip_assignment_mode", "tags"]:
             if key in kwargs:
                 if key == "auth_mode":
                     payload["authMode"] = kwargs[key]
@@ -378,6 +399,9 @@ class SSID(Meraki):
                     payload["encryptionMode"] = kwargs[key]
                 elif key == "ip_assignment_mode":
                     payload["ipAssignmentMode"] = kwargs[key]
+                elif key == "tags":
+                    payload["availabilityTags"] = kwargs[key]
+                    payload["availableOnAllAps"] = False
                 else:
                     payload[key] = kwargs[key]
 

+ 23 - 2
setup-meraki-nets.py

@@ -118,6 +118,23 @@ def main():
                         break
             net_obj = org.create_network(nname, **nargs)
 
+        if "client_limit" in network:
+            if not isinstance(network["client_limit"], int) or network["client_limit"] < 0:
+                print(
+                    "{}Client limit for network {} must be an integer greater than or equal to 0!{}".format(
+                        Fore.RED, nname, Style.RESET_ALL
+                    )
+                )
+                nerrors += 1
+                continue
+
+            shape_ret = net_obj.apply_shaping(network["client_limit"])
+            if shape_ret:
+                print("{}update: added traffic shaping to network {}{}".format(Fore.YELLOW, nname, Style.RESET_ALL))
+            else:
+                print("{}Error adding shaping to network {}!{}".format(Fore.RED, nname, Style.RESET_ALL))
+                nerrors += 1
+
         if net_obj is None:
             print("{}Error creating new network {}!{}".format(Fore.RED, nname, Style.RESET_ALL))
             errors += 1
@@ -188,9 +205,13 @@ def main():
 
                     dev_location = network["address"]
                     dev_name = dev["name"]
+                    dparams = {}
                     if "location" in dev:
                         dev_location += "\n" + dev["location"]
-                    dev_obj.update_device(name=dev_name, address=dev_location, move_map_marker=True)
+                        dparams["address"] = dev_location
+                    if "tags" in dev:
+                        dparams["tags"] = dev["tags"]
+                    dev_obj.update_device(name=dev_name, move_map_marker=True, **dparams)
                     print("{}update: updated {} name and location{}".format(Fore.YELLOW, inv_dev[0]["serial"], Style.RESET_ALL))
 
                 else:
@@ -254,7 +275,7 @@ def main():
                 for sname, ssid in network["ssids"].items():
                     ssid_obj = SSID(key=config["api_key"], id=si, name=sname, net=net_obj)
                     sargs = {}
-                    for key in ["name", "enabled", "auth_mode", "encryption_mode", "psk", "ip_assignment_mode"]:
+                    for key in ["name", "enabled", "auth_mode", "encryption_mode", "psk", "ip_assignment_mode", "tags"]:
                         if key in ssid:
                             sargs[key] = ssid[key]
                     res = ssid_obj.update_ssid(**sargs)