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

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

Como ser um expert em GNU/Linux!

Slackware x Debian

Boot Seguro LILO

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

Criando um pacote TXZ no Slackware

Leitura recomendada

Trabalhando com datas no Linux

À procura por pacotes em distros Debian-based (Ubuntu, Linux Mint e outras)

Gerenciadores de Pacote e Repositórios

Instalação dual boot com 2 HDs com Windows XP e Ubuntu Linux

Uma análise do software livre e de sua história

  
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