Pandora FMS community forums

Full Version: Actualizar datos módulo mediante API
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2
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 "<p>".$url."</p>";
        $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 "<p>Curl error ->".$error."</p>";
        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:
<?xml version="1.0" encoding="UTF-8"?>
<agent_data description="" group="" os_name="Other" os_version="" interval="300" version="" timestamp="2015/07/09 09:22:45" agent_name="artila-00134800fb37" timezone_offset="0">
    <module>
      <name><![CDATA[modbus name]]></name>
      <description><![CDATA[descripcion]]></description>
      <type><![CDATA[generic_data_string]]></type>
      <data><![CDATA[Unknown]]></data>
    </module>
</agent_data>

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!
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
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.
¿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.
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!!!!
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.
¿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.
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
Muchas gracias, quedo a la espera.
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:

<?xml version='1.0' encoding='ISO-8859-1'?>
<agent_data description='' group='' os_name='Linux'  os_version='6.0dev' interval='300' version='6.0dev(Build 150629)' timestamp='2015/08/13 18:56:54' agent_name='localhost.localdomain' timezone_offset='0'>
<module>
<name><![CDATA[Network_Usage_Bytes]]></name>
<description><![CDATA[Total bytes/sec transfered in this system]]></description>
<type><![CDATA[generic_data_inc]]></type>
<data><![CDATA[123]]></data>
</module>
</agent_data>

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:

<?php

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 "<p>".$url."</p>";
        $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 "<p>Curl error ->".$error."</p>";
        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:

[[email protected] ~]# php api_test.php
<p>Curl error -></p><?xml version='1.0' encoding='ISO-8859-1'?>
                                <agent_data description='' group='' os_name='Linux'  os_version='"CentOS release 6.6 (Final)"' interval='300' version='6.0dev(Build 150629)' timestamp='2015/08/13 19:08:51' agent_name='localhost.localdomain' timezone_offset='0'>
                                        <module>
                                                <name><![CDATA[Network_Usage_Bytes]]></name>
                                                <description><![CDATA[Total bytes/sec transfered in this system]]></description>
                                                <type><![CDATA[generic_data_inc]]></type>
                                                <data><![CDATA[123]]></data>
                                        </module>
                                </agent_data>

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

Saludos,

Borja
Pages: 1 2