#!/bin/bash # Este simples script monta compartilhamentos (normalmennte NFS ou SAMBA) e faz # a copia dos diretorios. Inicialmente ele foi desenvolvido para popular os# backups da draco na pandora, para que assim existam duas copias de ambos. # Toda vez ele remove todos os arquivos dos diretórios e copia os # novos. ## Hoje ele já foi alterado, hoje ele verifica se o diretório tem necessidade de# ser montado, se tiver e o diretório não estiver montado, ele monta e isto para# ambos, tanto o diretório de origem como o dir destino.## A única exigencia é que o diretório esteja no /etc/fstab para que seja# montado, caso contrário os dados serão copiados para ele.# Autor: Felipe Rafael Prenholato # Data: Tue Sep 12 10:46:50 BRT 2006 # E-Mail: philipe_rp@yahoo.com.br / chronos@gentoobr.org # Licença: GPLv2 # ======================= Updates =======================# * Tue Sep 19 11:21:08 BRT 2006# -> Felipe Prenholato ( philipe_rp@yahoo.com.br / chronos@gentoobr.org )# - Modificando comentários.# - Melhorando suporte a montar diretórios.# Para configurar o script sete as variaveis abaixo. # DIR_TO_MOUNT deve ser uma lista de diretórios em um array iniciando # do 0. O script tentara montar os diretórios e caso consiga copiara # para os diretórios de DIR_TO_COPY com o mesmo index. Existem dois # meios de configurar esta variavel: # # DIR_TO_MOUNT[0]='/mnt/nfs/draco/var/backup' # DIR_TO_MOUNT[1]='/mnt/nfs/draco/var/backup-archives' # # OU # # DIR_TO_MOUNT=( '/mnt/nfs/draco/var/backup' '/mnt/nfs/draco/var/backup-archives' )DIR_TO_MOUNT=( '/mnt/nfs/draco/var/backup' '/mnt/nfs/draco/var/backup-archives' )# DIR_TO_COPY deve ser uma lista de diretórios em um array iniciando # do 0. O script copiara os dados dos diretórios montados com o mesmo # index para estes diretórios. Existem dois meios de configurar esta # variável. # # DIR_TO_COPY[0]='/var/backup' # DIR_TO_COPY[1]='/var/backup-archives' # # OU # # DIR_TO_COPY=( '/var/backup' '/var/backup-archives' )DIR_TO_COPY=( '/mnt/storage/mzdel/draco/backup' '/mnt/storage/mzdel/draco/backup-archives' )# Quantos dias mantenho as cópias?COPY_DAYS=92 # 3 meses normalmente# Onde fica seu fstab? Quem executa o script precisa ler ele :)._FSTAB='/etc/fstab'# OBS: O script detecta automaticamente se o dir esta no fstab, se estiver tenta# montar, se não estiver cria o diretório e copia os dados.# Functions.incsource /sbin/functions.sh# Função countdowcountdow () { normal="\e[0m" [ -z "$2" ] && cor="" [ "$2" == "red" ] && cor="\e[1;31m" [ -n "$3" ] && _sleep="$3" for e in $(seq $1 -1 1) do echo -ne $cor$e$normal' ' sleep 1$_sleep done}# Função para checar permissionamento do diretório.checaDir() { if [ -d $1 ] \ && [[ -e $1 ]] \ && [ -r $1 ] \ && [ -w $1 ] \ && [ -x $1 ] then eend 0 return 0 else if [ ! -d $1 ] && [ ! -e $1 ] then eend 1 echo " $(ewarn 'O diretório não existe, criando '$1)" mkdir -p $1 &>/dev/null sts=$? eend $sts if [ "$sts" != "0" ] then echo " $(eerror 'O diretório não pode ser criado, pode haver um arquivo com o mesmo nome ou não haver permissões para cria-lo')" return 1 fi fi if [ ! -r $1 ] || [ ! -w $1 ] || [ ! -x $1 ] then eend 1 echo " $(eerror 'O diretório tem permissões incorretas.')" echo " $(eerror 'Use chmod para corrigir e rode o script novamente.')" return 1 fi fi} # Percorre array DIR_TO_COPY for index in $(seq 0 ${#DIR_TO_COPY[*]})do # Pegando diretorios _MOUNT=${DIR_TO_MOUNT[$index]} _COPY=${DIR_TO_COPY[$index]} [ -z $_MOUNT ] && continue [ -z $_COPY ] && continue # Verificando diretórios no fstab, se estiver lá tenta montar eles, senão cria # eles. O script também cria os pontos de montagem caso não existam. for directory in $_MOUNT $_COPY do count=$(egrep "$directory( | )" $_FSTAB | wc -l) # Diretorio tem entrada no fstab if [ $count -eq 1 ] then count=$(mount | egrep "$directory( | )" | wc -l) # Diretório não esta montado if [ $count -eq 0 ] then # Checa ponto de montagem einfo "Chegando ponto de montagem para $directory" checaDir $directory [ $? -ne 0 ] && exit 1 # Montando $_MOUNT einfo "Montando $directory" mount $directory &>/dev/null sts=$? eend $sts # SE não deu certo da mensagem de erro e pula pro próximo index. [ ! $sts -eq 0 ] && echo " $(eerror 'Impossível montar '$directory)" \ && echo " $(eerror 'Verifique problemas do ponto de montagem, ponto de origem, etc..')" \ && continue else # Diretório já esta montado ... O_o! ewarn "ALERTA: $directory já está montado. Para parar aperte Ctrl-C em 5 segundos" countdow 5 red fi else # Diretório não tem entrada no fstab # Checando diretório (cria se precisar) einfo "Checando diretório $directory" checaDir $directory [ $? -ne 0 ] && exit 1; fi done # Excluindo copias com mais de $COPY_DAYS einfo "Removendo copias com mais de $COPY_DAYS de $_COPY" archs=$(find $_COPY -type f -ctime $COPY_DAYS) i=0 erro=0 date >> $_COPY'/clearlog' for e in $archs do let i++ rm $e -f -v >> $_COPY'/clearlog' sts=$? [ $sts -ne 0 ] && erro=1 done if [ $erro -eq 1 ] then eend 1 echo " $(eerror 'Problemas na remoção das cópias antigas.')" echo " $(eerror 'Log em '$_COPY'/clearlog.')" umount $_MOUNT continue else eend 0 echo " $(einfo $i' cópias removidas.')" fi # Go to copy :]. einfo "Copiando arquivos de $_MOUNT para $_COPY" cp -ax $_MOUNT/* $_COPY 1>$_COPY/copylog 2>$_COPY/copyerrorlog sts=$? eend $sts [ ! $sts -eq 0 ] \ && echo " $(eerror 'Erro ao copiar arquivos.')" \ && echo " $(eerror 'Verifique '$_COPY'/copyerrorlog para mais detalhes.')" \ && umount $_MOUNT &>/dev/null\ && continue # Umounting $_MOUNT for directory in $_MOUNT $_COPY do # Verifica se ele ta montado count=$(mount | grep $directory | wc -l) [ $count -eq 0 ] && continue einfo "Desmontando $directory" umount $directory &>/dev/null sts=$? eend $sts [ ! $sts -eq 0 ] \ && echo " $(error 'Erro ao desmontar '$directory)" \ && echo " $(error 'Tente desmontar na mão.')" donedone