1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331
| #!/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 |
Partager