All pastes #176829 Raw Edit

Anonymous

public text v1 · immutable
#176829 ·published 2006-09-19 23:49 UTC
rendered paste body
#!/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