#!/bin/bash


user="root"
source=""
dest=""


usage(){

    echo "Usage is $0  [-u <ssh user ($user)> ] -s <local source> [-d <remote destination>] <server lists file >"
    
}

dest=""
while getopts u:d:s:h opt;do 
    case $opt in
	u) 
	    user=$OPTARG
	    ;;
	d)
	    dest=$OPTARG
	    ;;
	h)
	    usage
	    exit 0
	    ;;
	s)
	    source=$OPTARG
	    ;;
    esac
    
done


shift $((OPTIND -1))

if [ ! -e "$1" ];then
    echo "## you must specify a valid list of servers file"
    exit 1
fi

if [ ! -e "$source" ];then
    echo "## you must specify an existing binary, \"$source\" doesn't exists"
    exit 1
fi

 
list=`cat $1`
md5=`md5sum $source | cut -d ' ' -f 1`
base_source=`basename $source`
echo "* md5: $md5"
for s in $list;do
     if [ -n "$dest" ];then
     	rmd5=`ssh $user@$s "if [ -e $dest/$base_source ]; then md5sum $dest/$base_source|cut -d ' ' -f 1; fi"`
     else
     	 rmd5=`ssh $user@$s "if [ -e $dest/$base_source ]; then md5sum $base_source|cut -d ' ' -f 1;fi"`

    fi
    if ! [ "$rmd5" == "$md5" ];then
	scp $source $user@$s:$dest >& /dev/null &
	echo "* copying $source in $user@$s:$dest id $! ..."
    else
	echo "* skipping copy an existing copy esists with the same MD5 $rmd5"
    fi

done
error=0
for job in `jobs -p`;do
    echo "* waiting finishing id $job"
    wait $job || let "error+=1"
    if [ $error != "0" ] ;then
	echo "## error copying (job $job) $error"
	
    fi
done

if [ $error == "0" ] ;then
    echo "* successfully copied"
else
    exit 1
fi