20 de Diciembre, 2004

Actualizando PHP con los ports de OpenBSD

Igual alguien no se ha enterado, pero se han descubierto varias cagadas en PHP. Es decir, en el intérprete de este lenguaje.

En realidad he estudiado con minuciosidad cada uno de los problemas y creo que no estoy expuesto a ninguno de ellos. Aun así me ha parecido buena idea actualizar, que de paso probaba una cosa.

La idea es actualizar el port de OpenBSD a CURRENT, y además solo ese y sin instalar todo el árbol de ports.

Se podrían meter los fuentes oficiales de PHP y dejarnos de historias, aunque no tendríamos la seguridad de que el resultado está probado, que es lo que hacen los encargados de los ports. Pero, ¿dónde estaría la diversión?

El sistema de ports de OpenBSD no difiere mucho del de otros sistemas BSD que poseen esta característica, aunque sí hay un punto importante: el árbol de ports de OpenBSD se sincroniza con la versión del sistema a la que pertenece. Esto significa que puede que al actualizar un paquete a CURRENT desde nuestra versión, este no funcione. Ojo que no hablo de binarios, lo que es bastante razonable (si se espera la librería foo en su versión X y tenemos una versión anterior, seguro que eso no es bueno).

En realidad complico las cosas mucho :D, pero bueno... dejo aquí constancia del pollo que he montado para otra vez. Así igual releeo todo esto y cambio de idea antes de ponerme.

No tengo el árbol de ports instalado, siempre he usado paquetes. Necesitamos un paquete para el PHP4 parcheado (4.3.10), y con la extensión para MySQL.

Para ello montaremos la estructura mínima indispensable, instalando desde binarios si queremos las dependencias (ya estarán la mayoría si tenemos una versión anterior de PHP funcionando), y con un pequeño hack para hacer la experiencia excitante al 100%.

Primero recogemos lo que necesitamos del CVS:

# export CVSROOT=anoncvs@anoncvs3.usa.openbsd.org:/cvs
# export CVS_RSH=/usr/bin/ssh
# cd /usr
# cvs checkout -P -rOPENBSD_3_6 ports/infrastructure

Hasta aquí bien, ¿no? Hemos pedido los fuentes indispensables del árbol de ports de mi versión (OpenBSD 3.6-STABLE).

Ahora necesitamos todos los elementos necesarios para compilar el paquete, aunque esto no es realmente así. Necesitamos la parte correspondiente del árbol de ports para que no de problemas el sistema de compilación, pero no porque realmente lo necesitemos, osea... podemos instalar de paquetes binarios recogidos del FTP de OpenBSD sin problemas.

Bueno, pues recogemos lo que hace falta:

# cd /usr
# cvs checkout -P -rOPENBSD_3_6 ports/devel/gettext
# cvs checkout -P -rOPENBSD_3_6 ports/devel/autoconf
# cvs checkout -P -rOPENBSD_3_6 ports/devel/metaauto
# cvs checkout -P -rOPENBSD_3_6 ports/converters/libiconv
# cvs checkout -P -rOPENBSD_3_6 ports/converters/recode
# cvs checkout -P -rOPENBSD_3_6 ports/databases/mysql

Lo que es bastante poco, comparado con el árbol completo, ¿no?

¿Cómos sabemos qué necesitamos? Bueno... podemos echar un ojo a los Makefile, probar y ver que errores va dando (lo más fácil, pero queda feo) o ejecutar algo como:

# pkg_info | awk '{ print $1 }' | xargs pkg_info -R

Y ver que paquetes está usando nuestro PHP4 actual.

Ahora vamos a por el PHP, pero no el de STABLE, sino el de CURRENT... que es el que está actualizado (y nos obligará a hacer un inofensivo hack :D):

# cvs checkout -P ports/www/php4

Ahora vamos a por el hack. En ports/www/php4/core/pkg/PLIST hay una linea que nos va a fastidiar el invento sin motivo:

...
@conflict php5-core-*
...

Si hacemos memoria seguro que recordamos que PHP5 no está en el árbol de ports de 3.6. Claro, por eso no funcionará nuestro intento si dejamos esa linea ahí, así que: o ella o nosotros :D. Yo la he borrado tranquilamente, nunca tendré instalado PHP5 en este sistema.

Recapitulemos un poco.

Hemos instalado la infraestructura de los ports de nuestra versión del sistema, la información de los paquetes necesarios (que instalaremos desde binarios y también de nuestra versión), y la información de PHP4 de CURRENT (actualizada a 4.3.10).

Ahora creamos los paquetes:

# cd /usr/ports/www/php4/extensions
# env FLAVOR="no_x11 no_bz2 no_curl no_dba\
 no_dbase no_dbx no_domxml no_filepro no_gd no_gmp\
 no_imap no_ldap no_mcrypt no_mhash no_ncurses\
 no_odbc no_pdf no_pgsql no_shmop no_snmp no_sybase_ct\
 no_xmlrpc no_xslt" MULTI_PACKAGES="-mysql"\
 make package

El chorizo del FLAVOR es porque solo queremos la extensión de MySQL (por eso no aparece no_mysl).

Podemos ver que sabores tenemos que quitar con:

# cat ports/www/php4/extensions/Makefile | grep FLAVORS

Ojo que añadir alguna de las extensiones puede significar más dependencias. Yo solo he ido a por MySQL.

Si no ha pasado nada, es decir, si no me he equivocado en algún paso (crear las extensiones debe generar también el paquete core, sino imagino que un cd /usr/ports/www/php4/core/ ; env FLAVOR="no_x11" make package lo hará), no debe de dar errores y crear los paquetes sin problemas.

Ahora, el momento de la instalación. Los paquetes están en:

ls /usr/ports/packages/i386/all/ | grep php
php4-core-4.3.10.tgz
php4-extensions-4.3.10.tgz
php4-mysql-4.3.10.tgz
php4-pear-4.3.10.tgz

Paramos el servidor web, desinstalamos los paquetes viejos e instalamos los nuevos.

A ver...

# lynx -dump -head http://127.0.0.1 | grep Powered
X-Powered-By: PHP/4.3.10

Bueno, parece que ya está.

¿Qué hubiera pasado si nuestro versión de OpenBSD es muy vieja y no hay manera de sincronizar con los ports de CURRENT? Puede que no compile quedándose en el paso de configurar el paquete, o puede que de un error el sistema de ports más grave del que nos ha dado con el conflict. Es una lástima que el sistema de ports de OpenBSD no sea más fácil de usar, aunque esto de ventajas competitivas a aquellos que tengan el know how, claro.

Actualización: Ya ha salido el OpenBSD Package Security Advisory (OPSA 20041223) y está disponible el paquete binario para 3.6. De todas formas mi experimento tiene mucho valor para cuando acabe el soporte de una versión y no queramos/podamos actualizar todo el sistema.

Anotación por Juan J. Martínez.

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.