Python Script to dump all devices from NetBrain
The NetBrain API requires a few steps before getting at the data:
- Login and retrieve the token for API calls
- Set the domain and tenant where the data is stored
- Make the API calls to do work
- Logout so you don’t take up login sessions
The CMDB/Devices
API call only returns 100 devices at a time. There is logic in this script to deal with that shortcoming.
All of the output is for debugging purposes only. They key takeaways from this post is to show the login / logout methods and how to dump a CMDB that has more then 100 entries in it.
Full example of login, setting the domain/tenant, dumping the CMDB, and logging out:
#!/usr/bin/env python3
# import python modules
import requests
import time
import urllib3
import pprint
#urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
import json
### Global Variables
# Base URL for API
nb_url = "https://netbrain.example.com"
# Site Specific
tenant = "YOUR_TENANT_ID"
domain = "YOUR_DOMAIN_ID"
# Set headers
headers = {'Content-Type': 'application/json', 'Accept': 'application/json'}
# Set authentication information
username = "YOUR_USERNAME"
passwd = "YOUR_PASSWORD"
authid = "Tacacs"
def login(nb_url, headers):
body = {
"username" : username,
"password" : passwd,
"authentication_id" : authid
}
# Set the requests input URL
full_url = nb_url + "/ServicesAPI/API/V1/Session"
try:
# Do the HTTP request
response = requests.post(full_url, headers=headers, data = json.dumps(body), verify=True)
# Check for HTTP codes other than 200
if response.status_code == 200:
# Decode the JSON response into a dictionary and use the data
js = response.json()
print (js)
return js["token"]
else:
print ("Get token failed! - " + str(response.text))
except Exception as e:
print (str(e))
def set_domain(nb_url, headers, tenant, domain):
# Set the request inputs URL
full_url = nb_url + "/ServicesAPI/API/V1/Session/CurrentDomain"
# Set proper headers
body = {
"tenantId": tenant,
"domainId": domain
}
try:
# Do the HTTP request
response = requests.put(full_url, data=json.dumps(body), headers=headers, verify=True)
# Check for HTTP codes other than 200
if response.status_code == 200:
# Decode the JSON response into a dictionary and use the data
result = response.json()
print (result)
elif response.status_code != 200:
print ("Login failed! - " + str(response.text))
except Exception as e: print (str(e))
def get_all_devices(nb_url, headers):
# Used for debugging the JSON output
pp = pprint.PrettyPrinter(indent=4)
# Set the requests input URL
full_url = nb_url + "/ServicesAPI/API/V1/CMDB/Devices"
# API only returns 100 entries at a time. Variables to loop through
# and return all entries
limit = 100
totaldevices = limit
grandtotal = 0
skip = 0
# API only returns 100 entries. Logic to get all data.
while totaldevices >= limit:
data = {
"version": 1,
"limit": limit,
"skip": skip
}
try:
response = requests.get(full_url, params = data, headers = headers, verify = True)
if response.status_code == 200:
result = response.json()
# Debugging output
pp.pprint(result)
totaldevices = len(result["devices"])
grandtotal = grandtotal + totaldevices
print("Total Devices: " + str(totaldevices))
print("Grand Total Devices: " + str(grandtotal))
skip = skip + totaldevices
else:
print("Get Devices failed! - " + str(response.text))
except Exception as e:
print (str(e))
def logout(nb_url, headers):
# Set the request inputs
full_url = nb_url + "/ServicesAPI/API/V1/Session"
try:
# Do the HTTP request
response = requests.delete(full_url, headers=headers, verify=True)
# Check for HTTP codes other than 200
if response.status_code == 200:
# Decode the JSON response into a dictionary and use the data
js = response.json()
print (js)
else:
print ("Session logout failed! - " + str(response.text))
except Exception as e:
print (str(e))
if __name__ == "__main__":
token = login(nb_url, headers)
headers["Token"]=token
set_domain(nb_url, headers, tenant, domain)
get_all_devices(nb_url, headers)
logout(nb_url, headers)