Criar pacotes .deb apartir de script

Publicado por Raimundo Alves Portela (última atualização em 17/07/2011)

[ Hits: 6.429 ]

Homepage: http://portelanet.com

Download debfacil.deb




Olá pessoal, desenvolvi para minhas atividades um programa em shell-script para automatizar a criação dos pacotes .deb, fiz uma adaptação nele para poder torná-lo o mais genérico possível, na intenção de disponibilizar para a comunidade, e eis que posto-o aqui.

Exemplo de uso:
Abra um terminal, navegue até o diretório onde está o diretório do seu script e digite:

$ debfacil diretorio_do_seu_script

Prontinho, se você tiver colocado seu script dentro do diretório informado, ele automaticamente irá criar a estrutura de um pacote .deb e vai lhe fazer algumas perguntas para defini-lo.

Funcionalidades:
- Cria um pacote .deb;
- Possibilita criar um atalho no menu do Gnome;

Espero que gostem, assim como eu :-)

  



Esconder código-fonte

#!/bin/bash
# Aplicativo: debfacil
# Criado em: 15/06/2011
# Descrição: Automatiza a construção do pacote .deb
# Autor: Raimundo Portela <rai3mb@gmail.com>
# -----------------------------------------------------------------------------
# Descrição detalhada do funcionamento:
# Para usar o programa basta chamálo na linha de comando seguido do nome do
# do diretório a ser um pacote .deb
# sintaxe de uso: debfacil diretorio_do_script_candidato_a_pacote
# -----------------------------------------------------------------------------
# Histórico de Mudanças: -> Disponível no arquivo CHANGELOG
# 
# Licença (copyrght): GPL.
#

# verifica se foi informado o parametro
[ -z "$1" ] &&   echo 'Você deve informar o diretório do pacote' && exit

# verifica se o parametro informado é um diretório 
! [ $? -eq 1 ] &&   echo "$1:não é um diretório" && exit

PACOTE="$1"

func_banner(){
clear
echo "======================================================="
echo "Bem vim do ao gerador de pacotes .deb debfacil v.1.0"
echo "-------------------------------------------------------"
echo
}
func_banner

# Cria a estrutura de diretório do pacote
mv "$PACOTE" "$PACOTE"_temp 2> /dev/null
mkdir -p "$PACOTE/opt/$PACOTE" 2> /dev/null
if [ "$?" -eq 1 ]; then
   echo "Não foi possível definir a estrutura $PACOTE"/opt/"$PACOTE"
   exit
fi

mv "$PACOTE"_temp "$PACOTE/opt" 2> /dev/null
mv "$PACOTE/opt/$PACOTE"_temp/* "$PACOTE/opt/$PACOTE" 2> /dev/null
rm  -rf "$PACOTE/opt/$PACOTE"_temp

#usado para não perder a referência do diretório inicial
FONTE=$(pwd)

cd "$FONTE/$PACOTE/opt/$PACOTE"

# pega o PACOTE da versão direto do arquivo CHANGELOG
# ou seja, obriga o programador a registrar as versões no CHANGELOG
# caso não exista o arquivo, criamos um.
! [ -f CHANGELOG ] && touch CHANGELOG

func_Especifica_Versao() {
   clear
   func_banner
   echo "----CONFIGURANDO O ARQUIVO CHANGELOG----"
   echo
   echo "Defina qual a versão do seu programa [$PACOTE], usando números: (0.1)"
   read VERSAO
   [ -z "$VERSAO" ] && VERSAO="0.1"
   echo "Quem Desenvolveu esta versão: ($(whoami))"
   read NOME
   [ -z "$NOME" ] && NOME=$(whoami)
   echo "Desenvolvido em que data: ($(date +%d%m%Y))"
   read DATA
   [ -z "$DATA" ] && DATA=$(date +%d%m%Y)
   echo "Uma rápida descrição sobre essa versão deste pacote"
   read DESCRICAO
   
   echo "# Versão-$VERSAO" > CHANGELOG
   echo "Desenvolvido por:$NOME" >> CHANGELOG
   echo "Desenvolvido em:$DATA" >> CHANGELOG
   echo "Descrição:$DESCRICAO" >> CHANGELOG
}

! egrep '^# Versão-' CHANGELOG > /dev/null && func_Especifica_Versao

echo "Identificado o arquivo [CHANGELOG]"
VERSAO=$(egrep '^# Versão-*' CHANGELOG | tail -1 | cut -d'-' -f 2)
echo "Identificado a versão de [$PACOTE], como: [$VERSAO]"
sleep 2

func_Especifica_Control() {
   cd "$FONTE/$PACOTE"
   # criando o arquivo control
   rm DEBIAN/control 2> /dev/null
   touch DEBIAN/control

   #tamanho do diretório em Kb
   DELIMIT=$(echo "$PACOTE" | cut --bytes=1-1)
   cd opt
   TAMANHO=$(du "$PACOTE" | tail -1 | cut -d"$DELIMIT" -f 1)
   cd ..

   # coleta parametros para o arquivo control
   echo "Package:$PACOTE" > DEBIAN/control
   echo "Version:$VERSAO" >> DEBIAN/control
   echo "Architecture:all" >> DEBIAN/control
   echo "Installed-Size:$TAMANHO" >> DEBIAN/control
   NOME=$(egrep '^Desenvolvido por' opt/"$PACOTE"/CHANGELOG | tail -1 | cut -d':' -f 2)
   echo "Maintainer: $NOME" >> DEBIAN/control
   echo "Section:gnome" >> DEBIAN/control
   echo "Priority:optional" >> DEBIAN/control
   echo "Description: . $DESCRICAO" >> DEBIAN/control
}
#volta para a raiz do pacote
cd "$FONTE/$PACOTE"

mkdir DEBIAN 2> /dev/null
! egrep '^Package:.*' DEBIAN/control 2> /dev/null && func_Especifica_Control

func_START()
{
   func_banner
   
   #volta para a pasta raiz do pacote
   cd "$FONTE/$PACOTE/opt/$PACOTE"
   echo "Quais desses arquivos inicia a execução do seu programa(pacote):"
   echo
   ls -1
   echo
   echo "Escreva o nome completo dele:"
   read START
   
   #verifica se o arquivo existe
   ! [ -f "$START" ] && \
   echo "Arquivo [$START] não existe no diretório do PACOTE [$PACOTE]" \
   && sleep 2 && func_START
      
   # se o arquivo não for executável, torna-o
   ! [ -x "$START" ] && chmod +x "$START"
}
func_START
   
# criar menu
echo
echo "Deseja criar atalho no menu do Gnome para o pacote [$PACOTE] (S/n):"
read RESP
[ -z "$RESP" ] || [ "$RESP" = "S" ] && RESP="s"

func_Cria_Menu() {
   
   func_banner
   
   if [ "$RESP" = "s" ]; then
   mkdir -p "$FONTE/$PACOTE/usr/share/menu" 2> /dev/null
   cd "$FONTE/$PACOTE/usr/share/menu"
   
   echo "----CONTRUINDO O ATALHO DE MENU (GNOME)----"
   echo
   echo "Escolha a categoria da sua Aplicação:"
   echo 
   echo "1 - AudioVideo : Áudio/Vídeo"
   echo "2 - Development : Desenvolvimento"   
   echo "3 - Education   : Educacional"
   echo "4 - Game : Jogo"
   echo "5 - Graphics : Gráficos";
   echo "6 - Network : Rede/Internet";
   echo "7 - Office : Escritório";
   echo "8 - System : Ferramenta de Sisema";
   echo "9 - Utility : Utilitários (padrão)";
   echo "10 - Settings : Configurações do Sistema [Sistema -> Preferências]"

   echo
   echo "Escolha o número (9):"
   read MENU
   [ -z "$MENU" ] && MENU="9"
   
   case "$MENU" in
      1) SUBMENU="AudioVideo" ;;
      2) SUBMENU="Development" ;;
      3) SUBMENU="Education" ;;
      4) SUBMENU="Game" ;;
      5) SUBMENU="Graphics" ;;
      6) SUBMENU="Network" ;;
      7) SUBMENU="Office" ;;
      10) SUBMENU="Settings" ;;
      8) SUBMENU="System" ;;
      9) SUBMENU="Utility" ;;
      *) echo "Opção [$MENU] inválida!" && sleep 2
         func_Cria_Menu
         ;;
   esac
   
   echo "package=$PACOTE:\\" > "$PACOTE"
   echo "needs='X11'\\" >> "$PACOTE"
   echo "section='Applications/$SUBMENU/'\\" >> "$PACOTE"
   echo "title='$PACOTE'\\" >> "$PACOTE"
   echo "command='/opt/$PACOTE/$START'\\" >> "$PACOTE"
   echo "icon=''" >> "$PACOTE"
   
   mkdir -p "$FONTE/$PACOTE/usr/share/applications" 2> /dev/null
   cd "$FONTE/$PACOTE/usr/share/applications"

   echo "[Desktop Entry]" > "$PACOTE.desktop"
   echo "Name=$PACOTE" >> "$PACOTE.desktop"
   
   echo "Escreva um comentário para aparecer sobre a entrada no menu"
   read COMENTARIO
   [ -z "$COMENTARIO" ] && COMENTARIO="$PACOTE"

   echo "Comment=$COMENTARIO" >> "$PACOTE.desktop"
   echo "Exec=/opt/$PACOTE/$START" >> "$PACOTE.desktop"
   echo "Icon=$PACOTE" >> "$PACOTE.desktop"
   echo "Terminal=true" >> "$PACOTE.desktop"
   echo "Type=Application" >> "$PACOTE.desktop"
   echo "StartupNotify=true" >> "$PACOTE.desktop"
   echo "Categories=GNOME;GTK;$SUBMENU;" >> "$PACOTE.desktop"
   echo "X-GNOME-Gettext-Domain=$PACOTE" >> "$PACOTE.desktop"
   echo "Name[en_US]=$PACOTE" >> "$PACOTE.desktop"
   echo "Name[pt_BR]=$PACOTE" >> "$PACOTE.desktop"

   #ajustando o ícone
   cd "$FONTE/$PACOTE"
   cp -r "/opt/debfacil/usr" .
   cd "$FONTE/$PACOTE/usr/share/pixmaps"
   mv debfacil.svg "$PACOTE.svg"
   
fi
}
func_Cria_Menu

mkdir -p "$FONTE/$PACOTE/usr/bin" 2> /dev/null
cd "$FONTE/$PACOTE/usr/bin"
echo "#!/bin/bash" > "$PACOTE"
echo "/opt/$PACOTE/$START" >> "$PACOTE"
chmod +x "$PACOTE"

cd "$FONTE"

# cria o pacote deb

func_banner

NOVONOME=$(sudo dpkg -b "$PACOTE" .)
NOVONOME=$(echo $NOVONOME | cut -d'/' -f 2 | cut -d"'" -f 1)

echo "O pacote $NOVONOME foi criado com sucesso"
echo
echo "Já deseja fazer a instalação dele? (s/N):"
read RESP
[ -z "$RESP" ] || [ "$RESP" = "N" ] && RESP="n"
if ! [ "$RESP" = "n" ]; then
   if [ "$USER" = "root" ]; then
      dpkg -i "$NOVONOME"
   else
      sudo dpkg -i "$NOVONOME"
   fi
else
   echo
   echo "Se quiser instalar, use o comando:"
   echo "dpkg -i $NOVONOME"
fi
echo
#.EOF

Scripts recomendados

Atualizando páginas automaticamente com Lynx

Trocar string A por string B em vários arquivos

LinuxMint-19.03 After Install

Script Para reiniciar o Debian

Restaurar backup de uma conta cpanel mesmo que ela já exista


  

Comentários
[1] Comentário enviado por removido em 26/09/2011 - 01:02h

muito bom

[2] Comentário enviado por robertobrandao em 01/12/2013 - 13:23h

amigo parabéns pelo script, gostei muito tem como melhorar ele pedindo informar qual o icone da aplicação?

[3] Comentário enviado por rai3mb em 11/06/2014 - 18:34h

Tem sim, bastaria colocar o ícone informado no diretório correspondente: app/opt/app/usr/share/icons.

Qualquer dia reviso ele e acrescento outras melhorias, no momento estou focado em outras coisas.

Att,
rai3mb


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts