sync2test - sincroniza arquivos do subversion
Publicado por Perfil removido (última atualização em 10/02/2010)
[ Hits: 8.624 ]
O presente script sincroniza arquivos do servidor subversion com o servidor de testes.
Utiliza:
- svn
- rsync
- sed
- dialog
#!/bin/bash
# sync2test
# Programa de sincronizacao de codigo-fonte com o servidor de teste
# 10/10/2009 - Luiz Sanches - luizgrsanches@gmail.com
# Versao 0.18
principal() {
# Definicao de variaveis do programa
SCRIPT="sync2test"
VERSAO_SCRIPT=$(sed '/Versao/!d; q' $0)
DIR_SCRIPT=$(pwd)
DIR_CONF="/opt/$SCRIPT"
DIR_CONF_USER="$HOME/.$SCRIPT"
ARQUIVO_CONF="$DIR_CONF/$SCRIPT.conf"
ARQUIVO_CONF_USER="$DIR_CONF_USER/$SCRIPT.conf"
ARQUIVO_PROJETOS="$DIR_CONF/projetos"
# Criacao dos diretorios de configuracao do programa
[ ! -e "$DIR_CONF" ] && mkdir "$DIR_CONF"
[ ! -e "$DIR_CONF_USER" ] && mkdir "$DIR_CONF_USER"
# Definicao do program de dialogo como o usuario
if [ "$DISPLAY" ]; then
DIALOG="Xdialog"
# Verifica a existencia do programa Xdialog
[ ! -e "/usr/bin/$DIALOG" ] && DIALOG="dialog"
else
DIALOG="dialog"
fi
# Verifica a existencia dos programas
verificaArquivo "/usr/bin/$DIALOG"
verificaArquivo "/usr/bin/svn"
verificaArquivo "/usr/bin/rsync"
verificaArquivo "/bin/sed"
# Cria a variavel $DIALOG_TITLE com parametro do titulo na tela de fundo
DIALOG="$DIALOG --backtitle '$SCRIPT - Sincroniza SVN com Servidor de Teste. ${VERSAO_SCRIPT:2} - Usuario: $USER '"
# Verifica a existencia do arquivo de projetos
if [ ! -e "$ARQUIVO_PROJETOS" ]; then
echo "siig:Sistemas Integrados" > $ARQUIVO_PROJETOS
fi
# seleciona os projetos, no arquivo projetos, com o padrao projeto:descricao
LISTA_PROJETOS=$(sed '-n' 'p' $ARQUIVO_PROJETOS | sed 's/:/ "/;s/$/"/')
while : ; do
# Selecao de projeto
PROJETO=$(eval "$DIALOG --stdout --menu \"Selecione o projeto:\" 0 0 0 $LISTA_PROJETOS")
# Se cancelar, sai do programa
[ $? -ne 0 ] && break
# Verifica a existencia do arquivo de modulos das gerencias
if [ "$PROJETO" = "siig" ]; then
ARQUIVO_MODULOS="$DIR_CONF/${PROJETO}_modulos"
if [ ! -e "$ARQUIVO_MODULOS" ]; then
echo "gpi:Afr:Administracao de Frota" > $ARQUIVO_MODULOS
echo "gpi:Sco:Controle de Obras" >> $ARQUIVO_MODULOS
echo "gpi:Gestao:Sala de Gestao" >> $ARQUIVO_MODULOS
echo "gpa:Seg:Seguranca" >> $ARQUIVO_MODULOS
echo "gpa:Cpr:Controle de Processos" >> $ARQUIVO_MODULOS
echo "gpa:Aof:Administracao Financeira" >> $ARQUIVO_MODULOS
echo "gpa:Talentos:Banco de Talentos" >> $ARQUIVO_MODULOS
fi
fi
# Verifica a existencia do arquivo de configuracao, para carregamento das variaveis
if [ -e "$ARQUIVO_CONF" ]; then
. $ARQUIVO_CONF
else
SERVIDOR=$(eval $DIALOG --stdout --inputbox \"Digite o endereco do servidor SVN:\" 0 0 \"ip\")
DIR_REPOSITORIO=$(eval $DIALOG --stdout --inputbox \"Digite o caminho do repositorio SVN \(com / no final\):\" 0 0 \"/var/svn/\")
DIR_DESTINO=$(eval $DIALOG --stdout --inputbox \"Digite o diretorio de destino \(com / no final\):\" 0 0 \"/var/www/\")
USUARIO_SVN=$(eval $DIALOG --stdout --inputbox \"Digite o nome do usuario de acesso ao SVN:\" 0 0 \"$USER\")
SENHA_SVN=$(eval $DIALOG --stdout --inputbox \"Digite a senha do usuario SVN:\" 0 0 \"senha\")
echo "SERVIDOR=\"$SERVIDOR\"" > $ARQUIVO_CONF
echo "DIR_REPOSITORIO=\"$DIR_REPOSITORIO\"" >> $ARQUIVO_CONF
echo "DIR_DESTINO=\"$DIR_DESTINO\"" >> $ARQUIVO_CONF
echo "USUARIO_SVN=\"$USUARIO_SVN\"" >> $ARQUIVO_CONF
echo "SENHA_SVN=\"$SENHA_SVN\"" >> $ARQUIVO_CONF
fi
# Verifica a existencia do arquivo de configuracao do usuario, para carregamento das variaveis
if [ -e "$ARQUIVO_CONF_USER" ]; then
. $ARQUIVO_CONF_USER
else
# Selecao de gerencia
GERENCIA=$(eval $DIALOG --stdout --menu \"Selecione a gerencia em que trabalha:\" 0 0 0 GPI \"Projetos_Institucionais\" GPA \"Projetos_Academicos\")
# Converte o conteudo da variavel gerencia para minusculo
GERENCIA=$(echo $GERENCIA | tr [:upper:] [:lower:])
# se a gerencia for nula, emitir mensagem e retornar a tela de projetos
if [ -z "$GERENCIA" ]; then
eval $DIALOG --title \"$SCRIPT\" --msgbox \"Nenhuma gerencia foi selecionada.\" 0 0
continue
fi
echo "GERENCIA=\"$GERENCIA\"" > $ARQUIVO_CONF_USER
fi
# Arquivos de log
ARQUIVO_LOG="$DIR_CONF_USER/.$SCRIPT-temp.log"
DIR_LOG_PERMANENTE="$DIR_DESTINO/.$SCRIPT/log"
ARQUIVO_LOG_PERMANENTE="$DIR_LOG_PERMANENTE/${PROJETO}_${USER}.log"
[ ! -e "$DIR_LOG_PERMANENTE" ] && mkdir -p $DIR_LOG_PERMANENTE
# Prepara o diretorio de sincronizacao
DIR_TMP_SYNC="$DIR_DESTINO/.$SCRIPT/$PROJETO"
[ ! -e "$DIR_TMP_SYNC" ] && mkdir -p $DIR_TMP_SYNC
# Seleciona os modulos do projeto, no arquivo $PROJETO_modulos, com o padrao gerencia:modulo:descricao
ARQUIVO_MODULOS="$DIR_CONF/${PROJETO}_modulos"
verificaArquivo "$ARQUIVO_MODULOS"
MODULOS_PROJETO=$(sed "/$GERENCIA/!d" $ARQUIVO_MODULOS | cut -d: -f2,3 | sed 's/:/ "/;s/$/"/')
ARQUIVO_PROJETO_DEMAIS="$DIR_CONF/${PROJETO}_demais"
ARQUIVO_PROJETO_COMPLETO="$DIR_CONF/${PROJETO}_completo"
if [ "$PROJETO" = "siig" ]; then
if [ ! -e "$ARQUIVO_PROJETO_DEMAIS" ]; then
echo "/config/ d" > $ARQUIVO_PROJETO_DEMAIS
echo "/controller/ d" >> $ARQUIVO_PROJETO_DEMAIS
echo "/model/ d" >> $ARQUIVO_PROJETO_DEMAIS
echo "/model/dao/ d" >> $ARQUIVO_PROJETO_DEMAIS
echo "/model/database/ d" >> $ARQUIVO_PROJETO_DEMAIS
echo "/model/generic/ d" >> $ARQUIVO_PROJETO_DEMAIS
echo "/model/template/ dr" >> $ARQUIVO_PROJETO_DEMAIS
echo "/model/utils/ dr" >> $ARQUIVO_PROJETO_DEMAIS
echo "/model/vo/ dr" >> $ARQUIVO_PROJETO_DEMAIS
echo "/view/ d" >> $ARQUIVO_PROJETO_DEMAIS
echo "/view/css/ dr" >> $ARQUIVO_PROJETO_DEMAIS
echo "/view/images/ dr" >> $ARQUIVO_PROJETO_DEMAIS
echo "/view/js/ dr" >> $ARQUIVO_PROJETO_DEMAIS
echo "/view/style/ dr" >> $ARQUIVO_PROJETO_DEMAIS
fi
fi
if [ -e "$ARQUIVO_PROJETO_DEMAIS" ] || [ -e "$ARQUIVO_PROJETO_COMPLETO" ]; then
MODULOS_PROJETO="${MODULOS_PROJETO} Outros \"Outros diretorios\""
fi
while : ; do
# deleta o arquivo de log para mostrar somente a ultima sincronizacao
[ -e "$ARQUIVO_LOG" ] && rm $ARQUIVO_LOG
# Selecao de modulo
MODULO=$(eval $DIALOG --stdout --menu \"Selecione o modulo do projeto [$PROJETO] a ser atualizado para o servidor de teste:\" 0 0 0 $MODULOS_PROJETO)
# Se cancelou retorna a tela de projetos
[ $? -ne 0 ] && break
# se escolher a opcao 'Outros'
if [ "$MODULO" = "Outros" ]; then
LISTA_OUTRAS_OPCOES=$(sed '-n' 'p' $ARQUIVO_PROJETO_COMPLETO | cut -d: -f1,2 | sed 's/:/ "/;s/$/"/')
if [ -e "$ARQUIVO_PROJETO_DEMAIS" ]; then
LISTA_OUTRAS_OPCOES="Demais \"Demais pastas do projeto [$PROJETO]\" ${LISTA_OUTRAS_OPCOES}"
fi
while : ; do
# deleta o arquivo de log para mostrar somente a ultima sincronizacao
[ -e "$ARQUIVO_LOG" ] && rm $ARQUIVO_LOG
# Selecao de outras opcoes
OPCAO=$(eval $DIALOG --stdout --menu \"Selecione uma opcao:\" 0 0 0 $LISTA_OUTRAS_OPCOES)
# Se cancelar retorna a tela de modulos
[ $? -ne 0 ] && break
eval $DIALOG --yesno \"Confirma a operacao?\" 0 0
# Se escolher nao, retorna a tela de opcoes
[ $? -ne 0 ] && continue
if [ "$OPCAO" = "Demais" ]; then
# Executa a funcao para baixar o projeto do SVN
baixaProjetoSvn
while read LINHA
do
sincronizaDiretorio $LINHA
done < $ARQUIVO_PROJETO_DEMAIS
exibeResultado
# Outros diretorios
else
DIR_DESTINO_ESCAPE=$(echo $DIR_DESTINO | sed "s,\/,\\\/,g")
DIR_ALVO=$(sed "/$OPCAO/!d" $ARQUIVO_PROJETO_COMPLETO | cut -d: -f4)
# formata os caminhos de origem e destino, exemplo:
# antes.: siig:siig_homologacao
# depois: /var/www/siig/ /var/www/siig_homologacao/
PROJETO_COMPLETO=$(sed "/$OPCAO/!d" $ARQUIVO_PROJETO_COMPLETO | cut -d: -f3,4 | sed "s/^/$DIR_DESTINO_ESCAPE/; s/:/\/ $DIR_DESTINO_ESCAPE/; s/$/\//")
PROJETO_COMPLETO_SELECIONADO=$(sed "/$OPCAO/!d" $ARQUIVO_PROJETO_COMPLETO | cut -d: -f4)
DATA_HORA=$(date +%Y-%m-%d-%H-%M)
DIR_BACKUP="${DIR_DESTINO}bkp-${DIR_ALVO}/$DATA_HORA"
ARQUIVO_LOG_PERMANENTE="$DIR_LOG_PERMANENTE/${PROJETO_COMPLETO_SELECIONADO}_${USER}.log"
sincroniza $PROJETO_COMPLETO r
exibeResultado
fi
done
else # Para a escolha de um modulo
# Adiciona um nivel de diretorio na variavel modulo
ARVORE="/view/"
FACADE="$MODULO"
# Converte o conteudo da variavel modulo para minusculo
MODULO=$(echo $MODULO | tr [:upper:] [:lower:])
DATA_HORA=$(date +%Y-%m-%d-%H-%M)
DIR_BACKUP="${DIR_DESTINO}bkp-$PROJETO$ARVORE$MODULO/$DATA_HORA"
# Une view/nome do modulo
MODULO="$ARVORE$MODULO"
# Executa a funcao para baixar o projeto do SVN
baixaProjetoSvn
# Sincroniza o projeto criando um backup
# Se o diretorio do projeto nao existir, sincroniza tudo
if [ ! -e "$DIR_DESTINO$PROJETO" ]; then
sincroniza $DIR_TMP_SYNC $DIR_DESTINO a
# Se existir, sincroniza somente os diretorios do modulo selecionado
else
sincroniza "$DIR_TMP_SYNC$MODULO" "$DIR_DESTINO$PROJETO$ARVORE" r "SIMULA"
# Sincroniza as fachadas do modulo
DIR_BACKUP="${DIR_DESTINO}bkp-$PROJETO/model/facade/$DATA_HORA"
# Prepara o arquivo para nao sincronizar as outras fachadas
ARQUIVO_EXCLUDE_MODULOS="$DIR_CONF_USER/.modulos"
EXCLUDE_FACADE="$DIR_CONF_USER/.exclude_facade"
[ -e "$ARQUIVO_EXCLUDE_MODULOS" ] && rm "$ARQUIVO_EXCLUDE_MODULOS"
while read LINHA
do
MOD=$(echo $LINHA | cut -d: -f2)
echo "$MOD*" >> $ARQUIVO_EXCLUDE_MODULOS
done < $ARQUIVO_MODULOS
sed "/^$FACADE/d" $ARQUIVO_EXCLUDE_MODULOS > $EXCLUDE_FACADE
sincroniza "$DIR_TMP_SYNC/model/facade/" "$DIR_DESTINO$PROJETO/model/facade/" r --exclude-from=$EXCLUDE_FACADE
fi
exibeResultado
fi
done
done
clear
exit
}
baixaProjetoSvn() {
# Se o diretorio existir executar SVN update
if [ -e "$DIR_TMP_SYNC" ]; then
svn update $DIR_TMP_SYNC
else # Senao, executar SVN checkout
mkdir -p $DIR_TMP_SYNC
svn checkout "svn://$SERVIDOR$DIR_REPOSITORIO$PROJETO" --username $USUARIO_SVN --password $SENHA_SVN $DIR_TMP_SYNC
fi
}
sincroniza() {
#echo $1 = origem
#echo $2 = destino
#echo $3 = r (recursive), a (archive), d (directory)
#echo $4 = qualquer parametro do rsync
# Seleciona arquivos que nao serao sincronizados
ARQUIVO_PROJETO_EXCLUDE="$DIR_CONF/${PROJETO}_exclude"
LISTA_EXCLUDE="$DIR_CONF_USER/.lista_exclude"
LISTA_TMP="$DIR_CONF_USER/.lista_tmp"
# Cria a lista de arquivos que nao seram sincronizados
[ -e "$LISTA_EXCLUDE" ] && rm $LISTA_EXCLUDE
[ -e "$ARQUIVO_PROJETO_EXCLUDE" ] && cat $ARQUIVO_PROJETO_EXCLUDE > $LISTA_EXCLUDE
if [ "$4" = "SIMULA" ]; then
# Simula (-n) a sincronizacao guardando em arquivo
rsync -CvzpOu$3 -n --delete --exclude-from=$LISTA_EXCLUDE $1 $2 > $LISTA_TMP
# Apaga as demais linhas, deixando somente os nomes dos arquivos
sed '/^$/ d; /^sen/ d; /^total/ d; /^deleting/ d;' "$LISTA_TMP" > "${LISTA_TMP}1"
sed "s/$/ '' OFF/g" "${LISTA_TMP}1" > "$LISTA_TMP"
rm "${LISTA_TMP}1"
# Mostra os arquivos e opcao para selecionar os que nao seram sincronizados
ARQ_EXCLUDES=$(cat $LISTA_TMP)
[ -e "$LISTA_TMP" ] && rm $LISTA_TMP
if [ -n "$ARQ_EXCLUDES" ]; then
NAO_SINC=$(eval $DIALOG --stdout --separate-output --title \"Selecao de arquivos\" --checklist \"Selecione os arquivos que nao seram sincronizados\" 0 0 0 $ARQ_EXCLUDES)
# Se nao cancelou
if [ $? -eq 0 ]; then
# Adiciona na lista os arquivos que nao seram sincronizados
echo "$NAO_SINC" | while read LINHA
do
echo "$LINHA" >> $LISTA_EXCLUDE
done
# Sincroniza o projeto sem os arquivos selecionados anteriormente
rsync -CvzpOu$3 --delete --no-perms -h -b --backup-dir=$DIR_BACKUP --log-file=$ARQUIVO_LOG --exclude-from=$LISTA_EXCLUDE $1 $2
fi
else
# Sincroniza o projeto prevendo delecao de arquivos
rsync -CvzpOu$3 --delete --no-perms -h -b --backup-dir=$DIR_BACKUP --log-file=$ARQUIVO_LOG --exclude-from=$LISTA_EXCLUDE $1 $2
fi
else
# Sincroniza o projeto sem perguntar nada
rsync -CvzpOu$3 $4 --delete --no-perms -h -b --backup-dir=$DIR_BACKUP --log-file=$ARQUIVO_LOG --exclude-from=$LISTA_EXCLUDE $1 $2
fi
if [ -e "$ARQUIVO_LOG" ]; then
# Apaga as linhas abaixo do log para mostrar somente o nome dos arquivos sincronizados
cp $ARQUIVO_LOG "$ARQUIVO_LOG.old"
sed "/building/ d; /done/ d; /receiving/ d; /sent/,+1 d" "$ARQUIVO_LOG.old" > $ARQUIVO_LOG
rm "$ARQUIVO_LOG.old"
# Atualiza o arquivo de log permanente
cat $ARQUIVO_LOG >> $ARQUIVO_LOG_PERMANENTE
fi
}
sincronizaDiretorio() {
#echo $1 = diretorio
#echo $2 = opcao do rsync
DATA_HORA=$(date +%Y-%m-%d-%H-%M)
DIR_BACKUP="${DIR_DESTINO}bkp-$PROJETO$1$DATA_HORA"
[ -e "$DIR_TMP_SYNC$1" ] && sincroniza "$DIR_TMP_SYNC$1" "$DIR_DESTINO$PROJETO$1" $2
}
exibeResultado() {
CONTEUDO=$(cat $ARQUIVO_LOG)
if [ -z "$CONTEUDO" ]; then
eval $DIALOG --title \"log da atualizacao\" --msgbox \"Nenhum arquivo foi atualizado\" 0 0
else
eval $DIALOG --title \"log da atualizacao\" --textbox $ARQUIVO_LOG 0 0
fi
}
verificaArquivo() {
# Verifica a existencia do programa $1
if [ ! -e "$1" ]; then
echo "ATENCAO! O arquivo '$1' nao foi encontrado. Operacao cancelada."
exit
fi
}
principal
Configurando a raiz do seu servidor apache facilmente.
Testa a conexão com a internet e se não tem reinicia o pc.
Barra de Progresso com Shell Script
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Warcraft II Remastered no Linux? (7)
O programa assinador digital (5)









