#!/bin/sh
#Script de distribution d'une commande ou d'un fichier sur une liste de machines#a la facon de rdist
#Auteur: Olivier Perret/Ensta Mai 1990
#Modifie en 1991 pour le support du background et des jokers ("*.*")
#Modifie en 1995 pour le support des repertoires (cp -rp)
#Modifie en 1997 pour le support des commentaires dans les listes de machines
#(A.Peron) commandes multiples et wait pour les commandes en background, (H.Loupp)
#Derniere modification 01/2005 pour la salle de cours du CIS (ssh)
HOST=`hostname`
#valeurs par defaut
RESEAU="/local/adm/cdist/"
ECHO="echo"
USER="lbd"

# Option -u pour changer la variable USER
if (test $1 = "-u") then
	USER=$2
	shift
	shift
fi

# Je verifie que le reseau declare existe, sinon, je regarde s'il existe
# un fichier appele reseau dans le repertoire courant,. Sinon, je rale !
if (test $1 = "-r") then
	RESEAU=$RESEAU/$2
	shift
	shift
elif (test -f reseau) then
		RESEAU="reseau"
	else
		echo "Pas de reseau declare !"
	exit 1
fi

# Modif 4/11/97, Hadrien Loupp 
##Modif du 20/02/97, Arnaud Peron
##LISTE=`cat $RESEAU`
#LISTE=`grep -v '#' $RESEAU`
LISTE=`cat $RESEAU | grep -v "^#" | sed "s/#.*$//g"` 

# Distribution d'un fichier sur le reseau
# Je n'accepte qu'un nom de fichier, mais celui-ci peut contenir des jokers.
if (test $1 = "-f") then
	shift
	FILE=$1
	shift
	if (test $# -gt 0) then
		if (test $1 = "-d") then
			FILE=`pwd`/$FILE
		else
			echo "Il y a trop de parametres. Mettez des jokers !"
			exit 2
		fi
	fi
	if (test $ECHO) then
		echo Distribution de $FILE sur le reseau $RESEAU
	fi
	for i in $LISTE
	do
		if (test $i != $HOST) then
			if (test $ECHO) then
				echo $i,
			fi
		for j in $FILE
		do
			scp -rp $j $USER"@"$i":"$j
		done
		fi
	done

# UTILISATION NORMALE: DISTRIBUTION d'UNE COMMANDE
# Je regarde si je dois lancer en serie ou en parallele, et je passe le reste
# de la ligne a rsh...

# Copie d'une commande sur le reseau en parallele
elif (test $1 = "-b") then
	shift
	for i in $LISTE
	do
		if (test $i != $HOST) then
			if (test $ECHO) then
				echo $i.
			fi
			ssh $i -l $USER $* &
		fi
	done
	# Pour savoir quand c'est fini. Hadrien Loupp, 4/11/97
	wait
	echo "Termine, boss."

# Copie d'une commande sur le reseau en serie
else
	for i in $LISTE
	do
		if (test $i != $HOST) then
			if (test $ECHO) then
				echo $i:
			fi
			ssh $i -l $USER $*
		fi
	done
fi
exit 0



