#!/usr/bin/perl
use Expect;
my $deb_last_IP=141;
my $fin_last_IP=165;
my $num_poste=1;
my $salle='e25';





sub make_config_file {
        my ($IP_new,$hostname_new,$name_config)=@_;

	#répertoire ou stocker les fichiers de configurations fabriqués
	$rep_pour_config='/var/distro/9.2/config/';

	$reseau='kleber.linux';

	#ligne à modifier dans auto_kleber.cfg
	$nom1="'IPADDR' => '192.168.117.151'";
	$nom2="'HOSTNAME' => 'p01-e25.kleber.linux'";
	$nom_fichier='/var/distro/9.2/config/auto_kleber.cfg';
	open(FICHIERVAR, $nom_fichier) or print "Impossible ouvrir $nom_fichier \n";
		@contenu=<FICHIERVAR>;
	close(FICHIERVAR);

	my 	$chaine = join "" , @contenu;

	#morceau à changer dans $nom1
	$nom1=~m/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/s;
	$IP_old=$1;
	$nom1_new=$nom1;
	$nom1_new=~s/$IP_old/$IP_new/s;
	print 'installation avec IP : '."$nom1_new\n";

	#morceau à changer dans $nom2
	$nom2=~m/.*'(.*?)'$/s;
	$hostname_all_old=$1;
	$hostname_all_new=$hostname_new.'.'.$reseau;
	$nom2_new=$nom2;
	$nom2_new=~s/$hostname_all_old/$hostname_all_new/s;
	print 'et avec nom : '."$nom2_new\n";

	#modification de la config

	$newconfig=$chaine;
	$newconfig=~s/$nom1/$nom1_new/gs;
	$newconfig=~s/$nom2/$nom2_new/gs;
	#print "$newconfig\n";
	$name_config_all=$rep_pour_config.$name_config;
	open(FICHIERVAR, '>', $name_config_all) or print "Impossible ouvrir $name_config_all \n";
        print FICHIERVAR $newconfig;
	close(FICHIERVAR);

}

sub send_expect {

#modification des IP en salle E25
($machine)=@_;
$machine=~s/(\d{1,3}\.\d{1,3}\.\d{1,3}\.)(\d{1,3})/$1/s;
$numero=$2+10;
$machine=$machine.$numero;
##########################################################################################
#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='/root';
#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/prof';
#############################################################################################################################""

#liste des fichiers exécutables (ils devront être dans $rep_distant à lancer dans l'ordre
#mettre l'image diskette
@tab_exec=	('makedisket.pl'
			);

	#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";
}

sub format_disket {

#nécessite d'avoir le fichier image network.img dans le répertoire du programme
        my ($IP_new,$hostname_new,$name_config)=@_;
$source='#!/usr/bin/perl'."\n";
$source=$source.'my $IP_new='."'$IP_new';\n";
$source=$source.'my $hostname_new='."'$hostname_new';\n";
$source=$source.'my $name_config='."'$name_config';\n";
$source1=<<'SOURCE';
my $chaine1="
default linux
prompt 1
timeout 1
display boot.msg
F1 help.msg
F2 advanced.msg
F3 boot.msg
label linux
  kernel vmlinuz
  append auto_install=config/";
my $chaine2=" automatic=met:nfs,ser:192.168.114.155,dir:/var/distro/9.2,int:eth0,netw:static,ip:";
my $chaine3=",netm:255.255.0.0,gat: initrd=network.rdz ramdisk_size=128000 root=/dev/ram3  acpi=ht vga=788\n";
#my $chaine3=",netm:255.255.0.0,gat: initrd=network.rdz ramdisk_size=128000 root=/dev/ram3  acpi=ht vga=788\n";#pour ethernet 10/100
my $chaine3=",netm:255.255.0.0,gat: initrd=network_.rdz ramdisk_size=128000 root=/dev/ram3  acpi=ht vga=788\n"; #pour  ethernet 10/100/1000
	#pour salle E21
	#$config="auto"."$i".'_21.cfg';
	#pour salle E25
	$chaine=$chaine1.$name_config.$chaine2.$IP_new.$chaine3;

	print "$i\n\n";
	print(`/usr/bin/fdformat /dev/fd0u1440`);
	print(`umount /mnt/floppy`);
	#pour salle E21
	#print(`dd if=network.img of=/dev/fd0`);
	#pour salle E25
	#print(`dd if=network_gigabit_usb.img of=/dev/fd0`);
	print(`dd if=network_gigabit_usb.img of=/dev/fd0`);
	print(`umount /mnt/floppy`);
	print(`mount /mnt/floppy`);
	open(FICHIERVAR,'>','/mnt/floppy/syslinux.cfg') or die "Impossible ouvrir  \n";
        @contenu=<FICHIERVAR>;
	print FICHIERVAR $chaine;
        close(FICHIERVAR);
	print "$chaine\n";
	print(`umount /mnt/floppy`);
	print(`mount /mnt/floppy`);
	print(`cat /mnt/floppy/syslinux.cfg`);
	print(`umount /mnt/floppy`);
	print("config pour poste $hostname_new terminee\n");
	print(`reboot`);
SOURCE
print "$source$source1\n";
$source="$source$source1\n";
$fichier='/root/fich_to_send/makedisket.pl';
	open(FICHIERVAR,'>',$fichier) or die "Impossible ouvrir  \n";
	print FICHIERVAR $source;
        close(FICHIERVAR);
	chmod 0750, $fichier;
	send_expect($IP_new);
}





for($num=$deb_last_IP ; $num <= $fin_last_IP ; $num++ ) {
my	$IP='192.168.117.';
my	$IP_new=$IP.$num;
my	$poste='p'.$num_poste;
my	$hostname_new=$poste.'-'."$salle";
my	$name_config=$hostname_new.'.pl';
# deux sous programmes pour être sur de la concordance des noms et des IPs
#en pratique ne faire fonctionner que un sur deux....;

	make_config_file($IP_new,$hostname_new,$name_config);
	format_disket($IP_new,$hostname_new,$name_config);

	$num_poste++;

}

