Welcome to Pandora FMS Community!

Find answers, ask questions, and connect with our community around the world.

Welcome to Pandora FMS Community Forums Soporte de la comunidad Python agente no foncionando [SOLVED]

  • Python agente no foncionando [SOLVED]

    Posted by rischfre on June 24, 2011 at 19:36

    Hola buenos dias

    en mi servidor Pandora (server = agente) modificando /etc/pandora/pandora_agente.conf consigo ejecutar varios scripts de tipo SH pero a mi grande surpresa no consigo hacer lo mismo con un script PYTHON, tan simple como devolver un valor.
    module_begin
    module_name Camara
    module_type generic_data
    module_exec /u/camara.py
    module_end
    donde camara.py es “solamente” esto :
    #!/usr/bin/env python
    from sys import argv, exit
    import sys
    def main():
     return str(100.00)
    if __name__ == ‘__main__’:
    sys.exit(main())

    El problema no viene de las autorisaciones de los ficheros. Hay otra cosa que puedo comprobar?

    rischfre replied 13 years, 7 months ago 2 Members · 6 Replies
  • 6 Replies
  • tpalacios

    Member
    June 25, 2011 at 17:11
    0 Karma points
    Community rank: tentacle-noob-1 Tentacle noob
    Like it
    Up
    0
    Down
    Drop it
    ::

    Buenas tardes, richfre.

    Tu problema es tan simple como que usando la función str estás convirtiendo dicho dato numérico en un string, de modo que si defines un módulo de tipo generic_data, dicho módulo será incapaz de procesar la salida de tu script, ya que lo considerará un string en vez de un dato de valor numérico.

    Para este problema hay dos soluciones:

    1) Si realmente quieres considerar dicho valor como un string, la estructura del módulo debe ser:

    module_begin
    module_name Camara
    module_type generic_data_string
    module_exec /u/camara.py
    module_end

    2) Si necesitas que Pandora server interprete el valor como numérico, la salida de tu script debe ser un valor numérico, no un string, y para ello no puedes hacer uso de la función str.

    Puedes intentar esto:

    #!/usr/bin/env python
    from sys import argv, exit
    import sys
    def main():
     return float(100.00)
    if __name__ == ‘__main__’:
    sys.exit(main())

    Para que te devuelva el dato en formato numérico y no como un string.

    En este caso, el campo “module_type” sí sería “generic_data”.

    Espero que te haya servido de ayuda.

    Saludos.

  • tpalacios

    Member
    June 25, 2011 at 19:46
    0 Karma points
    Community rank: tentacle-noob-1 Tentacle noob
    Like it
    Up
    0
    Down
    Drop it
    ::

    He estado comprobando más a fondo tu problema y parece que nos encontramos con una especie de problema adicional:

    Mientras que tu script devuelve 100.0 a la salida por línea de comandos, parece que a la hora de que el agente de Pandora parsee la salida de la ejecución de ese módulo a XML ocurre algo que provoca que el XML correspondiente a ese módulo no contenga ningún dato o hace que directamente no se cree…

    Esto puede ser debido a que al incluir “import sys” y hacer referencia a “sys.exit(main())” se genere una especie de conflicto entre el módulo que dicha línea incluye y el módulo que crea el agente de Pandora para enviar al servidor.

    He llegado a esta conclusión debido a que un simple código que contenga:

    #!/usr/bin/python
    def main():
      return float(100.00)
    print main()
    

    Incluído en pandora_agent.conf como:

    module_begin
    module_name Camara
    module_type generic_data
    module_exec /u/camara.py
    module_end

    Devuelve el mismo valor y sí es procesado correctamente por el servidor de Pandora, el cual muestra el nuevo módulo en la consola.

    Para arreglar este problema puedes o bien usar este código o bien encontrar otra manera de mostrar esa salida evitando hacer uso de sys.exit(main())

    Es un problema poco frecuente, pero bastante grave a la hora de querer implementar módulos o plugins Python… de modo que lo reportaré a la lista de bugs para ver que se puede hacer para corregir esto.

    Muchas gracias por hacernos llegar tu consulta.

    Un saludo.

  • rischfre

    Member
    June 25, 2011 at 20:26
    80 Karma points
    Community rank: tentacle-noob-1 Tentacle noob
    Like it
    Up
    0
    Down
    Drop it
    ::

    Gracias por tú respuesta.
    El problema que veo es que obviamente el scribt python que quiero implementar es más importante con varios include y comunicaciones.
    Intentaré quitar el último str, pero voy a necesitar otros includes que no podré prescindir.
    El lunes Lo probare
    Buen fin de semana, y otra vez gracias

  • rischfre

    Member
    June 27, 2011 at 14:04
    80 Karma points
    Community rank: tentacle-noob-1 Tentacle noob
    Like it
    Up
    0
    Down
    Drop it
    ::

    Buenos dias

    respondo a mi propria duda. La solucion dado por TPALACIOS es valida, pero quiero añadir algunos comentarios (por si a caso otra persona tiene un problema similar)
      – el script python puede devolver el numero en forma de STR, del momento que sea un numero Pandora lo interprete bien.
      – Pandora admite el uso de IMPORT (system, o otros)
      – A Pandora “no le gusta”
                if __name__ == ‘__main__’:
                  sys.exit(main())
       
      La solucion print main(), es la adecuada
    Gracias a TPalacios por su ayuda

  • tpalacios

    Member
    June 28, 2011 at 13:19
    0 Karma points
    Community rank: tentacle-noob-1 Tentacle noob
    Like it
    Up
    0
    Down
    Drop it
    ::

    Me temo que la solución no es del todo precisa, richfre. 😉

    He estado indagando y haciendo pruebas adicionales hemos descubierto el verdadero problema de tu script:

    El problema radica en que a la hora de interpretar los datos, Pandora los recoge todos los datos mediante la salida estándar stdout.

    Si haces que el script devuelva el dato mediante un return en vez de mediante un print, Pandora no recogerá ningún dato.

    He llegado a esta conclusión debido a que un script igual al tuyo pero sustituyendo return por print funciona, incluso con las líneas:

    if __name__ == '__main__':
    	sys.exit(main())

    Por eso tanto:

    #!/usr/bin/python
    def main():
      return float(100.00)
    print main()
    #!/usr/bin/env python
    from sys import argv, exit
    import sys
    
    def main():
    	print(float(100.00))
    
    if __name__ == '__main__':
    	sys.exit(main())
    

    Mi solución aportaba dicho return, pero al final recogía el dato mediante un print, con lo que funcionaba igualmente.

    No hay ningún problema con los imports.

    Un saludo. 😉

  • rischfre

    Member
    June 29, 2011 at 11:59
    80 Karma points
    Community rank: tentacle-noob-1 Tentacle noob
    Like it
    Up
    0
    Down
    Drop it
    ::

    Gracias