Sigo descubriendo grandes posibilidades en esta distribución de
GNU/Linux y una de ellas es empaquetar deb's de cosas que no tenemos en
los mirrors oficiales.
Antes de seguir, quiero dejar claro que
el método de crear un deb desde las fuentes de un programa no es éste, existen
checkinstall o mucho mejor
dpkg-buildpackage, que para eso estan pudiendo firmar con gpg el paquete y despueś testearlo con
lintian o
linda.
Mi script es un apaño para salir del paso por conflictos de
dependencias o la creación de paquetes no binarios como puede ser un
tema de gnome o programas que sólo es descomprimir (basados en java por
ejemplo)
Hace tiempo que vengo usando un pequeño script que he
hecho en bash y ahora ya que funciona bastante bien me he decidido a
publicarlo. A más de uno seguro que le va a venir muy bien...
El funcionamiento es muy sencillo, como usuario o como root ejecutamos:
empaqueta_deb.sh -d ruta/relativa/archivo.deb
empaqueta_deb.sh -d /ruta/absoluta/archivo.deb
Esto
desempaqueta el deb en /tmp/paquete/tmp creando un árbol de directorios
Linux (/usr /bin /var con los archivos que se copian en el sistema
cuando lo instalamos por apt) además se crea un directorio especial
/tmp/paquete/tmp/DEBIAN con los ficheros responsables de la creación
del paquete, el más importante es
control
donde indicamos el nombre del paquete, versión, tamaño ocupado,
responsable empaquetador y las dependencias. Puede haber otros scripts
que se ejcutarán antes, después de la instalación o desinstalación.
Para más info acude a la
Guía del nuevo desarrollador de Debian.
Para empaquetar:
empaqueta_deb.sh -e (esto sólo crea el deb en /tmp/paquete)
empaqueta_deb.sh -e -a (crea el deb, lo copia en el mirror que tengamos)
Como prueba de su funcionamiento aquí tengo una lista de los paquetes que he empaquetado hasta hoy:
atnag_0.0.3_i386.deb
jclic_0.1.1.5_i386.deb
jclic-games-3-6-years_0.1.1.5_i386.deb
clearlooks_0.5-1_i386.deb
sofilin_0.0.3_i386.deb
xfce4-panel-menu-plugin-_0.3.1-1_i386.deb
vnc2swf_0.4.2-1_i386.deb
spice_3f4-15_i386.deb
tablix_0.1.1-1_i386.deb
tnt_1.2.2-1_i386.deb
php-gtk_0.1.0-mario-1_i386.deb
php-gtk-cvs_1.0.1-1_i386.deb
php-manual-es_0.0.2_i386.deb
pxes-base-i586_0.9-2_i386.deb
pxesconfig_0.9-2_all.deb
libparted1.6-12_1.6.20-0.exp.1_i386.deb
libtiff3g_3.7.2-1_i386.deb
ming_0.2a-1_i386.deb
mixmagic_0.1.7-1_i386.deb
mysqlcc_0.9.4_i386.deb
gparted_0.0.8-1_i386.deb
gphpedit_0.9.50-2_i386.deb
gphpedit-cvs_0.9.50-2_i386.deb
gtablix_0.0.7-12_all.deb
gtk2-engines-soleupix_0.0.1_i386.deb
gtkscintilla-0.8.2_0.8.2-1_i386.deb
gcursor_0.0.6.1-1_i386.deb
gcvs_1.0.0-1_i386.deb
geotrace_0.0.4-2_i386.deb
getleft_1.1.2-2_all.deb
gimpshop_2.2.4-2_i386.deb
ccd2iso_0.1+fix-1_i386.deb
cinelerra_1.2.2-1_i386.deb
as6edriver-0.5_0.5-1_i386.deb
bashburn_1.5b2_i386.deb
Quizás alguno de estos paquetes ya esté en debian oficialmente, pero cuando yo lo empaquete no estaba.
No me vengais pidiendo nada de esto porque no tengo suficiente ancho de banda para hacerlos públicos.
(algunos están colgados en idefix.eup.uva.es)
Fichero: empaqueta_deb.sh
(recomiendo copiarlo en /usr/bin o /usr/sbin dependiendo de si lo
ejecutará root o cualquiera) y darle permisos de ejecución: chmod 755
empaqueta_deb.sh
#!/bin/bash
#------------------------------------------------------------------
# Copyright (C) 2005, Mario Izquierdo mariodebian[AT]gmail[dot]com
# You may distribute this software under the GPL License
#------------------------------------------------------------------
# directorio donde montaremos el mirror
# no poner la ultima barra
# edita esta variable
#
#despues añadir al sources.list la siguiente linea
#deb file:///mirror/extra ./
mirror_extra="/mirror/extra"
# NO EDITES DESDE AQUI
#variables más comodas
modificador=$1
fichero=$2
destino=$3
ayuda() {
echo "Uso de empaqueta_deb.sh"
echo ""
echo " Desempaquetar:"
echo " empaqueta_deb.sh --desempaqueta (-d) /ruta/donde/este/archivo.deb"
echo " Esto descomprime nuestro deb a un directorio temporal"
echo " /tmp/paquete/tmp/"
echo ""
echo " Empaquetar:"
echo " empaqueta_deb.sh --empaqueta (-e) [-a /destino/del/mirror]"
echo " Esto empaqueta el deb préviamente desempaquetado"
echo " generando de nuevo el archivo .deb"
echo " "
echo " ejemplos:"
echo ""
echo " empaqueta_deb.sh -d /usr/src/sofilin_0.0.3_i386.deb"
echo ""
echo " empaqueta_deb.sh -e -a /mirror/extra"
exit 0
}
desempaqueta() {
#salimos si no hay argumento en $fichero
if [ "$fichero" == "" ]; then
echo "No se ha especificado ningún paquete .deb";
exit 1
fi
#miramos que no haya otro paquete para sobreescribirlo accidentamente
if [ -f "/tmp/paquete/tmp/DEBIAN/control" ]; then
nombre_p=`cat /tmp/paquete/tmp/DEBIAN/control |grep ^Package: | awk '{print $2}'`
version_p=`cat /tmp/paquete/tmp/DEBIAN/control |grep ^Version: | awk '{print $2}'`
echo "###################################"
echo "# #"
echo "# Ya hay un paquete deb en /tmp #"
echo "# ======># ${nombre_p}_${version_p} "
echo "# ¿Quiere seguir? #"
echo "# #"
echo -n "################################### (S/n) "
read seguir
if [ "$seguir" == "n" ];then
echo "Saliendo..."
exit 1
fi
fi
#localizamos el deb (ruta relativa o absoluta lo sabemos porque
# $fichero comience o no por /)
if [ "`echo $fichero | cut -c1`" == "/" ];then
fichero=$fichero
else
fichero=`pwd`/$fichero
echo "la ruta completa es: $fichero"
fi
#descomprimir cada cosa en su sitio
cd /tmp/
rm -rf paquete 2>/dev/null
mkdir paquete
cd /tmp/paquete
ar x $fichero >/dev/null
mkdir tmp
cd tmp
tar xzpf ../data.tar.gz
mkdir DEBIAN
cd DEBIAN
tar xzpf ../../control.tar.gz
echo "Desempaquetado."
exit 0
}
empaqueta() {
cd /tmp/paquete/tmp/
dpkg --build . ..
cd ..
ls *.deb
echo "Aquí tienes tu .deb"
}
if [ "$#" == "0" ]; then
ayuda
fi
if [ "$modificador" == "--help" ]; then
ayuda
fi
if [ "$modificador" == "--desempaqueta" ] ; then
desempaqueta
fi
if [ "$modificador" == "-d" ] ; then
desempaqueta
fi
if [ "$modificador" == "--empaqueta" ]; then
empaqueta
fi
if [ "$modificador" == "-e" ]; then
empaqueta
fi
#si no hemos deficnido destino ponemos uno por defecto
if [ "$destino" == "" ]; then
destino=$mirror_extra
fi
if [ "$fichero" == "-a" ]; then
echo "Copiando paquete en $destino ..."
cp *.deb $destino
echo "Actualizando mirror..."
cd $destino
dpkg-scanpackages ./ /dev/null | gzip -9c > ./Packages.gz
if [ ! -f "$destino/Sources.gz" ]; then
#creamos el Sources.gz si no existe
touch Sources
gzip Sources
fi
echo ""
echo "HECHO"
fi