500 Error when Camera is Offline

Solved
KarlWyatt
New here

500 Error when Camera is Offline

First, Please don't laugh at my code, I'm a network engineer, I've pieced this together from various sources. 

Second, its incomplete. So I know there are things that just don't work. 

 

So here is what it does. I have cameras that are in close to 200 different networks. In most cases there is 1 camera per network. For quality\compliance reasons I need to review each cameras placement and status at least once quarterly. I found it some what annoying to tackle this via the dashboard so I decided to figure out how to use the API. 

 

Enter my python script below. When run it asks for the API Key and then I lists the available orgs. Eventually I'll have 3 options 1) snap a pic from all cameras, 2) choose the camera to snap a pic from 3) exit. The first option allows me to just let it run and look later, the second option allows me to pull a specific camera if I want to review one, or check placement after adjustments are made, it lists out networks that have cameras

 

Okay - now that we are past what it does, I can say it does work.... so long as the camera is online. 

 

If you look at somewhere around line 39 (if copy and paste works) i have the line "snapurl = dashboard.camera.generateDeviceCameraSnapshot(indv_device['serial'])" 

 

I need help with some error handling here - if the camera is offline it can't create the snapshot url and throws a 500 error. It still tries because the dashboard knows about the device, but fails. I've tried to use try: with request response but maybe I'm doing something wrong? With the 500 error it just crashes the script with this message - "meraki.exceptions.APIError: camera, generateDeviceCameraSnapshot - 500 Internal Server Error, <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtm"

 

Does anyone have a tip to error handle a 500 error that maybe just prints "Camera is Unresponsive or Offline" or is there a way to test before the 500 if the device is online? 

 

Thanks,

 

 

 

 

 

 

import getpass
import requests
import meraki
import time

USER_KEY = getpass.getpass('Enter your Meraki API Value: ')
dashboard = meraki.DashboardAPI(USER_KEY, suppress_logging=True)
available_orgs = dashboard.organizations.getOrganizations()
print("\n---------------------------\nAvailable Organizations\n---------------------------")
for i in range(len(available_orgs)): 
    option = f"{i}: {available_orgs[i]['name']}" 
    print(option)
org_selection = input(f"\nSelect an organization [0-{len(available_orgs)-1}]: ")
org = available_orgs[int(org_selection)]
answer = input("Choose what you would like to do:\n    1) Capture snapshot from all camers\n    2) Capture snapshot from a single camera\n    3) Exit\nPlease type 1,2 or 3: ")
answer = '2'
if answer == '1':
    print("I don't do this yet")
if answer == '2':
    networks = dashboard.organizations.getOrganizationNetworks(org['id'])
    print("\n-------------------------------\nAvailable Networks With Cameras\n-------------------------------")
    num_networks = len(networks)
    for n in range(num_networks): 
        network = networks[n]
        dev_network = dashboard.networks.getNetworkDevices(network['id'])
        num_device = len(dev_network)
        for s in range(num_device):
            indv_device = dev_network[s]
            if indv_device['model'] == 'MV12N':
                netoption = f"{n}: {networks[n]['name']}" 
                print(netoption)
    net_selection = input(f"\nSelect a Network to capture image from [0-{len(networks)-1}]: ")
    camera_net = networks[int(net_selection)]
    dev_network = dashboard.networks.getNetworkDevices(camera_net['id'])
    num_device = len(dev_network)
    for s in range(num_device):
        indv_device = dev_network[s]
        if indv_device['model'] == 'MV12N':
            snapurl = dashboard.camera.generateDeviceCameraSnapshot(indv_device['serial'])
            file_name = indv_device['name']
            snapshot = snapurl['url']
            time.sleep(5)
            with open(file_name + '.jpg', 'wb') as handle:
                response = requests.get(snapshot, stream=True, headers={'User-Agent': 'Custom'})
                if not response =='200':
                    print("Faild to download automaticly - see if image exists at: ", snapshot)
                for chunk in response.iter_content(1024):
                    if not chunk:
                        break
                    handle.write(chunk)
                print("Snapshot Saved from ", indv_device['name'])            
if answer == '3':
        quit 

 

 

 

 

 

 

1 Accepted Solution
PhilipDAth
Kind of a big deal
Kind of a big deal

Untested, but something like:

 

try:

  snapurl = dashboard.camera.generateDeviceCameraSnapshot(indv_device['serial'])

  file_name = indv_device['name']

  ...

except meraki.APIError as e:

  print(e)

  

View solution in original post

4 Replies 4
PhilipDAth
Kind of a big deal
Kind of a big deal

Untested, but something like:

 

try:

  snapurl = dashboard.camera.generateDeviceCameraSnapshot(indv_device['serial'])

  file_name = indv_device['name']

  ...

except meraki.APIError as e:

  print(e)

  

Yeah this kind of worked, it at least handles the error, but then gives me a new one that comes up after the try\except - 

 

NameError: name 'snapurl' is not defined

 

So I tried to add a quit to the "except" for now, then i was going to figure out what better to do later but that doesn't work either, it seems to ignore the quit, and keeps moving.

 

except meraki.APIError as e:
                print(e)
                quit
snapshot = snapurl['url']

 

It still results in - NameError: name 'snapurl' is not defined - at this line

 

 

 

 

Ha. Nevermind, I saw it as soon as I posted it. *smh* - then couldn't delete the post. 

 

quit()

 

ugh. 

 

Thanks

PhilipDAth
Kind of a big deal
Kind of a big deal

Get notified when there are additional replies to this discussion.