Criar pacotes .deb apartir de script

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

[ Hits: 6.085 ]

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 <[email protected]>
# -----------------------------------------------------------------------------
# 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

Captura ip estatico !!

Criar gráficos, estatística da "Google-Scholar" usando wget

Criando Boot pelo USB para o VirtualBox no Linux KDu5

Criar usuários com ponto (nome.usuario) no Slackware

Script p/ instalar modem onboards


  

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