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

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


createpkg - Criando um pacote



O primeiro processo a ser feito, é criar um script para empacotar o nosso software já compilado/estruturado. Nesta primeira versão, ele não fará nada além de empacotar e fazer pequenos ajustes.

No nível a1, o createpkg deverá atender os seguintes requisitos:

Gerar o pacote um diretório acima: iniciamos nosso programa com a SHEBANG e alguns dados, como autor, versão e descrição, logo após isso, utilizamos o "set -e" para o programa parar se o status de qualquer comando for diferente de 0, ou seja erros.

Em seguida, crie uma função chamada CREATE, ela será encarregada de fazer todo o processo de montagem do pacote:

#!/bin/sh
#=========================HEADER===============================|
#AUTOR:
# Jefferson Rocha
#
#VERSÃO:
# 0.1
#
#DESCRIÇÃO:
#createpkg - cria pacotes compactador com tar e comprimido
#            com o utilitário xz.
#==============================================================|
# Erros? pare.
set -e

#==========================| FUNÇÕES
CREATE()
{
}

O segundo passo, é criar um case passando o primeiro argumento em linha, ou seja, o primeiro parâmetro posicional $1. Em seguida, criamos as opção para o case: "-c|--create|create" e rebaixamos um parâmetro com shift.

Logo após, fizemos a conferência se o próximo parâmetro é nulo, se for, devemos abortar pois o usuário não passou o nome do pacote, se não a FUNÇÃO CREATE deve ser chamada com o nome do pacote.

#==========================| INICIO
case $1 in
   -c|--create|create)
      shift # Rebaixando um parâmetro posicional.

      # O usuário passou o nome do pacote? exemplo dialog-teste.tar.xz
      if [ -z "$1" ]; then
         echo "Você deve especificar o nome do pacote."
         exit 1
      fi

      # Chamando a função CREATE e passando como parâmetro o nome do pacote.
      CREATE "$1"
   ;;
esac

Voltando à função CREATE, vamos preencher com alguns dados. O primeiro passo é ter uma variável para receber o parâmetro que enviamos para função. O nome da função será PKG, não esqueça de adicionar local na frente da variável para ficar somente local.

CREATE()
{
   # Recebendo o nome do pacote passado para a função.
   local PKG="$1"
Vamos fazer o empacotamento com o tar e comprimindo com o xz todo o diretório e gerar o "pacote" um diretório acima.

# Empacotando todo o diretório e gerando o pacote
# um diretório acima.
tar -cvJf ../${PKG} .
echo "O pacote ${PKG} foi gerado com sucesso."
return 0
}

Feito isto, já temos um empacotamento básico! Perceba que o programa não faz quase nenhum tipo de conferência e existe MUITO para adicionar para ficar funcional no dia-dia. Este processo será descrito na N-a2, aonde aprimoramos nosso software de uma maneira aonde poderemos usar no dia-dia.

O nosso programa deve ficar assim, por completo:

#!/bin/sh
#=========================HEADER===============================|
#AUTOR:
# Jefferson Rocha
#
#VERSÃO:
# 0.1
#
#DESCRIÇÃO:
#createpkg - cria pacotes compactador com tar e comprimido
#            com o utilitário xz.
#==============================================================|
# Erros? pare.
set -e

#==========================| FUNÇÕES
CREATE()
{
   # Recebendo o nome do pacote passado para a função.
   local PKG="$1"

   # Empacotando todo o diretório e gerando o pacote
   # um diretório acima.
   tar -cvJf ../${PKG} .
   echo
   echo "O pacote ${PKG} foi gerado com sucesso."
   return 0
}

#==========================| INICIO
case $1 in
   -c|--create|create)
      shift # Rebaixando um parâmetro posicional.

      # O usuário passou o nome do pacote? exemplo dialog-teste.tar.xz
      if [ -z "$1" ]; then
         echo "Você deve especificar o nome do pacote."
         exit 1
      fi

      # Chamando a função CREATE e passando como parâmetro o nome do pacote.
      CREATE1 "$1"
   ;;
esac

Entre como root, dê permissão de execução para o "createpkg" e envie o programa para /usr/sbin, onde nosso programa administrativo deve ficar, assim somente o usuário root pode executar:

# ls
createpkg

# chmod -v +x createpkg
mode of 'createpkg' retained as 0755 (rwxr-xr-x)

# cp -v createpkg /usr/sbin/
'createpkg' -> '/usr/sbin/createpkg'

Após isso, entre até o diretório aonde fizemos o Fakeroot do nano. Lembra que fizemos em /tmp/build/nano-4.7? É neste diretório que devemos entrar e executar o "createpkg" com os devidos parâmetros, no caso -c, --create ou create.

# cd /tmp/build/nano-4.7/
# ls
usr

# createpkg -c nano-4.7.tar.xz
./
./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
..............


O pacote "nano-4.7.tar.xz" foi gerado com sucesso em "../nano-4.7.tar.xz". Vamos retornar um diretório acima e veremos que o pacote foi gerado:

# cd ..
# ls
nano-4.7  nano-4.7.tar.xz

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

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

Howto de Compilação com Slackbuilds

Criando um pacote TXZ no Slackware

Como ser um expert em GNU/Linux!

Programas em Modo Texto (on Shell)

Leitura recomendada

Como ser um expert em GNU/Linux!

Conceitos sobre o X-Window

Guia pós-instalação do Slackware - edição 2013

Virtualização dos sistemas operacionais: CentOS, Debian, Slackware e Ubuntu

Palavras, expressões e celebridades do mundo do software livre

  
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