Criar pacotes .deb apartir de script
Publicado por Raimundo Alves Portela (última atualização em 17/07/2011)
[ Hits: 6.546 ]
Homepage: http://portelanet.com
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 :-)
#!/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
POSTFIX AUTOMÁTICO COM MYSQL E IPTABLES - BLOQUEAR IP
conssh.sh - Frontend para SSH via proxy HTTP
Pequeno sistema de backup (Rsync + SAMBA + Tar + FTP)
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
SysAdmin ou DevOps: Qual curso inicial pra essa área? (0)
Melhores Práticas de Nomenclatura: Pastas, Arquivos e Código (3)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta