I wanted to add to this since I really needed a solution and I had to make my own. For this script you need two text files: device_serials.txt and tag.txt in the same directory as your python script. device_serials has device serial numbers per line tag has the tag of the switch port How it works: It scans the device serials matching those in the device_serials.txt file. All the ports in that switch that have the tag written in the tag.txt file will be cycled. I made it it like this so that I could target specific ports on a switch. Here's my script, which is based on Meraki tagging. With a little Python know-how, this is easy to modify this based on device properties: #By Josh Carbajal
import meraki
import requests
import json
from datetime import datetime
#DECLARATIONS
API_KEY = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
dashboard = meraki.DashboardAPI(API_KEY)
payload = None
headers = {
"Content-Type": "application/json",
"Accept": "application/json",
"X-Cisco-Meraki-API-Key": API_KEY
}
dt = datetime.now().strftime("%Y_%m_%d-%I.%M.%S.%p")
divider = "\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"
#FUNCTIONS
def getresponse(serialnumber):
url = "https://api.meraki.com/api/v1/devices/{}/switch/ports".format(serialnumber)
response = requests.request('GET', url, headers=headers, data = payload)
refined = json.loads(response.text)
if 'errors' in refined:
print("Could not establish a good API handshake with device serial ({})".format(serialnumber))
logFile.write("\nCould not establish a good API handshake with device serial ({}).\n".format(serialnumber))
logFile.write(divider)
else:
switch = dashboard.devices.getDevice(serial)
name = switch['name']
logFile.write("\nDevice {}, with serial {} found.".format(name, serialnumber))
findRebootTag(refined, serialnumber)
def findRebootTag(goodresponse, serialnumber):
ports = []
for device in goodresponse:
if tag in device['tags']:
print(device)
ports.append(str(device['portId']))
else:
pass
print(ports)
logFile.write("\nDevice serial: {}.\tPorts tagged with {}: {}".format(serialnumber, tag, ports))
cycle(ports, serialnumber)
def cycle(ports, serialnumber):
if ports:
for port_number in ports:
print("Port number: " + port_number)
#cycleAll = dashboard.switch.cycleDeviceSwitchPorts(serialnumber, ports)
logFile.write("\nCycling ports {} for device serial {}.\n".format(ports, serialnumber))
logFile.write(divider)
else:
print("No ports tagged with {} found for device serial ({})".format(tag, serialnumber))
logFile.write("\nNo ports tagged with {} found for device serial ({}).\n".format(tag, serialnumber))
logFile.write(divider)
#MAIN RUN
tagFile = open("tag.txt", "r")
tag = tagFile.read()
tagFile.close()
logFile = open("{}.txt".format(dt), "w")
logFile.write("Log: Meraki API via Python custom script\n")
with open("device_serials.txt") as txtfile:
serialtxt = txtfile.read().splitlines()
for serial in serialtxt:
if serial:
getresponse(serial)
else:
pass
logFile.close() As you can see, it creates a log named with a datetime stamp. If you want to automate this kind of stuff, use Task Scheduler, for example, and run the python script with a batch file.
... View more