#!/usr/bin/perl
use Expect;

#ce programme copie le fichier $fichier_local (exécutable) dont le nom complet est $fichier_local_comp
#sur les machines distantes dont l'IP ou le nom est dans @host, par scp, sur le répertoire $rep_distant qui doit être le répertoire $HOME de $user.
#ensuite on se connecte en ssh à la machine distante sous le compte $user on passe root on chown et chmod le fichier copier et on l'exécute sur la
# machine distante puis on l'efface
# le mieux et d'avoir $user comme compte intermédiaire d'administration toujours inoccupé pour éviter les problèmes.
@host_S25=('192.168.117.151','192.168.117.152','192.168.117.153','192.168.117.154','192.168.117.155','192.168.117.156','192.168.117.157','192.168.117.158','192.168.117.159','192.168.117.160','192.168.117.161','192.168.117.162','192.168.117.163','192.168.117.164','192.168.117.165','192.168.117.166','192.168.117.167','192.168.117.168','192.168.117.169','192.168.117.170','192.168.117.171','192.168.117.172','192.168.117.173','192.168.117.174');
#,'192.168.117.175'); a rajouter 
@host_S21=('192.168.117.121','192.168.117.122','192.168.117.123','192.168.117.124','192.168.117.125','192.168.117.126','192.168.117.127','192.168.117.128','192.168.117.129','192.168.117.130','192.168.117.131','192.168.117.132','192.168.117.133');
@host_S22;

@host=(@host_S25,@host_S21);

##########################################################################################
#scp permet d'envoyer en tant que root !!!!
$time_copie=60;
#temps pour les échanges standard (ssh, su etc..)
$time_standard=30;
#user qui doit exister sur la machine distante
$user="";
#password du user
$passwd="";
$root_passwd="";
#répertoire de départ sur la machine local qui contient le répertoire à envoyer sans / à la fin
$chemin_rep_local='/home';
#assez tordu pour ne pas exister sur la machine distante
$nom_rep_to_send='fich_to_send';
$rep_local=$chemin_rep_local.'/'.$nom_rep_to_send;
#répertoire distant avec les droits d'écriture pour $user dans lequel on va créer un répertoire où placer les fichiers
#éventuellement $HOME qui est le répertoire utilisateur de $user
#attention scp veut un répertoire local pas le /export/home....
#par exemple $rep_distant='/home/prof';
$rep_distant='/home';
#############################################################################################################################""

#liste des fichiers exécutables (ils devront être dans $rep_distant à lancer dans l'ordre
@tab_exec=	(	#'urpmi.pl',  #on installe la distrib distante
				#'NIS_client.pl',
				#'login_sans_image.pl',
				#'securite.pl',
				'sec_lilo.pl'
			);

  for $machine (@host) {
	#envoie d'un fichier local sur la machine distante
	print "--------------------- début du script principal pour $machine ------------------------------------------\n";
	#print "tentative envoie du répertoire local $rep_local a $user sur $machine dans le répertoire $rep_distant pour \n";
	print(`cd $rep_local`);
	print "tentative envoie du répertoire local $rep_local a root sur $machine dans le répertoire $rep_distant pour \n";
	print "scp -r $rep_local root".'@'."$machine:$rep_distant\n";
	$cop=Expect->spawn("scp -r $rep_local root".'@'."$machine:$rep_distant\r");
	$cop->expect($time_standard,"assword:") || do {$cop->hard_close();print "erreur, pas de demande de password\n"; goto FIN_nocop;};
	print $cop "$root_passwd\r";
	#attention un ->expect() absorbe le résultat
	#	if ($cop->expect($time_standard,"Permission denied")) {$cop->hard_close();print "le login de $user n\'a pasfonctionné\n";goto FIN;};
	#bof, il suffit que 1 soit copier pour renvoyer 100%
	$cop->expect($time_copie,'100%') || do {$cop->hard_close();print "la copie de $rep_local sur $machine:$rep_distant échoué \n";goto FIN_nocop;};
	print "copie de $rep_local sur $machine:$rep_distant réussie";
	#laisser en soft_close
	$cop->soft_close();
	#connection ssh
	print "\n\ntentative de connexion ssh à $machine\n";
	$log=Expect->spawn("ssh -l $user $machine\r");
	$log->expect($time_standard,"assword:") || do {$log->hard_close();print "Pas de connexion ssh à $machine\n"; goto FIN;};
	print $log "$passwd\r";
	if ($log->expect($time_standard,"Permission denied")) {$log->hard_close();print "le login de $user n\'a pasfonctionné\n";goto FIN;};
	#$log->expect($time_standard,"$user") || do {$log->hard_close();print "le login de $user n\'a pasfonctionné\n";goto FIN;};
	print $log "su\r";
	$log->expect($time_standard,"assword:") || do {$log->hard_close();print "su n\'a pas fonctionné\n";goto FIN;};
	print ("on est $user sur $machine\n");
	print $log "$root_passwd\r";
	$log->expect($time_standard,"root") || do {$log->hard_close();print "mauvais mot de passe root \n";goto FIN;};
	print ("on est root sur $machine\n");
	#ca y est on est root sur la machine
	print $log "cd $rep_distant\r";
	$log->expect($time_standard,"root") || do {$log->hard_close();print "problème pour cd $rep_distant\n";goto FIN;};
 	print $log "cd $nom_rep_to_send\r";
	$log->expect($time_standard,"root") || do {$log->hard_close();print "problème cd sur $nom_rep_to_send \n";goto FIN;};
	foreach $fich_exec (@tab_exec) {
		print $log './'."$fich_exec\r";
		$log->expect(500,"root") || do {$log->hard_close();print "problème a l\'exécution de $fich_exec\n";goto FIN;};
		}

	FIN:

	print("suppression du répertoire distant\n");
	print $log "cd $rep_distant\r";
	print $log 'rm -f -r '."$nom_rep_to_send\r";
	$log->expect($time_standard,"root") || do {$log->hard_close();print "problème suppression des fichiers \n";goto FIN;};
 	$log->soft_close();

	FIN_nocop:
	print "--------------------- fin du script principal pour $machine ------------------------------------------\n\n";

}









