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.935 ]

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

Boot Seguro LILO

Programar em Shell - Script só para os baixinhos

Compilação do Kernel Linux para máquinas locais Debian

Descartando Séries no Slackware não tão Necessárias

Howto de Compilação com Slackbuilds

Leitura recomendada

Linux, aí vamos nós!

DebEX - Debian 10 com o Budgie Desktop 10.5 e Linux Kernel 5.7

FAI (Fully Automatic Installation)

Formatar para Linux

Apresentando Cinnamon

  
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