#!/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