#!/usr/bin/perl

$version = "32";

$param = shift; 
chomp $param;

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


# j'utilise ici la syntaxe 
# $var = <<LABEL;
# ...
# LABEL
# (le 2° LABEL devant être en début de ligne, ce que je 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

# liste des fichiers constituant l'environnement utilisateur standard
$environment_files = <<EFILES;
csv bin r
cs bin
csver bin
install_env_fj etc
raf_liste etc
raf bin x
alias_liste etc
adaf bin x
cgz bin
mt bin
nv bin
EFILES


# au cas où on exécute le script 'à la main'
$id=`whoami`;
chomp $id;
if ($id ne "root") {
	if ($param ne "") {
		print "Il faut être 'root' pour pouvoir installer la configuration standard";
		print "\n";
		exit;
	}

	print "\n";
	print "Fabrication, dans le répertoire courant, d'un fichier compressé";
	print "\n";
	print "'env_fj.xx.tgz'";
	print "\n";
	print "permettant de reproduire l'environnement utilisateur";
	print "\n";
	print "de la version actuelle de 'cs'";
	print "\n";

}


# vérifier que wget est installé
#	wget est un programme qui permet de télécharger des fichiers,
#	avec les protocoles http et ftp,
#	en ligne de commande
# sinon terminer le script avec un message d'erreur

$nom_programme = "wget";
# trouver l'exécutable
$chemin_executable = `which $nom_programme 2>/dev/null`;
# supprimer la sortie erreur (2) 
# (en la redirigeant vers le fichier "trou noir" /dev/null)
# car elle n'est pas redirigée par la syntaxe ``
# et serait affichée pendant l'exécution de ce script
# ce qui serait désagréable
# voir script sortie_erreur2
chomp $chemin_executable;
# vérifier qu'il existe
if ($chemin_executable eq "") {
	print "\n$nom_programme n'est pas un exécutable dans un des répertoires du \$PATH\n\n";
	print "\nSTADARDISATION NON EFFECTUEE !\n\n";
	exit;
}




# liste des fichiers constituant l'environnement d'administration spécifique au local 30
$files_30 = <<FILES30;
scpi bin			
ftpi bin			
ftpexa bin			
syncdate bin r			
net.sh bin r			
resetuser bin=ru r		
slog_bootstamp bin r		
slog_bootstamps bin r		
loginstamp bin l		
hapos etc			
syslog.conf /etc		
S00unstart /etc/rc.d/rc5.d x	
mac bin				
FILES30


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

$ping_local30 = `ping -c 1 $serveur_local30`;
$ping_internet = `ping -c 1 $serveur_internet`;

if ($param eq "l") {
# option locale
	$serveur = $serveur_local30;
	$files = $environment_files . $files_30;

	# le 'if' qui suit renferme du code qui concerne la configuration réseau
	# et est destiné à résoudre un problème spécifique de configuration
	# qui est apparu avec la version 2007 de Mandriva :
	#	les configurations ethernet sont liées à une carte ethernet précise,
	#	et ne fonctionne donc plus si on démarre su un autre PC,
	#	ce qui est le cas dans le local 30, avec les disques amovibles
	#
	# ce problème étant très spécifique, je n'examine pas cette partie du script en détail
	if ( ! -d "/home/guest") {
	# si l'utilisateur 'guest' n'existe pas,
	# on n'est pas dans un système "live" (démarré sur un DVD); 
	#      où cette opération n'a pas de sens
		
		# standardiser les ifcfg-eth* (de ifcfg-eth0 à ifcfg-eth19)
		if ( -f "/etc/hd.nb") {
			$hdnb = `cat /etc/hd.nb`;
	
$eth = <<ETH;
BOOTPROTO=static
IPADDR=192.168.30.$hdnb
NETMASK=255.255.0.0
NETWORK=192.168.0.0
BROADCAST=192.168.255.255
ONBOOT=yes
MII_NOT_SUPPORTED=yes
ETH
	
		} else {
		
$eth = <<ETH;
BOOTPROTO=dhcp
ONBOOT=yes 
MII_NOT_SUPPORTED=yes
DHCP_CLIENT=dhclient
NEEDHOSTNAME=yes 
PEERDNS=yes
PEERYP=no
PEERNTPD=no
ETH
		}
			
		$number = 0;
		while ($number < 20) {
			$texte = "DEVICE=eth" . $number . "\n" . $eth;
			$filename = "ifcfg-eth$number";
			system("echo '$texte' > /etc/sysconfig/network-scripts/$filename");
			
			$number++;
		}
		system("chmod +x /etc/sysconfig/network-scripts/ifcfg-eth*");
		
	}
} elsif ($param =~ /\d/) {
# option pour une installation locale à partir d'un tgz



} elsif ($ping_local30 ne "") {
# serveur du local 30 accessible
	$serveur = $serveur_local30;
	$files = $environment_files;
} elsif ($ping_internet ne "") {
# serveur internet accessible
	$serveur = "$serveur_internet";
#	$serveur = "$serveur_internet/epfc";
	$files = $environment_files;
} else {
	print "\nPas de serveur accessible !\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
# le format que j'ai choisi sera explicité dans le 'foreach' qui suit
# (et qui utilise ces paramètres) :
# fichier répertoire 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 /)
#	si 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
#	l : à chaque login

# 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/*");

foreach (@files) {
# pour chaque ficher dans la liste
	($file, $type, $exec) = split;
	# récupérer les 3 paramètres (le 3° pouvant être vide)
	$directory = $type;
	$directory =~ s/=.*//;
	if ( $directory =~ /^\// ) {
		$realdirectory = $directory;
		system("/bin/rm -f $realdirectory/$file");
		# supprimer le fichier pour que wget ne change pas son nom
	} else {
		$realdirectory = "/usr/local/$directory";
	}
	system("wget --directory-prefix=$realdirectory http://$serveur/$file");
	# télécharger le fichier et le mettre dans le répertoire
	if ( $directory =~ /^bin/ ) {
		system("chmod +x /usr/local/bin/$file");
		# si c'est un exécutable, le rendre exécutable
		if ( $type =~ /=/ ) {
			$lien_symbolique = $type;
			$lien_symbolique =~ s/^.*=//;
			system("/bin/ln -s /usr/local/bin/$file /usr/local/bin/$lien_symbolique");
			# 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, "/usr/local/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
	} elsif ( $exec eq "l" ) {
		push (@exec_at_login, "/usr/local/bin/$file\n");
		# s'il faut l'exécuter à chaque login de 'user', 
		# 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_old = "/etc/rc.d/rc.local.old";
system("mv $local $local_old");
open(IN, "<$local_old");
open(OUT, ">$local");
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");



# pour l'exécution à chaque login j'utilise le fichier /home/user/.bash_profile, prévu pour ça
# je le recopie d'abord, en enlevant toute trace de fichiers dans '/usr/local/bin/'
system("mv /home/user/.bash_profile /home/user/.bash_profile.old");
open(IN, "</home/user/.bash_profile.old");
open(OUT, ">/home/user/.bash_profile");
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_login) {
	print OUT;
}
close OUT;

if ( -d "/home/guest") {
# si l'utilisateur 'guest' existe,
# on est dans un système "live" (démarré sur un DVD); 
	system("slog_bootstamp");
}

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.pl', exécuté à chaque démarrage, 
# puisse faire la comparaison avec la version présente sur le serveur à ce moment
