Some customers may want to leverage the opCharts API with python scripts. This article will provide one example of how this could be done.
For this example we'll build a HTML Network Status web page via a CGI script. This page will be comprised of tables; the first table will summarize group status while the subsequent tables will provide node level details for each group.
This example will utilize the following modules.
We also need to define the following variables.
#!/usr/bin/python3 import urllib.request, http.cookiejar, json PROTOCOL = 'https' SERVER = 'demo.opmantek.com' USERNAME = 'nmis' with open('/var/www/opChartsApi.conf', 'r') as confFile: USERPASS = confFile.read().strip() |
CJ = http.cookiejar.CookieJar() OPENER = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(CJ)) loginUrl = (PROTOCOL + '://' + SERVER + '/omk/opCharts/login') loginDict = {'username' : USERNAME , 'password' : USERPASS} DATA = urllib.parse.urlencode(loginDict).encode("utf-8") REQUEST = urllib.request.Request(loginUrl, DATA) OPENER.open(REQUEST) |
nodeData = OPENER.open(PROTOCOL + '://' + SERVER + '/omk/opCharts/nodes.json') nodeDecoded = nodeData.read().decode() nodeList = json.loads(nodeDecoded) |
groupStatus = {} for n in nodeList: if n['group'] not in groupStatus: groupStatus[n['group']] = {'up' : 0, 'down' : 0} groupStatus[n['group']]['nodes'] = {} if n['nodedown'] == 'true': groupStatus[n['group']]['down'] += 1 else: groupStatus[n['group']]['up'] += 1 groupStatus[n['group']]['nodes'][n['name']] = {'name' : n['name'], 'location' : n['location'], 'type' : n['nodeType'], 'net' : n['netType'], 'role' : n['roleType'], 'status' : n['nodestatus']} |
print('Content-type: text/html\n\n') print('<html>') print('<style>table, th, td { border: 1px solid black; border-collapse: collapse;}</style>') print('<head><title>Opmantek Network Status</title></head>') print('<body><strong>Opmantek Network Status</strong><br><br>') print('<table><tr><th>Group</th><th>Nodes Up</th><th>Nodes Down</th></tr>') for k in sorted(groupStatus): print('<tr><td>' + k + '</td><td> ' + str(groupStatus[k]['up']) + '</td><td> ' + str(groupStatus[k]['down']) + '</td></tr>') print('</table><br><br>') for k in sorted(groupStatus): print('<strong>Group: ' + k + '</strong><br>') print('<table><tr><th>Node</th><th>Location</th><th>Type</th><th>Net</th><th>Role</th><th>Status</th></tr>') for g in sorted(groupStatus[k]['nodes']): print('<tr><td>' + groupStatus[k]['nodes'][g]['name'] + '</td><td> ' + groupStatus[k]['nodes'][g]['location'] + ' </td><td> ' + groupStatus[k]['nodes'][g]['type'] + ' </td><td> ' + groupStatus[k]['nodes'][g]['net'] + ' </td><td> ' + groupStatus[k]['nodes'][g]['role'] + ' </td><td> ' + groupStatus[k]['nodes'][g]['status'] + ' </td>') print('</table><br><br>') print('</body>') print('</html>') |