Provided by: debconf-doc_1.5.91_all bug

NOMBRE

       debconf - Guía del desarrollador

DESCRIPCIÓN

       Esta es una guía para el desarrollo de paquetes que usan debconf.

       Este  manual asume que está familiarizado con debconf como usuario, y que conoce los conceptos básicos de
       la construcción de paquetes debian.

       Este manual comienza explicando dos nuevos ficheros que se añaden a paquetes debian que usan  debconf.  A
       continuación,  explica cómo funciona el protocolo de debconf, y señala las bibliotecas que permitirán que
       sus programas hablen tal protocolo. Se discuten otros scripts de  desarrollador  que  habitualmente  usan
       debconf:  los  scripts  postinst  (postinstalación)  y  postrm  (posteliminación). Continua con temas más
       avanzados como el sistema de plantillas compartidas de debconf, depuración de fallos, y algunas  técnicas
       comunes  y  problemas  a  la  hora de programar con debconf. Finaliza con un análisis de las deficiencias
       actuales de debconf.

EL SCRIPT CONFIG

       Debconf añade un script de desarrollador adicional,  el  script  «config»,  al  conjunto  de  scripts  de
       desarrollador  que  pueden  existir  en  paquetes debian («postinst», «preinst», «postrm», y «prerm»). El
       script «config» es el responsable de plantear cualquier pregunta  necesaria  para  la  configuración  del
       paquete.

       Nota:  Es un poco confuso que dpkg se refiere a ejecutar el script «postinst» como la «configuración» del
       paquete, ya que, habitualmente, un paquete que usa debconf está  totalmente  preconfigurado  mediante  el
       script «config» antes de que se ejecute el script de postinstalación. Pero bueno.

       Al igual que el script «postinst», el script «config» acepta dos parámetros cuando se ejecuta. El primero
       dice  la acción que se está realizando, y el segundo la versión del paquete actualmente instalado. Por lo
       tanto, al igual que con un script «postinst», puede usar «dpkg --compare-versions» con  «$2»  para  hacer
       que  un  comportamiento  sólo  aparezca durante la actualización a partir de una versión en particular, y
       otros comportamientos parecidos.

       El script «config» se puede ejecutar de tres formas distintas:

       1      Si el paquete está preconfigurado con «dpkg-preconfigure», se ejecuta el script «config» y  se  le
              introducen los parámetros «configure» y la versión instalada («installed-version»).

       2      Cuando  se ejecuta el script «postinst» de un paquete debconf intentará ejecutar también el script
              «config»,  al  que  se  le  introducirán  los  mismos  parámetros  que  se  introducen  cuando  se
              preconfigura.  Es  necesario  ya  que puede que el paquete aún no se haya preconfigurado, y que el
              script «config» todavía necesite una oportunidad  para  ejecutarse.  Para  más  detalles  consulte
              «ARREGLOS».

       3      Si  el  paquete  se  reconfigura  con  «dpkg-reconfigure»,  se ejecuta el script «config», y se le
              introducen los parámetros «reconfigure» y la versión instalada («installed-version»).

       Tenga en cuenta que ya que una instalación o actualización típica de paquetes mediante  apt  ejecuta  los
       pasos  1  y  2,  el  script  «config»  se ejecutará dos veces. No debería hacer nada (plantear las mismas
       preguntas dos veces seguidas es molesto), y  debería  ser  idempotente.  Afortunadamente,  debconf  evita
       repetir preguntas por omisión, así que esto es generalmente fácil de realizar.

       Observe  que  el  script «config» se ejecuta antes de desempaquetar el paquete. Sólo debería usar órdenes
       que están en los paquetes esenciales («essential»). La única dependencia que su paquete tendrá  de  forma
       obligatoria al ejecutar el script «config» es el mismo debconf (posiblemente versionada).

       El  script  «config» no debería necesitar modificar el sistema de ficheros de ninguna forma. Simplemente,
       examina el estado del sistema y plantea preguntas, y debconf guarda las respuestas para usarlas después a
       través del script «postinst». Por el contrario, el script «postinst»  nunca  debería  usar  debconf  para
       plantear  preguntas,  sino  que debería actuar en base a las respuestas a las preguntas planteadas por el
       script «config».

EL FICHERO DE PLANTILLAS

       Probablemente, un paquete que usa debconf desea plantear algunas preguntas. Estas preguntas  se  guardan,
       en de plantilla, en el fichero de plantillas.

       Al  igual  que el script «config», el fichero de plantillas se ubica en la sección «control.tar.gz» de un
       paquete «.deb». Su formato es similar al fichero de  control  de  debian,  un  conjunto  de  definiciones
       separadas por líneas en blanco. Cada definición tiene una forma similar al formato RFC822:

         Template: foo/bar
         Type: string
         Default: foo
         Description: Este es un ejemplo de pregunta de tipo cadena.
          Esta es su descripción extendida.
          .
          Tenga en cuenta:
           - Al igual que en la descripción de un paquete debian,
             un punto en una línea vacía inicia un nuevo párrafo.
           - La mayoría del texto se justifica, pero el texto con
             doble sangrado no se modifica, así que puede usarlo
             para listas de elementos como esta lista. Tenga
             cuidado ya que no se justifica, y tendrá un pobre
             aspecto si es demasiado ancho. Es mejor usarlo con
             elementos cortos (y por ello éste es un mal ejemplo).

         Template: foo/baz
         Type: boolean
         Description: Es obvio, ¿no?
          Esta es otra pregunta, de tipo booleano.

       Si     desea     ver    ejemplos    de    uso    reales    de    ficheros    de    plantillas    consulte
       «/var/lib/dpkg/info/debconf.templates» y otros ficheros «.templates» en ese directorio.

       Ahora vamos a explicar cada uno de los campos.

       Template
              El nombre de la plantilla, en el campo «Template», tiene habitualmente como prefijo el nombre  del
              paquete. A continuación de esto, el espacio de nombres está abierto; puede usar un sencillo diseño
              plano  como  el  que  aparece  antes,  o  definir  «subdirectorios»,  que  contienen las preguntas
              relacionadas.

       Type   El tipo de plantilla determina el tipo de elemento que se muestra al usuario. Los tipos  aceptados
              actualmente son:

              string Resulta  en  un  campo  de  entrada con formato libre en el que el usuario puede introducir
                     cualquier cadena.

              password
                     Solicita una contraseña al usuario. Úselo con precaución; tenga en cuenta que la contraseña
                     que el usuario introduzca se escribirá en la  base  de  datos  de  debconf.  Probablemente,
                     debería eliminar ese valor de la base de datos tan pronto como sea posible.

              boolean
                     Una elección «true/false» (verdadero/falso).

              select Una  elección  de  un  valor  entre  un número de valores. Las posibles elecciones se deben
                     definir en un campo llamado «Choices». Separe los valores posibles con  comas  y  espacios,
                     como se ve a continuación.
                       Choices: yes, no, maybe

              multiselect
                     Similar  al  tipo datos «select», a excepción de que el usuario puede seleccionar cualquier
                     número de elementos de la lista de elecciones (o no seleccionar ninguno).

              note   Más que una pregunta, este tipo de dato indica una nota que se puede  mostrar  al  usuario.
                     Sólo  se  debería  usar para notas importantes que el usuario realmente debería ver, ya que
                     debconf sufrirá complicaciones para asegurarse de que el usuario  lo  ve;  interrumpirá  la
                     instalación  para que puedan pulsar una tecla. Es mejor usar este aviso sólo para problemas
                     serios, y a menudo es más adecuado usar el tipo de dato «error» .

              error  Este tipo de dato se usa para mensajes de error, tales como los errores  de  validación  de
                     entradas.  Debconf  mostrará una pregunta de este tipo incluso si la prioridad es demasiado
                     alta o si el usuario ya la ha visto.

              title  Este tipo de datos se usa para títulos, que se definirán con la orden «SETTITLE».

              text   Este tipo de datos se puede usar para fragmentos de texto  tales  como  etiquetas,  que  se
                     pueden  usar  por razones estéticas en las ventanas de algunas interfaces. Otras interfaces
                     no harán uso de él. Aún no existe ninguna razón para usar este tipo de dato ya que  ninguna
                     interfaz lo permite de forma adecuada. Incluso puede que se elimine en el futuro.

       Default
              El  campo «Default» dice a debconf cuál debería ser el valor predefinido. Con «multiselect», puede
              ser una lista de elecciones separadas por comas y espacios, de forma similar al  campo  «Choices».
              Con  «select»,  debería  ser  una de las elecciones. Con «boolean», es «true» o «false». Puede ser
              cualquier cosa con «string», y se ignora con «passwords».

              No cometa el error de pensar que el campo «Default» contiene el valor de la  pregunta,  o  que  se
              puede  usar  para  cambiar el valor de la pregunta. No puede hacer esto, y no debería. Simplemente
              ofrece el valor predefinido para la primera vez que se muestra la pregunta. Para  proporcionar  un
              valor  predefinido  que  se  pueda  modificar  en  el momento, tendrá que usar la orden «SET» para
              cambiar el valor de una pregunta.

       Description
              El campo «Description» tiene dos partes, al igual que la descripción de un paquete de Debian:  una
              descripción  corta  y una descripción extendida. Tenga en cuenta que algunas interfaces de debconf
              no muestran la descripción extendida, o puede que sólo la muestren si el usuario  solicita  ayuda.
              Por ello, la descripción corta debería ser suficientemente completa.

              Si  no  puede  inventarse  una  descripción  larga, primero, piense un poco más. Mande un correo a
              debian-devel. Pida ayuda. ¡Tome clases de  composición  de  texto!  La  descripción  extendida  es
              importante.  Si  después de todo esto aún no se le ha ocurrido nada, deje el espacio en blanco. No
              tiene sentido duplicar la descripción corta.

              El texto de la descripción extendida se justificará, a menos que esté  precedido  por  un  espacio
              blanco adicional (además del espacio requerido). Puede dividirlo en varios párrafos insertando «.»
              en una línea vacía entre los párrafos.

PREGUNTAS

       Una  pregunta  es  una  instancia  de  plantilla.  Al pedir a debconf que muestre una pregunta, su script
       «config» puede interactuar con el usuario. Cuando debconf carga un fichero  de  plantillas  (esto  ocurre
       cada  vez  que  se  ejecuta un script «config» o «postinst») automáticamente crea una instancia para cada
       pregunta de cada plantilla. Es posible crear instancias de varias preguntas independientes a partir de la
       misma plantilla (usando la orden «REGISTER»), pero rara  vez  es  necesario.  Las  plantillas  son  datos
       estáticos que proceden del fichero de plantillas, mientras que las preguntas se usan para almacenar datos
       dinámicos,  tales  como  el  valor  actual  de  la pregunta, si el usuario ha visto la pregunta, y así en
       adelante. Tenga en cuenta la diferencia entre una plantilla y una pregunta, pero no se preocupe demasiado
       por ello.

PLANTILLAS COMPARTIDAS

       Es posible tener una plantilla y una pregunta compartidas por un conjunto de paquetes. Todos los paquetes
       deben proporcionar una copia idéntica de la plantilla en sus ficheros de plantillas. Puede ser útil si un
       conjunto de paquetes necesitan plantear la misma pregunta, y sólo desea consultar  al  usuario  una  sola
       vez.  Habitualmente,  las plantillas compartidas se ubican en el seudo directorio «shared/» en el espacio
       de nombres («namespace») de la plantilla de debconf.

EL PROTOCOLO DE DEBCONF

       Los scripts «config» se comunican con debconf usando  el  protocolo  de  debconf.  Éste  es  un  sencillo
       protocolo  orientado  a la línea de órdenes, similar a protocolos comunes de Internet tales como SMTP. El
       script «config» envía una orden a debconf enviando la orden por la salida estándar. A continuación, puede
       leer la respuesta de debconf por la entrada estándar.

       La respuesta de debconf se puede dividir en dos partes. Un código de salida numérico (la primera  palabra
       de  la  respuesta),  y  opcionalmente un código de salida extendido (el resto de la respuesta). El código
       numérico usa cero para indicar éxito, y otros números para  indicar  varios  tipos  de  fallo.  Para  más
       detalles,  consulte  la  tabla  en  el  documento  de especificaciones de debconf en las normas de Debian
       (debian-policy).

       El código de salida  extendido  tiene,  habitualmente,  una  forma  libre  y  sin  especificar,  así  que
       generalmente  debería  ignorarlo,  y  definitivamente no debería intentar analizarlo con un programa para
       averiguar lo que debconf está haciendo. La excepción son órdenes como «GET», que hacen que  un  valor  se
       devuelva en el código de salida extendido.

       Habitualmente,  querrá  usar  una  biblioteca de lenguaje específico que gestiona los particularidades de
       creación de estas conexiones con debconf y la comunicación con éste.

       Por ahora, aquí tiene las órdenes en el protocolo. Esta no es la definición completa; para ello, consulte
       el documento de especificaciones de debconf en las normas de Debian (debian-policy).

       VERSION número
              Generalmente no tendrá que usar esta orden. Intercambia con  debconf  el  número  de  versión  del
              protocolo  que se está usando. La versión del protocolo actual es 2.0, y las versiones de la serie
              2.x tendrán compatibilidad hacia atrás. Puede definir el número de versión del protocolo que  está
              usando  y  debconf  devolverá  la  versión  del  protocolo  que está usando en el código de salida
              extendido. Si la versión que define es demasiado baja, debconf responderá con el  código  numérico
              30.

       CAPB funcionalidades
              You  generally  don't  need  to  use  this  command. It exchanges with debconf a list of supported
              capabilities (separated by spaces). Capabilities that both you and debconf support will  be  used,
              and debconf will reply with all the capabilities it supports.

              Si  «escape»  está  entre  sus  funcionalidades, debconf esperará que las órdenes que envíe tengan
              escapes de barras inversas y nuevas líneas (como «\\» y «\n» respectivamente),  y  responderá  con
              barras inversas y nuevas líneas escapadas. Esto se puede usar, por ejemplo, para sustituir cadenas
              de  varias  líneas  en  plantillas,  o  para  obtener  descripciones  extendidas  de varias líneas
              adecuadamente usando METAGET. Si usa este modo, tendrá que escapar el texto de  entrada  (o  puede
              usar  debconf-escape(1)  para  que  le asista en esta labor si así lo desea), pero las bibliotecas
              confmodule devolverán respuestas sin escapes.

       SETTITLE pregunta
              Esto define el título que debconf muestra al usuario, usando la descripción corta de la  plantilla
              para  la  pregunta  especificada. La plantilla debería de ser de tipo «title». Rara vez necesitará
              usar esta orden ya que debconf puede generar automáticamente un título a  partir  del  nombre  del
              paquete.

              Configurar  el  título a partir de la plantilla significa que se guardan en la misma ubicación que
              el resto de las preguntas de debconf, permitiendo su traducción.

       TITLE cadena
              Esto define el título que debconf muestra al usuario con la cadena especificada. Habitualmente, se
              prefiere el uso de la orden «SETTITLE» ya que permite la traducción del título.

       INPUT prioridad pregunta
              Hace que debconf se prepare para mostrar una pregunta  al  usuario.  La  pregunta  no  se  muestra
              realmente  hasta  que  no se emita una orden «GO»; esto permite introducir en serie varias órdenes
              «INPUT» para construir una serie de preguntas que se podrían plantear en una sola pantalla.

              El campo de prioridad indica a debconf la importancia de la  pregunta  mostrada  al  usuario.  Los
              valores de prioridad son:

              low    Elementos  muy  triviales  que  tienen  valores  predefinidos que funcionarán en la inmensa
                     mayoría de los casos. Sólo los obsesos del control deberían verlos.

              medium Elementos normales con valores predefinidos razonables.

              high   Elementos que no tienen un valor predefinido razonable.

              critical
                     Elementos que posiblemente rompan el sistema sin la intervención del usuario.

              Debconf decide si se muestra la pregunta en base a la prioridad, si el usuario la ha visto  ya,  y
              la  interfaz que se está usando. Si la pregunta no se va a mostrar, debconf responde con el código
              numérico 30.

       GO
              Indica a debconf que muestre al usuario el conjunto acumulado de preguntas (de órdenes «INPUT»).

              Si se admite la funcionalidad de copia de seguridad y el  usuario  indica  que  desea  retroceder,
              debconf responde con el código numérico 30.

       CLEAR  Elimina el conjunto acumulado de preguntas (de órdenes «INPUT») sin mostrarlas.

       BEGINBLOCK

       ENDBLOCK
              Algunas interfaces de debconf pueden mostrar varias preguntas a la vez al usuario. Puede que en el
              futuro,  una  interfaz  sea  también  capaz  de  agrupar en bloque estas preguntas en la pantalla.
              «BEGINBLOCK» y «ENDBLOCK» se pueden ubicar en torno a un conjunto de órdenes «INPUT» para  indicar
              bloques  de preguntas (y los bloques se pueden anidar también). Ya que ninguna interfaz de debconf
              es aún tan sofisticada, estas órdenes se ignorarán por ahora.

       STOP   Esta orden indica a debconf que ya ha terminado de comunicarse con él. Habitualmente debconf puede
              detectar la finalización de su programa, con lo cual esta orden no sería necesaria.

       GET pregunta
              Después de usar «INPUT» y «GO» para mostrar una pregunta, puede usar esta orden  para  obtener  el
              valor que introdujo el usuario. El valor se devuelve en el código de salida extendido.

       SET pregunta valor
              Define  el  valor  de  la  pregunta,  y  se puede usar para reemplazar el valor predefinido con un
              cálculo que su programa haga durante el proceso.

       RESET pregunta
              Restablece la pregunta a su valor predefinido (tal y como está definido en el campo  «Default»  de
              su plantilla).

       SUBST pregunta clave valor
              Las  preguntas  pueden  integrar  sustituciones en sus campos «Description» y «Choices» (el uso de
              sustituciones en campos «Choices» no está demasiado bien hecho; con el tiempo se  desarrollará  un
              mecanismo mejor). Estas sustituciones tiene la apariencia «${key}». Cuando se muestra la pregunta,
              las sustituciones se reemplazan con sus valores. Esta orden se puede usar para definir el valor de
              una  sustitución.  Es  útil  si  necesita mostrar algunos mensajes al usuario, las cuales no desea
              integrar en el código («hardcode») en el fichero de plantillas.

              No intente usar «SUBST» para cambiar el valor predefinido de una pregunta; no  funcionará  ya  que
              existe una orden «SET» para ese propósito.

       FGET pregunta marca
              Las  preguntas  pueden  tener marcas asociadas a ellas. Las marcas pueden tener un valor de «true»
              (verdadero) o «false» (falso).

       FSET pregunta marca valor
              Esto define el valor de la marca de una pregunta. El valor debe ser «true» o «false».

              Una marca común es la marca «seen». Habitualmente, sólo se define si el  usuario  ya  ha  viso  la
              pregunta.  Generalmente,  debconf  sólo  muestra  preguntas a los usuarios si la marca «seen» está
              definida con «false» (o si está reconfigurando el paquete). A veces desea que el  usuario  vea  la
              pregunta otra vez; en estos casos puede definir la marca «seen» con el valor «false» para forzar a
              debconf a que la muestre otra vez.

       METAGET pregunta campo
              Devuelve  el  valor de cualquier campo de una plantilla asociada a la pregunta («Description», por
              ejemplo).

       REGISTER plantilla pregunta
              Crea una nueva pregunta ligada a una plantilla. Por omisión, cada  plantilla  tiene  una  pregunta
              asociada  con  el mismo nombre. Sin embargo, se pueden asociar cualquier número de preguntas a una
              plantilla, permitiendo la creación de más preguntas.

       UNREGISTER pregunta
              Elimina una pregunta de la base de datos.

       PURGE  Invoque esto en el script «postrm» al purgar el paquete. Elimina todas las preguntas de su paquete
              de la base de datos de debconf.

       X_LOADTEMPLATEFILE /ruta/a/plantillas [propietario]
              Esta extensión carga el fichero de plantilla especificado, en la base  de  datos  de  debconf.  El
              propietario recibe el valor predefinido del paquete que se está configurando con debconf.

       Aquí tiene un sencillo ejemplo del protocolo de debconf en acción.

         INPUT medium debconf/frontend
         30 question skipped
         FSET debconf/frontend seen false
         0 false
         INPUT high debconf/frontend
         0 question will be asked
         GO
         [ Aquí, debconf muestra al usuario una pregunta. ]
         0 ok
         GET no/such/question
         10 no/such/question doesn't exist
         GET debconf/frontend
         0 Dialog

BIBLIOTECAS

       Configurar  manualmente  lo  necesario  para poder hablar con debconf mediante el protocolo de debconf es
       quizá demasiado trabajo, y por ello existen algunas pequeñas bibliotecas para aliviar este arduo trabajo.

       Para la programación en consola existe  la  biblioteca  «/usr/share/debconf/confmodule»,  el  cual  puede
       cargar  al principio del script de consola, y comunicarse con debconf con una relativa naturalidad usando
       las versiones en minúscula de las órdenes del protocolo de debconf, las cuales están prefijadas con «db_»
       (por ejemplo, «db_input» y «db_go»). Para más detalles, consulte confmodule(3).

       Los programadores que usan Perl pueden usar el módulo de  Perl  Debconf::Client::ConfModule(3pm),  y  los
       programadores que usan Python pueden usar el módulo de Python de debconf.

       El  resto de este manual usará la biblioteca «/usr/share/debconf/confmodule» en los scripts de consola de
       ejemplo. Aquí tiene un script «config» de ejemplo  que  usa  esa  biblioteca,  y  que  sólo  plantea  una
       pregunta:

         #!/bin/sh
         set -e
         . /usr/share/debconf/confmodule
         db_set mi-paquete/reboot-now false
         db_input high mi-paquete/reboot-now || true
         db_go || true

       Tenga  en  cuenta  que  el  uso  de «|| true» evita que el script finalice si debconf decide que no puede
       mostrar la pregunta, o si el usuario intenta retroceder. En estas situaciones debconf devuelve un  código
       de  salida distinto de cero, y debido a que este script usa «set -e», un código de salida sin variable de
       error («untrapped») haría que se cancelase.

       Y aquí tiene un script «postinst» correspondiente, que usa la respuesta del usuario a  la  pregunta  para
       ver si se debería reiniciar el sistema (un ejemplo algo absurdo...):

         #!/bin/sh
         set -e
         . /usr/share/debconf/confmodule
         db_get mi-paquete/reboot-now
         if [ "$RET" = true ]; then
              shutdown -r now
         fi

       Tenga  en  cuenta  el  uso  de  la variable «$RET» para obtener un código de salida extendido de la orden
       «GET», que contiene la respuesta del usuario a la pregunta.

EL SCRIPT POSTINST

       La última sección tenía un ejemplo de un script «postinst» que usa debconf para obtener el valor  de  una
       pregunta,  y  actuar  en consecuencia. Existen algunas cosas que debe tener en cuenta al escribir scripts
       «postinst» que usan debconf:

       *      Evite hacer preguntas en el «postinst».  Por  el  contrario,  el  script  «config»  debería  hacer
              preguntas mediante debconf, para que funcione la preconfiguración.

       *      Cargue  siempre  «/usr/share/debconf/confmodule»  al  inicio  de su «postinst», incluso si no va a
              ejecutar ninguna orden «db_*» desde el script. Es necesario para asegurar que el  script  «config»
              tenga la oportunidad de ejecutarse (para más detalles consulte «ARREGLOS»).

       *      Evite  enviar  cualquier  información  del  «postinst» a través de la salida estándar ya que puede
              confundir a debconf, y de todas formas, «postinst» no debería ser informativo. Enviar  información
              a la salida de error es aceptable, de ser necesario.

       *      Si su «postinst» inicia un demonio asegúrese de informar a debconf de que ejecute «STOP» al final,
              ya que de otra forma puede que debconf confunda el momento en que finaliza el script «postinst».

       *      Haga  que el script «postinst» acepte «reconfigure» como primer parámetro. Puede tratarlo al igual
              que «configure». Se usará en futuras versiones de debconf para informar a los script «postinst» de
              cuándo se reconfiguran.

OTROS SCRIPTS

       Aparte del script «config» y «postinst», puede usar debconf en cualquier  otro  script  de  encargado  de
       paquetes.  Habitualmente,  usará  debconf  en  su  «postrm» para invocar la orden «PURGE» cuando purga su
       paquete y así eliminar sus  entradas  de  la  base  de  datos  debconf.  (Por  cierto,  está  configurado
       automáticamente mediante dh_installdebconf(1).)

       Un  uso  más  complejo  de  debconf sería si desea usarlo en el script «postrm» al purgar el paquete para
       realizar una pregunta acerca de la eliminación de algo. O puede que se vea en la necesidad de  usarlo  en
       los  script  «preinst»  o  «prerm».  Todos estos usos funcionarán, aunque probablemente incluyan plantear
       preguntas y actuar según la respuesta en el mismo programa, en lugar de separar las dos actividades  como
       se hace con los scripts «config» y «postint».

       Tenga  en  cuenta  que si el único uso que su paquete hace de debconf está en el script «postrm», debería
       comprobar que el script «postinst» del paquete carga «/usr/share/debconf/confmodule» para dar  a  debconf
       la  oportunidad  de  cargar  su  fichero  de  plantillas en la base de datos. Así, las plantillas estarán
       disponibles al purgar su paquete.

       También puede usar debconf con otros programas independientes. La cuestión que debe cuidar es que debconf
       no pretende ser, y no se debería usar, como un registro. Al fin y al cabo, esto es Unix, y los  programas
       se  configuran  mediante ficheros en «/etc», y no mediante alguna difusa base de datos de debconf (que es
       sólo un almacén susceptible de desaparecer). Así que reflexione antes de usar  debconf  con  un  programa
       independiente.

       Hay  situaciones  en  las  que tiene sentido, por ejemplo con el programa apt-setup, que usa debconf para
       realizar preguntas al usuario de una forma consistente con el resto del proceso de instalación de Debian,
       y así actuar según las respuestas para configurar el fichero «sources.list» de apt.

LOCALIZACIÓN

       Debconf permite la localización de ficheros de plantilla. Esto  se  consigue  añadiendo  más  campos  que
       contienen  el  texto traducido. Se pueden traducir cualquiera de los campos. Por ejemplo, puede que desee
       traducir la descripción al español. Simplemente, cree un campo llamado «Description-es» para contener  la
       traducción.  Si  no  se  dispone  de  la  traducción de un campo, debconf usa el campo en inglés de forma
       predefinida.

       Además del campo «Description» también debería traducir el campo «Choices» de una  plantilla  «select»  o
       «multiselect».  Asegúrese  de  listar  las opciones traducidas en el mismo orden en el que aparecen en el
       campo «Choices». No necesita traducir el campo «Default» de una pregunta «select» o «multiselect»,  y  el
       valor del campo aparecerá automáticamente en inglés.

       Le resultará más fácil administrar las traducciones si las gestiona en ficheros separados; un fichero por
       traducción.  En  el  pasado  se  usaban  los programas debconf-getlang(1) y debconf-mergetemplate(1) para
       administrar los ficheros «debian/template.ll». Han quedado obsoletos por el  paquete  po-debconf(7),  que
       permite  administrar  traducciones  de debconf en ficheros «.po», al igual que cualquier otra traducción.
       Sus traductores le estarán agradecidos por usar este nuevo y mejorado mecanismo.

       Para más detalles acerca de po-debconf,  consulte  su  página  de  manual.  Si  usa  debhelper,  pasar  a
       po-debconf  es  tan  fácil  como  ejecutar  la  orden  debconf-gettextize(1)  una  sola vez, y añadir una
       dependencia de construcción sobre po-debconf y debhelper (>= 4.1.13).

INTEGRAR LAS DIFERENTES PARTES

       Así que tiene un script «config», un fichero de plantillas, un script «postinst» que usa debconf y así en
       adelante. Integrar todos estos elementos en un paquete debian no es muy difícil. Puede hacerlo a mano,  o
       puede  usar dh_installdebconf(1), el cual fusionará sus plantillas traducidas, copiará los ficheros a las
       ubicaciones apropiadas, y puede incluso crear la invocación a «PURGE» que  debería  estar  en  su  script
       «postrm».  Compruebe  que  el  paquete dependa de debconf (>= 0.5) ya que las versiones anteriores no son
       compatibles con todo lo descrito en este manual. Y esto es todo.

       Bueno, a excepción de probar, la depuración y en realidad usar debconf para cosas  más  interesantes  que
       plantear unas pocas preguntas básicas. Para ello, siga leyendo...

DEPURACIÓN

       Así  que  tiene  un paquete que debería usar debconf, pero que no llega a funcionar. Puede que debconf no
       plantee la pregunta que configuró. O puede que esté ocurriendo algo más raro; está atrapado en un especie
       de bucle, o peor. Afortunadamente, debconf ofrece muchas facilidades para su depuración.

       DEBCONF_DEBUG
              La primera cosa que tiene que hacer es configurar  la  variable  de  entorno  «DEBCONF_DEBUG».  Si
              ejecuta  un  «set» y «export» de «DEBCONF_DEBUG=developer», debconf enviará por la salida estándar
              un volcado del protocolo de debconf a medida que el programa se ejecuta. Es  similar  a  esto,  la
              errata es evidente (--):

               debconf (developer): <-- input high debconf/frontand
               debconf (developer): --> 10 "debconf/frontand" doesn't exist
               debconf (developer): <-- go
               debconf (developer): --> 0 ok

              Es  bastante  útil  usar  la  interfaz  readline de debconf cuando realice la depuración (según la
              opinión del autor), ya que las preguntas no entorpecen la labor, y  la  salida  de  depuración  se
              puede registrar y preservar con facilidad.

       DEBCONF_C_VALUES
              Si  define  esta  variable  de entorno como «true», la interfaz mostrará los valores en los campos
              «Choices-C» (de  existir)  de  plantillas  «select»  y  «multiselect»  en  lugar  de  los  valores
              descriptivos.

       debconf-communicate
              Otra  herramienta  útil  es  el  programa debconf-communicate(1). Inícielo y podrá comunicarse con
              debconf mediante el protocolo de debconf de forma interactiva. Es una buena forma de probar  cosas
              inmediatamente.

       debconf-show
              Si  un  usuario informa de un problema puede usar debconf-show(1) para mostrar todas las preguntas
              del que su paquete es propietario, mostrando sus valores y si el usuario las ha visto.

       .debconfrc
              Para evitar el ciclo, a menudo tedioso, de construir, instalar y depurar, puede  ser  útil  cargar
              sus plantillas con debconf-loadtemplate(1) y ejecutar su script «config» directamente con la orden
              debconf(1).  Sin embargo, tiene que hacer esto como el usuario «root», ¿no?. No es muy bueno. Y lo
              ideal es que pueda ver el comportamiento de una instalación nueva de su paquete, con una  base  de
              datos de debconf limpia.

              Resulta  que  si  configura  un  fichero  «~/.debconfrc»  para un usuario normal que apunta a unos
              ficheros «config.dat» y «template.dat» para el usuario, puede cargar plantillas y ejecutar scripts
              «config» cuanto desee sin permisos del usuario «root». Si desea iniciar todo con una base de datos
              limpia, simplemente borre los ficheros «*.dat».

              Para detalles acerca de  la  configuración,  consulte  debconf.conf(5),  y  tenga  en  cuenta  que
              «/etc/debconf.conf» es una buena plantilla para un fichero «~/.debconfrc» personal.

PROGRAMACIÓN AVANZADA CON DEBCONF

   Manipulación de ficheros de configuración
       Parece  que  muchos  de  vosotros  queréis usar debconf para ayudar en la manipulación de los ficheros de
       configuración que son parte de su paquete. Puede que no exista un buen valor predefinido a incluir en  un
       fichero  de  configuración,  y  por  ello  puede desear usar debconf para plantear preguntas al usuario y
       escribir un fichero de configuración en base a las respuestas. Puede parecer fácil,  pero  considere  las
       actualizaciones,  y  qué hacer cuando alguien modifica el fichero de configuración que su paquete genera,
       cuando se usa dpkg-reconfigure, y más...

       Existen varias formas de hacer esto, y la mayoría están equivocadas, generando a menudo molestos informes
       de fallo. Aquí tiene una de las formas correctas de hacerlo. Asume que su  fichero  de  configuración  es
       realmente sólo una serie de variables de entorno a definir («set»), con comentarios entre ellos, para que
       así  pueda  sólo  leer  el  fichero  para  cargarlo. Si tiene un formato más complicado, leer y editar el
       fichero es más complicado.

       Su script «config» puede tener un aspecto similar a este:

        #!/bin/sh
        CONFIGFILE=/etc/foo.conf
        set -e
        . /usr/share/debconf/confmodule

        # Carga el fichero de configuración, si existe.
        if [ -e $CONFIGFILE ]; then
             . $CONFIGFILE || true

             # Guarda los valores del fichero de
             # configuración en la base de datos de debconf.
             db_set mypackage/foo "$FOO"
             db_set mypackage/bar "$BAR"
        fi

        # Plantea preguntas.
        db_input medium mypackage/foo || true
        db_input medium mypackage/bar || true
        db_go || true

       Y el script «postinst» tendrá un aspecto similar al siguiente:

        #!/bin/sh
        CONFIGFILE=/etc/foo.conf
        set -e
        . /usr/share/debconf/confmodule

        # Genera el fichero de configuración, si no existe.
        # Una alternativa es copiar un fichero
        # de plantillas en otra ubicación.  ¡ if [ ! -e $CONFIGFILE ]; then
             echo "# Fichero de configuración para mi paquete " > $CONFIGFILE
             echo "FOO=" >> $CONFIGFILE
             echo "BAR=" >> $CONFIGFILE
        fi

        # Sustituye los valores de la base de datos de debconf
        # Aquí hay muchas optimizaciones posibles.
        # «cp» antes de «sed» asegura que no nos equivocamos
        # con el propietario y permisos del fichero de configuración.
        db_get mypackage/foo
        FOO="$RET"
        db_get mypackage/bar
        BAR="$RET"
        cp -a -f $CONFIGFILE $CONFIGFILE.tmp

        # Si el administrador eliminó algunas variables pero después las
        # define («set») mediante debconf, las (re)añade al fichero de
        # configuración.
        test -z "$FOO" || grep -Eq '^ *FOO=' $CONFIGFILE || \
             echo "FOO=" >> $CONFIGFILE
        test -z "$BAR" || grep -Eq '^ *BAR=' $CONFIGFILE || \
             echo "BAR=" >> $CONFIGFILE

        sed -e "s/^ *FOO=.*/FOO=\"$FOO\"/" \
            -e "s/^ *BAR=.*/BAR=\"$BAR\"/" \
            < $CONFIGFILE > $CONFIGFILE.tmp
        mv -f $CONFIGFILE.tmp $CONFIGFILE

       Considere como estos dos scripts gestionan todas las situaciones. Las preguntas se realizan por el script
       «config» durante una instalación nueva, y «postinst» genera  un  nuevo  fichero  de  configuración.  Este
       fichero  se  lee durante una actualización y reconfiguración, y los valores contenidos en él se usan para
       modificar los valores en la base de datos de debconf, de forma que no se pierden los cambios manuales del
       administrador. Las preguntas se plantean otra vez (y puede o no que se muestren). Por último,  el  script
       «postinst» sustituye los valores en el fichero de configuración, sin modificar el resto del contenido.

   Permitir retroceder al usuario
       Pocas cosas son tan frustrantes al usar un sistema como debconf que responder a una pregunta, continuar a
       la  siguiente  pantalla  con  una  pregunta  nueva,  descubrir  que hizo una mala elección en la pregunta
       anterior, querer retroceder y descubrir que no puede.

       Ya que el script «config» regula el comportamiento de debconf,  este  no  puede  saltar  a  una  pregunta
       anterior  por  si  mismo,  aunque  puede  realizar  este  paso con un poco de su ayuda. El primer paso es
       permitir que el script «config» sepa que debconf permite que el usuario pulse un botón  para  retroceder.
       Para ello, use la orden «CAPB», introduciendo «backup» como parámetro.

       A  continuación,  después  de  cada  orden  «GO»,  debe comprobar si el usuario pidió retroceder (debconf
       devuelve un código de 30), y si es así, debe saltar a la pregunta anterior.

       Existen varias formas de escribir las estructuras de control de su programa para que pueda  retroceder  a
       preguntas  anteriores  cuando sea necesario. Puede escribir un código complicado y confuso. O puede crear
       varias funciones y usar recursión. Pero quizás la forma más sencilla y limpia es  crear  una  máquina  de
       estado. Aquí tiene un boceto de una máquina de estado, que puede rellenar y expandir.

        #!/bin/sh
        set -e
        . /usr/share/debconf/confmodule
        db_capb backup

        STATE=1
        while true; do
             case "$STATE" in
              1)
                   # Dos preguntas no relacionadas.
                  db_input medium my/question || true
                  db_input medium my/other_question || true
             ;;
             2)
                  # Realiza esta pregunta sólo si
                  # se respondió afirmativamente
                  # a la primera.
                    db_get my/question
                  if [ "$RET" = "true" ]; then
                       db_input medium my/dep_question || true
                  fi
              ;;
             *)
                  # El caso («case») predefinido se inicia cuando $STATE es
                  # mayor que el último «state» implementado, abandonando el bucle.
                  # Es necesario numerar los «states» consecutivamente desde el 1
                  # sin espacios, ya que el «case» predefinido también se introducirá
                  # si hay un espacio en la numeración.
                  break # exits the enclosing "while" loop
              ;;
              esac

             if db_go; then
                  STATE=$((STATE + 1))
             else
                  STATE=$((STATE - 1))
             fi
        done

        if [ $STATE -eq 0 ]; then
             # El usuario pidió volver atrás a la primera
             # pregunta. Este caso es problemático. La
             # instalación regular de dpkg y apt no es capaz de
             # retroceder a preguntas entre paquetes tal y como
             # esto se escribe, así que esto cerraría dejando el
             # paquete sin configurar - probablemente la mejor
             # forma de tratar esta situación.
             exit 10
        fi

       Tenga en cuenta que si todo lo que hace su script «config» es plantear unas pocas preguntas sin relación,
       no  hay  necesidad de una máquina de estado. Sólo plantee las preguntas, y «GO»; debconf lo hará lo mejor
       que pueda para mostrar todas en la misma pantalla, y así el usuario no tendrá que retroceder.

   Evitar bucles infinitos
       Debconf puede encontrar problemas si su script «config»  contiene  un  bucle.  Suponga  que  su  consulta
       requiere la entrada de datos y su validación, y su repetición en caso de que no sea válida:

        ok=”
        do while [ ! "$ok" ];
             db_input low foo/bar || true
             db_go || true
             db_get foo/bar
             if [ "$RET" ]; then
                  ok=1
             fi
        done

       Superficialmente,  esto es correcto. Pero considere qué ocurre si el valor de «foo/bar» es «""» al entrar
       en este bucle, y si el usuario ha definido la prioridad de las preguntas a mostrar como alta,  o  si  usa
       una  interfaz  no interactiva, de forma que en realidad no se pide ninguna entrada. El valor de «foo/bar»
       no se modifica mediante «db_input», fallando la prueba de validación y realizando el  bucle  una  y  otra
       vez...

       Una  forma  de  evitar  esto es que antes de entrar en el bucle, el valor de «foo/bar» esté definido como
       algo que superaría la prueba en el bucle. Por ejemplo, si el  valor  predefinido  de  «foo/bar»  es  "1",
       entonces puede reiniciar («RESET») «foo/bar» antes de entrar en el bucle.

       Otra  forma es comprobar el código de retorno de la orden «INPUT». Si es 30, el usuario no ve la pregunta
       que se les plantea, y debería salir del bucle.

   Escoger entre paquetes relacionados
       A veces se pueden instalar un conjunto de  paquetes  relacionados,  y  desea  consultar  al  usuario  qué
       conjunto  se debería usar por omisión. Ejemplos de tales conjuntos son gestores de ventanas o ficheros de
       diccionario ispell.

       Aunque sea posible que cada paquete en el  conjunto  podría  simplemente  consultar  «¿Debería  ser  este
       paquete  el  predefinido?»,  conllevaría  a  muchas  preguntas  repetitivas  si  se van a instalar varios
       paquetes. Debconf permite la presentación de una lista de todos los paquetes del conjunto, permitiendo al
       usuario seleccionar cuáles desea. Aquí tiene como hacerlo.

       Haga que todos los paquetes en el conjunto usen una plantilla compartida (tipo «shared»). Algo como esto:

        Template: shared/window-manager
        Type: select
        Choices: ${choices}
        Description: Select the default window manager.
         Select the window manager that will be started by
         default when X starts.

       Cada paquete debería incluir una copia de esta plantilla. También  debería  incluir  código  parecido  al
       siguiente en su script «config»:

        db_metaget shared/window-manager owners
        OWNERS=$RET
        db_metaget shared/window-manager choices
        CHOICES=$RET

        if [ "$OWNERS" != "$CHOICES" ]; then
             db_subst shared/window-manager choices $OWNERS
             db_fset shared/window-manager seen false
        fi

        db_input medium shared/window-manager || true
        db_go || true

       Esto requiere una explicación. Llegado el momento de ejecutar su script «config», debconf ya ha analizado
       todas  las plantillas de los paquetes que se van a instalar. Ya que el conjunto de paquetes comparten una
       pregunta, debconf registra este hecho en el campo «owners» (propietarios). Por una extraña  coincidencia,
       el  formato  del campo «owners» es el mismo que el del campo «choices» (elecciones), una lista de valores
       separados por comas y espacios.

       La orden «METAGET» se puede usar para obtener una lista de los propietarios y de las elecciones.  Si  son
       diferentes,  se  ha  instalado un paquete nuevo. Use la orden «SUBST» para cambiar la lista de elecciones
       para que sea igual a la lista de propietarios, y plantee la pregunta.

       Cuando se elimine un paquete  probablemente  querrá  ver  si  ese  paquete  es  la  elección  actualmente
       seleccionada,  y  si  es  así,  querrá consultar al usuario para que seleccione un paquete diferente para
       reemplazarlo.

       Esto se puede lograr añadiendo algo similar a lo siguiente en los scripts «prerm» de todos  los  paquetes
       relacionados (reemplazando <paquete> con el nombre del paquete).

        if [ -e /usr/share/debconf/confmodule ]; then
             . /usr/share/debconf/confmodule
             # No declara propiedad sobre esta pregunta.
             db_unregister shared/window-manager

             # Comprueba que la pregunta compartida aún existe.
             if db_get shared/window-manager; then
                  db_metaget shared/window-manager owners
                  db_subst shared/window-manager choices $RET
                  db_metaget shared/window-manager value
                  if [ "<paquete>" = "$RET" ] ; then
                       db_fset shared/window-manager seen false
                       db_input high shared/window-manager || true
                       db_go || true
                  fi

                  # Ahora haga lo que el script «postinst» hizo
                  # para actualizar el enlace simbólico del gestor
                  # de ventanas.
             fi
        fi

ARREGLOS

       A  día  de hoy debconf no está completamente integrado en dpkg (pero quiero cambiar esto en el futuro), y
       por ello actualmente se usan unos arreglos poco elegantes.

       El peor de estos arreglos implica ejecutar el script «config». La forma  en  la  que  funciona  ahora  es
       ejecutar  el  script  «config»  al  preconfigurar el paquete. Entonces, al ejecutar el script «postinst»,
       inicia debconf otra vez. Debconf detecta que está en uso mediante el script «postinst»,  y  por  ello  se
       desactiva  y  ejecuta  el  script  «config».  Sólo  funciona  si  su  script  «postinst» carga una de las
       bibliotecas debconf por lo que todos los scripts «postinst» deben encargarse de ello.  Esperamos  cambiar
       esto en el futuro añadiendo la compatibilidad explicita para debconf a dpkg. El programa debconf(1) es un
       paso en esta dirección.

       Otro arreglo relacionado es ejecutar debconf cuando un script «config», «postinst» u otro programa que lo
       usa  se inicia. Después de todo, esperan poder comunicarse con debconf inmediatamente. La forma de lograr
       esto   actualmente   es   que   cuando   un   script   carga   una   biblioteca    de    debconf    (como
       «/usr/share/debconf/confmodule»),  y debconf no está en ejecución, éste se inicia, y se ejecuta una nueva
       copia del script. La única diferencia notable es que necesita ubicar la línea que carga la biblioteca  de
       debconf  al  principio  del  script o pueden ocurrir comportamientos raros. Esperamos poder cambiar en el
       futuro la forma en que se invoca debconf, transformándolo en un especie de demonio transitorio.

       La forma en que debconf averigua qué ficheros de plantillas cargar y cuándo es también  un  arreglo  poco
       elegante.  Cuando  los  scripts  «config»,  «preinst»,  y  «postinst»  invocan  debconf,  éste averiguará
       automáticamente dónde está el fichero de plantilla, y lo cargará. Los programas independientes  que  usan
       debconf       provocarán       que       debconf      busque      ficheros      de      plantilla      en
       «/usr/share/debconf/templates/progname.templates». Y si un «postrm» desea usar  debconf  al  purgar,  las
       plantillas  no  estarán  disponibles  a  menos  que  debconf tenga la oportunidad de cargarlo a través de
       «postinst». Esto es algo confuso, pero inevitable. En el futuro, puede que  algunos  de  estos  programas
       sean capaces de usar debconf-loadtemplate directamente.

       El comportamiento histórico de «/usr/share/debconf/confmodule» de manipular los descriptores de ficheros,
       configurando  un  descriptor  de  fichero  3  para  comunicarse con debconf, puede causar varios tipos de
       problema cuando un «postinst» se comunica con debconf ya que el  script  finaliza  la  comunicación  pero
       debconf  no  puede averiguar cuándo finaliza el script. Puede usar la orden «STOP» como un arreglo. En el
       futuro, estamos considerando hacer que la comunicación con debconf se realice a través de un  «socket»  o
       algún otro mecanismo además de la entrada y salida estándar.

       Debconf  define  «DEBCONF_RECONFIGURE=1»  antes  de  ejecutar  scripts «postinst», de forma que un script
       «postinst» que deba evitar alguna operación compleja al reconfigurarse puede examinar esa variable.  Este
       es  sólo  un  arreglo  ya  que lo correcto sería introducir «$1 = "reconfigure"», pero hacerlo sin romper
       todos los «postinst» que usan debconf es difícil. La vía para abandonar este arreglo es animar a la gente
       a que escriban ficheros «postinst» que acepten «reconfigure», y una vez que todos  lo  hagan,  empezar  a
       introducir ese parámetro.

VÉASE TAMBIÉN

       debconf(7) es la guía de usuario de debconf.

       La  especificación  de  debconf  en  las  normas  de Debian (debian-policy) es la definición estándar del
       protocolo de debconf. Puede encontrarlo en«/usr/share/doc/debian-policy/debconf_specification.txt.gz».

       debconf.conf(5) contiene mucha información útil, incluyendo algo de información acerca del sistema de  la
       base de datos.

AUTOR

       Joey Hess <joeyh@debian.org>

TRADUCCIÓN

       Omar Campagne Polaino <ocampagne@gmail.com>, 2010

       Si  encuentra  un  fallo  en  la  traducción,  por  favor,  informe  de  ello  en  la lista de traducción
       <debian-l10n-spanish@lists.debian.org>.

                                                                                                DEBCONF-DEVEL(7)