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 3: 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:
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.
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.
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:
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
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