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