#!/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.inc source /sbin/functions.sh # Função countdow countdow () { 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.')" done done