Controlar SAI mediante script
Luis Orellana Orihuela
luis.ore.ori en gmail.com
Lun Abr 21 12:06:53 CEST 2008
Alejandro Bermudez Araguez escribió:
> Si el SAI tiene conexion RS-232c(como la gran mayoria), puedes
> contactar con el fabricante del SAI y pedirle una lista de comandos
> series que puedas pasarle al SAi, del tipo(por poner un ejemplo):
>
> "#5" => Estado de la bateria
> "#2" => Conectar sistema baterias
>
> Luego gracias a la libreria pyserial es muy facil comunicar por RS-232c.
> Segun que fabricante sea puede que no te ponga ninguna pega en cuanto
> al protocolo de comunincaciones usado por su SAI.
>
> Un saludo.
El caso es que uso varios modelos de SAI, y al menos uno no tiene
puerto RS-232.
Por otro lado he encontrado este código * , pero no soy capaz de
entenderlo al no conocer en profundidad SNMP. Básicamente no sé que
tengo que pasar como parámetros: <agente snmp> <comunidad> <obj-id
[[obj-id] ...] >
*
#!/usr/local/bin/python -O
"""
Script que usa la peticion SNMP v.1/v.2c GET para extraer uno o mas
objetos SNMP de un agente
"""
import sys
import getopt
import time
# Importar modulos PySNMP
from pysnmp import asn1, v1, v2c
from pysnmp import role
# Inicializar mensajes de ayuda
options = 'Opciones:\n'
options = options + ' -p <port> puerto para comunicar con el agente.
Por defecto el 161.\n'
options = options + ' -r <retries> numero de intentos a usar en las
peticiones. Por defecto es 5.\n'
options = options + ' -t <timeout> tiempo entre intentos. Por
defecto es 1.\n'
options = options + ' -v <version> version del protocolo SNMP a usar
[1, 2c]. Por defecto es 2c (version uno).'
usage = 'Uso: snmp.py [opciones] <agente snmp> <comunidad> <obj-id
[[obj-id] ...] >\n'
usage = usage + options
# Initializar valores por defecto
port = 161
retries = 5
timeout = 1
version = '2c'
# Analizar posibles opciones
try:
(opts, args) = getopt.getopt(sys.argv[1:], 'hp:r:t:v:',['help',
'port=', 'retries=', 'timeout=', 'version='])
except getopt.error, why:
print 'getopt error: %s\n%s' % (why, usage)
sys.exit(-1)
try:
for opt in opts:
if opt[0] == '-h' or opt[0] == '--help':
print usage
sys.exit(0)
if opt[0] == '-p' or opt[0] == '--port':
port = int(opt[1])
if opt[0] == '-r' or opt[0] == '--retries':
retries = int(opt[1])
if opt[0] == '-t' or opt[0] == '--timeout':
timeout = int(opt[1])
if opt[0] == '-v' or opt[0] == '--version':
version = opt[1]
except ValueError, why:
print 'Parametro invalido \'%s\' para la opcion %s: %s\n%s' %
(opt[1], opt[0], why, usage)
sys.exit(-1)
if len(args) < 2:
print 'Insuficiente numero de argumentos suministrados\n%s' % usage
sys.exit(-1)
# Creacion del objeto gestor SNMP (manager)
client = role.manager((args[0], port))
# Pasarle varias opciones
client.timeout = timeout
client.retries = retries
# Creacion de los objetos request&response SNMP de la
# version del protocolo especificada en el modulo
try:
req = eval('v' + version).GETREQUEST()
rsp = eval('v' + version).GETRESPONSE()
except (NameError, AttributeError):
print 'Version del protocolo SNMP no soportada: %s\n%s' %
(version, usage)
sys.exit(-1)
print '\n\nMONITORIZACION SAI EN TIEMPO REAL'
print '----------------------------------\n\nHora actual | Sistema\n'
for set in range(1000000):
# Codificacion de OIDs, codificacion del mensaje de peticion SNMP y
# intento de enviarlo al agente y recibir una respuesta
(answer, src) =
client.send_and_receive(req.encode(community=args[1],
encoded_oids=map(asn1.OBJECTID().encode, args[2:])))
# Decodificacion de la respuesta SNMP
rsp.decode(answer)
# Asegurarse de que la respuesta es la peticion buscada (request
IDs, communities, etc.)
if req != rsp:
raise 'Respuesta incorrecta: %s vs %s' % (str(req), str(rsp))
# Decodificacion BER de los objetos IDs codificados
oids = map(lambda x: x[0], map(asn1.OBJECTID().decode,
rsp['encoded_oids']))
# Decodificacion BER de los valores codificados asociados con
los objetos IDs
vals = map(lambda x: x[0](), map(asn1.decode, rsp['encoded_vals']))
# Consulta de fallo remoto del agente SNMP
if rsp['error_status']:
raise 'SNMP error #' + str(rsp['error_status']) + ' for OID
#'+ str(rsp['error_index'])
# Impresion de resultados
for (oid, val) in map(None, oids, vals):
#print oid + ' ---> ' + str(val)
sys.stdout.write("%s " % val)
#sys.stdout.flush()
time.sleep(1)
sys.stdout.write("\r")
_______________________________________________
Lista de correo Python-es
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes
Más información sobre la lista de distribución Python-es