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 Actualizar datos módulo mediante API

  • Actualizar datos módulo mediante API

    Posted by guillermorf on July 9, 2015 at 11:37

    Hola, me llamo Guillermo y estoy desarrollando actualmente un servicio Web en PHP con el framework Symfony2 que actuaría de intermediario entre algunos dispositivos embebidos y Pandora FMS (por temas de ancho de banda muy limitado). Estoy teniendo algunos problemas a la hora de utilizar la API que os comentaré ahora.

    El contexto es el que os comento, la aplicación web recibe los datos que envían los embebidos por POST (una serie de JSON), los parsea y se comunica con la API de Pandora FMS para el intercambio de datos (crear agente si no está, lo mismo con los módulos, etc). Sin ningún problema se crean los agentes y módulos correspondientes para monitorizar los servicios que quiero de los embebidos, el problema aparece al final cuando quiero actualizar los datos de los módulos.

    Os copio las funciones que se comunicarían con el API:

    public function setModuleData ($module, $data) {
            $op = “set”;
            $op2 = “module_data”;
            $id = $module->getId_module(); 
           
            $other_mode = “url_encode_separator_|”;
           
            $other = array (
                “data”=>$data,
                “time”=>”now”,
            );
            $url = $this->ip.$this->pandora_url.”/include/api.php”.
                    “?”.”&op=”.$op.”&op2=”.$op2.”&id=”.$id.
                    “&other=”.$other[“data”].”|”.$other[“time”].
                    “&other_mode=”.$other_mode.”&apipass=”.$this->apipass.
                    “&user=”.$this->user.”&pass=”.$this->password;
           
            echo “

    “.$url.”

    “;
            $result = PandoraApiComm::curlThis($url);
           
            $aux = htmlentities($result);
            echo $aux;
           
            return $result;
        }
        public static function curlThis($url) {
            $url = str_replace(” “,”%20”,$url);
            $curlObj = curl_init();
            curl_setopt($curlObj, CURLOPT_URL, $url);
            curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, 1);
            //curl_setopt($curlObj, CURLOPT_HEADER, 0);
            $result = curl_exec($curlObj);
            //$error = curl_error($curlObj);
            //print “

    Curl error ->”.$error.”

    “;
            curl_close($curlObj);
           
            return $result;
        }
    Un ejemplo de URL que se envía con este método:
    http://localhost/pandora_console/include/api.php?&op=set&op2=module_data&id=43&other=Unknown|now&other_mode=url_encode_separator_|&apipass=1234&user=admin&pass=pandora

    No tiene demasiado misterio. Envía una petición con CURL con la URL que se construye y recoge la respuesta, que por alguna razón (primera pregunta) es texto XML con algunos datos del agente, por ejemplo:


       
         
         
         
         
       

    El problema es que, mientras que al enviar de esta forma varias peticiones de actualización de módulos, el sistema parece “quedarse colgado” actualizando uno o ninguno de ellos, ignorando completamente el resto. He verificado que devuelve para cada uno de las peticiones el XML respuesta que os he comentado, y responde con código 200, así que recibe bien todas las peticiones. Poniendo el log del servidor de pandora en modo verbosity 10 veo que, de todos los módulos que intento actualizar, solo me intenta (a veces ni lo consigue) actualizar uno o dos:
    2015-07-09 09:35:02 pandora [V10] Updating keep_alive module for agent ‘pepito’.
    2015-07-09 09:35:02 pandora [V10] Processing module ‘process’ for agent ‘pepito’.

    El problema aparece al hacer la petición como a un servidor pandora local (Ubuntu 14.04 LTS) como a uno remoto (una máquina de Amazon con el mismo Ubuntu 14.04 LTS).

    No se si es un bug, o estoy haciendo mal la petición, pero me tiene “loco”.

    Un saludo y espero respuestas!

    guillermorf replied 9 years, 6 months ago 3 Members · 10 Replies
  • 10 Replies
  • smartin

    Member
    July 9, 2015 at 12:45
    0 Karma points
    Community rank: tentacle-noob-1 Tentacle noob
    Like it
    Up
    0
    Down
    Drop it
    ::

    Hola buenos días,

    si “a mano” te funciona todo correcto y todo tiene conectividad… debería funcionar…

    ¿Has probado a desactivar el selinux? Te lo digo porque selinux a veces nos trae de cabeza en estos asuntos…

    Un saludo,

    Sergio

  • guillermorf

    Member
    July 9, 2015 at 13:16
    0 Karma points
    Community rank: tentacle-noob-1 Tentacle noob
    Like it
    Up
    0
    Down
    Drop it
    ::

    Hola, gracias por responder. Acabo de comprobar lo de SElinux y está deshabilitado (ejecutando # sestatus), así que no creo que ese sea el problema.

    Respecto al funcionamiento, aunque metiendo directamente la URL en el navegador o en cUrl dentro del bash, si en bash mando a la vez las peticiones (simplemente separadas por &&) el servidor también parece “saturarse” y surge el mismo problema que al mandarlos desde el PHP.

  • guillermorf

    Member
    July 23, 2015 at 11:15
    0 Karma points
    Community rank: tentacle-noob-1 Tentacle noob
    Like it
    Up
    0
    Down
    Drop it
    ::

    ¿Alguien tiene alguna idea? Me vendría bastante bien solucionar el problema para terminar la aplicación, o al menos si es un bug que se vaya a solucionar en el futuro.

  • smartin

    Member
    July 23, 2015 at 14:34
    0 Karma points
    Community rank: tentacle-noob-1 Tentacle noob
    Like it
    Up
    0
    Down
    Drop it
    ::

    Hola buenos días,

    ¿qué versión de Pandora estás utilizando? Es para investigar acerca de esto. Hubo problemas en versiones anteriores con la API y nos sería de gran ayuda que nos indicaras que versión estás utilizando.

    Un saludo!!!!

  • guillermorf

    Member
    July 24, 2015 at 11:16
    0 Karma points
    Community rank: tentacle-noob-1 Tentacle noob
    Like it
    Up
    0
    Down
    Drop it
    ::

    Hola, gracias por contestar. La versión que marca la consola es “Pandora FMS v5.1SP3 – Revisión PC150716”, acabo de actualizar con el update manager.

  • guillermorf

    Member
    August 7, 2015 at 16:41
    0 Karma points
    Community rank: tentacle-noob-1 Tentacle noob
    Like it
    Up
    0
    Down
    Drop it
    ::

    ¿Ninguna solución, entonces? Pensábamos comprar la versión Enterprise si todo iba bien, pero necesito saber que hay solución al problema antes de tomar ninguna decisión al respecto.

  • smartin

    Member
    August 10, 2015 at 13:31
    0 Karma points
    Community rank: tentacle-noob-1 Tentacle noob
    Like it
    Up
    0
    Down
    Drop it
    ::

    Vamos a estudiar el funcionamiento con tu plugin que nos has adjuntado. Si “a mano” se ejecuta todo correctamente, tendríamos que mirar por qué no es capaz de actualizar los módulos.

    Un saludo,

    Sergio

  • guillermorf

    Member
    August 11, 2015 at 17:36
    0 Karma points
    Community rank: tentacle-noob-1 Tentacle noob
    Like it
    Up
    0
    Down
    Drop it
    ::

    Muchas gracias, quedo a la espera.

  • fborja

    Member
    August 13, 2015 at 19:11
    0 Karma points
    Community rank: tentacle-noob-1 Tentacle noob
    Like it
    Up
    0
    Down
    Drop it
    ::

    Buenas tardes,

    Sería conveniente intentar lanzar la petición directamente a través del navegador para comprobar si realmente está devolviendo resultado

    p.e. firefox

    http://direccion_ip_del_servidor/pandora_console/include/api.php?op=set&op2=module_data&id=14&other_mode=url_encode_separator_|&other=123|now&apipass=pandora&user=admin&pass=pandora

    -> inspeccionar elemento
    -> network
    -> reload
    -> desplegar la petición que debería aparecer respondida con 200OK
    -> en el apartado de Response verificar que devuelve algo parecido a:

    Si no devuelve esto, o si nos aparece algún mensaje (auth error) revisar en:
    http://ip_de_la_consola_de_pandora/pandora_console/index.php?sec=gsetup&sec2=godmode/setup/setup&section=general&pure=

    Verificar que:
    – API Pass está establecida
    – El host desde el que se está realizando la petición contra la API está en la lista de hosts (poner * para pruebas)

    Comprobado que el script funciona correctamente:

    fichero api_test.php:

    getId_module();

            $other_mode = “url_encode_separator_|”;

            $other = array (
                “data”=>$data,
                “time”=>”now”,
            );
            $url = $this->ip.$this->pandora_url.”/include/api.php”.
                    “?”.”&op=”.$op.”&op2=”.$op2.”&id=”.$id.
                    “&other=”.$other[“data”].”|”.$other[“time”].
                    “&other_mode=”.$other_mode.”&apipass=”.$this->apipass.
                    “&user=”.$this->user.”&pass=”.$this->password;

            echo “

    “.$url.”

    “;
            $result = PandoraApiComm::curlThis($url);

            $aux = htmlentities($result);
            echo $aux;

            return $result;
        }
        function curlThis($url) {
            $url = str_replace(” “,”%20”,$url);
            $curlObj = curl_init();
            curl_setopt($curlObj, CURLOPT_URL, $url);
            curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, 1);
            //curl_setopt($curlObj, CURLOPT_HEADER, 0);
            $result = curl_exec($curlObj);
            $error = curl_error($curlObj);
            print “

    Curl error ->”.$error.”

    “;
            curl_close($curlObj);

            return $result;
        }

    echo curlThis(“http://192.168.219.130/pandora_console/include/api.php?op=set&op2=module_data&id=14&other_mode=url_encode_separator_|&other=123|now&apipass=pandora&user=admin&pass=pandora”);

    ?>

    Si se ejecuta desde consola: php api_test.php
    devuelve:

    [root@localhost ~]# php api_test.php

    Curl error ->

                                   
                                           
                                                   
                                                   
                                                   
                                                   
                                           
                                   

    Probablemente estemos ante un problema de configuración de API.

    Saludos,

    Borja

  • guillermorf

    Member
    August 14, 2015 at 13:37
    0 Karma points
    Community rank: tentacle-noob-1 Tentacle noob
    Like it
    Up
    0
    Down
    Drop it
    ::

    Hola, gracias por contestar. Como ya dije en mi primer post, tanto por navegador como por CURL me devuelve correctamente un XML. Por ejemplo:

    $ curl “http://localhost/pandora_console/include/api.php?op=set&op2=module_data&id=200&other_mode=url_encode_separator_|&other=prueba|now&apipass=1234&user=admin&pass=pandora”








    Además el módulo se actualiza correctamente, pero el problema viene cuando envío varias peticiones al mismo tiempo, como también puse en mi primer post. Por ejemplo, al ejecutar este script:

    #!/bin/bash
    curl “http://localhost/pandora_console/include/api.php?op=set&op2=module_data&id=194&other_mode=url_encode_separator_|&other=prueba|now&apipass=1234&user=admin&pass=pandora”
    curl “http://localhost/pandora_console/include/api.php?op=set&op2=module_data&id=195&other_mode=url_encode_separator_|&other=prueba|now&apipass=1234&user=admin&pass=pandora”
    curl “http://localhost/pandora_console/include/api.php?op=set&op2=module_data&id=196&other_mode=url_encode_separator_|&other=prueba|now&apipass=1234&user=admin&pass=pandora”
    curl “http://localhost/pandora_console/include/api.php?op=set&op2=module_data&id=197&other_mode=url_encode_separator_|&other=prueba|now&apipass=1234&user=admin&pass=pandora”
    curl “http://localhost/pandora_console/include/api.php?op=set&op2=module_data&id=198&other_mode=url_encode_separator_|&other=prueba|now&apipass=1234&user=admin&pass=pandora”
    curl “http://localhost/pandora_console/include/api.php?op=set&op2=module_data&id=199&other_mode=url_encode_separator_|&other=prueba|now&apipass=1234&user=admin&pass=pandora”
    curl “http://localhost/pandora_console/include/api.php?op=set&op2=module_data&id=200&other_mode=url_encode_separator_|&other=prueba|now&apipass=1234&user=admin&pass=pandora”

    estando los módulos de la manera que os adjunto en la imagen “pandora1”, el resultado es el estado que os adjunto en la imagen “pandora2”.

    Todos los CURLs me devuelven el XML correctamente con los datos del correspondiente módulo y el nuevo dato que le he mandado, como adjunto en “pandora3”. Sin embargo, no aparecen los cambios en la mayoría de los módulos dentro de la consola. Ése es el problema.

    Un saludo y espero haberlo aclarado un poco mejor.

    PD: La APIPASS está configurada y la lista de IPs con acceso a *.