Solucionar error symbol lookup error: suhosin.so: undefined symbol: php_mb_encoding_translation en PHP 5.4 con cPanel

5 09 2013
Suhosin logo

Suhosin logo de Hardened PHP Project

Si has actualizado a PHP 5.4 en cPanel es posible que durante la subida de archivos u otras partes de tu código PHP te encuentres el siguiente error en el error_log de Apache.

1
2
/usr/bin/php: symbol lookup error: /usr/local/lib/php/extensions/no-debug-non-zts-20100525/suhosin.so:
 undefined symbol: php_mb_encoding_translation

Este error sólo se produce si además tienes activo Suhosin. Oficialmente PHP 5.4 no tiene soporte para Suhosin, pero esta extensión es muy necesaria para el uso de servidores compartidos, debido a que ofrece bastantes características de seguridad adicionales a la instalación base de PHP.

El problema se debe a que varias funciones relacionadas con mb string no estan presentes en el código fuente de PHP (probablemente porque cPanel usa una versión propia y ligeramente modificada del código original de PHP), donde puede haber sido eliminada la función php_mb_encoding_translation

Podemos observar, que en el código fuente de la versión PHP 5.4.19 se encuentra definida la función php_mb_encoding_translation() en concreto en /ext/mbstring/mbstring.c:102. Teóricamente esta función existe en el código nativo de PHP y suhosin debería poder utilizarla, pero al ser la versión PHP personalizada de cPanel no esta presente y suhosin falla al ejecutar el código php y eso producirá un error 500 en Apache abortando la ejecución del script.

Afortunadamente, existe un parche en Github en forma de Pull Request cuyo autor es Jan Ingvoldstad, que no ha sido aún aceptada después de más de 8 meses (al momento de escribir este artículo).

Puedes aplicar directamente el parche en el código fuente de github y compilarlo. En mi caso, he creado un repositorio aparte haciendo cherry picking del parche y de otros parches adicionales que corrigen otros errores en PHP 5.4 con suhosin y aún no han sido fusionados en el proyecto original.

La forma rápida de solucionarlo sería:

1 – Clonar mi repositorio de Suhosin con los parches aplicados (cherry picking)

1
git clone -b master --single-branch http://github.com/shakaran/suhosin.git suhosin-shakaran

2 – Compilar e instalar suhosin desde mi rama. En una sola línea sería:

1
cd suhosin-shakaran; phpize; ./configure; make; make install

Pero si quieres hacer tu propio cherry picking te explico como podrías hacer lo mismo que yo:

1 – Dirígete a github, en el repositorio oficial de suhosin y haz un fork del proyecto original

2 – Añade como repositorio remoto la rama de Jan Ingvoldstad

1
git remote add jani-upstream git://github.com/jani/suhosin.git

3 – Baja los commits de dicha rama (solo las referencias)

1
git fetch jani-upstream

4 – Haz un cherry pick del commit (parche) que arregla el fallo:

1
git cherry-pick e8beb4f50fa997c0ea4b923677deb275cc7660e

5 – Compila con:

1
cd suhosin-shakaran; phpize; ./configure; make; make install

Y listo, tendrás tu propio branch con tu parche aplicado.

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)


Virtualización y automatización para desarrolladores con Vagrant

26 12 2012
vagrant-hippieVagrant Hippie vagrant-hippie.png.png

Vagrant

Vagrant es una utilidad escrita en Ruby y open source para administrar máquinas virtuales de forma simple y desde la interfaz de comandos. Se apoya en un entorno de virtualización basado en VirtualBox que es generalmente utilizado para la automatización de entornos de desarrollo, pruebas unitarias, maquinas sandbox, etc.

Es muy útil cuando uno o varios desarrolladores disponen de varios perfiles y requisitos en proyectos, por ejemplo programar bajo PHP, Python, Ruby, Java, etc con diferentes gestores de bases de datos y versiones (MySQL 5.0, MySQL 5.5, MariaDB, PostGreSQL 9.2, MongoDB, etc), diferentes sistemas operativos, diferentes IDE’s, diferentes servidores web, control de versiones (git, mercurial, subversion, …) y estas configuraciones pueden provocar conflictos entre sí a la larga o directamente ser incompatibles. El mundo del desarrollador se hace cada día más complejo para establecer toda la infraestructura y componentes necesarios cumpliendo las dependencias exigidas.

Vagrant ofrece una solución basada en un aislamiento para cada perfil deseado a través de la virtualización independiente en máquinas virtuales donde pueden ser configuradas para cada necesidad del desarrollador. Esto no sería muy diferente a otras soluciones ya que aún sería necesario configurar máquinas virtuales, elegir un tipo de virtualización (KVM, Xen, OpenVZ, VirtualBox, VMWare, etc), instalar sistemas operativos, etc. Por ello Vagrant actúa como una herramienta independiente de más alto nivel donde permite abstraerse de detalles. De esta forma, automatiza y se ahorra tiempo a perfiles tan diferentes como desarrolladores independientes, equipos de trabajo o grandes empresas.

Instalación

Para instalarlo, por ejemplo en Ubuntu 12.10, necesitamos tener instalado ruby y VirtualBox (en el futuro esta previsto el soporte de otros tipos de virtualizaciones)

1
$ sudo apt-get install virtualbox ruby ruby1.9.1-dev

Después instalamos vagrant como gema de ruby:

1
$ sudo gem install vagrant --no-ri --no-rdoc  -V

Las opciones de:

  • –no-ri –no-rdoc permiten ahorrar tiempo evitando instalar la documentación de la gema que por lo general es un proceso lento y no suele ser buena documentación o estar obsoleta (si crees que realmente vas a usar la documentación elimina esta opción,).
  • -V es para la opción “verbose” o modo impresión. Con esta opción se obtiene información del proceso breve y permite conocer como va el estado de la instalación.

Este articulo se ha elaborado sobre la versión 1.0.5 de Vagrant. Para visualizar la información de que versión de vagrant se esta utilizando:

1
2
$ vagrant --version
Vagrant version 1.0.5

Creando un box

Las plantillas estándar de imágenes base para máquinas virtuales reciben el nombre de boxes. Permiten crear un entorno virtual predefinido. Tienen la extensión .box y están ideadas con la intención de ser archivos portables para que puedan ser usados en otras plataformas o entornos virtuales diferentes. En el sitio oficial de Vagrant se ofrece un breve listado para usar.

También existen otras verificadas oficialmente que proceden de la comunidad de usuarios. Pero si ninguna se adapta a tus necesidades (sistema operativo, versión, software base instalado, etc) puedes intentar crearte una box por ti mismo

Por ejemplo podríamos escoger el box oficial de Ubuntu 12.04 (Precise Pangolin) 64 bits desde:
http://files.vagrantup.com/precise64.box

Y el box de la comunidad de usuarios de Centos 6.3 (Versión mínima) desde:
https://dl.dropbox.com/u/7225008/Vagrant/CentOS-6.3-x86_64-minimal.box

Para crear un box o maquina virtual es necesario inicializar Vagrant con un nombre para el box y un archivo .box que puede estar situado localmente o puede ser descargado remotamente de una URL.

Para el box seleccionado podemos crear un directorio e inicializarlo desde el .box remoto:

1
2
$ mkdir precise64
$ sudo vagrant init precise64 http://files.vagrantup.com/precise64.box

Para la versión de Centos, seria similar pero cambiando por:

1
2
$ mkdir centos63minimal
$ sudo vagrant init centos63minimal https://dl.dropbox.com/u/7225008/Vagrant/CentOS-6.3-x86_64-minimal.box

Este comando crea ademas un archivo llamado Vagrantfile de configuración y otro .vagrant (estado de la máquina e identificador) en el directorio donde se ejecuta el comando.

Las boxes quedan almacenadas en ~/.vagrant.d/boxes/ bajo una carpeta con el nombre que se haya establecido. En ese directorio es donde realmente se guarda la imagen de VirtualBox en un fichero del tipo .vmdk ylas propiedades de la máquina virtual en un .ovf.

Podemos listar los box disponibles con el comando:

1
2
$ vagrant box list
precise64

Si queremos cambiar el nombre de nuestra box, podemos hacerlo cambiando la directiva config.vm.box en el archivo Vagrantfile:

1
config.vm.box = "centos63minimal"

Para iniciar nuestra máquina virtual en modo gráfico si nos fuera necesario, es posible realizarlo mediante la directiva config.vm.boot_mode en el archivo Vagrantfile:

1
config.vm.boot_mode = :gui

Para volver al anterior modo basta con cambiar a:

1
config.vm.boot_mode = :headless

Inicializar un box y gestionarlo

Para inicializar un box se ejecuta el comando:

1
sudo vagrant up

Si tienes algun error en la ejecución, es útil utilizar el modo DEBUG de Vagrant con:

1
$ VAGRANT_LOG=DEBUG sudo vagrant up

Suelen existir problemas en la creación del puente de red que permite la conexión a internet de la máquina virtual en determinadas configuraciones de red. Yo particularmente he tenido problemas si establecía una conexión mediante wifi (para otro tipo de virtualización KVM y VirtualBox, ya que es posible que el modo wireless no admita crear puentes de red), pero ningún problema si la conexión se establecía por clave ethernet.

También tenemos otras acciones para administrar vagrant como:

1
$ sudo vagrant halt

Para la máquina virtual

1
$ sudo vagrant reload

Recarga la configuración

1
$ sudo vagrant suspend

Suspende el estado de la máquina virtual

1
$ sudo vagrant resume

Activa el estado de la máquina virtual

1
$ sudo vagrant destroy

Destruye la máquina virtual

Acceder al box sin modo gráfico

Para acceder al modo “headless”, es decir por consola, es posible hacerlo mediante ssh con el comando:

1
$ sudo vagrant ssh

Los usuarios de acceso y contraseñas habituales de los box prefefinidos y oficiales son:

1
2
root/vagrant
vagrant/vagrant

Automatización de software y configuraciones

Una vez establecida el box, necesitamos automatizar los programas que serán instalados y configuraciones base de software. Para ello puede utilizarse Chef o Puppet, que son quizás parte de otro artículo.

Fuentes

Documentación oficial de Vagrant (código fuente documentación)

Daniel Vigueras (Scalia) – Vagrant: virtualizando entornos de desarrollo

VN:F [1.9.22_1171]
Rating: 10.0/10 (1 vote cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)


Configurar adaptador usb wifi RT5370 Ralink para linux kernel 2.6

13 12 2012
ADAPTADOR USB WIFI 150 MBPS CONCEPTRONIC de CONCEPTRONIC

ADAPTADOR USB WIFI 150 MBPS CONCEPTRONIC

Recientemente he adquirido un adaptador usb wifi para utilizarlo en ordenadores de sobremesa y evitar cableado en algunas zonas donde la conexión por cable al router no es muy accesible.

Tras configurarlo en un ordenador de sobremesa con Ubuntu 12.10 no tuve ningún problema y funcionó simplemente con enchufarlo (plug & play) y aparecieron las redes wireless disponibles para conectar.

El problema fue al cambiar de sistema operativo, en concreto a Centos 6.3. El dispositivo era detectado, lo que puede comprobarse con:

1
2
$ lsusb | grep Ralink
Bus 002 Device 007: ID 148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter

Sin embargo, no parecía existir una interfaz de red inalámbrica. Tras unas pocas búsquedas en google, comprobé que el soporte para este dispositivo con el driver RT5370 estaba integrado sólo en kernels superiores a 3.0+ y no para la rama 2.6. Por ello, Ubuntu 12.10 que usa la rama 3.X+ funcionaba perfecto y sin embargo en Centos 6.3 no, ya que aún usa la rama 2.6.X (ya que es un distribución orientada más a servidores).

Para solucionarlo, en el caso de este dispositivo, es necesario activar el repositorio de ELRepo, esto es:

1
2
# rpm --import http://elrepo.org/RPM-GPG-KEY-elrepo.org
# rpm -Uvh http://elrepo.org/elrepo-release-6-4.el6.elrepo.noarch.rpm

Posteriormente, instalamos el paquete kmod-rt5370sta que da soporte para el driver RT5370 en kernels 2.6:

1
# yum install kmod-rt5370sta

Después ya solo es necesario conectar e introducir el dispositivo (no es necesario reiniciar) y ya será plenamente funcional.

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)





Cargado con 272 consultas en 1,340 segundos