a veces la vida del sysadmin lo pone uno frente a situaciones que sólo se pueden arreglar de la peor forma posible: con alambre.
resulta que upgradeamos a feisty hace poco más de una semana. ese upgrade se llevó puesto una versión de python que aún es usado en algunos proyectos viejos (agradézcoseló a nuestros queridísimos amigos zope 2.9.6 y plone 2.5), la 2.3. como es imprescindible para ese laburo, no quedó otra que tratar de instalarlo.
para casos como éste lo primero que intento es bajar el .deb más reciente que haya. en debian o ubuntu, visito la página de paquetes y me los bajo de ahí. la ventaja de esto sobre ir al repo directamente es que me manda al repo de actualizaciones de seguridad si esto llegara a ser necesario.
cuestión que me bajé el python2.3_2.3.5-9ubuntu1.2_i386.deb y le mandé un dpkg --dry-run -i. la salida era algo de esperarse:
python conflicts with python2.3 (<< 2.3.5-14)
python2.3 (version 2.3.5-9ubuntu1.2) is to be installed.
el segundo paso obvio es el *port (en este caso un forwardport!). para un backport apt-get source y apt-get build-dep suelen ser tus amigos, pero para un fwport no. así que a visitar las páginas de los paquetes y a resolver estas dependencias a mano. hubo que descomprimir las fuentes a mano con dpkg-source -x y luego el viejo y querido fakeroot ./debian/rules binary para compilar y crear el paquete. como era de esperarse, esto tampoco funcionó. lamentablemente no tengo el error acá.
ahora bien, el mensaje de error del dpkg -i de allá arriba me dió una idea: forzar la versión de python. yo ya sabía desarmar .debs a mano con ar -x (esto deja un control.tar.gz y un data.tar.gz que contienen los metadatos del paquete y los archivos del paquete respectivamente. notar que ar es parte de las binutils, por lo que si de repente se te rompió todo el sistema apt/dpkg en un debian, aún podés recurrir a estas herramientas para solucionarlo (no digo que haya sido el motivo por el cual lo usaron, sino que es una buena consecuencia; seguramente es porque era lo que había a mano :)
así que desarmé el paquete, desarmé el control.tar.gz, toqué el archivo control donde declaraba la versión (cambié el 9 por un 14), rearmé el control.tar.gz y rearmé el .deb con ar -r y traté de instalarlo con dpkg -i nuevamente. para mi sorpresa, dpkg se negó a consumir semejante frankenstein, lo cual se lo entiendo; debe haber encontrado piolines y grampas que usé para cerrar el paquete.
momentáneamente perdido, pregunté en #debian en freenode. allí me mostraron una versión distinta:
12:45 < jelly> StucKman: dunno about ar, but I do with with dpkg:
dpkg --extract foo.deb somedir;
dpkg --control foo.deb somedir/DEBIAN;
(mess with it);
dpkg -b somedir .
hice exactamente eso, excepto que en el último comando tuve que agregar el nombre del archivo final. luego nuevamente usé dpkg --dry-run -i, y al confirmar que no se quejó, dpkg -i a secas. una vez instalado, me sercioré que el comando python siguiera apuntando al original (2.5.algo) y que python2.3 arrancara el correcto.