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.

[ Hits: 10.967 ]

Por: Slackjeff em 19/02/2020 | Blog: https://slackjeff.com.br


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.

#!/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.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Iniciando
   3. createpkg - Criando um pacote
   4. pkginstall - Instalando um pacote
   5. pkgremove - Removendo um pacote
Outros artigos deste autor

Slackware x Debian

Como ser um expert em GNU/Linux!

Criando um pacote TXZ no Slackware

Boot Seguro LILO

Howto de Compilação com Slackbuilds

Leitura recomendada

A Origem dos Nomes (parte 2)

Introdução ao Arch Build System

GNU/Linux, querido software livre

Sabayon completo, personalizado e portátil, em pendrive de boot

Compilando Apache 2 com PHP, MySQL, mod_perl e mod_ssl

  
Comentários
[1] Comentário enviado por Tio_do_Toldo em 23/02/2020 - 11:06h

Legal.

[2] Comentário enviado por cizordj em 29/02/2020 - 15:23h

Caramba hein, que massa! Nunca entendi como o dpkg do Debian removia os pacotes do sistema e vendo agora o seu shell script dá para entender a lógica disso. E é uma coisa perigosa, o comando rm se for passado o argumento errado já era.

Outra coisa que aprendi também é que #!/bin/sh também interpreta funções.
________________________________________________
O programador tem a mania de achar que tudo é objeto


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts