IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Este articulo es una traducción del articulo Creació de paquets Debian

Paquetes Debian

Nombre de los ficheros Debian

El formato del fichero .deb es el siguiente:

<nombre_del_paquete>_<numero_de_version>-<numero_de_revision_debian>.deb

El número de versión está especificado por el desarrollador de la aplicación. Hay un estándar y nos podemos encontrar diferentes tipos de codificaciones como "19990513" o "1.3.8pre1".

El número de revisión de Debian está especificado por el desarrollador Debian (o por quien realmente cree el paquete). Este número se corresponde con el nivel de revisión del paquete Debian. En el caso de que sea un paquete Ubuntu aquí encontraremos la versión de Ubuntu.


Estructura de un paquete binario

Cada paquete Debian es un archivo ar compuesto por:

  • data.tar.gz: Ficheros a instalar en el sistema
  • control.tar.gz: Scripts de mantenimiento y metadatos
  • debian-binary: Número de versión del binario Debian

Ark.png

GestordArxius.png

El fichero control.tar.gz contiene los metadatos del paquete. Dentro de este paquete podemos encontrar ficheros como:

GestordArxius1.png

El fichero control contiene los metadatos. Por ejemplo el fichero control del paquete apache2.2-common:

Package: apache2.2-common
Version: 2.2.3-3.2build1
Section: web
Priority: optional
Architecture: i386
Depends: apache2-utils, net-tools, libmagic1, mime-support, lsb-base
Conflicts: apache2-common, libapache2-mod-php5 (<= 5.1.6-3), libapache2-mod-php4 (<= 4:4.4.4-2), libapache2-mod-mime-xattr (<= 0.3-2),     
libapache2-mod-mono (<= 1.1.17-3), libapache2-mod-proxy-html (<= 2.4.3-2), libapache2-mod-scgi (<= 1.11-1), libapache2-mod-speedycgi (<= 2.22-3),  
libapache2-modxslt (<= 2005072700-1), libapache2-redirtoservername (<= 0.1-1), libapache2-webauth (<= 3.5.3-1), libapache2-webkdc (<= 3.5.3-1)
Replaces: apache2-common
Installed-Size: 3460
Maintainer: Ubuntu Core Developers <ubuntu-devel@lists.ubuntu.com>
Original-Maintainer: Debian Apache Maintainers <debian-apache@lists.debian.org>
Source: apache2
Description: Next generation, scalable, extendable web server
Apache v2 is the next generation of the omnipresent Apache web server. This
version - a total rewrite - introduces many new improvements, such as
threading, a new API, IPv6 support, request/response filtering, and more.
.
It is also considerably faster, and can be easily extended to provide services
other than http.
.
This package contains all the standard apache2 modules, including SSL support.
However, it does *not* include the server itself; for this you need to
install one of the apache2-mpm-* packages; such as worker or prefork. 

Que coincide con la información que podeis encontrar con Synaptic si seleccionáis el paquete y con el botón derecho escogeis la opción Propiedades del menú Contextual:

PropietatsPaquetApache1.png

Los contenidos de estos ficheros en el caso de Debian vienen regulados por la Debian policy

El fichero md5sums contiene las sumas de comprobación (checksums) que permiten comprobar que no hay ninguna diferencia entre el paquete que tenemos y el original:

c4d71eca239992365ff6bb0dd2b087e6  usr/bin/krusader
a1bea18a70b85afac022cfe6e05d6b64  usr/share/icons/crystalsvg/22x22/apps/krusader_blue.png
29847c1108bc50911de6eb9e231fee69  usr/share/icons/crystalsvg/22x22/apps/krusader_root.png
c963d8938d45793ed937abdf1f874685  usr/share/icons/crystalsvg/22x22/apps/krusader_shield.png
1d046e13a24bc4db374fdd599727b233  usr/share/icons/crystalsvg/22x22/apps/krusader_user.png
e2b220c05fa7c83b5f53e1843715cced  usr/share/icons/crystalsvg/22x22/apps/krusader_red.png

.............

El resto de ficheros son los scripts de mantenimiento (postrm, postinst, etc) que se explican con más detalle en otro apartado.

Recursos:

Ficheros GNU ar

El comando ar lo proporciona el paquete binutils:

$ dpkg -S /usr/bin/ar
binutils: /usr/bin/ar


Metadatos

Podemos consultar los metadatos de un paquete Debian a través del comando:

$ dpkg --info talk_0.17-11ubuntu1_i386.deb 
paquet de debian nou, versió 2.0.
mida 21638 bytes: arxiu de control= 1084 bytes.
    611 bytes,    17 línies     control              
    449 bytes,     7 línies     md5sums              
    357 bytes,    14 línies* postinst             #!/bin/sh
    158 bytes,     8 línies* prerm                #!/bin/sh
Package: talk
Version: 0.17-11ubuntu1
Section: net
Priority: optional
Architecture: i386
Depends: libc6 (>= 2.5-0ubuntu1), libncurses5 (>= 5.4-5), update-inetd, openbsd-inetd | inet-superserver
Suggests: talkd
Replaces: netstd
Installed-Size: 88
Maintainer: Ubuntu MOTU Developers <ubuntu-motu@lists.ubuntu.com>
Original-Maintainer: Alberto Gonzalez Iniesta <agi@inittab.org>
Source: netkit-ntalk
Description: Chat with another user
Talk is a visual communication program which copies lines from your terminal
to that of another user.
.
In order to talk locally, you will need to install the talkd package.

Los metadados se almacenan en el fichero control de dentro del fichero comprimido control.tar.gz de un fichero binario de debian.

La Debian Policy determina como se han de utilizar los campos del fichero control.

Recursos:


Scripts de mantenimiento

Durante la instalación o desinstalación de un paquete Debian no se instalan o se eliminan simplemente ficheros en el sistema, sino que también se llevan a cabo diferentes acciones para configurar los paquetes. Estas acciones las llevan a cabo los siguientes scripts de mantenimiento:

  • preinst: Se ejecuta antes de extraer los ficheros del paquete al sistema.
  • postinst: Se ejecuta después de extraer los ficheros del sistema.
  • prerm: Se ejecuta antes de borrar los ficheros del sistema.
  • postrm: Se ejecuta después de borrar los ficheros del sistema.
  • config: Fichero de configuración de Debconf.
  • templates: Plantillas de Debconf.

Todos estos ficheros se encuentran dentro del fichero control.tar.gz de un paquete Debian. Durante el proceso de construcción del paquete, los ficheros se encuentran en la carpeta debian.

La siguiente gráfica muestra cuando se ejecutan estos scripts.

ScriptsManteniment.png

La [(http://www.debian.org/doc/debian-policy/ch-maintainerscripts.html) Debian Policy] determina como se han de utilizar los scripts de mantenimiento. Si consultais el enlace anterior además vereis que hay otros scripts de mantenimiento aparte de los mencionados.

Recursos:


Relaciones entre paquetes

  • El paquete A depende del Paquete B: Implica que es absolutamente necesario que el paquete B esté instalado antes de poder instalar A. También incluso puede ser que A dependa de una versión específica de B.
  • El paquete A recomienda B: B no es necesario pero el desarrollador de A cree que la mayoria de usuarios de A encontrarán útil B.
  • El paquete A sugiere B: El paquete A sugeriere el B porque B contiene funcionalidades relacionadas con A (y que a menudo mejoran su funcionalidad).
  • El paquete A entra en conflicto con el paquete B: El paquete A no puede operar en el sistema si existe B. A menudo porque los dos proporcionan el mismo fichero.
  • El paquete A reemplaza B: Al instalar A se borran los ficheros de B y en algunos casos se sobreescriben.
  • El paquete A provee de B: Cuando todos los ficheros y funcionalidades de B han de estar incorporados a A.

Recursos:


Importancia de un paquete

  • Required: Paquetes imprescindibles para el correcto funcionamento del sistema. Esto incluye todas las herramientas necesarias para reparar los defectos de un sistema. Sin estos paquetes el sistema estará roto y no se podrá utilizar dpkg para arreglarlo. Los sistemas que solo tienen paquetes requeridos no son utilizables, pero tienen las suficientes funcionalidades para permitir que el administrador del sistema pueda iniciar la máquina e instalar más software.
  • Important: Paquetes que se habrian de encontrar en todo sistema. Estos paquetes no incluyen Emacs o X11 o TeX ni ninguna otra "gran" aplicación. Estos paquetes solo constituyen la infraestructura básica.
  • Standard: Los paquetes Standard, son aquellos paquetes mínimos que se habrian de encontrar en toda máquina. Están las herramientas básicas para navegar por la web (w3m), enviar correos electrónicos (mutt) o descargar ficheros o servidores FTP. Estos paquetes (y los de prioridad superior) son los que se instalan por defecto. No incluye muchas aplicaciones importantes.
  • Optional: Paquetes que posiblemente mucha gente querrá instalar pero que no son imprescindibles para el sistema. Aquí encontramos paquetes tan importantes como X11.
  • Extra: Paquetes que entran en conflicto con otros de mayor prioridad pero que en ciertas condiciones los usuarios pueden preferir.

Una instalación por defecto de Debian instala todos los paquets de prioridad Standard o superior.

Recursos:


Estructura de los paquetes fuente Debian

Si consultais un repositorio de paquetes Debian como por ejemplo el repositorio de Ubuntu:

Obtendreis el siguiente:

PaquetsDebianRepositoriUbuntu.png

Como podeis ver hay diferentes versiones del mismo paquete, y además de los paquetes Debian para diferentes arquitecturas (fitxers .deb) hay otros ficheros:

  • hello_2.2-2.dsc: Fichero principal que controla el código fuente del paquete, con información general del código fuente. Están firmados con PGP.
  • hello_2.2-2.orig.tar.gz: Código fuente original o el que a menudo se denomina upstream.
  • hello_2.2-2.diff.gz: Fichero diff que contiene los cambios que se han de aplicar sobre el original para obtener la versión Debian.

Si queremos obtener estos ficheros los podemos descargar manualmente o simplemente ejecutando:

$ apt-get source hello
Se está leyendo la lista de paquetes... Hecho 
Se está construuendo el árbol de dependencias       
Reading state information... Hecho           
Se necesita descargar 388kB de archivos fuente.
Des:1 http://ch.archive.ubuntu.com feisty/main hello 2.2-1build1 (dsc) [524B]
Des:2 http://ch.archive.ubuntu.com feisty/main hello 2.2-1build1 (tar) [383kB]
Des:3 http://ch.archive.ubuntu.com feisty/main hello 2.2-1build1 (diff) [4841B]
388kB descargados en 1s (372kB/s)    
gpg: Signature made dl 05 mar 2007 02:22:21 CET using DSA key ID 0F932C9C
gpg: No se ha podido comprobar la firma: no se ha encontrado la clave pública
dpkg-source: se está extrayendo hello a hello-2.2
dpkg-source: se está desempaquetando hello_2.2.orig.tar.gz
dpkg-source: se está aplicando ./hello_2.2-1build1.diff.gz

Nos descarga todos los ficheros y aplica el pegado:

$ ls -l
total 404
drwxr-xr-x 10 sergi sergi   4096 2007-06-14 08:30 hello-2.2
-rw-r--r--  1 sergi sergi   4841 2007-03-05 03:04 hello_2.2-1build1.diff.gz
 -rw-r--r--  1 sergi sergi    524 2007-03-05 03:04 hello_2.2-1build1.dsc
-rw-r--r--  1 sergi sergi 382629 2006-12-12 14:03 hello_2.2.orig.tar.gz

En la carpeta hello-2.2 tenemos todo el código fuente del paquete Debian. Si quereis, podeis crear (compilar) vuestro paquete ejecutando:

$ cd hello-2.2
$ fakeroot
# dpkg-buildpackage  

Recursos:


Comando patch

TODO

Recursos:


Comando debdiff

Permite comparar fichero debian. Veamos un ejemplo:

$ wget http://ch.archive.ubuntu.com/ubuntu/pool/main/h/hello/hello_2.2-2_i386.deb
$ wget http://ch.archive.ubuntu.com/ubuntu/pool/main/h/hello/hello_2.2-2_powerpc.deb
$ debdiff hello_2.2-2_i386.deb hello_2.2-2_powerpc.deb 
File lists identical (after any substitutions)
Can't compare control files; wdiff package not installed

Instalamos wdiff:

$ sudo apt-get install wdiff
$ debdiff hello_2.2-2_i386.deb hello_2.2-2_powerpc.deb 
File lists identical (after any substitutions)

Control files: lines which differ (wdiff format)
------------------------------------------------
Architecture: [-i386-] {+powerpc+}
Installed-Size: [-584-] {+588+} 

Son ficheros debian idénticos pero para diferentes arquitecturas.

Recursos:


Comando dpkg-source

Continuando con el ejemplo hello. Si descargamos los ficheros fuente

$ wget http://ch.archive.ubuntu.com/ubuntu/pool/main/h/hello/hello_2.2-2.dsc
$ wget http://ch.archive.ubuntu.com/ubuntu/pool/main/h/hello/hello_2.2-2.diff.gz
$ wget http://ch.archive.ubuntu.com/ubuntu/pool/main/h/hello/hello_2.2.orig.tar.gz

Ahora podemos crear la carpeta con el código fuente del paquete debian con:

$ dpkg-source -x hello_2.2-2.dsc

NOTA: Todos estos pasos son equivalentes a ejecutar apt-get source.

Recursos:

Nota sobre Paquetes Ubuntu

TODO

Así, la primera revisión de la versión 1.0 del paquete «dirhola» sería «dirhola_1.0-1» si es la primera vez que la versión 1.0 de este paquete entra en Debian, «dirhola_1.0-2» si es la segunda revisión, etc... En Ubuntu el nombre es el mismo, pero si se da el caso de que Ubuntu también hace cambios este último pasaria a ser «dirhola_1.0-2ubuntu1»; si encontramos algún otro problema entonces saldría el paquete «dirhola_1.0-2ubuntu2», etc.

En el caso de que un paquete esté en Ubuntu pero no en Debian el número de revisión de debian es 0, por ejemplo «diradeu_0.1-0ubuntu1», si es la primera vez que se hace un paquete de la versión 0.1 del programa «diradeu» y ésta solamente se hace en Ubuntu (o se hace independientemente del de Debian, caso que también se puede dar).

Gracias a Siegfried-Angel Gevatter Pujals (RainCT).

Debconf

Debconf es una utilidad de software que permite llevar a cabo tareas de configuración en sistemas Debian GNU/Linux. Debconf está muy ligado a dpkg.

Muchos paquetes al instalarse iniciando una interfaz con el usuario para pedir los parámetros de configuración que crean adientes:

Debconf se proporciona por el paquete del mismo nombre. Ejecutando

$ dpkg -L debconf | grep bin
/usr/sbin
/usr/sbin/dpkg-preconfigure
/usr/sbin/dpkg-reconfigure
/usr/bin
/usr/bin/debconf
/usr/bin/debconf-apt-progress
/usr/bin/debconf-communicate
/usr/bin/debconf-copydb
/usr/bin/debconf-escape
/usr/bin/debconf-set-selections
/usr/bin/debconf-show

Podemos ver cuáles son los comandos proporcionados por Debconf. El más importante es dpkg-reconfigure que nos permite reconfigurar paquetes ya instalados en nuestro sistema. Uno de los ejemplos más comunes es ejecutar:

$ sudo dpkg-reconfigure xserver-xorg

Que permite configurar el servidor X tal y como podeis ver en el artículo Configurar_el_paquet_Debian_xserver-xorg.

Hay otros paquetes relacionados con debconf:

  • debconf-doc: Documentación de debconf
  • debconf-utils: Utilidades para Debconf
  • po-debconf: Internacionalización de Debconf.
  • debconf-i18n: Internacionalización de Debconf.

La especificación de Debconf en la Debian Policy os puede dar más detalles sobre Debconf.

Recursos:


Protocolo Debconf

Las aplicaciones que quieren utilizar debconf han de utilizar un protocolo de comunicación con debconf. Los comandos del protocolo son:

  • VERSION
  • CAPB
  • TITLE
  • SETTITLE
  • INPUT
  • GO
  • CLEAR
  • BEGINBLOCK
  • ENDBLOCK
  • STOP
  • GET
  • SET
  • RESET
  • SUBST
  • FGET
  • FSET
  • METAGET
  • REGISTER
  • UNREGISTER
  • PURGE

En el manual de debconf-devel encontrareis una explicación de cada comando. Los más importantes (o los que utilizamos en los ejemplos de este artículo):

  • VERSION: Establece la versión. Utilizamos la versión 2.0
  • CAPB: Establece las capacidades de DEBCONF. Lo utilizaremos para establecer la capacidad backup.
  • INPUT: Prepara una plantilla de debconf para ser mostrada. Cada ventana tiene una cierta prioridad.
  • GET: Obtenemos el resultado de llamar a una plantilla. Dependiendo de la plantilla puede ser una respuesta sí/no, un string, etc...
  • GO: Muestra la plantilla que hemos preparado con INPUT.

Cada comando tiene una función equivalente en shell. Estas funciones son proporcionadas por el script de shell /usr/share/debconf/confmodule y sus nombres son:

db_comandodebconf

Donde comandodebconf es un comando de debconf. Ejemplos: db_capb, db_version, db_get. También se pueden comunicar con debconf a través de otros lenguajes como Perl.


Depurando Debconf

Una herramienta muy útil para identificar errores con debconf es activar el modo DEBUG de debconf con:

$ export DEBCONF_DEBUG=developer

Ahora si ejecutamos el script config tendremos más información sobre la ejecución:

$ sudo ./config 
debconf (developer): frontend started
debconf (developer): Trying to find a templates file..
debconf (developer): Trying ./config.templates
debconf (developer): Trying ./templates
debconf (developer): I guess it is ./templates
debconf (developer): frontend running, package name is 
debconf (developer): starting ./config
debconf (developer): <-- VERSION 2.0
debconf (developer): --> 0 2.0

................................

Prioridades de debconf

El parámetro debconf/priority define la prioridad más alta de los mensajes a mostrar por debconf. La instalación predeterminada utiliza priority=high. En este caso se mostrarán los mensajes con prioridad high y critical, pero se anularán los mensajes con prioridad medium y low.

Estos parámetros se utilizan con debconf y con la instalación del sistema. Si utilizais el parámetro de arranque priority=medium, se os mostrará el menú de instalación y dispondreis de más control sobre la instalación. Cuando se utiliza el parámetro priority=low se mostrarán todos los mensajes (es equivalente al método de arranque experto). En el caso de priority=critical, el sistema de instalación mostrará únicamente los mensajes críticos y procurará hacer el trabajo correctamente sin mostrar mensajes.

Recursos:


Interfaces de debconf

El parámetro DEBIAN_FRONTEND es un parámetro que define el tipo de interfaz de usuario utilizado durante las instalaciones y también con las configuraciones con Debconf. Los posibles parámetros de configuración actuales para la instalación del sistema son:

  • DEBIAN_FRONTEND=noninteractive: No hay interacción con el usuario.
  • DEBIAN_FRONTEND=text: Texto para línea de comandos. readline es una opción equivalente.
  • DEBIAN_FRONTEND=newt
  • DEBIAN_FRONTEND=gtk
$ export DEBIAN_FRONTEND=readline

Si ejecutamos el script, las preguntas se harán desde la línea de comandos:

$ sudo debian/config

Configuración del paquete «»

Please enter the hostname of the database server host.

Database server hostname: 8001

NOTA: Realmente debconf utiliza las interfaces definidas en la carpeta /usr/share/perl5/Debconf/FrontEnd:

$ ls
Dialog.pm  Editor.pm  Gnome.pm  Kde  Kde.pm  Noninteractive.pm  Passthrough.pm  Readline.pm  ScreenSize.pm   Teletype.pm  Text.pm  Web.pm

Por ejemplo para probar con Gnome hemos de ejecutar:

$ export DEBIAN_FRONTEND=gnome
$ sudo debian/config

DebconfGnome.png

Por defecto, debconf utiliza Programació_en_C_2#Dialog dialog. Dialog es un conjunto de herramientas que utilizando ncurses para crear formulario de interfaz con los usuarios por línea de comandos. Las pantallas se muestran de la siguiente forma:

DebconfDialog.png

Podeis probar el resto de interfaces:

Dialog.pm  Editor.pm  Gnome.pm  Kde  Kde.pm  Noninteractive.pm  Passthrough.pm  Readline.pm  ScreenSize.pm   Teletype.pm  Text.pm  Web.pm

estableciendo la variable de entorno en el nombre de fichero pero en minúsculas. Por ejemplo:

$ export DEBIAN_FRONTEND=kde

Recursos:

Debconf-communicate

Se puede utilizar para comunicarse con debconf. Por ejemplo el comando:

$ sudo -i 
$ echo get echod/port | debconf-communicate
0 8001

Nos devuelve el resultado de ejecutar la pregunta echod/port.

Recursos:

Herramientas de traducción de Debconf

TODO


Troubleshooting

Al ejecutar los scripts de configuración de debconf (config) no se muestran las plantillas

Si al ejecutar debconf, de golpe las ventanas de configuración dejan de ejecutarse podemos probar los pasos indicados en esta sección para mirar de solucionarlo.

Si configuramos debconf en mode debug:

$ export DEBCONF_DEBUG=developer

Si ahora ejecutamos el script:

$ sudo debian/config 
debconf (developer): frontend started
debconf (developer): Trying to find a templates file..
debconf (developer): Trying debian/config.templates
debconf (developer): Trying debian/templates
debconf (developer): I guess it is debian/templates
debconf (developer): frontend running, package name is 
debconf (developer): starting debian/config
debconf (developer): <-- VERSION 2.0
debconf (developer): --> 0 2.0
debconf (developer): <-- CAPB backup
debconf (developer): --> 0 multiselect escape backup
debconf (developer): <-- INPUT critical echod/port
debconf (developer): --> 30 question skipped
...........

Vemos como las preguntas se saltan. Para solucionar este problema le hemos de indicar a debconf (a través del comando debconf-communicate) que la plantilla no está vista todavia:

$ sudo -i
$ echo fset echod/port seen false | debconf-communicate
$ echo fset echod/notconfigured seen false | debconf-communicate
$ exit

Problemas extraños. Comandos que hemos pedido pero que finalmente no se han ejecutado

Ojo con el uso de fakeroot porque solamente nos sirve para crear el paquete con dpk-buildpackage!!! Si os dais cuenta que algunos comandos que habeis ejecutado no se han realizado (por ejemplo habeis borrado un paquete del sistema con --purge y los ficheros de configuración todavia están ...) es muy posible que el comando lo hayais ejecutado desde fakeroot.

Debianización de programas

Pasos previos. Paquetes necesarios para crear paquetes Debian

$ sudo apt-get install binutils gcc libc6-dev make fakeroot

Posiblemente muchos de estos paquetes ya los encontrareis instalados en el sistema dependiendo de su importancia.

Utilidades:

$ sudo apt-get install debmake dpkg-dev devscripts patch

Documentación:

$ sudo apt-get install debian-policy developers-reference

DebHelper. Ayuda en el proceso de Build

Instalación:

$ apt-­get install debhelper dh­-make

dh_make es la aplicación que nos ayuda a crear una carpeta debian a partir de la cual debianizar un código fuente

$ dh_make -­e you@example.com -f ../foo­0.1.tar.gz

debhepler nos proporciona una serie de guiones de shell que no ayudan en la creación de paquetes debian. Podemos obtener la lista de guiones de shell ejecutando:

$ dpkg -L debhelper | grep bin
/usr/bin
/usr/bin/dh_builddeb
/usr/bin/dh_clean
/usr/bin/dh_compress
/usr/bin/dh_desktop
/usr/bin/dh_fixperms
/usr/bin/dh_gconf 
/usr/bin/dh_gencontrol
/usr/bin/dh_iconcache
/usr/bin/dh_install
/usr/bin/dh_installcatalogs
/usr/bin/dh_installchangelogs
/usr/bin/dh_installcron
/usr/bin/dh_installdeb
/usr/bin/dh_installdebconf
/usr/bin/dh_installdirs
/usr/bin/dh_installdocs
/usr/bin/dh_installemacsen
/usr/bin/dh_installexamples
/usr/bin/dh_installinfo
/usr/bin/dh_installinit
/usr/bin/dh_installlogcheck
/usr/bin/dh_installlogrotate
/usr/bin/dh_installman
/usr/bin/dh_installmanpages
/usr/bin/dh_installmenu
/usr/bin/dh_installmime
/usr/bin/dh_installmodules
/usr/bin/dh_installpam
/usr/bin/dh_installppp
/usr/bin/dh_installudev
/usr/bin/dh_installwm
/usr/bin/dh_installxfonts
/usr/bin/dh_link
/usr/bin/dh_listpackages
/usr/bin/dh_makeshlibs
/usr/bin/dh_md5sums
/usr/bin/dh_movefiles
/usr/bin/dh_perl
/usr/bin/dh_python
/usr/bin/dh_scrollkeeper
/usr/bin/dh_shlibdeps
/usr/bin/dh_strip
/usr/bin/dh_suidregister
/usr/bin/dh_testdir
/usr/bin/dh_testroot
/usr/bin/dh_testversion
/usr/bin/dh_undocumented
/usr/bin/dh_usrlocal   

Las siguientes tablas nos muestran los ficheros que utilizan algunos de los guiones debhelper más importantes:

Debhelper.png

Debhelper1.png

Recursos:

Probando los paquetes creados. Lintian y Linda

Instalación:

$ apt-­get install lintian linda

Devscripts

El paquete devscripts proporciona múltiples utilidades útiles para los desarrolladores.

$ sudo apt-get install devscripts

Las utilidades o comandos que proporciona son:

$ dpkg -L devscripts | grep bin
/usr/bin
/usr/bin/bts
/usr/bin/checkbashisms
/usr/bin/cvs-debuild
/usr/bin/dd-list 
/usr/bin/debchange
/usr/bin/debcommit
/usr/bin/debdiff
/usr/bin/debi
/usr/bin/debpkg
/usr/bin/debuild
/usr/bin/dget
/usr/bin/dpkg-depcheck
/usr/bin/dscverify
/usr/bin/grep-excuses
/usr/bin/mass-bug
/usr/bin/plotchangelog
/usr/bin/rc-alert
/usr/bin/rmadison
/usr/bin/svnpath
/usr/bin/annotate-output
/usr/bin/archpath
/usr/bin/cvs-debi
/usr/bin/cvs-debrelease
/usr/bin/deb-reversion
/usr/bin/debclean
/usr/bin/debrelease
/usr/bin/debrsign
/usr/bin/debsign
/usr/bin/dpkg-genbuilddeps
/usr/bin/mergechanges
/usr/bin/nmudiff
/usr/bin/pts-subscribe
/usr/bin/tagpending
/usr/bin/uscan
/usr/bin/uupdate
/usr/bin/whodepends
/usr/bin/who-uploads
/usr/bin/wnpp-alert
/usr/bin/requestsync
/usr/bin/dch
/usr/bin/debc
/usr/bin/cvs-debc  


Debchange (alias dch)

El comando debchange (también conocido como dch) nos permite modificar los ficheros changelog de forma cómoda. Si ejecutamos debchange sin parámetros (siempre desde la raiz de nuesro código fuente o lo que es lo mismo que la carpeta debian esté dentro de la carpeta donde nos encontramos) nos abre el fichero debian/changelog con nuestro editor preferido (variable de entorno $EDITOR).

Pero la verdadera utilidad de debchange la encontrareis en el siguiente ejemplo: imaginaros que acabais de solucionar un BUG/error en vuestro código fuente. Podeis ejecutar:

$ debchange S'ha modificat la línia x del fitxer y per solucionar l'error 2325

Si ahora ejecutais debchange obtendreis el siguiente fichero changelog:

echod (0.1-1) unstable; urgency=low

*Initial release (Closes: #nnnn)  <nnnn is the bug number of your ITP>
*S'ha modificat la línia x del fitxer y per solucionar lerror 2325

Como podreis observar algunos caracteres se "pueden escapar". La forma correcta habría sido:

$ debchange S\'ha modificat la línia x del fitxer y per solucionar l\'error 2325

Si estamos creando una nueva versión del paquete podemos cambiar el fichero changelog fácilmente con:

$ debchange -i

echod (0.1-1ubuntu2) feisty; urgency=low 

*Nueva versión 

 -- Sergi Tur Badenas <sergi@localhost.localdomain>  Wed,  6 Jun 2007 12:58:10 +0200

echod (0.1-1) unstable; urgency=low 

*Initial release (Closes: #nnnn)  <nnnn is the bug number of your ITP>
*Sha modificat la línia x del fitxer y per solucionar lerror 2325 

-- Sergi Tur Badenas <sergi@localhost.localdomain>  Wed,  6 Jun 2007 12:53:05 +0200

NOTA: También podemos utilizar debchange utilizant el alias dch:

$ which dch
/usr/bin/dch
$ ls -la /usr/bin/dch
lrwxrwxrwx 1 root root 9 2007-04-21 03:09 /usr/bin/dch -> debchange

Creación de un paquete Debian. Servidor de echos (echod)

En este apartado veremos los pasos a seguir para convertir en un paquete Debian el Servidor de ecos del artículo Programación de demonios Linux. Podeis obtener los ficheros en:

$ svn checkout

  • Usuari: anonymous
  • Contrasenya: anonymous

Encontrareis una carpeta echoDimoni. El primer paso es copiar esta carpeta a una nueva que siga los convenios de debian:

$ cd sessio10
$ cp -r echoDimoni echod-0.1

Ahora hay que obtener las herramientas necesarias para crear el paquete Debian:

$ sudo apt-get install dh-make fakeroot build-essential devscripts debhelper
  • dh-make: Será la utilidad que nos creará la carpeta debian a partir de la cual podremos crear el paquete debian.
  • fakeroot: Para crear el paquete necesitamos permisos de superusuario. Este comando es útil para aquellos desarrolladores que han de crear paquetes en sistemas donde no tenemos permisos de superusuario.
  • build-essential: Build essential es un paquete "tonto" (dummy package) que instala todas las herramientas necesarias para construir aplicaciones a partir del códigp fuente:
    • libc6-dev: librerias de C para desarrolladores.
    • gcc: el compilador GNU.
    • g++: el compilador GNU de C++.
    • make: la herramienta make.
    • dpkg-dev: nos proporciona herramientas como dpkg-buildpackage que nos ayudarán en la construcción del paquete.
  • 'devscripts: devscripts nos proporciona guiones de shell útiles para los desarrolladores de paquetes debian como por ejemplo debchange.
  • debhelper: Nos proporciona todas los comandos dh_xxx que nos ayudarán a construir el paquete Debian.

Para crear un paquete Debian, hay que crear una carpeta debian dentro de nuestro código. Esta carpeta tendrá una serie de información necesaria para crear un paquete debian a partir del código fuente. La forma más sencilla de crear esta carpeta es utilizar una herramienta como dh_make del paquete deb-helper:

NOTA: Poned vuestro propio correo en lugar de creador.del.paquete@ejemplo.com.

$ cd echod-0.1
$ dh_make -e creador.del.paquete@ejemplo.com --createorig

Os preguntará por el tipo de paquete. En este documento solamente trataremos la opción single binary (s):

Type of package: single binary, multiple binary, library, kernel module or cdbs?
 [s/m/l/k/b] 

Y nos mostrarán los datos de control iniciales de nuestro paquete (más adelante los veremos con más detalle y los adaptaremos a nuestras necesidades):

Maintainer name : Sergi Tur Badenas
Email-Address   : sergi.tur@upc.edu 
Date            : Fri,  8 Jun 2007 13:15:56 +0200
Package Name    : echod
Version         : 0.1
License         : blank
Type of Package : Single
Hit <enter> to confirm: 

Presionamos enter y ya tenemos creada la carpeta debian.

La opción --createorig nos creará una carpeta llamada echod-0.1.orig:

$ ls -la ..
total 32
............. 
drwxr-xr-x 5 sergi sergi 4096 2007-06-08 13:18 echod-0.1
drwxr-xr-x 4 sergi sergi 4096 2007-06-08 13:12 echod-0.1.orig
drwxr-xr-x 4 sergi sergi 4096 2007-06-08 12:59 echoDimoni
......

Esta carpeta será utilizada más adelante para crear los ficheros fuente de debian.

Una vez tenemos la carpeta debian, ya estamos en condiciones de crear un paquete Debian a través del comando dpkg-buildpackage. Para crear el paquete hay que ser superusuario o todavia mejor, utilizar el comando fakeroot:

$ fakeroot
# dpkg-buildpackage
.............
.............
dpkg-genchanges
dpkg-genchanges: including full source code in upload
signfile echod_0.1-1_i386.changes

dpkg-buildpackage: full upload (original source is included)

Una vez creado el paquete es MUY IMPORTANTE para evitar errores y otras complicaciones, salir de fakeroot con el comando exit:

# exit
$

Si ejecutamos el comando:

$ ls -l ..
..............................
drwxr-xr-x 5 sergi sergi  4096 2007-06-08 13:22 echod-0.1
-rw-r--r-- 1 sergi sergi  7474 2007-06-08 13:22 echod_0.1-1.diff.gz
-rw-r--r-- 1 sergi sergi   546 2007-06-08 13:23 echod_0.1-1.dsc
-rw-r--r-- 1 sergi sergi   980 2007-06-08 13:23 echod_0.1-1_i386.changes
-rw-r--r-- 1 sergi sergi  6550 2007-06-08 13:23 echod_0.1-1_i386.deb
-rw-r--r-- 1 sergi sergi 18471 2007-06-08 13:22 echod_0.1.orig.tar.gz
drwxr-xr-x 4 sergi sergi  4096 2007-06-08 12:59 echoDimoni
.....................

Se han creado tanto el paquete debian binario, como los #Estructura_de_los_paquetes_fuente_Debian paquetes debian fuente () y el fichero de cambios (.changes).

Pero no todo es tan simple, realmente si ahora abris el paquete debian con el comando:

$ nautilus ..

Y abris el paquete con la aplicación "Gestor d'arxius":

ObreAmbGestorArxius.png

en KDE teneis una aplicación llamada ARK:

ObreAmbArk.png

Desde la línea de comandos, el comando equivalente es:

$ file-roller ../echod_0.1-1_i386.deb

Si navegais por los contenidos del paquete vereis que hay mucha información incompleta (descripción del fichero, fichero README, etc...) y que todavia quedan algunos detalles por mejorar. Esto es debido a que dh_make no puede hacer todo el trabajo del programador, pero sí facilitarla proporcionandonos una serie de herramientas y plantillas que precisamente se encuentran en la carpeta debian.

De hecho, si utilizamos alguna de las herramientas de comprobación de paquetes como por ejemplo lintian:

$ lintian ../echod_0.1-1_i386.debW: echod: binary-without-manpage echod
E: echod: helper-templates-in-copyright
E: echod: description-is-dh_make-template
W: echod: wrong-bug-number-in-closes l3:#nnnn
E: echod: section-is-dh_make-template

Vemos que el paquete tiene errores y que todavia no cumple completamente con las políticas de Debian.

Hay que decir también que con tal de poder utilizar dpkg-buildpackage el Makefile del código fuente original ha de tener como mínimo las normas clean y install. Vemos los ficheros debian/rules y Makefile para conocer mejor la relación entre los dos. Ejecutamos los comandos:

$ gedit debian/rules &
$ gedit Makefile &

Fichero debian/rules:

clean:
 	dh_testdir
 	dh_testroot
	rm -f build-stamp configure-stamp

	# Add here commands to clean up after the build process.
	-$(MAKE) clean 

	dh_clean 

................

install: build
	dh_testdir
	dh_testroot
	dh_clean -k 
	dh_installdirs

	# Add here commands to install the package into debian/echod.
	$(MAKE) DESTDIR=$(CURDIR)/debian/echod install

Fichero makefile:

OWNER=root
GROUP=root
PROGRAM=echod
INSTALL=/usr/bin/install
BINDIR=$(DESTDIR)/usr/sbin
INITDDIR=$(DESTDIR)7/etc/init.d
ETCDIR=$(DESTDIR)/etc/$(PROGRAM)
 
 all:	echod 

echod: echod.c
	gcc -o echod echod.c

clean:
	rm -f echod

install: all install_portfile install_initd
	$(INSTALL) -c -o $(OWNER) -g $(GROUP) -m 755 $(PROGRAM) $(BINDIR)

install_initd: all
	mkdir -p $(INITDDIR)
	$(INSTALL) -c -o $(OWNER) -g $(GROUP) -m 755 etc/init.d/$(PROGRAM) $(INITDDIR)

install_portfile: all
	mkdir -p $(ETCDIR)
	$(INSTALL) -c -o $(OWNER) -g $(GROUP) -m 644 etc/$(PROGRAM)/port $(ETCDIR)

uninstall:
	rm -f $(INITDDIR)/echod
	rm -f $(BINDIR)/echod

Fijaros que el truco de utilizar la variable $(DESTDIR) nos permite instalar la aplicación allí donde queramos. El fichero debian/rules no es más que un script Makefile (por eso en la primera línea #!/usr/bin/make -f).

El comando dpkg-buildpackage ejecuta las normas de Debian necesarias para poder crear el paquete. Algunas de estar normas contienen llamadas a normas del fichero Makefile original, como puede ser el caso de las normas install y clean:

$(MAKE) clean  

$(MAKE) DESTDIR=$(CURDIR)/debian/echod install

Fijaros que todos los ficheros que formarán part del paquete se instalan antes temporalmente en la carpeta debian/nombre_paquete (en nuestro caso: debian/echod). Todo empieza a relacionarse!

Podeis encontrar más información sobre el fichero debian/rules de la Debian Policy.

El resto del fichero debian/rules son llamadas a guiones de shell de debhelper. Durante lo siguientes apartados veremos algunos ejemplos de uso de estos guiones:

Ahora vamos a modificar las plantillas que nos proporciona dh_make para configurar nuestro paquet y acabar de crear un Paquete Debian "perfecto".

Seguiremos los siguientes pasos:

  • Modificar el fichero debian/control para introducir la sección del paquete y la descripción (si el paquete tuviese alguna dependencia también la habríamos de especificar en este fichero)

Fichero original:

Source: echod
Section: unknown
Priority: extra
Maintainer: Sergi Tur Badenas <sergi.tur@upc.edu>
Build-Depends: debhelper (>= 5)
Standards-Version: 3.7.2 

Package: echod
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: <insert up to 60 chars description>
<insert long description, indented with spaces>

Fichero modificado:

Source: echod
Section: web
Priority: extra
Maintainer: Sergi Tur Badenas <sergi.tur@upc.edu>
Build-Depends: debhelper (>= 5)
Standards-Version: 3.7.2

Package: echod
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: Servidor d'ecos del curs de programació en Linux
Aquest servidor és un dimoni que esta a l'espera de rebre missatges d'un client
Els missatges rebuts pel client són retornats sense cap canvi al client
  • Podemos/habríamos de modificar el fichero de registro de cambios (debian/changelog) con el comando debchange. Si ejecutamos:
$ debchange Esta es la versión inicial de nuestro paquete

y después ejecutamos:

$ debchange

Vemos como se ha modificado el fichero de cambios:

echod (0.1-1) unstable; urgency=low

*Initial release (Closes: #nnnn)  <nnnn is the bug number of your ITP>
*Esta es la versión inicial de nuestro paquete

-- Sergi Tur Badenas <sergi@localhost.localdomain>  Sun, 10 Jun 2007 11:27:06 +0200

Veremos como hemos añadido un comentario al registro de cambios. Consultar la sección debchange para obtener más detalles sobre debchange.

El siguiente paso es modificar el fichero debian/copyright para especificar nuestra licencia. El comando dh_make nos ha creado la siguiente plantilla:

This package was debianized by Sergi Tur Badenas <sergi.tur@upc.edu> on
Tue,  5 Jun 2007 13:01:02 +0200.

It was downloaded from <fill in http/ftp site>  

Upstream Author: <put author(s) name and email here>

Copyright: <put the year(s) of the copyright, and the names of the
            copyright holder(s) here>

License: 

<Put the license of the package here>
 
The Debian packaging is (C) 2007, Sergi Tur Badenas <sergi.tur@upc.edu> and
is licensed under the GPL, see `/usr/share/common-licenses/GPL'.
 
# Please also look if there are files or directories which have a
# different copyright/license attached and list them here.

Podeis encontrar ficheros de ejemplo de licencias en vuestra propia máquina ejecutando el comando:

$ sudo updatedb
$ locate copyright

Por ejemplo la licencia de emacs la encontrareis en:

$ cat $(dpkg -L emacs | grep copyright)

o apache2:

$ cat $(dpkg -L apache2 | grep copyright)

Podeis copiar la licencia libre que os parezca más adecuada a vuestro fichero de copyright.

  • El siguiente paso es modificar el fichero debian/dirs para que solamente incluya las carpetas que realmente utilizaremos (al tratarse de un demonio solamente necesitamos la carpetas /usr/sbin)
$ gedit debian/dirs
usr/sbin
  • El siguiente paso es preparar los ficheros debian/README.Debian y debian/TODO.Debian:
$ cat debian/README.Debian 
echod for Debian
---------------------

<possible notes regarding this package - if none, delete this file>

-- Sergi Tur Badenas <sergi.tur@upc.edu>  Tue,  5 Jun 2007 13:01:02 +0200

En el fichero README podemos poner las notas que creamos convenientes sobre la aplicación. Otro fichero típico es el fichero TODO (things to do), donde como dice su propio nombre, se muestran las tareas que hay pendientes de hacer. Podemos crear un fichero llamado debian/TODO.Debian.

Estos dos ficheros acabarán en la carpeta de documentación, que siguiendo el estándar FHS debe ser la carpeta /usr/share/doc/nompaquet.

  • Hay que recordar que nuestro código fuente es el código fuente de un demonio y que como tal tiene su correspondiente script de inicialización System V /etc/init.d/echod. El fichero ya se instala en la carpeta adecuada durante la llamada a la norma install, pero además deb_helper nos proporciona el comando dh_installinit. Solo hemos de descomentar la línea adecuada en el fichero debian/rules:
.........
#	dh_installemacsen
#	dh_installpam
#	dh_installmime
#	dh_python
 	dh_installinit
#	dh_installcron
#	dh_installinfo 

En este punto es donde hemos de introducir nuestro primer hack del fichero debian/rules'. El comando dh_install no hará nada si ya encuentra el fichero /etc/init.d/echod instalado en el sistema. Como que el instalador del código fuente original del programa (norma install del Makefile) ya instala el fichero dh_installinit no hará nada. Podemos solucionar este problema añadiendo la línea:

$ mv $(CURDIR)/debian/echod/etc/init.d/echod $(CURDIR)/debian/echod.init

En la norma install del fichero debian/rules queda de la siguiente forma:

install: build
	dh_testdir
	dh_testroot
	dh_clean -k 
	dh_installdirs

	# Add here commands to install the package into debian/echod.
	$(MAKE) DESTDIR=$(CURDIR)/debian/echod install
  	mv $(CURDIR)/debian/echod/etc/init.d/echod $(CURDIR)/debian/echod.init

Es un buen punto para hacer notar como todo el fichero debian/rules está lleno de llamadas a los comandos del paquete deb-helper (comandos dh_*). Cada uno de estos comandos tiene su correspondiente manual donde podemos obtener información detallada de lo que hacen.

El comando dh_installinit creará los ficheros:

  • echod.postinst.debhelper
  • echod.postrm.debhelper
  • echod.prerm.debhelper

Estos ficheros son los que conjuntamente con los ficheros (en el caso que existan):

  • debian/postinst
  • debian/postrm
  • debian/prerm

Conformarán los Scripts de mantenimiento finales postinst, postrm y prerm que encontraremos en el fichero control.tar.gz del paquete debian final.

Si vemos el código de uno de ellos echod.postinst.debhelper:

# Automatically added by dh_installinit
if [ -x "/etc/init.d/echod" ]; then
	 update-rc.d echod defaults >/dev/null
	 if [ -x "`which invoke-rc.d 2>/dev/null`" ]; then
		 invoke-rc.d echod start || exit $?
	else
		/etc/init.d/echod start || exit $?
	fi
fi

# End automatically added section

Veremos que el script postinst se encargará de configurar nuestro sistema para iniciar el demonio automáticamente al iniciar el sistema. Simplemente Genial! El resto de scripts hacen tareas similares (como por ejemplo sacar del inicio el demonio si lo desinstalamos).

NOTA: Hay que recalcar que los scripts echod.*.debhelper no reescriben nuestros ficheros postinst, postrm, etc sino que deb_helper se encarga de añadir este código (operación merge) a nuestro fichero.

  • Ahora es el turno de crear los manuales del programa. dh_make nos crea diferentes plantillas por si todavia no tenemos nuestros propios manuales.

Las plantillas son:

  • manpage.1.ex
  • manpage.sgml.ex
  • manpage.xml.ex

Son los tres formatos soportados por los ficheros man. Como podeis ver las plantillas siempre acaban con la extensión .ex.

El guión de shell de debhelper que instala los manuales es dh_installman y está activado por defecto en el fichero debian/rules. Los únicos pasos que hemos de seguir son editar alguna de las plantillas, poner un nombre adecuado al fichero (típicamente 'nomcomando.seccion) y crear un fichero debian/manpages con la lista de ficheros manual. Los pasos a seguir:

Copiamos la plantilla:

$ cp debian/manpage.1.ex debian/echod.1

Y editamos el manual para añadir la documentación a nuestro gusto:

$ gedit debian/echod.1 &

Y editamos el manual. Una vez editado ejecutamos:

$ gedit debian/manpages &

Añadir la línea:

debian/echod.1

Si no tocamos la plantilla el resultado final será:

$ man echod

ECHOD(SECTION)                                                                                                                               
ECHOD(SECTION)

NAME
       echod - program to do something

SYNOPSIS
       echod [options] files...
       bar [options] files... 

DESCRIPTION
       This manual page documents briefly the echod and bar commands.

       echod is a program that...

OPTIONS
       These  programs  follow  the  usual  GNU  command line syntax, with long options starting with two dashes (‘-’).  A summary of options is  
included below.  For a complete description, see the Info files. 

       -h, --help
              Show summary of options.

       -v, --version
              Show version of program.

SEE ALSO
       bar(1), baz(1).
       The programs are documented fully by The Rise and Fall of a Fooish Bar, available via the Info system.

AUTHOR
       echod was written by <upstream author>.

       This manual page was written by Sergi Tur Badenas <sergi.tur@upc.edu>, for the Debian project (but may be used by others).

                                                                      juny  8, 2007                                                         
ECHOD(SECTION)
  • Finalmente y para ilustrar el uso de Debconf vamos a crear los ficheros necesarios para pedir al usuario que instala nuestro dominio, qué puerto quiere utilizar y guardaremos este puerto en el fichero /etc/echod/port.

Lo primero que tenemos que hacer es crear el fichero debian/templates. Este fichero contiene las plantillas de interfaz con el usuario.

$ gedit debian/templates &

Un plantilla sencilla puede ser la siguiente:

Template: echod/port
Type: string
Default: 8001
Description: Port Number:
  Please enter the port number for echod.
Description-es.UTF-8: 
  por favor introducir el puerto del servidor echod
Description-ca.UTF-8: 
 Por favor introducir el puerto del servidor echod

Esta plantilla se encarga de preguntar a los usuarios el número de puerto. Si estais interesados en hacer plantillas más complejas habría que consultar el apartado Templates de la especificación de Debconf y consultar el manual debconf-devel.

El segundo paso es crear el fichero debian/config:

$ gedit debian/config

# Source debconf library.
. /usr/share/debconf/confmodule 

db_version 2.0
#Establecemos que durante la configuración se pueda ir atrás con el botón cancelar
db_capb backup

#Establecemos nuestros templates a no vistos para que debconf siempre los muestre
db_fset echod/port seen false
db_fset echod/notconfigured seen false

STATE=1
while [ "$STATE"  != 0 -a "$STATE" != 2 ]
  do
  case "$STATE" in
      1)
        # Preparamos el template echod/port
	db_input critical echod/port || true
        #lo mostramos
 	if db_go; then
		#Controlamos si el valor del puerto está vacio
		db_get echod/port || true
		      if [ ! -z "$RET" ]; then
			  STATE=2
		      fi
		  else
		      STATE=0
		  fi
		  ;;
  esac
done 

#Si el puerto está vacio mostramos un mensaje de error: template echod/notconfigured
if [ "$STATE" = 0 ]; then
    db_input critical echod/notconfigured || true
    db_go
    exit 1
fi 

El fichero config solo se encarga del flujo de la interfaz con el usuario. Para este menester, utilizamos las funciones de shell proporcionadas por el fichero /usr/share/debconf/confmodule para comunicarnso con debconf a través de los comandos del protocolo debconf. Si os fijais, el script solo se encarga de llamar a la plantilla echod/port:

DebconfDialog2.png

y en caso de que cancelemos muestra un mensaje de aviso echod/notconfigured:

DebconfDialog3.png

El manual de confmodule (man confmodule) nos da información sobre la libreria de debconf para Shell (/usr/share/debconf/confmodule).

Ahora viene la parte más complicada: la lógica de la configuración. En nuestro caso modificaremos el script de mantenimiento postint. dh-make nos ha creado una plantilla para este fichero (debian/postinst.ex) y la aprovecharemos:

$ cp debian/postinst.ex debian/postinst
$ gedit debian/postinst & 

Una vez hemos copiado la plantilla le añadiremos la función get_config() justo antes del case:

get_config() {
    db_get echod/port
    port="$RET"
} 

handle_config() {

    cfile=/etc/echod/port
    tempcfile=`tempfile`
    cat > $tempcfile <<EOF
${port}
EOF
    ucf $tempcfile $cfile
    chmod 644 $cfile
}

Y llenaremos el case configure con el siguiente código:

. /usr/share/debconf/confmodule
	db_version 2.0  

	# Read debconf 
	get_config
	db_stop
	exec 0<&1
	handle_config 

El fichero ha de quedar igual que este.

Resumiendo, el codigo lee el puerto que hemos introducido, y lo guarda al fichero /etc/echod/port.

El último paso que nos queda es descomentar la línea dh_installdebconf del fichero debian/rules:

# Build architecture-dependent files here.
binary-arch: build install
        .....
	dh_installdocs
	dh_installexamples
#	dh_install
#	dh_installmenu
	dh_installdebconf
#	dh_installlogrotate
#	dh_installemacsen

Ahora ya está todo preparado y podemos crear nuestro paquete Debian:

$ fakeroot
# dpkg-buildpackage
# exit

No olvideis el exit si no quereis pensar que estais haciendo cosas como root pero en realidad no (fake root ;-))

Para instalarlo ejecuamos:

$ sudo dpkg -i ../echod_0.1-1_i386.deb

Si queremos reconfigurar:

$ sudo dpkg-reconfigure echod

Si hacemos algún cambio y queremos volver a crear el primer paquete lo tendríamos que desinstalar con:

$ sudo apt-get remove --yes --purge echod


Crear una nueva versión del paquete

Es tan sencillo cómo hacer los cambios que queramos y cambiar de versión con:

$ dch -i 

Y notificamos los cambios:

echod (0.1-1ubuntu1) feisty; urgency=low
  • Segona Versió:
-- Sergi Tur Badenas <sergi@localhost.localdomain>  Wed, 13 Jun 2007 12:13:34 +0200

echod (0.1-1) unstable; urgency=low

*Initial release (Closes: #nnnn)  <nnnn is the bug number of your ITP>
*Primera Versio

-- Sergi Tur Badenas <sergi@localhost.localdomain>  Fri,  8 Jun 2007 17:11:24 +0200

Y ahora ya podemos crear el nuevo paquete con:

$ fakeroot
# dpkg-buildpackage
# exit

Como que la prueba la he hecho en un Ubuntu, ahora el nuevo paquete se llama echod_0.1-1ubuntu1_i386.deb:

$ ls -la ..
.......
-rw-r--r-- 1 sergi sergi 10883 2007-06-13 12:14 echod_0.1-1ubuntu1.diff.gz
-rw-r--r-- 1 sergi sergi   324 2007-06-13 12:14 echod_0.1-1ubuntu1.dsc
-rw-r--r-- 1 sergi sergi   673 2007-06-13 12:15 echod_0.1-1ubuntu1_i386.changes
-rw-r--r-- 1 sergi sergi  9566 2007-06-13 12:15 echod_0.1-1ubuntu1_i386.deb 

Ver tambien

Recursos