All pastes #176831 Raw Edit

Anonymous

public shellscript v1 · immutable
#176831 ·published 2006-09-19 23:50 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.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