Publicado por & archivado en Varios.

Si tienes un servidor gestionado con VHCS2 y actualizas el PHP a la versión 5.3, por ejemplo al pasar de Debian Lenny a Squeeze, te encontrarás con la desagradable sorpresa de que en vez de cargarse los textos y valores, aparecen sólo los nombres de las variables.

 

Después de actualizar PHP a la 5.3, te llevas la sorpresa cuando vas a entrar a VHCS2 y en vez de aparecer en el formulario de entrada nombre y usuario, aparece {TR_USERNAME} y {TR_PASSWORD}, y así cada texto y cada valor de la pantalla, lo que inutiliza por completo su uso.

 

Mi primer intento para arreglarlo fue tratar de hacer un downgrade de PHP 5.3 a 5.2, para el que hay varios tutoriales, pero resulta que Debian a retirado los repositorios de Lenny y aunque tenía los paquetes, después de una hora con dpkg desistí de seguir pegándome con las dependencias.

 

Otra solución es actualizar a ispCP Omega, pero lo que debería ser algo fácil ya que se trata de una versión moderna del propio VHCS2, en realidad es una pesadilla que dejó parado el servidor con el que hice el intento por las diferencias en la configuración de Apache y además, ya no funcionan los scripts de actualización con las últimas versiones, así que la migración de la base de datos tendría que hacerse a mano.

 

Así que llegados a este punto, la única solución aparte de montar un servidor nuevo y migrar todos los virtuales a mano (algo que por nada quería hacer), era encontrar donde estaba el fallo en VHCS2.

 

Primero probé a buscar la solución en Google, se que le ha pasado a más gente porque buscando los nombres de las variables encontré un montón de servidores con el mismo problema, e ingenuo de mi, pensé que alguien habría publicado la solución, pero después de una hora buscando, decidí ponerme a mirar el código de VHCS2, que para mi desgracia no tiene ni un comentario.

 

Después de unas horas de ingeniería reversa, descubrí que el problema está en una función que hace el “parse” de los arrays que sustituyen las variables por sus valores de la base de datos, la función es substitute_dynamic y está en el archivo gui/include/class.pTemplate.php.

 

Ahora quedaba arreglarlo, pero lo que hice fue comprobar las funciones de ispCP Omega a ver si eran compatibles, ya que este si funciona con PHP 5.3, y resulta que no sólo son compatibles, la mayoría de ellas son idénticas, pero me fijé que substitute_dynamic estaba muy modificada, así que probé a sustituirla entera y … ¡funcionó!

 

Para arreglarlo, lo único que hay que hacer es editar el archivo gui/include/class.pTemplate.php de VHCS2, borrar la función substitute_dynamic y poner la de ispCP Omega que está en el archivo gui/include/ispCP/pTemplate.php.

Se puede encontrar la función en esta página de Github:
https://github.com/okbutton/ispCP-distributed/blob/master/gui/include/class.pTemplate.php

Este es el código que usé yo, aunque tiene un bucle con un doble else que debería dar error, parece que con eso y todo funciona:


function substitute_dynamic($data){

 $this -> sp = 0;

 $start_from = -1;

 $curl_b = substr($data, '{', $start_from);

 if ($curl_b) {

 $this -> stack[$this -> sp++] = array('{', $curl_b);

 $curl = $this -> find_next_curl($data, $start_from);

 while ($curl) {

 if ($curl[0] == '{') {

 $this -> stack[$this -> sp++] = $curl;

 $start_from = $curl[1];

 } else {

 $curl_e = $curl[1];

 if ($this -> sp > 0) {

 $curl = $this -> stack [--$this -> sp]; /* CHECK for empty stack must be done HERE ! */

 $curl_b = $curl[1];

 if ($curl_b < $curl_e + 1) {

 $var_name = substr($data, $curl_b + 1, $curl_e - $curl_b - 1);

 /*
 *
 * The whole WORK goes here :) ;
 *
 */

 if (preg_match('/[A-Z0-9][A-Z0-9\_]*/', $var_name)) {

 if (isset($this -> namespace[$var_name])) {

 $data = substr_replace($data, $this -> namespace[$var_name], $curl_b, $curl_e - $curl_b + 1);

 $start_from = $curl_b - 1; /* new value may also begin with '{' */

 } else if (isset($this -> dtpl_data[$var_name])) {

 $data = substr_replace($data, $this -> dtpl_data[$var_name], $curl_b, $curl_e - $curl_b + 1);

 $start_from = $curl_b - 1; /* new value may also begin with '{' */

 } else {

 $start_from = $curl_b; /* no soutable value found -> go forward */

 }

 } else {

 $start_from = $curl_b; /* go forward, we have {not varialbe} here :) */

 }

 } else {

 $start_from = $curl_e; /* go forward, we have {} here :) */

 }

 } else {

 $start_from = $curl_e;

 }
 }

 $curl = $this -> find_next_curl($data, $start_from);

 }

 return $data;

 } else {

 return $data; /* tghere is nothing to substitute in $data */

 }
}

 

 

2 Comentarios para “Problemas con VHCS2 al actualizar a PHP 5.3”

  1. Juan

    De nada. Me alegra que le sirviera a alguien más después del trabajo que me dio averiguar lo que pasaba.

    Responder

Deja un comentario

Tu dirección de correo electrónico no será publicada.