\section{Personalização do Base-config}%A Segunda fase da Instalação}
%A segunda fase da instalação e de responsabilidade do pacote ``base-config".

%Esse pacote é responsável por alterar a segunda fase da instalação do sistema. Para obter informações sobre ele, leia o documento Hackeando o Base-Config.
\label{baseconf}

O Base-Config é o programa responsável pela configuração do sistema Debian, executado na segunda fase da instalação. Para personalizar a segunda fase da instalação do Debian, você deve alterar o Base-Config. Ele nada mais é do que um conjunto de scripts e arquivos que controlam a ordem de execução desses scripts. 

Para lidar com as informações apresentadas nesta seção é necessário ter conhecimento do protocolo Debconf e da geração de pacotes Debian. Para mais informações, leia o apêndice.

\subsection{Alterando o Base-Config}\label{alterandobaseconf}
Para alterar o Base-Config será criado um pacote chamado [suadistro]-base-config. O Base-Config, em si, não será alterado diretamente para facilitar a atualização de sua distribuição quando uma versão nova do Base-Config for lançada. Além disso, fazer a alteração através de um pacote próprio para isso é muito mais elegante e permite ao usuário desinstalar o pacote de personalização e trabalhar com o Base-Config original do Debian.

\subsubsection{Estrutura do Base-Config}
O Base-Config executa os scripts localizados em /usr/lib/base-config/menu na ordem configurada no arquivo [nome-do-script].mnu. O formato desse arquivo é o de uma variável por linha, seguido de dois pontos e o valor da variável.

Principais variáveis que podem ser colocadas:
\begin{itemize}
	\item Only-New - Recebe como valor true ou false. Configura se esse item do menu deve aparecer somente em novas instalações (true) ou sempre que o Base-Config for executado (false).
	\item Debconf - Recebe como valor true ou false. Configura se o debconf pode já estar rodando quando o item for exibido. %importante?
	\item Order - Recebe como valor a ordem em que o item de menu aparecerá para o usuário.
\end{itemize}

Os arquivos .mnu podem receber mais variáveis. Execute o comando \colorbox{claro}{man base-config} para obter mais detalhes.

Exemplo da estrutura:
{\small
\begin{framed}
\begin{verbatim}
Only-New: true
Debconf: false
Order: 92
\end{verbatim}
\end{framed}
}

Com essas opções o script só será executado durante a instalação do sistema, suas entradas de menu aparecerão depois dos scripts que possuem Order menor que 92 e antes dos que possuem Order maior que 92. %Conferir função do Debconf:

\subsubsection{Alterando uma Pergunta}
Como a interação com o usuário é feita através do Debconf, você terá que colocar no diretório debian do seu pacote um arquivo templates. Você encontrará mais informações sobre esse arquivo no apêndice deste documento.

Para alterar uma pergunta já existente no Base-Config, basta colocar no template de seu pacote uma pergunta com o mesmo caminho que ela possui no Base-Config. Para ver os caminhos das perguntas, você terá que baixar o pacote oficial do Base-Config com o comando:

\medskip
\noindent \colorbox{claro}{\# aptitude download base-config}
\medskip
% \begin{verbatim}
% aptitude download base-config
% \end{verbatim}

...e descompactar a parte de controle do pacote utilizando o comando:

\medskip
\noindent \colorbox{claro}{\# dpkg -e base-config*.deb $[destino]/$ }
\medskip
% \begin{verbatim}
% dpkg -e base-config*.deb [destino]/
% \end{verbatim}

Onde [destino] é o diretório no qual o comando colocará as informações de controle do pacote. Em seguida, basta entrar nesse diretório para ver o arquivo template do Base-Config.

Para alterar, por exemplo, a mensagem de boas vindas da sua instalação:

{\small
\begin{framed}
\begin{verbatim}
Template: base-config/intro
Type: note
Description-pt_BR.ISO-8859-1: Bem-vindo ao seu novo sistema [sua_distro]!

A partir de agora, você será guiado para configurar seu sistema 
recém-instalado.
\end{verbatim}
\end{framed}
}

\subsubsection{Retirando uma Pergunta}
É possível pré-alimentar as perguntas efetuadas na segunda etapa da instalação. Para isso, basta colocar em /usr/share/base-config/debconf-seed as pré-alimentações desejadas. Os arquivos de pré-alimentação possuem a seguinte sintaxe:

{\small
\begin{framed}
\begin{verbatim}
[pacote] [caminho da pergunta] [estilo da pergunta] [opção]
\end{verbatim}
\end{framed}
}

A configuração da fonte do mplayer, por exemplo, é a seguinte:

{\small
\begin{framed}
\begin{verbatim}
mplayer-fonts mplayer-fonts/size select iso-8859-1/arial-18
\end{verbatim}
\end{framed}
}

É possível obter todas as opções que estão sendo utilizadas no sistema, com o comando debconf-get-selections.

\subsubsection{Acrescentando uma Etapa à Instalação}
Para adicionar uma etapa nova à instalação de seu sistema, basta acrescentar um script em /usr/lib/base-config/menu e um arquivo [nome-do-script].mnu para controlar quando sua pergunta vai aparecer na instalação. Caso sua nova etapa tenha que perguntar algo ao usuário (o que provavelmente vai acontecer), lembre-se que a pergunta deve ser feita através do protocolo Debconf. Informações sobre como utilizar esse protocolo em scripts podem ser vistas no apêndice. %estou citando demais isso?

Assim, para acrescentar 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 falhe.

\subsubsection{Alterando uma Etapa da Instalação}
Em muitas situações você pode querer alterar uma das etapas existentes. Porém, como fazer isso sem alterar diretamente o Base-Config?

Caso não o tenha feito no passo anterior, baixe o pacote oficial do Base-Config com o comando:

\medskip
\noindent \colorbox{claro}{aptitude download base-config}
\medskip
% \begin{verbatim}
% aptitude download base-config
% \end{verbatim}

... e descompacte-o com

\medskip
\noindent \colorbox{claro}{dpkg -x base-config*.deb [destino]}
% \begin{verbatim}
% dpkg -x base-config*.deb [destino]
% \end{verbatim}

Onde [destino] é o diretório que receberá o conteúdo do pacote do Base-Config. Observe que dessa vez estamos extraindo o conteúdo, não as informações de controle.

Entre em [destino]/usr/lib/base-config/menu. Localize o script que deseja alterar e copie-o para o diretório em que está construindo o pacote de personalização do base-config. % Explicar melhor % xala: acho melhor...
Edite o arquivo (no diretório fonte do seu pacote) e faça as alterações desejadas. Lembre-se que toda a interação com o usuário deve ser feita através do protocolo Debconf. %ok, eu devo estar repetindo isso demais.

Vamos usar o dpkg-divert para controlar essas duas versões do mesmo script. Para ter mais informações sobre esse programa, leia \colorbox{claro}{man dpkg-divert}.

No diretório debian de seu pacote, coloque o seguinte script em preinst:

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

if [ install = "$1" ]; then
  dpkg-divert --package [sua_distro]-base-config --add --rename \
        --divert /usr/lib/base-config/menu/[script_alterado_1].base-config \
                   /usr/lib/base-config/menu/[script_alterado_1]
  dpkg-divert --package [sua_distro]-base-config --add --rename \
        --divert /usr/lib/base-config/menu/[script_alterado_2].base-config \
                     /usr/lib/base-config/menu/[script_alterado_2]
fi
\end{verbatim}
\end{framed}
}
% {\small
% \begin{framed}
% \begin{verbatim}
% #!/bin/sh -e
% 
% if [ install = "$1" ]; then
%     dpkg-divert --package [sua_distro]-base-config --add --rename \
%                 --divert /usr/lib/base-config/menu/[o_script_que_você_mudou_1].base-config \
%                          /usr/lib/base-config/menu/[o_script_que_você_mudou_1]
%     dpkg-divert --package [sua_distro]-base-config --add --rename \
%                 --divert /usr/lib/base-config/menu/[o_script_que_você_mudou_2].base-config \
%                          /usr/lib/base-config/menu/[o_script_que_você_mudou_2]
% fi
% \end{verbatim}
% \end{framed}
% }

Onde \verb![script_alterado_n]! refere-se ao nome do script do base-config que você alterou. Se, por exemplo, você tiver alterado o apt-setup, o timezone e o passwd, seu preinst terá o seguinte conteúdo:

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

if [ install = "$1" ]; then
    dpkg-divert --package [sua_distro]-base-config --add --rename \
                --divert /usr/lib/base-config/menu/apt-setup.base-config \
                         /usr/lib/base-config/menu/apt-setup
    dpkg-divert --package [sua_distro]-base-config --add --rename \
                --divert /usr/lib/base-config/menu/timezone.base-config \
                         /usr/lib/base-config/menu/timezone
    dpkg-divert --package [sua_distro]-base-config --add --rename \
                --divert /usr/lib/base-config/menu/passwd.mnu.base-config \
                         /usr/lib/base-config/menu/passwd.mnu
fi
\end{verbatim}
\end{framed}
}

Quando seu pacote for removido, é interessante que o base-config volte ao original. Por isso, coloque o seguinte postrm em seu pacote:

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

if [ remove = "$1" ]; then
 dpkg-divert --package [sua_distro]-base-config --remove --rename \
        --divert /usr/lib/base-config/menu/[script_alterado_1].base-config \
                     /usr/lib/base-config/menu/[script_alterado_1]
 dpkg-divert --package [sua_distro]-base-config --remove --rename \
        --divert /usr/lib/base-config/menu/[script_alterado_2].base-config \
                     /usr/lib/base-config/menu/[script_alterado_2]
fi
\end{verbatim}
\end{framed}
}
% {\small
% \begin{framed}
% \begin{verbatim}
% #!/bin/sh -e
% 
% if [ remove = "$1" ]; then
%     dpkg-divert --package [sua_distro]-base-config --remove --rename \
%                 --divert /usr/lib/base-config/menu/[o_script_que_você_mudou_1].base-config \
%                          /usr/lib/base-config/menu/[o_script_que_você_mudou_1]
%     dpkg-divert --package [sua_distro]-base-config --remove --rename \
%                 --divert /usr/lib/base-config/menu/[o_script_que_você_mudou_2].base-config \
%                          /usr/lib/base-config/menu/[o_script_que_você_mudou_2]
% fi
% \end{verbatim}
% \end{framed}
% }

No caso de nosso exemplo:

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

if [ remove = "$1" ]; then
    dpkg-divert --package [sua_distro]-base-config --remove --rename \
                --divert /usr/lib/base-config/menu/apt-setup.base-config \
                         /usr/lib/base-config/menu/apt-setup
    dpkg-divert --package [sua_distro]-base-config --remove --rename \
                --divert /usr/lib/base-config/menu/timezone.base-config \
                         /usr/lib/base-config/menu/timezone
    dpkg-divert --package [sua_distro]-base-config --remove --rename \
                --divert /usr/lib/base-config/menu/passwd.mnu.base-config \
                         /usr/lib/base-config/menu/passwd.mnu
fi
\end{verbatim}
\end{framed}
}

\subsection{Detecção Automática de Hardware} %existe no sarge? Só conheço a solução do br-cdd...
Após a instalação do sistema, é interessante executar programas responsáveis pela detecção do hardware. Os principais são:
\begin{itemize}
  \item xdebconfigurator - Script que autoconfigura o xserver-xfree86 
  \item xresprobe - Procura a resolução do monitor de laptops e telas compatíveis com DDC
  \item hwinfo - Identifica o hardware instalado no sistema
  %\item numlockx - Ativa o numlock na inicialização do X11 %ok, onde coloco esse pacote?
\end{itemize}
Para executar esses programas, você pode utilizar um script no base-config. O debian-br-cdd, por exemplo, utiliza o install-extra-br-cdd, que possui o seguinte conteúdo:

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

#### This code is from debian-br-cdd, and was based on debian-edu-install 
# package
# Check if a deb package is installed.  Return true if it is, and
# false if it isn't.
deb_installed() {
    RET=$( dpkg -s $1 2>/dev/null | awk '/Status\:/ {print $4}' )
    if [ "$RET" = "installed" ] ; then
        return 0
    fi

    return 1
}

clear
echo "Instalando pacotes de detecção de video ..."
if deb_installed xserver-xfree86; then
    for package in xdebconfigurator xresprobe hwinfo numlockx; do
        echo "Instalando $package..."
        apt-get -y install $package
    done
fi
\end{verbatim}
\end{framed}
}

\subsubsection{Finalizando as Alterações} % talvez essa seção não seja necessária... Talvez uma seção no final de Personalizando o Sistema falando pro cara gerar os pacotes e enviá-los para o mirror....
Gere o pacote com o comando:

\medskip
\noindent \colorbox{claro}{dpkg-buildpackage -us -uc -rfakeroot}
\medskip
% \begin{verbatim}
% dpkg-buildpackage -us -uc -rfakeroot
% \end{verbatim}

Caso esteja utilizando svn, gere o pacote com o comando:

\medskip
\noindent \colorbox{claro}{svn-buildpackage}
\medskip
% \begin{verbatim}
% svn-buildpackage
% \end{verbatim}

Envie-o para o diretório pool/main/[sua\_distro]/ de seu mirror local, com o comando:

\medskip
\noindent \colorbox{claro}{cp ../[sua\_distro]-base-config*.deb [seu\_mirror]/pool/main/[sua\_distro]/ }
\medskip
% \begin{verbatim}
% cp ../[sua_distro]-base-config*.deb [seu_mirror]/pool/main/[sua_distro]/
% \end{verbatim}
