#! /bin/bash
# ne preserve pas les droits sur les repertoires

case $DEBUG in
  1) set -x
     ;;
  *)
     ;;
esac

error() { # juste pour usage
		echo $1 1>&2
}

usage() {
		error "usage : ldist.sh [-h] -s <source dir> -d <dest dir> -l <log file>"
		error "example : ldist.sh -s /home/c21/images -d /mnt/clyde/home/c21/images -l ldist.log"
}

while true
do
  case $1 in
    -s) srcdir=$2
        shift 2
				;;
    -d) destdir=$2
        shift 2
				;;
    -h) usage
		exit 0
		;;
	-l) logfile=$2
		shift 2
		;;
     *)
		break
		;;
  esac
done

if [ -z "$srcdir" -o -z "$destdir" -o -z "$logfile" ] 
then
		usage
		exit 1
fi

date=`date '+%d-%m-%Y'`
error() {
		echo "ERROR:ldist.sh:$date: $1" 1>&2
		echo "ERROR:ldist.sh:$date: $1" >> $logfile
}

TMPDIR=/tmp/`whoami`
mkdir -p ${TMPDIR}
if [ $? -ne 0 ]
then
	error "cannot mkdir -p ${TMPDIR}"
	exit 1
fi

pwd=`pwd`

# les repertoires

cd $srcdir
if [ $? -ne 0 ]
then
		error "cannot cd $srcdir"
		exit 1
fi
find -type d -exec ls -dl {} \; | awk 'BEGIN { OFS="|" } { for (i=9;i<NF;i++) printf $i" "; print $NF,$3,$4 }' | sort > ${TMPDIR}/srcldist_$$
cd $pwd
cd $destdir
if [ $? -ne 0 ]
then
		error "cannot cd $destdir"
		exit 1
fi
find -type d -exec ls -dl {} \; | awk 'BEGIN { OFS="|" } { for (i=9;i<NF;i++) printf $i" "; print $NF,$3,$4 }' | sort > ${TMPDIR}/destldist_$$
cd $pwd
diff ${TMPDIR}/srcldist_$$ ${TMPDIR}/destldist_$$ > ${TMPDIR}/diffldist_$$
rm -f ${TMPDIR}/srcldist_$$ ${TMPDIR}/destldist_$$

# on enleve d'abord ce qui a change ou a disparu
for rmdir in `grep '^>' ${TMPDIR}/diffldist_$$ | sed 's/^> //g' | awk -F"|" '{ print $1 }' | sed 's/ /_espace_/g'`
do
		rmdir=`echo "$rmdir" | sed 's/_espace_/ /g'`
		rm -rf $destdir/"$rmdir"
		if [ $? -ne 0 ]
		then
				error "cannot rm $destdir/\"$rmdir\""
		fi
done

# on copie ce qu'il y a de nouveau
for cpdir in `grep '^<' ${TMPDIR}/diffldist_$$ | sed 's/^< //g' | sed 's/ /_espace_/g'`
do
		cpdir=`echo "$cpdir" | sed 's/_espace_/ /g'`
		dir=`echo "$cpdir" | awk -F'|' '{ print $1 }'`
		own=`echo "$cpdir" | awk -F'|' '{ print $2 }'`
		if [ "$own" = "chargeme" ]
		then
				own=chargement
		fi
		grp=`echo $cpdir | awk -F'|' '{ print $3 }'`
		if [ "$grp" = "chargeme" ]
		then
				grp=chargement
		fi
		mkdir -p $destdir/"$dir"
		if [ $? -ne 0 ]
		then
				error "cannot mkdir -p $destdir/\"$dir\""
				exit 1
		fi
		chown $own.$grp $destdir/"$dir"
		if [ $? -ne 0 ]
		then
				error "cannot chown $own.$grp $destdir/\"$dir\""
				exit 1
		fi
done
rm ${TMPDIR}/diffldist_$$

# les fichiers
cd $srcdir
if [ $? -ne 0 ]
then
		error "cannot cd $srcdir"
		exit 1
fi
find -type f -exec cksum {} \; | sed 's/\([0-9]*\) \([0-9]*\) \(.*\)/\3|\1_\2/g' | sort > ${TMPDIR}/srcldist_$$
cd $pwd
cd $destdir
if [ $? -ne 0 ]
then
		error "cannot cd $destdir"
		exit 1
fi
find -type f -exec cksum {} \; | sed 's/\([0-9]*\) \([0-9]*\) \(.*\)/\3|\1_\2/g' | sort > ${TMPDIR}/destldist_$$
cd $pwd
diff ${TMPDIR}/srcldist_$$ ${TMPDIR}/destldist_$$ > ${TMPDIR}/diffldist_$$
rm -f ${TMPDIR}/srcldist_$$ ${TMPDIR}/destldist_$$


# on enleve d'abord ce qui a change ou a disparu
for rmfile in `grep '^>' ${TMPDIR}/diffldist_$$ | sed 's/^> //g' | awk -F"|" '{ print $1 }' | sed 's/ /_espace_/g'`
do
		rmfile=`echo "$rmfile" | sed 's/_espace_/ /g'`
		rm $destdir/"$rmfile"
		if [ $? -ne 0 ]
		then
				error "cannot rm $destdir/\"$rmfile\""
		fi
done

# on copie ce qu'il y a de nouveau
for cpfile in `grep '^<' ${TMPDIR}/diffldist_$$ | sed 's/^< //g' | awk -F"|" '{ print $1 }' | sed 's/ /_espace_/g'`
do 
		cpfile=`echo "$cpfile" | sed 's/_espace_/ /g'`
		cp -a $srcdir/"$cpfile" $destdir/"$cpfile"
		if [ $? -ne 0 ]
		then
				error "cannot cp -a $srcdir/\"$cpfile\" $destdir/\"$cpfile\""
		fi
done
rm ${TMPDIR}/diffldist_$$
