MarioDebian, mi devlog

Bitácora de un desarrollador newbie.

Empaquetador/Desempaquetador de debian

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





Articulos relacionados:

Comentarios

  1. ramon que majo eres
    16/03/2007 | 18:43

    estas favorecido en la foto

Comentarios cerrados