\documentclass{article}
\usepackage[brazilian]{babel}
\usepackage[latin1]{inputenc}
\usepackage[dvips]{graphics}
\usepackage{hyperref}
\newcommand\link{\hyperlink}

\title{Gerenciamento de instalações e metapacotes com o simplepkg}
\author{Silvio Rhatto}

\begin{document}\label{start}
\maketitle

\begin{abstract}
O \emph{simplepkg} é um sistema de gerenciamento de pacotes que roda sobre o \emph{pkgtool}. Ele trabalha com templates -- listas com pacotes instalados, scripts e arquivos de configuração -- permitindo criar perfis de instalação que podem ser então usados para instalar o sistema numa outra partição, criar um chroot específico ou até trabalhar com o conceito de \emph{metapacotes}: uma lista de pacotes que pode ser instalada e removida com apenas um comando.
\end{abstract}

\section{Descrição}

Todas as distribuições de GNU/Linux já tem algum sistema de empacotamento amadurecido. A questão agora é a praticidade de instalar e controlar o que está instalado, tanto pacotes como arquivos de configuração de uma máquina.

Imagine por exemplo se você precisa manter uma lista de pacotes de 200 máquinas slackware, sendo que algumas são usadas como desktop, outras como servidores web, alguma sendo o servidor de email e assim por diante. Imagine agora que você perca o disco de algumas dessas máquinas ou que precise cotidianamente reinstalar ou atualizar um sistema.

Usar o cd de instalação do slackware e configurar na mão toda a vez que der um pau faria com que você ficasse louco/a e desperdiçasse muito tempo, além do que sempre ocorre de esquecermos algum detalhe ou pacote durante a configuração do sistema. Manter um backup completo de cada máquina, por outro lado, pode ser muito custoso se o número delas for muito grande.

O simplepkg permite que você mantenha um template para cada grupo de máquinas e com apenas um comando instalar o template numa partição. Além do template, você precisa do \emph{swaret} configurado para os repositórios de pacote que possuem seus aplicativos.

Gerenciar instalações e metapacotes não é tudo o que o simplepkg faz. Ele pode ser usado até na criação de \emph{vservers}. O simplepkg inclusive é um amadurecimento de idéias delineadas nos seguintes artigos:

\begin{itemize}
  \item \link{/node/3}{Rodando o OpenOffice.org em chroot no Slamd64}
  \item \link{/node/6}{Criando Vservers em Slackware}
  \item \link{/node/7}{Instalando o Slackware sem programa de instalação}
\end{itemize}

O \emph{simplepkg} permite que o trampo proposto nos artigos acima seja simplificado a uma meia dúzia de comandos, desde que existam templates prontos.

\section{Arquitetura}

O \emph{simplepkg} é um conjunto de scripts escritos com a filosofia KISS em mente. Ele é um sistema muito simples, composto pelos seguintes comandos:

\begin{itemize}
  \item mkjail: constrói uma jaula/instalação de slackware numa pasta
  \item metapkg: instala ou remove um metapacote
  \item templatepkg: criar ou adiciona pacotes a um template
  \item lspkg: lista pacotes instalados
  \item jail-upgrade: faz o upgrade nas jaulas
  \item rebuildpkg: reconstrói um pacote a partir de sua entrada no \emph{/var/log/packages}
  \item simplaret: obtém pacotes de repositórios locais ou remotos
\end{itemize}

A pasta de configuração e armazenamento de templates é a \emph{/etc/simplepkg}. Templates são arquivos contendo uma lista de pacotes, um pacote por linha e com a extensão \emph{.template}.  Como exemplo, um template poderia se chamar \emph{minimo.template} e conter a seguinte lista:

\begin{verbatim}
aaa_base
aaa_elflibs
apache
bash
bin
coreutils
findutils
\end{verbatim}

Se você quiser também é possível usar um \emph{tagfile} do slackware como template, sem nem precisar editá-lo.

\section{Instalando o simplepkg}

Para baixar o pacote do simplepkg, vá em http://slack.midiatatica.org/packages/noarch/. Depois de instalá-lo.

\begin{verbatim}
installpkg simplepkg-VERSAO-noarch-BUILD.tgz
\end{verbatim}

Alternativamente, se você usa o swaret, adicione em seu \emph{swaret.conf} a linha

\begin{verbatim}
REPOS_ROOT=SlackMidiataticaNoarch%http://slack.midiatatica.org/packages/noarch
\end{verbatim}

e então digite

\begin{verbatim}
swaret --update
swaret --install simplepkg
\end{verbatim}

\section{Configurando o simplepkg}

Como exemplo, vamos criar uma jaula baseada nos pacotes instalados no seu slackware. Edite o arquivo \emph{/etc/simplepkg/simplepkg.conf}:

\begin{verbatim}
# /etc/simplepkg/simplepkg.conf
JAIL_ROOT="/vservers" # local onde as jaulas serão criadas
SIMPLARET="simplaret" # programa que baixa os pacotes (pode ser o swaret se voce o tiver)
STORAGE="/var/simplaret" # local onde o swaret armazena seus pacotes
SIMPLARET_CLEAN="1" # apaga o cache de pacotes antes da instalação da jaula
SIMPLARET_DELETE_DOWN="1" # apaga o cache de pacotes após a instalação
SIMPLARET_UPDATE="0" # atualiza as listas de pacotes antes de iniciar a instalação da jaula
SIMPLARET_PURGE_WEEKS="N" # apaga os pacotes mais velhos que N semanas antes de instalar
PATCHES_DIR="/var/simplaret/patches" # local os patches são armazenados
\end{verbatim}

Para definir quais repositórios de pacotes você usará, edite o arquivo \emph{/etc/simplepkg/repos.conf}, colocando algo como

\begin{verbatim}
ROOT-i386="http://slack.midiatatica.org/packages/slackware"
REPOS-i386="slack-midiatatica%http://slack.midiatatica.org/packages/slackware"
ROOT-x86_64-10.2="http://darkstar.ist.utl.pt/pub/slamd64/"
REPOS-x86_64-10.2="slamd-midiatatica%http://slack.midiatatica.org/packages/slamd64"
\end{verbatim}

Se você quer utilizar o swaret em lugar do simplaret, o swaret.conf deve estar bem configurado para que ele seja capaz de baixar e instalar todos os pacotes dos templates. Parâmetros como \emph{EXCLUDE} podem ser um empecilho, e se você os remover da sua instalação tenha muito cuidado ao atualizar o seu sistema via \emph{swaret --upgrade}. A desvantagem de usar o swaret é que você não terá como administrar jaulas e instalações de múltiplas arquiteturas.

Para informações detalhadas sobre o simplaret, consulte seu \link{/node/16}{artigo específico}.

\section{Criando jaulas e replicando instalações}

\begin{verbatim}
templatepkg meu-slackware
mkjail jaula meu-slackware
\end{verbatim}

Isso cria o template \emph{meu-slackware} a partir da sua lista de pacotes em \emph{/var/log/packages} e cria uma nova árvore com esses pacotes na pasta \emph{/vservers/jaula} (dependendo de qual o valor da variável \emph{JAIL\_ROOT} do simplepkg.conf, é claro).

Se você quiser que alguns arquivos de configuração e executar scripts após a instalação dessa jaula, basta colocarmos na pasta \emph{/etc/simplepkg/meu-slackware.d/} os arquivos de configuração (dentro da hierarquia de pastas do sistema, isto é, \emph{/etc/simplepkg/meu-slackware.d/etc/apache/httpd.conf}) e os script em \emph{/etc/simplepkg/meu-slackware.s}. O template \emph{vserver}, que já vem no mkjail, contém um exemplo de script.

Você pode especificar também destinos alternativos para sua jaula, através de um comando do tipo

\begin{verbatim}
ROOT=/mnt mkjail hda2 meu-slackware
\end{verbatim}

O comando acima faz exatamente o que você está pensando: replica sua instalação slackware em \emph{/mnt/hda2}, dispensando totalmente o programa de instalação do slackware!

Caso nenhum template for especificado, o \emph{mkjail} utiliza o template \emph{/etc/simplepkg/default.template}.

Se você manter uma jaula em \emph{JAIL\_ROOT} com o mesmo nome que um template, é possível ainda usar o script \emph{jail-update} para copiar todas as alterações de arquivos da jaula na pasta de arquivos do seu template (\emph{/etc/simplepkg/nome-da-jaula.d}). Assim, basta que você copie todos os arquivos de configuração que você editou para essa pasta e deixar o \emph{jail-update} numa crontab para que você tenha sempre um template atualizado e baseado nas jaulas / instalações que você tem rodando e que estiverem listadas no arquivo \emph{/etc/simplepkg/jailist}:

\begin{verbatim}
jail-update
\end{verbatim}

O \emph{jail-update} considera que o template \emph{main}, caso exista, se refere à instalação principal da sua máquina, isto é, o sistema de você roda. Dessa forma a invocação do \emph{jail-update} atualiza todos os templates cujas jaulas estão em \emph{JAIL\_ROOT} e ainda atualiza o template da instalação principal.

Para adicionar ou remover pacotes de um template, basta editar o arquivo de template. Uma outra forma de adicionar arquivos é usando o \emph{templatepkg} com a opção \emph{-a}, que adiciona apenas novos pacotes ao template. Se você quiser que o \emph{templatepkg} crie um template a partir de uma jaula, simplesmente use

\begin{verbatim}
templatepkg jaula /vservers/jaula
\end{verbatim}

\section{Metapacotes}

Outro uso dos templates é a criação de pacotes: imagine por exemplo a dificuldade de um usuário/a novo de slackware para instalar o cinelerra e todas as suas dependências. Criando um template contendo o nome de todos os pacotes necessários para rodar esse software permite que um usuário instale-o simplesmente com o comando

\begin{verbatim}
metapkg --install cinelerra
\end{verbatim}

O comando sugere uma semelhança com o uso direto do \emph{swaret} ou do \emph{slapt-get}, com a única diferença residindo no modo como cada um desses programas lida com as dependências de um pacote. Os \emph{slapt-get} suporta o arquivo \emph{slack-required}, que pode ou não estar presente no pacote. Já o \emph{swaret} possui uma ferramenta própria para a criação de uma lista de dependências.

O \emph{simplepkg} não pretende substituir esses dois modos de checagem e sim propor uma alternativa de distribuição de pacotes em que as dependências são resolvidas sem precisar de um repositório de dependências ou uma modificação no próprio pacote, que é o caso do \emph{slack-required}, um arquivo que na maioria das vezes não está presente.

A remoção de um aplicativo e todas as suas dependências podem ser feitas simplesmente com o comando

\begin{verbatim}
metapkg --remove cinelerra
\end{verbatim}

\section{Upgrade de jaulas}

O upgrade de jaulas que estejam em \emph{JAIL\_ROOT} pode ser efetuado com o comando \emph{jail-upgrade}. Simplesmente coloque os patches em \emph{PATCHES\_DIR} e dê o comando

\begin{verbatim}
jail-upgrade
\end{verbatim}

Se você quiser atualizar apenas uma das jaulas que estão em \emph{JAIL\_ROOT}, use

\begin{verbatim}
jail-upgrade nome-da-jaula
\end{verbatim}

Para especificar uma pasta contendo patches diferente de \emph{PATCHES\_DIR} (útil quando você possui jaulas com diferentes versões do slackware), simplesmente use

\begin{verbatim}
PATCHES=/local/dos/patches jail-upgrade nome-da-jaula
\end{verbatim}

De modo análogo ao \emph{mkjail}, é possível indicar ao \emph{jail-upgrade} uma outra pasta onde a jaula está armazenada:

\begin{verbatim}
ROOT=/otherroot jail-upgrade
\end{verbatim}

\section{Arquiteturas e versões diferentes}

O \emph{simplepkg} foi idealizado para permitir que um mesmo template possa ser usado para criar jaulas de arquiteturas e versões diferentes de sistemas padrão slackware. A atualização desses sistemas também é unificada. Essa possibilidade só é permitida se você usa o simplaret e não o swaret como ferramenta de obtenção de pacotes.

Por exemplo, para criar uma instalação de slackware 10.1 (assumindo que suas definições de repositórios do \emph{/etc/simplepkg/repos.conf} contenham locais com slack 10.1), basta usar o comando

\begin{verbatim}
VERSION=10.1 mkjail minha-jaula template-servidor
\end{verbatim}

Arquiteturas diferentes também podem ser usadas. Se você está num sistema \emph{x86\_64} e quer instalar um slack 10.2 numa partição, experimente

\begin{verbatim}
ARCH=i386 VERSION=10.2 ROOT=/mnt mkjail hda2 meu-slackware
\end{verbatim}

Note que os templates independem de arquitetura e versão, já que eles só contém nomes de pacotes,
arquivos de configuração e scripts. Por isso, o \emph{templatepkg}, o \emph{metapkg}, o \emph{lspkg} e o \emph{jail-update} funcionam normalmente.

Para atualizar suas jaulas, o \emph{jail-upgrade} checa antes qual a versão e arquitetura de cada uma
de suas jaulas através do \emph{/etc/slackware-version} correspondente e a partir disso aplica os patches da arquitetura e versão da mesma, usando para isso o simplaret (veja a \link{node/16}{documentação própria}).

Desse modo, mesmo que você tenha jaulas de versões e arquiteturas diversas, usar o comando \emph{jail-upgrade} faz a atualização sem problemas, desde que seus patches estejam organizados por arquitetura e versão, conforme é detalhado na \link{/node/16}{documentação do simplaret}.

\section{Aplicativo auxiliar: rebuildpkg}

O simplepkg acompanha ainda um aplicativo auxiliar que ajuda a recuperar pacotes instalados cujo \emph{.tgz} original foi perdido. O comando \emph{rebuildpkg} reconstrói um pacote a partir de uma entrada no \emph{/var/log/packages}. O comando

\begin{verbatim}
rebuildpkg coreutils
\end{verbatim}

reconstrói um pacote do coreutils usando os arquivos e as metainformações listadas no arquivo do \emph{/var/log/packages/} correspondente ao coreutils.

\section{Fonte}

Se você quiser obter diretamente o código-fonte do \emph{simplepkg}, baixe-o do repositório:

\begin{verbatim}
svn checkout svn://slack.midiatatica.org:40/simplepkg
\end{verbatim}

\section{Página de desenvolvimento}

A página do \emph{simplepkg} fica em \link{http://slack.midiatatica.org/wiki/Main/SimplePKG}{http://slack.midiatatica.org/wiki/Main/SimplePKG}.

\end{document}
