Script para criação de pacote rpm.

Publicado por Jeferson Alberi da Silva 10/01/2006

[ Hits: 5.619 ]

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

Knife System

Tux Colorido

Raiz Quadrada (Square Root) para Bash

Função que indica o estado do funcionamento do script

Intervalo de tempo v.2 - Corrigido


  

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