#!/usr/bin/perl

$version = "47-7";

$param = shift; 
chomp $param;

# sert à l'automatisation des updates du côté serveur
if ($param eq "v") {
	print "$version";
	exit;
}


# au cas où on exécute le script 'à la main';
# ce qui n'est normalement jamais le cas :
# normalement, 'cs' est exécuté par 'csv' au démarrage 
# en cas de changement de version sur le serveur
$id=`whoami`;
chomp $id;
if ($id eq "root") {
	print "Il NE faut PAS être 'root' pour tester.\n";
	print "\n";
	exit;
}



# pour constituer la liste des fichiers constituant l'environnement utilisateur standard (et leurs paramètres)
# j'utilise ici la syntaxe 
# $var = <<LABEL;
# ...
# LABEL
# (le 2° LABEL devant être en début de ligne, ce que je ne sais pas faire en commentaire)
# qui met tout le texte entre les LABEL, formattage compris, dans la variable $var
# c'est une manière pratique d'entrer des données sans fioritures syntaxiques
# Voir le script 'pppp' comme illustration.

# le format que j'ai choisi sera explicité dans le 'foreach' qui suit (à la ligne 236)
# (et qui utilise ces paramètres) :
# fichier type exécution
# le 3° paramètre (exécution) étant optionnel
# pour chaque ligne on définit donc :
# 1 le nom du fichier qu'il faut télécharger du serveur
# 2 dans quel sous-répertoire (de /usr/local/) il faut le mettre
#	sauf si 
#		chemin absolu (commençant par /)
#		chemin relatif à un utilisateur (commençant par ~)
#		le 1° paramètre se termine par '.rpm' (dans ce cas le 2° paramètre = nom de l'exécutable)
#	s'il comporte un '=', créer un lien symbolique avec le nom qui suit
# 3 et s'il faut l'exécuter :
#	x : immédiatement
#	r : à chaque démarrage

# liste des fichiers constituant l'environnement utilisateur standard
$environment_files = <<EFILES;
syncdate bin r	# synchroniser les dates/heures avec le serveur 192.168.30.130 (si accessible)
csv bin r	# détection d'un changement de version de cs sur le serveur, et dans ce cas, exécution de la nouvelle version
cs bin 		# script mettant en place une configuration standard (d'une distribution Linux Mandriva)
csver bin 	# affichage des versions de cs, celle de l'ordinateur et celle du serveur
alias_liste etc 	# liste des alias, utilisée par 'adaf'
adaf bin x	# script ajoutant les alias contenus dans 'alias_liste' au fichier '/etc/profile.d/alias.sh'
raf_liste etc 	# liste des "pseudo-alias", utilisée par 'raf'
raf bin x	# script créant des scripts permettant d'exécuter des programmes par des "pseudo-alias" (avec &)
cgz bin 	# script facilitant la création de fichiers compressés (.tgz) d'un répertoire
mt bin 		# script facilitant le 'montage' d'une partition
nv bin 		# script affichant une synthèse de la configuration réseau de l'ordinateur
ws bin 		# script exécutant (et éventuellement installant) le 'sniffer' wireshark
kwnoroot bin x		# script empêchant d'utiliser 'kwrite' en tant que 'root'
bootstamp bin r		# script créant une trace à chaque démarrage (boot) de l'ordinateur
atlogin bin=atl 	# script créant une trace à chaque login d'un utilisateur (et l'envoyant au serveur)
ftpi bin 	# script permettant le transfert de fichiers au serveur
ftpexa bin	# script permettant le transfert de fichiers (réponses d'examen) au serveur
exa bin 	# script initiant la mise en place de l'examen 
getexa bin 	# script mettant la configuration de l'examen en place 
wg130 bin	# script permettant le téléchargement de fichiers à partir du serveur web du serveur local (=192.168.30.130)
wge bin		# script permettant le téléchargement de fichiers à partir du serveur web du serveur internet (=epfc.nooware.net)
EFILES


# liste des fichiers constituant l'environnement d'administration spécifique au local 30
$files_30 = <<FILES30;
net.sh bin r			# normaliser les paramètres réseau
resetuser bin=ru r		# remettre le compte 'user' dans un état standard
resetbprofile bin r		# remettre les fichiers '~/.bash_profile' dans un état standard
syslog.conf /etc		# configure le service 'syslog' de manière à ce que les 'slog_*' fonctionnent
slog_bootstamp bin r		# laisse une trace par le service 'syslog' lors d'un 'boot'
slog_bootstamps bin r		# laisse une trace (cumulative) par le service 'syslog' lors d'un 'boot'
hapos etc			# liste permettant de retrouver la position d'un ordinateur d'après sa carte réseau
mac bin				# transmet l'adresse hardware de la carte réseau au serveur
fileschanged-0.6.5-0.i386.rpm fileschanged 	# le programme 'fileschanged'
bash_profile etc 		# version 'normale' 
FILES30


$serveur_local30 = "192.168.30.130";
$serveur_internet = "epfc.nooware.net";

if ($param eq "s") {
# option 'auxilliaire'

  $files = $environment_files;
  chomp $files;
  @files = split(/\n/,$files);
  open(OUT, ">environment_files");
  foreach (@files) {
  # pour chaque fichier dans la liste
    s/^([^ ]+) .*/$1/;
    # supprimer le 1° espace, et tout ce qui suit
    print OUT;
    # écrire dans le fichier 'environment_files'
    print OUT "\n";
    # écrire une fin de ligne dans le fichier 'environment_files'
  }
  close OUT;
  
  system("/bin/cp environment_files all_files");
  # copier la partie commune dans le fichier 'all_files'
	  
  # ajouter la partie '$files_30' au fichier 'all_files'
  $files = $files_30;
  chomp $files;
  @files = split(/\n/,$files);
  open(OUT, ">>all_files");
  # '>>' ouvrir en écriture 'append' = ajouter à la fin
  foreach (@files) {
  # pour chaque fichier dans la liste
    s/^([^ ]+) .*/$1/;
    # supprimer le 1° espace, et tout ce qui suit
    print OUT;
    # écrire dans le fichier 'all_files'
    print OUT "\n";
    # écrire une fin de ligne dans le fichier 'all_files'
  }
  close OUT;
	
  exit;

} elsif ($param eq "c") {
# option complète
	$serveur = $serveur_local30;
	$files = $environment_files . $files_30;		

} elsif ($param eq "l") {
# serveur du local 30 accessible
# option locale
	$serveur = $serveur_local30;
	$files = $environment_files;

} elsif ($param eq "i") {
# serveur internet accessible
# option internet
	$serveur = "$serveur_internet";
	$files = $environment_files;

} else {
	print "\nPas d'argument !\n\n";
	print "\nSTADARDISATION NON EFFECTUEE !\n\n";
	exit;

}

# $files contient maintenant tous les paramètres de ma configuration standard
# et je peux la modifier très simplement

# pour utiliser les paramètres contenus dans $files,
# je préfère les transférer dans une variable de type vecteur, 
# pour pouvoir utiliser 'foreach'
# cela se fait simplement par un 'split' avec une 'fin de ligne' (\n) comme séparateur
# (pour éviter une composante vide, 
# correspondant à ce qu'il y a derrière le dernier \n,
# je fais d'abord un 'chomp'

chomp $files;

@files = split(/\n/,$files);
# la variable vecteur @files n'entre pas en conflit avec la variable scalaire $files :
# en perl les scalaires, les vecteurs et les hash ont des espaces de noms séparés
# j'en profite ici pour donner le même 'nom',
# pour indiquer qu'elles contiennet la même information

# à partir de la version 15 je réserve les répertoires /usr/local/bin et /usr/local/etc
# exclusivement à ce qui est prévu par ce script 'cs'
# à chaque nouvelle version je fais donc le vide avant d'installer cette version

# system("rm -f /usr/local/bin/*");
# system("rm -f /usr/local/etc/*");
# system("rm -f /usr/local/etc/.*");

# créer le répertoire './ul' s'il n'existe pas
if ( ! -d "./ul") {
  mkdir ('./ul');
}
# créer le répertoire './ul/bin' s'il n'existe pas
if ( ! -d "./ul/bin") {
  mkdir ('./ul/bin');
}
system("rm -f ./ul/bin/*");

# créer le répertoire './ul/etc' s'il n'existe pas
if ( ! -d "./ul/etc") {
  mkdir ('./ul/etc');
}
system("rm -f ./ul/etc/*");

# créer le répertoire './etc' s'il n'existe pas
if ( ! -d "./etc") {
  mkdir ('./etc');
}



foreach (@files) {
# pour chaque ficher dans la liste
	$line = $_;
	($file, $type, $exec) = split;
	# récupérer les 3 paramètres (le 3° pouvant être vide)
	if ( $file =~ /.rpm$/ ) {
	# si le nom du fichier se termine par '.rpm'
		# vérifier si le programme est déjà installé
		$nom_programme = $type;
		$chemin_executable =`which $nom_programme 2>/dev/null`;
		chomp $chemin_executable;
		if($chemin_executable eq "") {
			# sinon, télécharger
			system("wget --directory-prefix=/usr/tmp/ http://$serveur/$file");
			# et installer
# 			system("urpmi /usr/tmp/$file");
		}
		next;

	}
	if ( $type eq "urpmi" ) {
	# si le $type est "urpmi"
		$package = $file;
		# installer le package par "urpmi" 
		# (il faut qu'une source 'rpm' soit configurée)
# 		system("urpmi $package");
		next;

	}
	$directory = $type;
	$directory =~ s/=.*//;
	if ( $directory =~ /^\// ) {
		$realdirectory = "./";
		system("/bin/rm -f $realdirectory/$file");
		# supprimer le fichier pour que wget ne change pas son nom
	} elsif ( $directory =~ /^~/ ) {
	# si le 2° paramètre commence par un '~'
	# il s'agit d'un fichier de configuration, 
	# à modifier lors de le création d'un nouvel utilisateur
		$realdirectory = "./ul/etc";
		# il est à conserver dans '/usr/local/etc'
		system("/bin/echo $line >> ./ul/etc/at_creation_list");
		# et on l'ajoute à la liste '/usr/local/etc/at_creation_list'
	} else {
		$realdirectory = "./ul/$directory";
	}
	system("wget -nv --directory-prefix=$realdirectory http://$serveur/$file");
	# télécharger le fichier et le mettre dans le répertoire
	if ( $directory =~ /^bin/ ) {
		system("chmod +x ./ul/bin/$file");
		# si c'est un exécutable, le rendre exécutable
		if ( $type =~ /=/ ) {
			$lien_symboliques = $type;
			$lien_symboliques =~ s/^.*=//;
			@lien_symboliques = split( /,/, $lien_symboliques);
			foreach (@lien_symboliques) {
			# pour chaque lien_symbolique
			  system("cd ./ul/bin ; /bin/ln -s $file $_");
			# s'il faut ajouter un lien symbolique, le créer
			}
		}
	}
	if ( $exec eq "x" ) {
		if ( $directory eq $realdirectory ) {
			# si paramère 'x' pour un fichier dans un répertoire 'normal', 
			# le rendre exécutable
			system("chmod +x $directory/$file");
		} elsif ( $directory eq "bin" ) {
			# si paramère 'x' pour un fichier dans le répertoire '/usr/local/bin/', 
			# l'exécuter
# 			system("/usr/local/bin/$file");
		}
	} elsif ( $exec eq "r" ) {
		push (@exec_at_boot, "./ul/bin/$file\n");
		# s'il faut l'exécuter à chaque démarrage, 
		# l'accumuler, avec chemin complet et fin de ligne,
		# dans un vecteur (par 'push') pour traitement plus bas
	}
}

# pour l'exécution à chaque démarrage j'utilise le fichier /etc/rc.d/rc.local, prévu pour ça
# je le recopie d'abord, en enlevant toute trace de fichiers dans '/usr/local/bin/'
$local = "/etc/rc.d/rc.local";
$local_new = "./etc/rc.local";
# system("mv $local $local_old");
open(IN, "<$local");
open(OUT, ">$local_new");
while (<IN>) {
	if (/\/usr\/local\/bin\//) {
		next;
		# ne pas copier
	}
print OUT;
}
close IN;
# ensuite j'ajoute les exécutables accumulés ci-dessus dans le vecteur @exec_at_boot
foreach (@exec_at_boot) {
	print OUT;
}
close OUT;
# system("/bin/chmod +x $local");
# system("/bin/ln -sf $local /etc/rc.local");



system("echo -n $version > ./etc/cs.version");
# après avoir mis la configuration en place
# inscrire sa version dans le fichier /etc/cs.version
# pour que le script 'csv.txt', exécuté à chaque démarrage, 
# puisse faire la comparaison avec la version présente sur le serveur à ce moment

