Script para criação de pacote rpm.

Publicado por Jeferson Alberi da Silva 10/01/2006

[ Hits: 5.620 ]

Download createSpec.sh




Shell script para criação de pacotes rpm de forma simples. Este cript cria o arquivo fonte .tar.gz e arquivo .spec dos arquivos informados. Para maiores informações consulte o help do mesmo.

  



Esconder código-fonte

#!/bin/bash

# Jeferson A SILVA
# 20/12/2005

# Declara variáveis do script
VERSION_SCRIPT="1.0"
FTXTTMP="files.txt"
FSPECTMP="template.spec"
# Caminho do diretório com a estrutura para geração de pacotes rpm.
RPMPATH="/usr/src/RPM"
SUMMARY=""
NAME=""
VERSION=""
RELEASE="wsb"
LICENSE="GPL"
GROUP="System WSB"
BUILDARCHITECTURES="noarch"
BUILDREQUIRES="bash"
REQUIRES="bash"
PACKAGER="Jeferson A SILVA <jasilva_cwb@yahoo.com.br>"
DESCRIPTION=""
FILES=""
DATE=`LC_TIME= LANG=en date +%a" "%b" "%d" "%Y`

Usage(){
   echo "$0, version ${VERSION_SCRIPT}"
   echo "Copyright (C) 2005-2005, Jeferson A SILVA <jasilva_cwb@yahoo.com.br>"
   echo ""
   echo "Este programa é um software livre;  você pode redistribuilo e/ou modificá-lo"
   echo "sob os termos da licença GNU conforme publicado pela mesma; versão 2 da licença,"
   echo "ou alguma versão mais antiga."
   echo ""
   echo -e "Usage:"
   echo -e "\t$0 [options]"
   echo ""
   echo -e "General Options:"
   echo -e "\t--summary\t\t- Obrigatório - Sumário do pacote."
   echo -e "\t--name\t\t\t- Obrigatório - Nome do pacote."
   echo -e "\t--version\t\t- Obrigatório - Versão do pacote."
   echo -e "\t--release\t\t- Release do pacote."
   echo -e "\t--license\t\t- Tipo de licença do pacote (padrão GPL)."
   echo -e "\t--group\t\t\t- Grupo a qual o pacote pertence (System WSB)."
   echo -e "\t--buildarchitectures\t- Arquitetura para qual o pacote esta sendo criado (padrão noarch)."
   echo -e "\t--buildrequires\t\t- Requerimentos para configuração do pacote (padrão apenas o bash)."
   echo -e "\t--requires\t\t- Requerimento para instalação do pacote (padrão apenas o bash)."
   echo -e "\t--packager\t\t- Criador do pacote. Composto por nome <e-mail>"
   echo -e "\t\t\t\t(padrão: Jeferson A SILVA <jasilva_cwb@yahoo.com.br>)."
   echo -e "\t--description\t\t- Obrigatório - Descrição do pacote."
   echo -e "\t--files\t\t\t- Lista dos arquivos que deve ser adicionados ao pacte"
   echo -e "\t\t\t\tse o mesmo não for informado é assumido que o pacote é composto apenas pelos arquivos"
   echo -e "\t\t\t\tque se encontram no diretório cujo o nome é composto pelos parametro --name --version"
   echo -e "\t\t\t\tno diretório atual."
   echo ""
   echo -e "Example:"
   echo -e "\t$0 --summary=\"Pacote criado como exemplo\" --name=\"wasabi\" --version=\"1.0\" --description=\"Exemplo de criação de pacote pelo script\""
   echo -e "\t$0 --summary=\"Pacote criado como exemplo\" --name=wasabi --version=1.0 --description=\"Exemplo de criação de pacote pelo script\""
   echo -e "\t$0 --summary \"Pacote criado como exemplo\" --name wasabi --version 1.0 --description \"Exemplo de criação de pacote pelo script\""
   exit 0
}

CopyFiles(){
   mkdir -p ${PWD}/${NAME}-${VERSION}
   if [ ! -z "${FILES}" ]
   then
      (tar cvf - ${FILES} | tar xvf - -C ${PWD}/${NAME}-${VERSION}) >/dev/null 2>&1
   fi
}

while [ $# -gt 0 ]
do
   case $1 in
      --summary*)
         if echo $1 | grep -q '=' >/dev/null
         then
            SUMMARY=`echo $1 | sed 's/^--summary=//'`
         else
            SUMMARY=$2
            shift
         fi
         ;;
      --name*)
         if echo $1 | grep -q '=' >/dev/null
         then
            NAME=`echo $1 | sed 's/^--name=//'`
         else
            NAME=$2
            shift
         fi
         ;;
      --version*)
         if echo $1 | grep -q '=' >/dev/null
         then
            VERSION=`echo $1 | sed 's/^--version=//'`
         else
            VERSION=$2
            shift
         fi
         ;;
      --release*)
         if echo $1 | grep -q '=' >/dev/null
         then
            RELEASE=`echo $1 | sed 's/^--release=//'`
         else
            RELEASE=$2
            shift
         fi
         ;;
      --license*)
         if echo $1 | grep -q '=' >/dev/null
         then
            LICENSE=`echo $1 | sed 's/^--license=//'`
         else
            LICENSE=$2
            shift
         fi
         ;;
      --group*)
         if echo $1 | grep -q '=' >/dev/null
         then
            GROUP=`echo $1 | sed 's/^--group=//'`
         else
            GROUP=$2
            shift
         fi
         ;;
      --buildarchitectures*)
         if echo $1 | grep -q '=' >/dev/null
         then
            BUILDARCHITECTURES=`echo $1 | sed 's/^--buildarchitectures=//'`
         else
            BUILDARCHITECTURES=$2
            shift
         fi
         ;;
      --buildrequires*)
         if echo $1 | grep -q '=' >/dev/null
         then
            BUILDREQUIRES=`echo $1 | sed 's/^--buildrequires=//'`
         else
            BUILDREQUIRES=$2
            shift
         fi
         ;;
      --requires*)
         if echo $1 | grep -q '=' >/dev/null
         then
            REQUIRES=`echo $1 | sed 's/^--requires=//'`
         else
            REQUIRES=$2
            shift
         fi
         ;;
      --packager*)
         if echo $1 | grep -q '=' >/dev/null
         then
            PACKAGER=`echo $1 | sed 's/^--packager=//'`
         else
            PACKAGER=$2
            shift
         fi
         ;;
      --description*)
         if echo $1 | grep -q '=' >/dev/null
         then
            DESCRIPTION=`echo $1 | sed 's/^--description=//'`
         else
            DESCRIPTION=$2
            shift
         fi
         ;;
      --files*)
         if echo $1 | grep -q '=' >/dev/null
         then
            FILES=`echo $1 | sed 's/^--files=//'`
         else
            FILES=$2
            shift
         fi
         ;;
      --help|-help|--h|--info|-info)
         Usage
         ;;
      *)
         echo "Opcao invalida utilizada na funcao $(basename $0) - $1"
         Usage
         ;;
   esac
   shift
done

if [ -z "$SUMMARY" ] | [ -z "$NAME" ] | [ -z "$VERSION" ] | [ -z "$DESCRIPTION" ]
then
   Usage
   exit 0
fi

if [ ! -z "${FILES}" ]
then
   CopyFiles
fi

# Cria o arquivo temporario com a lista dos diretorios e arquivos do pacote
cd ${NAME}-${VERSION}
tar cvf /dev/null * 1>../$FTXTTMP
cd ..

# Executa a compactacao do pacote com tar+gzip ".tar.gz"
tar zcvf ${NAME}-${VERSION}-${RELEASE}.tar.gz ${NAME}-${VERSION} 1>/dev/null

# Cria o arquivo .spec
cat > $FSPECTMP <<EOF1
Summary: ${SUMMARY}
Name: ${NAME}
Version: ${VERSION}
Release: ${RELEASE}
License: ${LICENSE}
Group: ${GROUP}
Source: %{name}-%{version}-%{release}.tar.gz
BuildArchitectures: ${BUILDARCHITECTURES}
BuildRoot: /var/tmp/%{NAME}-%{RELEASE}/
BuildRequires: ${REQUIRES}
Requires: ${REQUIRES}
Packager: ${PACKAGER}

#Comandos para executar antes da instalacao nesta secao que contem instrucoes para
#descompactar e preparar os arquivos fonte para construcao/compilacao.
%prep
#if [ "\$1" = "1" ]; then
#   echo "antes de instalar pela 1a vez (-i)..."
#elif [ "\$1" = "2" ]; then
#   echo "antes de instar a nova versao (-U)..."
#fi
%setup -q -n %{name}-%{version}

#Descricao do pacote, nesta secao do arquivo spec que se inclui um resumo sobre o que e o
#pacote (o que fazem/sao os programas presentes dentro dele). Um arquivo
#spec pode ter varias secoes "%description", um para cada lingua em que o
#resumo esta, sendo especificado a linguagem com a opcao "-l"
%description -l pt_BR
${DESCRIPTION}

#Buid nesta secao que contem instrucoes para construir e compilar os arquivos do
#programa que sera empacotado, como configure, make.
%build

#Comandos de instalacao, nesta secao que contem instrucoes para instalar o pacote,
#usualmente um make install, so que ao inves de instalar o pacote no sistema o mesmo
#deve ser instalado no diretorio apontado por BuildRoot.
%install
rm -rf \$RPM_BUILD_ROOT
mkdir -p \$RPM_BUILD_ROOT

EOF1

for LINE in `cat $FTXTTMP`
do

if [ ! -z `echo $LINE | grep /$` ] ; then
   echo "install -m 755 -d \$RPM_BUILD_ROOT/`echo $LINE | grep /$`" >> $FSPECTMP
elif [ ! -z `echo $LINE | grep -v /$` ] ; then
   echo "cp -dp $LINE \$RPM_BUILD_ROOT/$LINE" >> $FSPECTMP
fi

done

cat >> $FSPECTMP <<EOF2

#Diretorios e arquivos do pacote sao especificados como arquivos gerados no BuildRoot (os
#arquivos executaveis por exemplo) serao instalados no sistema. Nesta secao ficam os
#arquivos especificados que serao copiados durante a instalacao do pacote, incluindo
#informacoes de permissao dos arquivos.
%files
%defattr(-,root,root)
EOF2

for LINE in `cat $FTXTTMP`
do

if [ ! -z `echo $LINE | grep /$` ] ; then
   echo "%dir /`echo $LINE | grep /$`" >> $FSPECTMP
elif [ ! -z `echo $LINE | grep -v /$` ] ; then
   echo "/$LINE" >> $FSPECTMP
fi
done

cat >> $FSPECTMP <<EOF3

#Secao que contem instrucoes para apagar o conteudo do diretorio apontado por BuildRoot,
#para permitir que o conteudo de construcoes de pacotes anteriores nao interfiram com a
#construcao atual. O padrao e esta secao conter somente a linha "rm -rf %{buildroot}".
%clean
rm -rf \$RPM_BUILD_ROOT

#Comandos para executar depois da instalacao contem instrucoes diversas que sao executadas
#apos a instalacao do pacote no sistema (copia dos arquivos).
%post
#if [ "\$1" = "1" ]; then
#   echo "depois de instalar pela 1a vez (-i)..."
#elif [ "\$1" = "2" ]; then
#   echo "depois de instalar a nova versao (-U)..."
#fi

#Comandos para executar antes da desinstalacao
%preun
#if [ "\$1" = "1" ]; then
#   echo "antes de remover a versao antiga (-U)..."
#elif [ "\$1" = "0" ]; then
#   echo "antes de remover definitivamente (-e)..."
#fi

#Comandos para executar após a desinstalacao, contem instrucoes diversas que sao executadas apos uma
#desinstalacao do pacote do sistema. Isso nem sempre e o caso de remocao do pacote, muitas vezes e uma
#atualizacao, onde a versao antiga e removida e uma nova instalada.
%postun
#if [ "\$1" = "1" ]; then
#   echo "depois de remover a versao antiga (-U)..."
#elif [ "\$1" = "0" ]; then
#   echo "depois de remover definitivamente (-e)..."
#fi

#Historico "changelog"
%changelog
* ${DATE} ${PACKAGER} ${VERSION}-${RELEASE}
- Criacao do pacote
EOF3

# Move arquivo .spec e o fonte .tar.gz para suas respectivas pastas
mv $FSPECTMP $RPMPATH/SPECS/${NAME}-${VERSION}.spec
mv ${NAME}-${VERSION}-${RELEASE}.tar.gz $RPMPATH/SOURCES/${NAME}-${VERSION}-${RELEASE}.tar.gz
if [ "$?" = "0" ]
then
   echo "Arquivos copiados:"
   echo -e "\t$RPMPATH/SPECS/${NAME}-${VERSION}.spec"
   echo -e "\t$RPMPATH/SOURCES/${NAME}-${VERSION}-${RELEASE}.tar.gz"
else
   echo "Erro na geração do arquivo spec."
fi
# Remove arquivo temporario
rm -rf $FTXTTMP

Scripts recomendados

Backup do banco de dados Postgresql

slackpigs - veja os pacotes que mais ocupam espaço no Slackware

Update no-ip utilizando Shell Script

Localizar e Matar Processo

Obter ip a partir de um NO-IP ou DYNDNS e atualizar o endereço do MUNIN MESTRE em um nó linux.


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts