sync2test - sincroniza arquivos do subversion
Publicado por Perfil removido (última atualização em 10/02/2010)
[ Hits: 8.358 ]
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
Implementando Statement e RecordSet em bash script
Firewall com proxy transparente completo
Atualizar o macOS no Mac - Opencore Legacy Patcher
Crie alias para as tarefas que possuam longas linhas de comando - bash e zsh
Criando um gateway de internet com o Debian
Configuração básica do Conky para mostrar informações sobre a sua máquina no Desktop
Aprenda a criar músicas com Inteligência Artificial usando Suno AI
Instalando Zoom Client no Ubuntu 24.04 LTS
Instalando Zoom Client no Fedora 40
Instalando Navegador Firefox no Debian 12
Bloqueando propagandas no Youtube e outros sites com o uBlocker Origin
Em que pasta/arquivo ficam as configurações das janelas em derivados d... (2)
Não consigo atualizar minha GPU (1)
Servidor Samba 4.15.13 AD-DC (3)