\chapter{Conhecimentos Fundamentais}
Saber gerar pacotes Debian e utilizar o protocolo Debconf são conhecimentos essenciais para a geração de uma CDD. Por isso, faremos uma breve apresentação desses sistemas.

\section{Gerando Pacotes Debian}
Essa seção não tem como objetivo substituir o \textit{Guia do Novo Mantenedor}. Caso queira aprender como gerar um pacote com mais profundidade, consulte as documentações do Debian. Aqui será exposto apenas o essencial para que você consiga gerar os pacotes necessários para a construção de uma CDD.

Primeiramente, é necessário que você crie um diretório para seu pacote. Dentro dele, crie um diretório chamado debian pois é nele que ficarão os arquivos que controlarão o comportamento do seu pacote. Poderemos ter os seguintes arquivos:
\begin{itemize}
	\item control - Esse arquivo é responsável por descrever seu pacote, quais são suas dependências, quem é o mantenedor, etc. Possui a seguinte sintaxe:

{\small
	\begin{framed}
	\begin{verbatim}
1  Source: [nome do pacote fonte]
2  Section: [seção do pacote]
3  Priority: [prioridade dele]
4  Maintainer: [nome do mantenedor] <[e-mail do mantenedor]>
5  Build-Depends: [dependências de compilação]
6  Standards-Version: [versão das regras da Debian que esse pacote segue]
7
8  Package: [nome do pacote binário]
9  Architecture: [arquitetura do pacote binário]
10 Depends: [dependências do pacote binário]
11 Description: [descrição com no máximo 60 caracteres]
12  [descrição longa, indentada com espaços]
	\end{verbatim}
	\end{framed}
}

	\item changelog - Esse arquivo é responsável por descrever as mudanças efetuadas no pacote. Possui a seguinte sintaxe:

{\small
        \begin{framed}
	\begin{verbatim*}
1  [nome do pacote] ([versão do pacote]) [árvore do 
pacote]; urgency=[urgência do pacote]
2
3   * [breve descrição das alterações realizadas]
4
5  -- [mantenedor] <[e-mail do mantenedor]>  [três 
primeiras letras do dia da semana], [dia] [três 
primeiras letras do mês] [ano] [horário com 
milisegundos] [fuso horário]
6
	\end{verbatim*}
        \end{framed}
}

	\item copyright - Esse arquivo é responsável pelas informações de copyright do pacote, licença, etc. Um padrão que pode ser seguido é o seguinte:

{\small
	\begin{framed}
	\begin{verbatim}
1  This package was debianized by [nome do 
   mantenedor] <[e-mail do mantenedor]> on
2  [três primeiras letras do dia da 
   semana], [dia] [três primeiras letras 
   do mês] [ano] [horário com 
   milisegundos] [fuso horário].
3
4  It was downloaded from [endereço para 
   download]
5
6  Upstream Author(s): [nome e e-mail dos 
   autores do software]
7
8  Copyright:
9
10 [licensa]
       \end{verbatim}
\end{framed}
}

       \item rules - Esse arquivo é um Makefile, responsável pela construção do pacote. Seu conteúdo pode variar muito, dependendo das necessidades de cada pacote. Um possível padrão é o seguinte:

{\small
       \begin{framed}
       \begin{verbatim}
1  #!/usr/bin/make -f
2  # Sample debian/rules that uses debhelper.
3  # GNU copyright 1997 to 1999 by Joey Hess.
4
5  # Uncomment this to turn on verbose mode.
6  #export DH_VERBOSE=1
7
8  # This is the debhelper compatibility version to use.
9  export DH_COMPAT=4
10 
11 CFLAGS = -g
12 ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
13 CFLAGS += -O0
14 else
15 CFLAGS += -O2
16 endif
17
18 build: build-stamp
19 build-stamp:
20        dh_testdir
21
22        # Add here commands to compile the package.
23        $(MAKE)
24        #docbook-to-man debian/gentoo.sgml > gentoo.1
25
26        touch build-stamp
27
28 clean:
29        dh_testdir
30        dh_testroot
31        rm -f build-stamp
32
33        # Add here commands to clean up after the build process.
34        -$(MAKE) clean
35
36        dh_clean
37
38 install: build
39        dh_testdir
40        dh_testroot
41        dh_clean -k
42        dh_installdirs
43
44        # Add here commands to install the package into debian/gentoo.
45        $(MAKE) install DESTDIR=$(CURDIR)/debian/gentoo
OB46
47 # Build architecture-independent files here.
48 binary-indep: build install
49 # We have nothing to do by default.
50
51 # Build architecture-dependent files here.
52 binary-arch: build install
53        dh_testdir
54        dh_testroot
55 #      dh_installdebconf
56        dh_installdocs
57        dh_installexamples
58        dh_installmenu
59 #      dh_installlogrotate
60 #      dh_installemacsen
61 #      dh_installpam
62 #      dh_installmime
63 #      dh_installinit
64        dh_installcron
65        dh_installman
66        dh_installinfo
67 #      dh_undocumented
68        dh_installchangelogs ChangeLog
69        dh_link
70        dh_strip
71        dh_compress
72        dh_fixperms
73 #      dh_makeshlibs
74        dh_installdeb
75 #      dh_perl
76        dh_shlibdeps
77        dh_gencontrol
78        dh_md5sums
79        dh_builddeb
80
81 binary: binary-indep binary-arch
82 .PHONY: build clean binary-indep binary-arch binary install
       \end{verbatim}
	\end{framed}
}

       \item install - Esse é um arquivo opcional, que facilita a instalação do seu pacote. Nele, você pode listar a localização de arquivos dentro do fonte do seu pacote e o local onde eles deverão ser instalados. Ele será muito usado em nossos pacotes para gerar a CDD. Sintaxe do arquivo install:

{\small
       \begin{framed}
       \begin{verbatim}
[diretório no fonte do pacote]/[arquivo] [localizacao no sistema]
       \end{verbatim}
\end{framed}
}

       [arquivo] pode ser *, para instalar todos os arquivos de um diretório. É importante notar que a localização no sistema não pode começar com `/'! \\ Exemplo:

{\small
       \begin{framed}
       \begin{verbatim}
configuracoes/system.conf etc/
       \end{verbatim}
\end{framed}
}

\item templates - É um arquivo opcional, utilizado pelo Debconf. Seu conteúdo e utilização serão discutidos na seção seguinte deste capítulo.
\item postinst - Script responsável por executar comandos após a instalação do pacote.
\item preinst - Script responsável por executar comandos antes da instalação do pacote.
\item prerm - Script responsável por executar comandos antes da remoção do pacote.
\item postrm - Script responsável por executar comandos após a remoção do pacote.
\item dirs - Listagem dos diretórios utilizados pelo seu pacote. Eles não podem começar com `/'! \\ Exemplo:

{\small
       \begin{framed}
       \begin{verbatim}
usr/bin
usr/sbin
       \end{verbatim}
\end{framed}
}

\end{itemize}

Caso queira utilizar um pacote fonte para gerar diversos pacotes binários, você poderá utilizar uma versão desses arquivos para cada pacote binário, bastando colocar o nome do pacote binário como prefixo. Assim, o arquivo dirs do pacote foo, chamará foo.dirs, por exemplo.

Depois que estiver tudo configurado, basta ir a um diretório acima do diretório debian e executar o seguinte comando para gerar seu pacote.

\medskip
\noindent \colorbox{claro}{dpkg-buildpackage -us -uc -b -rfakeroot}
\medskip

Caso as fontes do seu pacote estejam em um servidor svn, você terá que utilizar o svn-buildpackage. Crie um arquivo chamado .svn-buildpackage.conf em seu home, para configurá-lo. Uma configuração possível é a seguinte:

{\small
\begin{framed}
\begin{verbatim}
svn-builder=dpkg-buildpackage -us -uc -b -rfakeroot
svn-ignore-new
\end{verbatim}
\end{framed}
}

Assim, para gerar o pacote, bastará executar

\medskip
\noindent \colorbox{claro}{svn-buildpackage}
\medskip

\section{O Protocolo Debconf}
O protocolo Debconf é utilizado pelos pacotes para interagir com o usuário, mostrando notas de informação, fazendo perguntas, exibindo lista de itens, etc. Assim, a instalação de qualquer pacote sempre terá uma aparência uniforme. 
É recomendável, portanto, que qualquer comunicação entre seu pacote e o usuário seja realizada através desse protocolo. Faremos aqui uma breve apresentação dele. Mais detalhes podem ser encontrados em \colorbox{claro}{man debconf} e \colorbox{claro}{man debconf-devel}.

Toda a comunicação com o usuário durante a instalação do sistema utiliza esse protocolo. Portanto, seu conhecimento é essencial para a personalização da instalação de um sistema Debian. Para adicionar notas ou perguntas em seu pacote, você terá que colocar, no diretório debian, um arquivo templates, que possui a mesma estrutura básica de um arquivo control de um pacote: Uma variável por linha, seguida de dois pontos e o valor da variável. 

As principais variáveis são as seguintes:
\begin{itemize}
\item Template - Caminho do Debconf onde a resposta da pergunta ficará armazenada.
\item Type - Tipo da entrada do menu. Pode ser uma mensagem, uma caixa de seleção, etc.
\item Description - A mensagem que será exibida para o usuário nesse menu. Pode-se escolher uma mensagem diferente para cada idioma, assim como a decodificação da mensagem. Para fazê-lo, deve-se alterar o nome da variável. 

Por exemplo, para que sua mensagem seja exibida em português com a codificação ISO-8859-1, o nome da variável será Description-pt\_BR.ISO-8859-1, em vez de `Description'.

Após a primeira linha de conteúdo, todas as outras devem começar por um espaço. Linhas em branco devem conter um ponto. Veja o exemplo mais abaixo para compreender melhor.
\end{itemize}

Existem diversas opções que podem ser colocadas no arquivo templates. Para mais informações leia \colorbox{claro}{man debconf-devel}.

Exemplo:

{\small
\begin{framed}
\begin{verbatim*}
Template: [sua-distribuição]-desktop/cor-preferida
Type: select
Choices: Azul, Amarelo, Vermelho
Default: Azul
Description: Qual a sua cor predileta?
 Essa é apenas uma pergunta de demonstração, não a 
 coloque na instalação da sua distribuição! :)
 .
 Esse é outro parágrafo. Note o `.' para que seja gerada 
 uma linha em branco.
\end{verbatim*}
\end{framed}
}

Essa entrada de menu exibirá uma caixa de seleção para o usuário com três opções: Azul, Amarelo e Vermelho e deixará o Azul selecionado por padrão.

O rules de seu pacote deverá chamar o comando dh\_installdebconf -i na seção binary-indep. \\ Exemplo:

{\small
\begin{framed}
\begin{verbatim}
binary-indep: build install
 	dh_testdir
 	dh_testroot
 	dh_installchangelogs 
 	dh_installdocs
 	dh_installdebconf -i
 	dh_install
 	dh_link
 	dh_strip
 	dh_compress
 	dh_fixperms
 	dh_installdeb
 	dh_shlibdeps
 	dh_gencontrol
 	dh_md5sums
 	dh_builddeb
\end{verbatim}
\end{framed}
}

%Para utilizar as perguntas e notas criadas pelo arquivo templates, o seu pacote deverá possuir um script chamado config que utilize o protocolo Debconf. Na verdade, qualquer script pode usar o protocolo, e durante a criação de nossa CDD iremos utilizá-lo em outros scripts. Porém, na sua função original de facilitador da configuração do programa que está sendo instalado pelo pacote, ele deverá ser utilizado por um script chamado config. %está bem escrito?

Para mostrar as perguntas e notas criadas pelo arquivo templates, o seu pacote deverá possuir um script chamado config que utilize o protocolo Debconf. Já para pegar as respostas entradas pelo usuário e agir de acordo com elas, deve-se utilizar o postinst. Porém, durante a criação de uma CDD diversas situações requerem a utilização de tal protocolo em outros scripts.

Para que seu script possa utilizar esse protocolo, é necessário que carregue a biblioteca /usr/share/debconf/confmodule. Assim, você poderá controlar os menus através dos comandos db\_[comando-do-debconf].

Principais comandos do Debconf:
\begin{itemize}
\item set - Coloca uma opção como padrão para uma pergunta.
\item fset - Configura as propriedades de uma determinada pergunta. O mais comum é alterar a propriedade seen, que configura se a pergunta já foi ou não exibida para o usuário.
\item input - Coloca uma pergunta na fila de exibição.
\item go - Exibe todas as perguntas presentes na fila de exibição.
\item get - Pega a resposta do usuário em uma pergunta, armazenando-a na variável RET. % xala: RET ou GET?? soriano: é RET mesmo... get pega a resposta e RET eu acho q é de Return, ou seja, é o q o usuário retornou na resposta.
\end{itemize}
Existem diversos outros comandos do Debconf. Leia \colorbox{claro}{man debconf-devel} para mais detalhes.

Assim, para exibir uma pergunta, seu script pode ter o seguinte conteúdo:

{\small
\begin{framed}
\begin{verbatim}
#!/bin/sh
set -e

. /usr/share/debconf/confmodule

db_fset [caminho-para-sua-pergunta] seen false
db_input critical [caminho-para-sua-pergunta] || true
db_go || true
\end{verbatim}
\end{framed}
}

O ``$||$ true" é responsável por não deixar o script abortar caso algum desses comandos falhem. %será que o db_fset é realmente necessário? as perguntas são seen false por padrão?

E para pegar o resultado de uma pergunta, pode-se utilizar o seguinte código:

{\small
\begin{framed}
\begin{verbatim}
#!/bin/sh
set -e
. /usr/share/debconf/confmodule
db_get [seu pacote]/cor_preferida
if [ "$RET" = "amarelo" ]; then
   echo "Você tem bom gosto!"
fi
\end{verbatim}
\end{framed}
}

Para que uma determinada pergunta não seja exibida para o usuário, pode-se acrescentar as seguintes linhas ao config de seu pacote:

{\small
\begin{framed}
\begin{verbatim}
db_set [caminho-do-debconf] [resposta-desejada]
db_fset [caminho-do-debconf] seen true
\end{verbatim}
\end{framed}
}
%$

\chapter{Meta-pacotes}
Para facilitar a geração do CD e a instalação do sistema, no LibertasBR utilizamos meta-pacotes. Eles são pacotes vazios que possuem uma lista de pacotes no campo recommends. Por exemplo, o meta-pacote libertasbr-editoracao-grafica possui o seguinte conteúdo no campo recommends:

{\small
\begin{framed}
\begin{verbatim}
Recommends: gimp,gimp-help-en,gimp-helpbrowser,inkscape,scribus,scribus-doc,
            dia,ttf-freefont
\end{verbatim}
\end{framed}
}

Assim, quando o usuário digitar:

\colorbox{claro}{aptitude install libertasbr-editoracao-grafica}

O aptitude instalará o gimp, o inkscape, o dia e o scribus.

Essa organização facilita bastante o trabalho do desenvolvedor. Para conseguir a listagem completa dos pacotes que irão para o seu CD, por exemplo, você poderá gerar uma lista para cada meta-pacote. É bem melhor do que ter uma lista para cada pacote que deseja ter em seu CD, a manutenção disso seria trabalhosa. Além disso, o arquivo $Debian_sarge$ do Debian-CD, que define quais pacotes irão para o seu CD, poderá ter o seguinte conteúdo:

{\small
\begin{framed}
\begin{verbatim}
/*
 *
 * This file will be used to build official complete set of Sarge CD
 *
 */

#if (FORCENONUSONCD1 == 1)
#include ``Debian_sarge_nonUS''
#endif

/* Packages that should really be on CD1 */
#include <debian-installer+kernel>
#include <base-sarge>
#include <forcd1>
#include <[sua-distribuição]-base>
#include <[sua-distribuição]-editoracao-grafica>
#include <[sua-distribuição]-internet>
#include <[sua-distribuição]-kde>
#include <[sua-distribuição]-multimidia>
\end{verbatim}
\end{framed}
}

Onde os arquivos iniciados por [sua-distribuição] são a listagem completa de dependências de um meta-pacote. Assim, caso queira gerar um CD que não possua pacotes de editoração gráfica, por exemplo, bastará remover uma linha desse arquivo.

O modelo de meta-pacotes também facilita o trabalho de manutenção do tasksel personalizado, já que não será necessário listar todos os pacotes de uma task, mas apeans os meta-pacotes que a task instalará. Dessa maneira, mantêm-se listas menores e mais organizadas.