Un cliente potencial se acercó a nosotros y nos preguntó si podían utilizar Python para realizar solicitudes a la API de opCharts.

Puedes ponerte al día con la API en esta guía WIKI de la comunidad.

La respuesta fue muy rápida, sí, pero entonces fue necesario un ejemplo. Chris Gatlin, un ingeniero de soporte de APAC, escribió un magnífico ejemplo de cómo conseguirlo que se expondrá a continuación.

 

Para este ejemplo, construiremos una página web HTML de Estado de la Red a través de un script CGI. Esta página estará compuesta por tablas; la primera tabla resumirá el estado de los grupos, mientras que las tablas siguientes proporcionarán detalles a nivel de nodo para cada grupo.

Este ejemplo utilizará los siguientes módulos:

También tenemos que definir las siguientes variables:

  • Protocolo (HTTP o https)
  • Dirección del servidor
  • Nombre de usuario
  • Contraseña
#!/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()

Nota: la contraseña está oculta dentro del conFile, por lo que leemos de él.

 

El siguiente paso consiste en configurar el manejo de la URL;

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)

Una vez que tenga acceso, el siguiente paso es consultar el estado del nodo en opCharts;

nodeData = OPENER.open(PROTOCOL + '://' + SERVER + '/omk/opCharts/nodes.json')
nodeDecoded = nodeData.read().decode()
nodeList = json.loads(nodeDecoded)

Una vez que tenemos los datos, tenemos que reconvertirlos en una estructura de datos lógica;

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']
}

Ahora a construir y mostrar las tablas;

print('Content-type: text/html\n\n')

print(‘<html><style>’)

print(‘table, th, td { border: 1px solid black; border-collapse: collapse;}</style>’)

print(‘<head><title>Opmantek Network Status</title></head><body><strong>Opmantek Network Status</strong><br><br>’)

print(‘<table><tr><th>Group</th><th>Nodes Up</th><th>Nodes Down</th></tr>’)

para k en sorted(groupStatus):

print(‘<tr><td>’ + k + ‘</td><td>&nbsp’ + str(groupStatus[k][‘up’]) + ‘</td><td>&nbsp’ + str(groupStatus[k][‘down’]) + ‘</td></tr>’)

print(‘</table><br><br>’)

para k en 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>’)

para g en sorted(groupStatus[k]['nodes']):

imprimir(

‘<tr><td>’ + groupStatus[k][‘nodes’][g][‘name’] + ‘</td>

<td>&nbsp’ + groupStatus[k][‘nodes’][g][‘location’] + ‘&nbsp</td>

<td>&nbsp’ + groupStatus[k][‘nodes’][g][‘type’] + ‘&nbsp</td>

<td>&nbsp’ + groupStatus[k][‘nodes’][g][‘net’] + ‘&nbsp</td>

<td>&nbsp’ + groupStatus[k][‘nodes’][g][‘role’] + ‘&nbsp</td>

<td>&nbsp’ + groupStatus[k][‘nodes’][g][‘status’] + ‘&nbsp</td>’)

print(‘</table><br><br>’)

print('</html>')

Después de realizar todo esto, obtendrá una página con un aspecto similar al siguiente;

Panel de control de Python - 700

Hay muchas posibilidades cuando se utiliza la API de opCharts. ¿Qué formas novedosas ha utilizado?