Crie Seu Próprio Gerenciador de Pacotes do Zero - Parte 1
Eu sempre fui curioso em relação às coisas que me interessam, quando iniciei no mundo do GNU/Linux, eu fiquei admirado com a facilidade de instalar programas. No início, rodando entre as distribuições Linux, eu acabei conhecendo vários tipos de gerenciadores de pacotes e cada um com sua peculiaridade. Foi aí que me interessei em ler o código fonte de diversos gerenciadores e criar o meu próprio.
Parte 4: pkginstall - Instalando um pacote
Temos já o nosso pacote criado, mas falta alguma coisa? A instalação, claro. A instalação é muito importante. Fica a critério do instalador fazer o rastreamento/track de toda hierarquia que está sendo instalada. Sem este rastreamento ficaria inviável o gerenciador.
É como instalar com o "make install", este track será importante para a remoção do pacote posteriormente.
No nível a1, o "pkginstall" deverá atender os seguintes requisitos:
Criar o arquivo de rastreamento: fazer pequenas alterações no arquivo de rastreamento
Vamos iniciar nosso script, criamos uma variável chamada "INSTALLED_PKG" e no seu conteúdo deverá ter /var/log/installed. Neste diretório /var/log/installed/ será armazenada a nossa lista de rastreamento dos softwares utilizados para outros processos posteriormente, como remover o pacote.
Criamos uma área de testes! No caso, conferindo se o diretório /var/log/installed existe. Se não existir, deve ser criado.
Em seguida criamos uma função chamada "INSTALL" e um case simples com as opções: "-i|--install|install".
Neste case, na opção "-i|--install|install" deveremos iniciar fazendo um rebaixamento de parâmetro com o shift, após isso, fizemos uma conferencia com o test verificando se o pacote que o usuário está pedindo para instalar existe. Se existir, deve chamar a função INSTALL.
Voltando para a função "INSTALL", vamos começar a preparar nossa função. Estamos passando o nome do pacote para função, a função deve receber o argumento/pacote em uma variável chamada "pkg". Outra variável que devemos iniciar, é a variável "pkg_only_name", esta variável armazenará somente o nome do pacote cortando qualquer extensão. Não esqueça do local para deixar somente local a variável.
Agora que já temos o nome do pacote com extensão e sem, vamos imprimir alguma coisa na tela para o usuário. Outra informação é iniciar o arquivo "pacote.track" em /var/log/installed/pacote.track enviando como comentário o nome do pacote:
Seguindo, vamos fazer a extração do pacote na raiz (/) do sistema utilizando o comando "tar". Mas tem uma diferença, precisamos enviar tudo que está sendo extraído na raiz com o comando "tar" para o arquivo "pacote.track", para isto, use o redirecionamento ">>" que envia a saída de um comando anexando o mesmo sem sobrescrever.
A lista de rastreamento que será criada em /var/log/installed irá ficar com alguns caracteres extras como: ./, /, e linhas em branco! Precisamos apagar tudo isso e deixar somente o que importa, que é a hierarquia do que está sendo instalado.
Vamos usar o comando "sed" para fazer este processo, enviando a sua saída de erros para /dev/null:
Então, pedimos para o sed: substitua "./" por "/"; substitua se existir somente "/" por nada; apague linhas em branco. Em seguida, enviamos uma mensagem para o usuário seguido de um return 0:
Nosso programa deve ficar assim, completo:
Vamos fazer o nosso teste, vamos dar permissão e enviar para /usr/sbin, entrar no diretório /tmp/build/, onde está localizado nosso pacote que criamos com o "createpkg" e executar o "pkginstall" seguido do nome do pacote.
# chmod -v +x pkginstall
mode of 'pkginstall' retained as 0755 (rwxr-xr-x)
# cp pkginstall /usr/sbin/
# cd /tmp/build/
# pkginstall -i nano-4.7.tar.xz
========> Iniciando instalação do pacote nano-4.7.tar.xz
Removendo caracteres desnecessários do arquivo ".track".
Pacote: nano-4.7.tar.xz foi instalado com sucesso.
Vamos, primeiramente, ver se nossa lista de rastreamento foi criada em /var/log/installed/:
# cat /var/log/installed/nano-4.7.track
#PACOTE: nano-4.7
/usr/
/usr/bin/
/usr/bin/rnano
/usr/bin/nano
/usr/share/
/usr/share/info/
/usr/share/info/nano.info
/usr/share/info/dir
/usr/share/locale/
/usr/share/locale/pl/
/usr/share/locale/pl/LC_MESSAGES/
/usr/share/locale/pl/LC_MESSAGES/nano.mo
/usr/share/locale/hr/
/usr/share/locale/hr/LC_MESSAGES/
/usr/share/locale/hr/LC_MESSAGES/nano.mo
/usr/share/locale/da/
/usr/share/locale/da/LC_MESSAGES/
/usr/share/locale/da/LC_MESSAGES/nano.mo
/usr/share/locale/ko/
/usr/share/locale/ko/LC_MESSAGES/
/usr/share/locale/ko/LC_MESSAGES/nano.mo
/usr/share/locale/ga/
/usr/share/locale/ga/LC_MESSAGES/
/usr/share/locale/ga/LC_MESSAGES/nano.mo
/usr/share/locale/fr/
......................
Tudo certo até aqui, será que o editor nano 4.7 está disponível no sistema? Chame em linha de comando nano e veja.
É como instalar com o "make install", este track será importante para a remoção do pacote posteriormente.
No nível a1, o "pkginstall" deverá atender os seguintes requisitos:
Criar o arquivo de rastreamento: fazer pequenas alterações no arquivo de rastreamento
Vamos iniciar nosso script, criamos uma variável chamada "INSTALLED_PKG" e no seu conteúdo deverá ter /var/log/installed. Neste diretório /var/log/installed/ será armazenada a nossa lista de rastreamento dos softwares utilizados para outros processos posteriormente, como remover o pacote.
#!/bin/sh #==============================HEADER================================| #AUTOR # Jefferson 'Slackjeff' Rocha # #VERSÃO # 0.1 # #DESCRIÇÃO #pkginstall - Instala pacotes gerado com o createpkg e gera uma lista # de rastreamento em /var/log/installed/PKG.track #====================================================================| set -e #======================== CONFIGURAÇÕES INSTALLED_PKG="/var/log/installed"
Criamos uma área de testes! No caso, conferindo se o diretório /var/log/installed existe. Se não existir, deve ser criado.
#======================== TESTES [ ! -d $INSTALLED_PKG ] && mkdir $INSTALLED_PKG
Em seguida criamos uma função chamada "INSTALL" e um case simples com as opções: "-i|--install|install".
Neste case, na opção "-i|--install|install" deveremos iniciar fazendo um rebaixamento de parâmetro com o shift, após isso, fizemos uma conferencia com o test verificando se o pacote que o usuário está pedindo para instalar existe. Se existir, deve chamar a função INSTALL.
INSTALL()
{
}
#======================== INICIO
case $1 in
-i|--install|install)
shift # Rebaixando parâmetro.
# Se o arquivo existir chem a função INSTALL com o nome do pacote.
[ -e "$1" ] && INSTALL "$1"
;;
*) echo "Opções disponiveis: -i|--install|install" ;;
esac
Voltando para a função "INSTALL", vamos começar a preparar nossa função. Estamos passando o nome do pacote para função, a função deve receber o argumento/pacote em uma variável chamada "pkg". Outra variável que devemos iniciar, é a variável "pkg_only_name", esta variável armazenará somente o nome do pacote cortando qualquer extensão. Não esqueça do local para deixar somente local a variável.
INSTALL()
{
# Nome do pacote completo com extensão
local pkg="$1"
# Nome do pacote sem extensão .tar.xz
local pkg_only_name="${pkg//.tar.xz/}"
Agora que já temos o nome do pacote com extensão e sem, vamos imprimir alguma coisa na tela para o usuário. Outra informação é iniciar o arquivo "pacote.track" em /var/log/installed/pacote.track enviando como comentário o nome do pacote:
# Informação para o usuário.
echo "========> Iniciando instalação do pacote ${pkg}"
# Criando arquivo .track e enviando nome do pacote como comentário.
echo "#PACOTE: ${pkg_only_name}" > "${INSTALLED_PKG}/${pkg_only_name}.track"
echo
Seguindo, vamos fazer a extração do pacote na raiz (/) do sistema utilizando o comando "tar". Mas tem uma diferença, precisamos enviar tudo que está sendo extraído na raiz com o comando "tar" para o arquivo "pacote.track", para isto, use o redirecionamento ">>" que envia a saída de um comando anexando o mesmo sem sobrescrever.
# Fazendo extração do pacote e enviando a lista do que está sendo instalado
# para o arquivo .track
tar xvf ${pkg} -C / >> "${INSTALLED_PKG}/${pkg_only_name}.track"
A lista de rastreamento que será criada em /var/log/installed irá ficar com alguns caracteres extras como: ./, /, e linhas em branco! Precisamos apagar tudo isso e deixar somente o que importa, que é a hierarquia do que está sendo instalado.
Vamos usar o comando "sed" para fazer este processo, enviando a sua saída de erros para /dev/null:
echo "Removendo caracteres desnecessários do arquivo .track"
# Removendo alguns caracteres não importantes! e que podem resultar em falhas.
sed -i 's/\.\//\//g; s/^\/$//; /^$/d' "${INSTALLED_PKG}/${pkg_only_name}.track" 2>/dev/null
Então, pedimos para o sed: substitua "./" por "/"; substitua se existir somente "/" por nada; apague linhas em branco. Em seguida, enviamos uma mensagem para o usuário seguido de um return 0:
echo "Pacote: $pkg foi instalado com sucesso." return 0
Nosso programa deve ficar assim, completo:
#!/bin/sh
#==============================HEADER================================|
#AUTOR
# Jefferson 'Slackjeff' Rocha
#
#VERSÃO
# 0.1
#
#DESCRIÇÃO
#pkginstall - Instala pacotes gerado com o createpkg e gera uma lista
# de rastreamento em /var/log/installed/PKG.track
#====================================================================|
set -e
#======================== CONFIGURAÇÕES
INSTALLED_PKG="/var/log/installed/"
#======================== TESTES
[ ! -d $INSTALLED_PKG ] && mkdir $INSTALLED_PKG
#======================== FUNÇÕES
INSTALL()
{
# Nome do pacote completo com extensão
local pkg="$1"
# Nome do pacote sem extensão .tar.xz
local pkg_only_name="${pkg//.tar.xz/}"
# Informação para o usuário.
echo"========> Iniciando instalação do pacote ${pkg}"
# Criando arquivo .track e enviando nome do pacote como comentário.
echo "#PACOTE: ${pkg_only_name}" > "${INSTALLED_PKG}/${pkg_only_name}.track"
echo
# Fazendo extração do pacote e enviando a lista do que está sendo instalado
# para o arquivo .track
tar xvf ${pkg} -C / >> "${INSTALLED_PKG}/${pkg_only_name}.track"
echo "Removendo caracteres desnecessários do arquivo .track"
# Removendo alguns caracteres não importantes! e que podem resultar em falhas.
sed -i 's/\.\//\//g; s/^\/$//; /^$/d' "${INSTALLED_PKG}/${pkg_only_name}.track" 2>/dev/null
echo "Pacote: $pkg foi instalado com sucesso."
return 0
}
#======================== INICIO
case $1 in
-i|--install|install)
shift # Rebaixando parâmetro.
# Se o arquivo existir chem a função INSTALL com o nome do pacote.
[ -e "$1" ] && INSTALL "$1"
;;
*) echo "Opções disponiveis: -i|--install|install" ;;
esac
Vamos fazer o nosso teste, vamos dar permissão e enviar para /usr/sbin, entrar no diretório /tmp/build/, onde está localizado nosso pacote que criamos com o "createpkg" e executar o "pkginstall" seguido do nome do pacote.
# chmod -v +x pkginstall
mode of 'pkginstall' retained as 0755 (rwxr-xr-x)
# cp pkginstall /usr/sbin/
# cd /tmp/build/
# pkginstall -i nano-4.7.tar.xz
========> Iniciando instalação do pacote nano-4.7.tar.xz
Removendo caracteres desnecessários do arquivo ".track".
Pacote: nano-4.7.tar.xz foi instalado com sucesso.
Vamos, primeiramente, ver se nossa lista de rastreamento foi criada em /var/log/installed/:
# cat /var/log/installed/nano-4.7.track
#PACOTE: nano-4.7
/usr/
/usr/bin/
/usr/bin/rnano
/usr/bin/nano
/usr/share/
/usr/share/info/
/usr/share/info/nano.info
/usr/share/info/dir
/usr/share/locale/
/usr/share/locale/pl/
/usr/share/locale/pl/LC_MESSAGES/
/usr/share/locale/pl/LC_MESSAGES/nano.mo
/usr/share/locale/hr/
/usr/share/locale/hr/LC_MESSAGES/
/usr/share/locale/hr/LC_MESSAGES/nano.mo
/usr/share/locale/da/
/usr/share/locale/da/LC_MESSAGES/
/usr/share/locale/da/LC_MESSAGES/nano.mo
/usr/share/locale/ko/
/usr/share/locale/ko/LC_MESSAGES/
/usr/share/locale/ko/LC_MESSAGES/nano.mo
/usr/share/locale/ga/
/usr/share/locale/ga/LC_MESSAGES/
/usr/share/locale/ga/LC_MESSAGES/nano.mo
/usr/share/locale/fr/
......................
Tudo certo até aqui, será que o editor nano 4.7 está disponível no sistema? Chame em linha de comando nano e veja.