Un foro de discusión para nuestra comunidad de hispano hablante

Moderator: amosbatto

#815386
Hola a todos.
He estado realizando algunas pruebas con una instancias recién instaladas y limpias de Processmaker y he notado que en el la vista de diseño del procesos, cuando intento crear una nueva conexión a bases de datos, se presenta siempre un error y no permite realizar nada mas. Agrego una captura de pantalla del error.
He probado con las versiones 3.2.1 y 3.2.2+001 recientemente liberada y se presenta el mismo error.
Espero que me puedan ayudar.

Saludos.
Attachments
Screenshot_2018-07-28_10-44-28.png
Screenshot_2018-07-28_10-44-28.png (66.14 KiB) Viewed 101 times
#815408
No tienes las opciones necesarias seleccionadas para conectar a una base de datos.

¿Este mensaje de error aparece al momento de cargar el dialogo o cuando haces clic en el boton "Test Connection"?
¿Es una instalación manual or bitnami? ¿En Windows o Linux?
#815443
El error aparece cuando es cargado la ventana de dialogo, luego que es presionado el botón verde para agregar una nueva conexión.
Las pruebas la estoy haciendo bajo linux, especificadamente con la imagen Docker https://hub.docker.com/r/eltercera/docker-processmaker/.
Analizando la situación me percate que cuando es cargada esta ventana de dialogo, es llamado el endpoint "/api/1.0/plug_dev/system/db-engines" del Rest Api, el cual esta retornando directamente el código 404.

Puede que allí este el problema.
De antemano, gracias por sus respuestas.
#815446
Creo que logre solucionar el inconveniente.

Probé directamente el endpoin que comente anteriormente con un cliente REST e igualmente retorna 404, como si la página no existiera. Me puse a analizar el código fuente y deduje que el endpoint esta definido e implementado en el archivo workflow/engine/src/ProcessMaker/Services/Api/System.php, de echo los 3 endpoints que allí se definen están retornando 404.
También me percate que en el archivo workflow/engine/src/ProcessMaker/Services/api.ini se encuentra la configuración que creo que carga todas las clases que define el API Rest, y vi que no había ninguna referencia a la clase que se encuentra en workflow/engine/src/ProcessMaker/Services/Api/System.php. Siguiendo como ejemplo las demas lineas, al final del archivo workflow/engine/src/ProcessMaker/Services/api.ini agregue lo siguiente:
Code: Select all
[alias: system]                              
    system = "ProcessMaker\Services\Api\System"
Luego de esto eliminé el archivo "routes.php" que se encuentra en el directorio del site para que se regenere (en mi caso shared/sites/plug_dev/routes.php) y luego el endpoint comenzó a funcionar.

Ahora la pregunta es, ¿Esto debería de ser así? por que vi que en versiones anteriores tampoco se encuentra esta definición.

Slaudos.
#815447
No debe ser necesario hacer ese cambio en el código, pero nunca he probado ProcessMaker en Docker, entonces tal vez es necesario en Docker.
#815530
Ya determine en parte por que se presenta el error.

La imagen docker que estaba utilizando es basada en Alpine Linux 3.7 con la instalación de los paquetes Apache2 y PHP propias de la distribución. Solo por probar, cree una imagen basada en Centos7 con los paquetes PHP https://webtatic.com/packages/php56/ tan como lo es indicado en la wiki y todo funciono correctamente, por seguir probando cree otra imagen esta vez basada en Debian 8 con los paquetes Apache2 y PHP propias de la distribución y lo mismo, funciona correctamente. Mi cara fue de :?: :?: :?:. No me quede con esto solamente, así que me puse a analizar por que en Alpine Linux 3.7 no funcionaba.

Las versiones de PHP en las 3 distribuciones son prácticamente las mismas 5.6.36 o 5.6.37, y me asegure que en las 3 estuvieran presente los mismos módulos y extensiones.

Encontré que el error se presenta al momento de construir los Endpoint del servicio REST en el archivo "framework/src/Maveriks/WebApplication.php", especificadamente en el bucle de la linea 323 (tomando el soruce code de processmaker 3.2.1) y la llamada que implementa a la función glob en la linea 321 que carga las clases implementadas en el directorio "workflow/engine/src/ProcessMaker/Services/Api/".

Mas en concreto el problema se origina por que la funcion glob (https://secure.php.net/manual/en/function.glob.php) en Alpine Linux, digamos que "normaliza" los paths que retorna eliminado los caracteres no necesarios y el bucle en la linea 323 parece que espera que los path tenga el carácter extra por lo tanto no determina bien los path ni lo carga. Esto no sucede en Centos y debian ya que el retorno de la de la fusión glob no "normaliza" los path's.

Para que tenga una idea mas clara, le represento las salidas y Ajunto una imagen con las lineas de código en cuestión:

La variable $apiDir en este punto esta llegando con el el string "/opt/processmaker//workflow/engine/src/ProcessMaker/Services/Api/". Vean que tiene un separador de directorio "/" de mas entre " processmaker" y "workflow".

En contenido de la variable $classesList en 321 en Debian y Centos queda mas o menos así:
Code: Select all
Array
(
    [0] => /opt/processmaker//workflow/engine/src/ProcessMaker/Services/Api//ActionsByEmail.php
    [1] => /opt/processmaker//workflow/engine/src/ProcessMaker/Services/Api//Calendar.php
    [2] => /opt/processmaker//workflow/engine/src/ProcessMaker/Services/Api//Cases
    [3] => /opt/processmaker//workflow/engine/src/ProcessMaker/Services/Api//Cases.php
    [4] => /opt/processmaker//workflow/engine/src/ProcessMaker/Services/Api//Catalog.php
    [5] => /opt/processmaker//workflow/engine/src/ProcessMaker/Services/Api//Consolidated.php
    [6] => /opt/processmaker//workflow/engine/src/ProcessMaker/Services/Api//Dashboard.php
    [7] => /opt/processmaker//workflow/engine/src/ProcessMaker/Services/Api//Department.php
    [8] => /opt/processmaker//workflow/engine/src/ProcessMaker/Services/Api//EmailServer.php
    [9] => /opt/processmaker//workflow/engine/src/ProcessMaker/Services/Api//File.php
    [10] => /opt/processmaker//workflow/engine/src/ProcessMaker/Services/Api//GmailIntegration.php
    ...
)
Y en Alpine linux queda mas o menos así:
Code: Select all
Array
(
    [0] => /opt/processmaker/workflow/engine/src/ProcessMaker/Services/Api//ActionsByEmail.php
    [1] => /opt/processmaker/workflow/engine/src/ProcessMaker/Services/Api//Calendar.php
    [2] => /opt/processmaker/workflow/engine/src/ProcessMaker/Services/Api//Cases
    [3] => /opt/processmaker/workflow/engine/src/ProcessMaker/Services/Api//Cases.php
    [4] => /opt/processmaker/workflow/engine/src/ProcessMaker/Services/Api//Catalog.php
    [5] => /opt/processmaker/workflow/engine/src/ProcessMaker/Services/Api//Consolidated.php
    [6] => /opt/processmaker/workflow/engine/src/ProcessMaker/Services/Api//Dashboard.php
    [7] => /opt/processmaker/workflow/engine/src/ProcessMaker/Services/Api//Department.php
    [8] => /opt/processmaker/workflow/engine/src/ProcessMaker/Services/Api//EmailServer.php
    [9] => /opt/processmaker/workflow/engine/src/ProcessMaker/Services/Api//File.php
    [10] => /opt/processmaker/workflow/engine/src/ProcessMaker/Services/Api//GmailIntegration.php
    ...
)
Fijence que Alpine Linux es removido el caracter de mas y el path es "normalizado". Por lo que en la linea 325 no es eliminado parte del string como se espera, ya que la variable $servicesDir contiene "/opt/processmaker//workflow/engine/src/ProcessMaker/Services" con el caracter de mas.

Se que la sigueinte pregunta no tiene que ver con los temas que se tocan en este foro, pero tendran alguna idea de ¿por qué la función glob se comporta de forma distinta en Alpine linux?

Como programador, prienso que hay que tener cuidado de como se maneja los string que repretanan los path del sistema y asegurarse de "normalizarlos" antes de hacer alguna comparación.

De antemano muchas gracias por su ayuda.
Attachments
Screenshot_2018-08-04_07-56-07.png
Screenshot_2018-08-04_07-56-07.png (45.13 KiB) Viewed 65 times
#815584
Common::rglob() es definido en framework/src/Maveriks/Util/Common.php:
Code: Select all
    public static function rglob($pattern, $flags = 0, $onlyFiles = false)
    {
        $singlePattern = basename($pattern);

        if (strpos($singlePattern, "*") !== false) {
            $path = rtrim(str_replace($singlePattern, "", $pattern), DIRECTORY_SEPARATOR);
        } else {
            $singlePattern = "";
            $path = $pattern;
        }

        $files = glob("$path/$singlePattern", $flags);
        $dirs = glob("$path/*", GLOB_MARK|GLOB_ONLYDIR|GLOB_NOSORT);

        if(is_array($dirs)){
            foreach ($dirs as $dir) {
                $files = array_merge($files, self::rglob("$dir/$singlePattern", $flags));
            }
        }

        if ($onlyFiles) {
            $files = array_filter($files, function($v) { return is_dir($v) ? false : true;});
        }

        return $files;
    }
La documentación de glob() no dice que hay diferencias según el sistema operativo:
http://php.net/manual/en/function.glob.php

Tal vez el parametro GLOB_MARK en glob() funciona diferent en Alpine Linux. No sé.
Jalali Calendar

This topic says that this function " jdate fu[…]

messages

I just tried it in PM 3.2.1 and executing cron.p[…]

Session Expiration Issue

Hi .. I am using Mobile User Experience. In thi[…]

What happens if you change your HTML code to this?[…]