[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
1 #! /bin/bash 2 3 #--%<----%<----%<----%<----%<----%<----%<----%<----%<----%<----%<-- 4 SE3="__SE3__" 5 BASE_DN="__BASE_DN__" 6 SERVEUR_NTP="__SERVEUR_NTP__" 7 #--%<----%<----%<----%<----%<----%<----%<----%<----%<----%<----%<-- 8 9 # Pour avoir des sorties les plus simples possibles, c'est-à-dire 10 # en anglais avec des caractères 100% ASCII ! Ce changement de locales 11 # est temporaire et ne durera que le temps de l'exécution du script. 12 export LC_ALL="C" 13 14 # Pour faire des installations via apt-get non interactives. 15 export DEBIAN_FRONTEND=noninteractive 16 17 18 19 20 ####################################### 21 ####################################### 22 ### Quelques variables importantes. ### 23 ####################################### 24 ####################################### 25 26 # Le nom de ce script. 27 NOM_DU_SCRIPT=$0##*/} 28 29 # Nom actuel de la machine cliente. 30 NOM_CLIENT_ANCIEN=$(cat "/etc/hostname") 31 32 # Le nom de code de la distribution (par exemple "squeeze"). 33 NOM_DE_CODE=$(lsb_release --codename | cut -f 2) 34 #NOM_DE_CODE="wheezy" 35 36 # Le partage du Se3. 37 NOM_PARTAGE_NETLOGON="netlogon-linux" 38 CHEMIN_PARTAGE_NETLOGON="//$SE3/$NOM_PARTAGE_NETLOGON" 39 40 # Les répertoires/fichiers importants suite au montage du partage. 41 REP_MONTAGE="/mnt" 42 REP_NETLOGON="$REP_MONTAGE/netlogon" 43 REP_SAVE="$REP_NETLOGON/distribs/$NOM_DE_CODE/save" 44 REP_SKEL="$REP_NETLOGON/distribs/$NOM_DE_CODE/skel" 45 REP_BIN="$REP_NETLOGON/bin" 46 REP_INTEGRATION="$REP_NETLOGON/distribs/$NOM_DE_CODE/integration" 47 48 # Les répertoires/fichiers importants locaux au client. 49 REP_SE3_LOCAL="/etc/se3" 50 REP_SAVE_LOCAL="$REP_SE3_LOCAL/save" 51 REP_BIN_LOCAL="$REP_SE3_LOCAL/bin" 52 REP_SKEL_LOCAL="$REP_SE3_LOCAL/skel" 53 REP_UNEFOIS_LOCAL="$REP_SE3_LOCAL/unefois" 54 REP_LOG_LOCAL="$REP_SE3_LOCAL/log" 55 REP_TMP_LOCAL="$REP_SE3_LOCAL/tmp" 56 LOGON_SCRIPT_LOCAL="$REP_BIN_LOCAL/logon" 57 PAM_SCRIPT_AUTH="/usr/share/libpam-script/pam_script_auth" 58 CREDENTIALS="$REP_TMP_LOCAL/credentials" 59 60 # Les options de base pour un montage CIFS. 61 OPTIONS_MOUNT_CIFS_BASE="nobrl,serverino,iocharset=utf8,sec=ntlmv2" 62 63 # Variable de sortie en cas de debuggage 64 SORTIE="/dev/null" 65 66 ######################## 67 ######################## 68 ### Fonctions utiles ### 69 ######################## 70 ######################## 71 72 # Fonction pour afficher des messages. 73 function afficher () 74 { 75 echo "" 76 # On écrira des lignes de 65 caractères maximum. 77 echo "$@" | fmt -w 65 78 sleep 0.5 79 } 80 81 # Fonction qui teste si le nom du client est un nom valide. 82 # Elle prend un argument qui est le nom à tester bien sûr. 83 # Elle renvoie 0 si tout est Ok, 1 sinon (et dans ce cas un 84 # message d'erreur est envoyé). 85 function tester_nom_client () 86 { 87 # $1 représente le nom du client 88 # La classe [a-z] dépend de la locale : sur mon système (Debian Squeeze) 89 # et avec la locale fr_FR.utf8 la classe [a-z] attrape les caractères 90 # accentués ce que je ne souhaite pas. Mais avec la locale C, 91 # la classe [a-z] n'attrape pas les caractères accentués. 92 # Devant ce comportement un peu versatile, je préfère mettre explicitement 93 # la locale "C", même si en principe elle est déjà définie au début 94 # du script. 95 if echo "$1" | LC_ALL=C grep -Eiq '^[-a-z0-9]{1,15}$'; then 96 return 0 97 else 98 return 1 99 fi 100 } 101 102 # Affiche un message d'erreur concernant le nom du client à intégrer. 103 function afficher_erreur_nom_client () 104 { 105 afficher "Désolé, le client ne peut pas être intégré au" \ 106 "domaine car son nom doit être uniquement constitué" \ 107 "des caractères « -A-Za-z0-9 » avec 15 caractères maximum." 108 } 109 110 # Fonction qui Demande un mot de passe à l'utilisateur avec confirmation 111 # et définit ensuite la variable « mot_de_passe » qui contient alors 112 # la saisie de l'utilisateur. 113 function demander_mot_de_passe () 114 { 115 local mdp1 116 local mdp2 117 118 printf "Saissez le mot de passe : " 119 read -s -r mdp1 120 printf "\n" 121 122 printf "Saissez le mot de passe à nouveau : " 123 read -s -r mdp2 124 printf "\n" 125 126 while [ "$mdp1" != "$mdp2" ]; do 127 printf "Désolé, mais vos deux saisies ne sont pas identiques. Recommencez.\n" 128 129 printf "Saissez le mot de passe : " 130 read -s -r mdp1 131 printf "\n" 132 133 printf "Saissez le mot de passe à nouveau : " 134 read -s -r mdp2 135 printf "\n" 136 done 137 138 mot_de_passe="$mdp1" 139 } 140 141 # Fonction qui permet d'obtenir le hachage version Grub2 d'un mot 142 # de passe donné. La fonction prend un argument qui est le mot de 143 # passe en question. 144 function hacher_mot_de_passe_grub () 145 { 146 { echo "$1"; echo "$1"; } \ 147 | grub-mkpasswd-pbkdf2 -c 30 -l 30 -s 30 2>$SORTIE \ 148 | grep -v 'password' \ 149 | sed -r 's/Your PBKDF2 is (.+)$/\1/' 150 } 151 152 # Fonction qui permet de changer le mot de passe root. Elle prend 153 # un argument qui correspond au mot de passe souhaité. 154 function changer_mot_de_passe_root () 155 { 156 { echo "$1"; echo "$1"; } | passwd root > $SORTIE 2>&1 157 } 158 159 # Fonction qui restaure, en préservant les droits, un fichier 160 # à partir de sa version dans REP_SAVE_LOCAL. Le nom du fichier est donné 161 # en unique paramètre. 1) Le fichier doit exister dans REP_SAVE_LOCAL et 162 # 2) son nom doit être exprimé sous la forme d'un chemin absolu, correspondant 163 # à son emplacement dans le système. Par exemple "/etc/machin" comme paramètre 164 # implique que "$REP_SAVE_LOCAL"/etc/machin" doit exister. 165 function restaurer_via_save () 166 { 167 # Si la cible existe déjà, elle sera écrasée. 168 cp -a "$REP_SAVE_LOCAL}$1" "$1" 169 } 170 171 # Fonction qui permettra de supprimer le montage REP_NETLOGON 172 # (entre autres) si le script se termine incorrectement. 173 function nettoyer_avant_de_sortir () 174 { 175 case "$?" in 176 177 "0") 178 # Tout va bien, on ne fait rien. 179 true 180 ;; 181 182 "1") 183 # Là, il y a eu un problème. Il faut démonter REP_NETLOGON 184 # et supprimer le répertoire. 185 186 afficher "Nettoyage du système avant de quitter." 187 188 if mountpoint -q "$REP_NETLOGON"; then 189 umount "$REP_NETLOGON" && rmdir "$REP_NETLOGON" 190 else 191 if [ -d "$REP_NETLOGON" ]; then 192 rmdir "$REP_NETLOGON" 193 fi 194 fi 195 196 if [ -e "$REP_SE3_LOCAL" ]; then 197 if mountpoint -q "$REP_TMP_LOCAL"; then 198 umount "$REP_TMP_LOCAL" 199 fi 200 rm -fR "$REP_SE3_LOCAL" 201 fi 202 203 # On supprime les paquets installés. 204 apt-get purge --yes $PAQUETS_TOUS >$SORTIE 2>&1 205 ;; 206 207 *) 208 # On ne fait rien. 209 true 210 ;; 211 212 esac 213 } 214 215 function configurer_gdm3 () 216 { 217 ############################# 218 ############################# 219 ### Configuration de gdm3 ### 220 ############################# 221 ############################# 222 223 afficher "Configuration de gdm3 afin que le script de logon soit" \ 224 "exécuté au démarrage de gdm3, à l'ouverture et à la" \ 225 "fermeture de session" 226 227 ###################################################### 228 ### Modification du fichier /etc/gdm3/Init/Default ### 229 ###################################################### 230 231 # Ce fichier est exécuté à chaque fois que la fenêtre de connexion 232 # gdm3 est affichée, à savoir à chaque démarrage du système et après 233 # chaque fermeture de session d'un utilisateur. C'est dans l'exécution 234 # de ce script, entre autres, que le partage NOM_PARTAGE_NETLOGON va 235 # être monté. 236 237 # Modification du fichier en partant de la version sauvegardée. 238 # On supprime le « exit 0 » à la fin. 239 grep -v '^exit 0' "$REP_SAVE_LOCAL/etc/gdm3/Init/Default" > "/etc/gdm3/Init/Default" 240 # Puis on y ajoute ceci : 241 echo " 242 243 ########################################################################### 244 ### Modification pour l'intégration au domaine ### 245 ########################################################################### 246 247 if [ -x '$LOGON_SCRIPT_LOCAL' ]; then 248 '$LOGON_SCRIPT_LOCAL' 'initialisation' 249 fi 250 251 #######################FIN DE LA MODIFICATION############################## 252 253 exit 0 254 255 " >> "/etc/gdm3/Init/Default" 256 257 # Modifications des droits (les droits par défaut me semblent trop 258 # permissifs. 259 chown "root:root" "/etc/gdm3/Init/Default" 260 chmod "700" "/etc/gdm3/Init/Default" 261 262 ######################################################### 263 #### Création du fichier /etc/gdm3/PostLogin/Default #### 264 ######################################################### 265 266 # Ce script sera lancé à l'ouverture de session, juste après avoir 267 # entré le mot de passe. 268 touch "/etc/gdm3/PostLogin/Default" 269 chown "root:root" "/etc/gdm3/PostLogin/Default" 270 chmod "700" "/etc/gdm3/PostLogin/Default" 271 272 # On édite le fichier /etc/gdm3/PostLogin/Default de A à Z. 273 echo "#! /bin/bash 274 275 ########################################################################### 276 ### Création du fichier pour l'intégration au domaine ### 277 ########################################################################### 278 279 if [ -x '$LOGON_SCRIPT_LOCAL' ]; then 280 '$LOGON_SCRIPT_LOCAL' 'ouverture' 281 fi 282 283 #######################FIN DE LA MODIFICATION############################## 284 285 exit 0 286 287 " > "/etc/gdm3/PostLogin/Default" 288 289 ############################################################# 290 ### Modification du fichier /etc/gdm3/PostSession/Default ### 291 ############################################################# 292 293 # Ce script sera lancé à la fermeture de session. 294 295 # On édite carrément ce fichier de A à Z. 296 echo "#! /bin/bash 297 298 ########################################################################### 299 ### Modification pour l'intégration au domaine ### 300 ########################################################################### 301 302 if [ -x '$LOGON_SCRIPT_LOCAL' ]; then 303 '$LOGON_SCRIPT_LOCAL' 'fermeture' 304 fi 305 306 #######################FIN DE LA MODIFICATION############################## 307 308 exit 0 309 310 " > "/etc/gdm3/PostSession/Default" 311 312 # Modifications des droits. 313 chown "root:" "/etc/gdm3/PostSession/Default" 314 chmod "700" "/etc/gdm3/PostSession/Default" 315 316 ######################################################## 317 ### Modification de /etc/gdm3/greeter.gsettings ### 318 ######################################################## 319 320 # Ce fichier permet de gérer quelques options de la fenêtre de 321 # connexion qui s'affiche après le démarrage du système. 322 323 # Modification du fichier en partant de la version sauvegardée 324 # toujours pour être sûr de partir d'un fichier « clean ». 325 restaurer_via_save "/etc/gdm3/greeter.gsettings" 326 echo " 327 328 ########################################################################### 329 ### Modification pour l'intégration au domaine ### 330 ###########################################################################" 331 332 sed -r -i -e 's/^\# disable-user-list=true.*$/disable-user-list=true/g' /etc/gdm3/greeter.gsettings 333 334 } 335 336 function configurer_lightdm () 337 { 338 restaurer_via_save "/etc/lightdm/lightdm.conf" 339 sed -r -i "s|#greeter-setup-script.*$|greeter-setup-script=\"$LOGON_SCRIPT_LOCAL}\" initialisation|g" /etc/lightdm/lightdm.conf 340 sed -r -i "s|#session-setup-script.*$|session-setup-script=\"$LOGON_SCRIPT_LOCAL}\" ouverture|g" /etc/lightdm/lightdm.conf 341 sed -r -i "s|#session-cleanup-script.*$|session-cleanup-script=\"$LOGON_SCRIPT_LOCAL}\" fermeture|g" /etc/lightdm/lightdm.conf 342 } 343 344 # Avec de se terminer la fonction nettoyer_avant_de_sortir sera appelée. 345 trap 'nettoyer_avant_de_sortir' EXIT 346 347 348 349 350 ################### 351 ################### 352 ### Les options ### 353 ################### 354 ################### 355 356 # Une options longue avec les « :: » signifie que le paramètre est optionnel 357 # (par exemple « --nom-client » ou « --nom-client="S121-HPS-04" »). 358 # getopt réorganise les chaînes de caractères de "$@" pour que si par 359 # exemple "$@" vaut « --nom-client=TOTO arg1 arg2 », alors LISTE_OPTIONS 360 # vaut « --nom-client 'TOTO' -- 'arg1' 'arg2' ». 361 362 suite_options="help" 363 suite_options="$suite_options,nom-client::,nc::" 364 suite_options="$suite_options,mdp-grub::,mg::" 365 suite_options="$suite_options,mdp-root::,mr::" 366 suite_options="$suite_options,ignorer-verification-ldap,ivl" 367 suite_options="$suite_options,redemarrer-client,rc" 368 suite_options="$suite_options,installer-samba,is" 369 suite_options="$suite_options,debug,d" 370 371 LISTE_OPTIONS=$(getopt --options h --longoptions "$suite_options" -n "$NOM_DU_SCRIPT" -- "$@") 372 # Si l'appel est syntaxiquement incorrect on arrête le script. 373 if [ $? != 0 ] ; then echo "Arrêt du script $NOM_DU_SCRIPT." >&2; exit 1; fi 374 375 unset -v suite_options 376 377 # Évaluation de la chaîne $LISTE_OPTIONS afin de positionner 378 # $1, $2 comme étant la succession des mots de $LISTE_OPTIONS. 379 eval set -- "$LISTE_OPTIONS" 380 381 # On peut détruire la variable LISTE_OPTIONS. 382 unset -v LISTE_OPTIONS 383 384 # On définit des variables indiquant si les options ont été 385 # appelées. Par défaut, elles ont la valeur "false", c'est-à-dire 386 # qu'il n'y a pas eu appel des options. 387 OPTION_NOM_CLIENT="false" 388 OPTION_MDP_GRUB="false" 389 OPTION_MDP_ROOT="false" 390 OPTION_IV_LDAP="false" 391 OPTION_REDEMARRER="false" 392 OPTION_INSTALLER_SAMBA="false" 393 394 # La commande shift décale les paramètres $1, $2 etc. 395 # Par exemple après "shift 2" $3 devient accessible via $1 etc. 396 # On sortira forcément de la boucle car (et c'est entre autres le 397 # travail de getopt), la chaîne LISTE_OPTIONS évaluée précédemment 398 # contient forcément un "--" qui séparent les options (à gauche) et les 399 # arguments du script et qui ne sont pas des options (à droite de --). 400 while true ; do 401 case "$1" in 402 403 -h|--help) 404 afficher "Aide : voir la documentation (au format pdf) associée." 405 exit 0 406 ;; 407 408 --nom-client|--nc) 409 OPTION_NOM_CLIENT="true" 410 NOM_CLIENT="$2" 411 shift 2 412 ;; 413 414 --mdp-grub|--mg) 415 OPTION_MDP_GRUB="true" 416 MDP_GRUB="$2" 417 shift 2 418 ;; 419 420 --mdp-root|--mr) 421 OPTION_MDP_ROOT="true" 422 MDP_ROOT="$2" 423 shift 2 424 ;; 425 426 --ignorer-verification-ldap|--ivl) 427 OPTION_IV_LDAP="true" 428 shift 1 429 ;; 430 431 --redemarrer-client|--rc) 432 OPTION_REDEMARRER="true" 433 shift 1 434 ;; 435 436 --installer-samba|--is) 437 OPTION_INSTALLER_SAMBA="true" 438 shift 1 439 ;; 440 441 --debug|--d) 442 SORTIE=">&1" 443 shift 1 444 ;; 445 446 --) 447 shift 448 break 449 ;; 450 451 *) 452 afficher "Erreur: «$1» est une option non implémentée." 453 exit 1 454 ;; 455 456 esac 457 done 458 459 if [ -n "$1" ]; then 460 afficher "Désolé le script ne prend aucun argument à part des" \ 461 "options de la forme « --xxx ». Fin du script." 462 exit 1 463 fi 464 465 466 467 # Les paquets nécessaires à l'intégration. Ne peuvent être définis qu'après 468 # avoir connaissance de l'activation éventuelle de l'option --installer-samba. 469 PAQUETS_MONTAGE_CIFS="cifs-utils" 470 PAQUETS_CLIENT_LDAP="ldap-utils" 471 PAQUETS_RANDOM="rng-tools" 472 PAQUETS_AUTRES="libnss-ldapd libpam-ldapd nscd nslcd libpam-script rsync ntpdate xterm imagemagick" 473 if "$OPTION_INSTALLER_SAMBA"; then 474 PAQUETS_AUTRES="$PAQUETS_AUTRES samba" 475 fi 476 PAQUETS_TOUS="$PAQUETS_MONTAGE_CIFS $PAQUETS_CLIENT_LDAP $PAQUETS_RANDOM $PAQUETS_AUTRES" 477 478 479 480 ################################### 481 ################################### 482 ### Vérifications sur le client ### 483 ################################### 484 ################################### 485 486 afficher "Vérifications sur le système client..." 487 488 # On vérifie que l'utilisateur a bien les droits de root. 489 # Tester « "$USER" == "root" » est possible mais la variable 490 # $USER peut être modifiée par n'importe quel utilisateur, 491 # tandis que la variable $UID est en lecture seule. 492 if [ "$UID" != "0" ]; then 493 afficher "Désolé, vous devez avoir les droits « root » pour lancer" \ 494 "le script. Fin du script." 495 exit 1 496 fi 497 498 # On vérifie que le système est bien Debian Wheezy. 499 if [ "$NOM_DE_CODE" != "wheezy" ]; then 500 afficher "Désolé, le script doit être exécuté sur Debian Wheezy." \ 501 "Fin du script." 502 exit 1 503 fi 504 505 # Vérification du nom du client à intégrer. 506 if "$OPTION_NOM_CLIENT"; then 507 # L'option a été spécifiée. 508 if [ -n "$NOM_CLIENT" ]; then 509 # Si $NOM_CLIENT n'est pas vide, c'est que l'option a 510 # été spécifiée avec paramètre. 511 if ! tester_nom_client "$NOM_CLIENT"; then 512 afficher_erreur_nom_client 513 exit 1 514 fi 515 else 516 # $NOM_CLIENT est vide et l'utilisateur va choisir 517 # manuellement le nom du client plus loin. Pas de test. 518 true 519 fi 520 else 521 # L'option n'a pas été spécifiée, il faut vérifier le nom 522 # actuel du client. 523 if ! tester_nom_client "$NOM_CLIENT_ANCIEN"; then 524 afficher_erreur_nom_client 525 exit 1 526 fi 527 fi 528 529 # On vérifie que le répertoire de montage existe bien. 530 if [ ! -d "$REP_MONTAGE" ]; then 531 afficher "Désolé, le répertoire $REP_MONTAGE n'existe pas." \ 532 "Sa présence est nécessaire pour le script." \ 533 "Fin du script." 534 exit 1 535 fi 536 537 # On vérifie l'absence de montage dans le répertoire de montage. 538 if df | grep -q "$REP_MONTAGE"; then 539 afficher "Désolé, le répertoire $REP_MONTAGE ne doit contenir aucun" \ 540 "montage de système de fichiers. Charge à vous d'enlever" \ 541 "le ou les montages et de supprimer le ou les répertoires" \ 542 "associés. Relancez le script d'intégration ensuite." \ 543 "Fin du script." 544 exit 1 545 fi 546 547 # On vérifie alors qu'il n'existe pas de fichier ou répertoire REP_NETLOGON. 548 if [ -e "$REP_NETLOGON" ]; then 549 afficher "Désolé, un répertoire ou fichier $REP_NETLOGON existe déjà" \ 550 "dans $REP_MONTAGE. Charge à vous de le supprimer." \ 551 "Relancez le script d'intégration ensuite. Fin du script." 552 exit 1 553 fi 554 555 # Vérification du bon fonctionnement de « apt-get update ». 556 # Cette commande semble renvoyer la valeur 0 à chaque fois, 557 # même quand les dépôts ne sont pas accessibles par exemple. 558 # Du coup, je ne vois rien de mieux que de compter le nombre 559 # de lignes écrites sur la sortie standard des erreurs. 560 if [ $(apt-get update 2>&1 >$SORTIE | wc -l) -gt 0 ]; then 561 afficher "Désolé, la commande « apt-get update » ne fonctionne pas" \ 562 "correctement. Il y des erreurs que vous devez rectifier." \ 563 "Relancez le script d'intégration ensuite. Fin du script." 564 exit 1 565 fi 566 567 # Vérification de la disponibilité des paquets nécessaires à l'intégration. 568 for paquet in $PAQUETS_TOUS; do 569 if ! apt-get install "$paquet" --yes --simulate >$SORTIE 2>&1; then 570 afficher "Désolé, le paquet $paquet n'est pas disponible dans" \ 571 "les dépôts alors que celui-ci est nécessaire pour" \ 572 "effectuer l'intégration de la machine cliente." \ 573 "La liste des dépôts dans le fichier /etc/apt/sources.list" \ 574 "est sans doute incomplète. Fin du script." 575 exit 1 576 fi 577 done 578 579 # On teste la variable SE3 pour savoir si son contenu est une IP ou non. 580 # Si ce n'est pas une IP (et donc un nom), on teste sa résolution 581 # en adresse IP. 582 octet="[0-9]{1,3}" 583 if ! echo "$SE3" | grep -qE "^$octet\.$octet\.$octet\.$octet$"; then 584 if ! host "$SE3" >$SORTIE; then 585 afficher "Désolé, le nom d'hôte du SambaÉdu ($SE3) n'est pas résolu" \ 586 "par la machine cliente. Fin du script." 587 exit 1 588 fi 589 fi 590 unset -v octet 591 592 # Pas de client mDNS (le paquet tout seul est désinstallé). 593 # En effet, lors de la résolution d'un nom, ce protocole est 594 # utilisé avant DNS si et seulement si le nom d'hôte se termine 595 # par ".local". Et comme sur un réseau pédagogique il n'y a pas 596 # serveur mDNS, la résolution ne fonctionne pas. Et par défaut, 597 # quand la résolution mDNS n'aboutit pas, le protocole DNS n'est 598 # pas utilisé ensuite si bien que le nom d'hôte n'est pas résolu. 599 # Ça provient de la ligne 600 # « hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4 » 601 # dans le fichier /etc/nsswitch.conf. Bref, ce protocole ne sert 602 # à rien dans un réseau pédagogique et il peut même entraîner 603 # des erreurs (par exemple un simple « ping se3.intranet.local » 604 # ne fonctionnera pas alors que « ping se3 » fonctionnera). 605 apt-get remove --purge --yes libnss-mdns >$SORTIE 2>&1 606 607 # Arrêt définitif du service avahi-daemon. C'est la partie serveur 608 # du protocole mDNS dont on n'a que faire. Désintaller le paquet 609 # avahi-daemon ne doit pas être tenté car, par le jeu des dépendances, 610 # le paquet gnome-desktop-environment a besoin de avahi-daemon 611 # et du coup, si on désintalle avahi-daemon, gnome-desktop-environment 612 # se désinstalle et avec lui de très nombreuses dépendances ce qui 613 # ampute le système de plein de fonctionnalités. Le mieux, c'est donc 614 # de stopper ce daemon et d'empêcher son lancement lors du démarrage 615 # du système. 616 invoke-rc.d avahi-daemon stop >$SORTIE 2>&1 617 update-rc.d -f avahi-daemon remove >$SORTIE 2>&1 618 619 # On vérifie que le Se3 est bien accessible via un ping. 620 if ! ping -c 5 -W 2 "$SE3" >$SORTIE 2>&1; then 621 afficher "Désolé, le SambaÉdu est inaccessible via la commande ping." \ 622 "Fin du script." 623 exit 1 624 fi 625 626 afficher "Vérifications OK." 627 628 # Purge des paquets pour repartir sur une base saine et pouvoir 629 # enchaîner deux intégrations de suite sur le même client. 630 # Peut-être que l'option --installer-samba n'est pas activée 631 # et dans ce cas $PAQUETS_TOUS ne contient pas samba. 632 # Donc on l'ajoute dans la liste pour être sûr qu'il soit 633 # désintallé. 634 apt-get purge --yes $PAQUETS_TOUS samba >$SORTIE 2>&1 635 636 # On stoppe définitivement le daemon exim4 qui ne sert pas dans le 637 # cas d'une station cliente et qui peut bloquer pendant quelques secondes 638 # (voire quelques minutes) l'arrivée du prompt de login sur tty[1-6]. 639 invoke-rc.d exim4 stop >$SORTIE 2>&1 640 update-rc.d -f exim4 remove >$SORTIE 2>&1 641 642 643 644 645 ############################################### 646 ############################################### 647 ### Montage du partage NOM_PARTAGE_NETLOGON ### 648 ############################################### 649 ############################################### 650 651 afficher "Montage du partage « $NOM_PARTAGE_NETLOGON » du serveur." 652 653 # Nous allons installer PAQUETS_MONTAGE_CIFS nécessaire pour les montages CIFS, 654 # mais ce paquet nécessite l'installation du paquet samba-common 655 # qui lui-même pose des questions à l'utilisateur au moment de 656 # l'installation. D'où la nécessité de renseigner la configuration 657 # de ce paquet via debconf. 658 debconf_parametres=$(mktemp) 659 echo " 660 samba-common samba-common/encrypt_passwords boolean true 661 samba-common samba-common/dhcp boolean false 662 samba-common samba-common/workgroup string WORKGROUP 663 samba-common samba-common/do_debconf boolean true 664 " > "$debconf_parametres" 665 debconf-set-selections < "$debconf_parametres" 666 rm -f "$debconf_parametres" 667 unset -v debconf_parametres 668 669 # On installe le paquet qui contient la commande « mount.cifs ». L'option 670 # --no-install-recommends permet d'éviter l'installation du paquet 671 # samba-common-bin qui ferait du client un serveur Samba ce qui serait 672 # inutile ici. 673 apt-get install --no-install-recommends --reinstall --yes $PAQUETS_MONTAGE_CIFS >$SORTIE 2>&1 674 675 # Montage du partage NOM_PARTAGE_NETLOGON. 676 mkdir "$REP_NETLOGON" 677 chown "root:root" "$REP_NETLOGON" 678 chmod 700 "$REP_NETLOGON" 679 mount -t cifs "$CHEMIN_PARTAGE_NETLOGON" "$REP_NETLOGON" -o ro,guest,"$OPTIONS_MOUNT_CIFS_BASE" >$SORTIE 2>&1 680 if [ "$?" != "0" ]; then 681 rmdir "$REP_NETLOGON" 682 afficher "Échec du montage du partage $NOM_PARTAGE_NETLOGON du SambaÉdu." \ 683 "Fin du script." 684 exit 1 685 fi 686 687 688 689 690 ####################################################### 691 ####################################################### 692 ### Mise en place du répertoire local REP_SE3_LOCAL ### 693 ####################################################### 694 ####################################################### 695 696 afficher "Mise en place du répertoire local $REP_SE3_LOCAL." 697 698 # On efface le fichier ou répertoire REP_SE3_LOCAL s'il existe 699 # pour créer un répertoire vide qui sera rempli ensuite. 700 if [ -e "$REP_SE3_LOCAL" ]; then 701 if mountpoint -q "$REP_TMP_LOCAL"; then 702 umount "$REP_TMP_LOCAL" 703 fi 704 rm -fR "$REP_SE3_LOCAL" 705 fi 706 mkdir -p "$REP_SE3_LOCAL" 707 chown "root:" "$REP_SE3_LOCAL" 708 chmod "700" "$REP_SE3_LOCAL" 709 710 # Copie du répertoire REP_BIN. 711 cp -r "$REP_BIN" "$REP_BIN_LOCAL" 712 rm -fr "$REP_BIN_LOCAL/logon_perso" # En revanche le fichier logon_perso est inutile. 713 # On y ajoute les scripts d'intégration et de désintégration. 714 cp "$REP_INTEGRATION/"*"$NOM_DE_CODE"* "$REP_BIN_LOCAL" 715 chown -R "root:" "$REP_BIN_LOCAL" 716 chmod -R "700" "$REP_BIN_LOCAL" 717 718 # Copie du répertoire REP_SKEL et mise en place de droits cohérents. 719 cp -r "$REP_SKEL" "$REP_SKEL_LOCAL" 720 chown -R "root:" "$REP_SKEL_LOCAL" 721 chmod "700" "$REP_SKEL_LOCAL" 722 # Pour le premier find, il y a l'option « -mindepth 1 » car sinon 723 # les droits du répertoire « racine » REP_SKEL_LOCAL vont être 724 # redéfinis par find. 725 find "$REP_SKEL_LOCAL" -mindepth 1 -type d -exec chmod u=rwx,g=rwx,o='',u-s,g-s,o-t '{}' \; 726 find "$REP_SKEL_LOCAL" -type f -exec chmod u=rw,g=rw,o='',u-s,g-s,o-t '{}' \; 727 728 # Copie du répertoire REP_SAVE 729 cp -r "$REP_SAVE" "$REP_SAVE_LOCAL" 730 chown -R "root:" "$REP_SAVE_LOCAL" 731 chmod "700" "$REP_SAVE_LOCAL" 732 733 # Mise en place des droits sur les fichiers tels qu'ils sont 734 # sur un système « clean ». Pour ce faire, on utilise le fichier 735 # "droits" qui contient, sous un certain format, toutes les 736 # informations nécessaires. 737 cat "$REP_SAVE_LOCAL/droits" | while read; do 738 nom="$REP_SAVE_LOCAL$(echo "$REPLY" | cut -d ':' -f 1)" 739 proprietaire="$(echo "$REPLY" | cut -d ':' -f 2)" 740 groupe_proprietaire="$(echo "$REPLY" | cut -d ':' -f 3)" 741 droits="$(echo "$REPLY" | cut -d ':' -f 4)" 742 chown "$proprietaire:$groupe_proprietaire" "$nom" 743 chmod "$droits" "$nom" 744 done 745 unset -v nom proprietaire groupe_proprietaire droits 746 747 # Création du répertoire REP_UNEFOIS_LOCAL 748 mkdir -p "$REP_UNEFOIS_LOCAL" 749 chown "root:" "$REP_UNEFOIS_LOCAL" 750 chmod 700 "$REP_UNEFOIS_LOCAL" 751 752 # Création du répertoire REP_LOG_LOCAL 753 mkdir -p "$REP_LOG_LOCAL" 754 chown "root:" "$REP_LOG_LOCAL" 755 chmod 700 "$REP_LOG_LOCAL" 756 757 # Création du répertoire REP_TMP_LOCAL 758 mkdir -p "$REP_TMP_LOCAL" 759 chown "root:" "$REP_TMP_LOCAL" 760 chmod 700 "$REP_TMP_LOCAL" 761 762 763 764 765 ###################################### 766 ###################################### 767 ### Renommage (éventuel) du client ### 768 ###################################### 769 ###################################### 770 771 # On récupère le nom du client dans la variable NOM_CLIENT. 772 if "$OPTION_NOM_CLIENT"; then 773 # L'option a été spécifiée. 774 if [ -z "$NOM_CLIENT" ]; then 775 # Si $NOM_CLIENT est vide, c'est que l'option a été spécifié 776 # sans paramètre et il faut demander à l'utilisateur le nom 777 # qu'il souhaite pour le client. 778 afficher "Saisissez le nom de la machine cliente :" 779 read -r NOM_CLIENT 780 if ! tester_nom_client "$NOM_CLIENT"; then 781 afficher_erreur_nom_client 782 exit 1 783 fi 784 else 785 # $NOM_CLIENT n'est pas vide et l'utilisateur a déjà 786 # spécifié la valeur de ce paramètre. La vérification 787 # sur les caractères a déjà été effectuée dans la partie 788 # « Vérifications sur le client ». 789 true 790 fi 791 else 792 # L'option n'a pas été spécifiée et le nom (ancien) a déjà été 793 # vérifié au niveau des caractères dans la partie 794 # « Vérifications sur le client ». 795 NOM_CLIENT="$NOM_CLIENT_ANCIEN" 796 fi 797 798 afficher "Installation de l'exécutable ldapsearch et vérification de la" \ 799 "connexion avec l'annuaire LDAP du serveur à travers une" \ 800 "recherche d'enregistrements en rapport avec le client (au niveau" \ 801 "du nom de machine ou de l'adresse MAC ou de l'adresse IP)." 802 803 # Installation du ou des paquets contenant un client LDAP (pour 804 # faire des recherches. 805 apt-get install --no-install-recommends --reinstall --yes "$PAQUETS_CLIENT_LDAP" >$SORTIE 2>&1 806 807 # Vérification de la connexion LDAP avec le Se3. 808 ldapsearch -xLLL -h "$SE3" -b "ou=Computers,$BASE_DN" "(|(uid=$NOM_CLIENT$)(cn=$NOM_CLIENT))" "dn" > $SORTIE 2>&1 809 if [ "$?" != 0 ]; then 810 afficher "Désolé, le serveur LDAP n'est pas joignable." \ 811 "Fin du script." 812 exit 1 813 fi 814 815 # On passe à la recherche LDAP proprement dite. On va cherche dans l'annuaire 816 # toute entrée de machine dont le nom, l'adresse MAC ou l'adresse IP seraient 817 # identique à la machine cliente. 818 819 # Liste des cartes réseau (eth0, lo etc). 820 cartes_reseau=$(ifconfig | grep -i '^[a-z]' | cut -d' ' -f 1) 821 822 # Variable contenant les lignes de la forme 823 # nom-de-carte;adresse-mac;adresse-ip. 824 carte_mac_ip=$(for carte in $cartes_reseau; do 825 # On passe le cas où la carte est lo. 826 [ "$carte" = "lo" ] && continue 827 ifconfig "$carte" | awk 'BEGIN { v="rien"} 828 /^'"$carte"' / { printf $1 ";" $NF ";" } 829 /inet addr/ {v=$2; gsub("addr:", "", v); print v } 830 END { if (v == "rien") print "SANS-IP" }' 831 done) 832 833 # Construction du filtrer de recherche LDAP, par rapport au nom du client, 834 # à l'adresse MAC des cartes réseau ou à l'adresse IP des cartes réseau. 835 filtre_recherche="(|(uid=$NOM_CLIENT$)(cn=$NOM_CLIENT)" 836 for i in $carte_mac_ip; do 837 carte=$(echo "$i" | cut -d";" -f 1) 838 adresse_mac=$(echo "$i" | cut -d";" -f 2) 839 adresse_ip=$(echo "$i" | cut -d";" -f 3) 840 # Si jamais "$adresse_ip" = "SANS-IP", on ajoute simplement un critère inutile 841 # dans la recherche mais ce n'est pas un problème. 842 filtre_recherche="$filtre_recherche(ipHostNumber=$adresse_ip)(macAddress=$adresse_mac)" 843 done 844 # On ferme la parenthèse. 845 filtre_recherche="$filtre_recherche)" 846 847 # On effectue enfin la recherche LDAP qu'on affiche. 848 resultat=$(ldapsearch -xLLL -h "$SE3" -b "ou=Computers,$BASE_DN" "$filtre_recherche" dn ipHostNumber macAddress) 849 if [ "$resultat" = "" ]; then 850 resultat="AUCUNE ENTRÉE CORRESPONDANT DANS L'ANNUAIRE." 851 fi 852 afficher "Résultat de la recherche LDAP :" 853 echo "-------------------------------------------------" 854 echo "$resultat" 855 echo "-------------------------------------------------" 856 857 # On affiche quelques informations sur les cartes réseau de la 858 # machine cliente. 859 afficher "Pour information, voici l'adresse MAC et l'adresse IP des cartes" \ 860 "réseau de la machine cliente ($NOM_CLIENT) :" 861 for i in $carte_mac_ip; do 862 carte=$(echo "$i" | cut -d";" -f 1) 863 adresse_mac=$(echo "$i" | cut -d";" -f 2) 864 adresse_ip=$(echo "$i" | cut -d";" -f 3) 865 # On ne saute pas de ligne ici, alors on utilise echo. 866 echo "* $carte <--> $adresse_mac (IP: $adresse_ip)" 867 done 868 869 if "$OPTION_IV_LDAP"; then 870 afficher "Vous avez choisi d'ignorer la vérification LDAP, le script" \ 871 "d'intégration continue son exécution." 872 else 873 afficher "D'après les informations ci-dessus, voulez-vous continuer" \ 874 "l'exécution du script d'intégration ? Si oui, alors répondez" \ 875 "« oui » (en minuscules), sinon répondez autre chose :" 876 read -r reponse 877 if [ "$reponse" != "oui" ]; then 878 afficher "Fin du script." 879 exit 1 880 fi 881 fi 882 883 # Après les vérifications, on procède au renommage proprement 884 # dit. Renommage qui n'a lieu que si l'option --nom-client a été 885 # spécifié. 886 if "$OPTION_NOM_CLIENT"; then 887 afficher "Changement de nom du système." 888 echo "$NOM_CLIENT" > "/etc/hostname" 889 invoke-rc.d hostname.sh stop > $SORTIE 2>&1 890 invoke-rc.d hostname.sh start > $SORTIE 2>&1 891 fi 892 893 unset -v cartes_reseau carte_mac_ip carte adresse_mac adresse_ip 894 unset -v filtre_recherche resultat reponse 895 896 897 898 899 ####################################################### 900 ####################################################### 901 ### Mise en place (éventuelle) du mot de passe Grub ### 902 ####################################################### 903 ####################################################### 904 905 # Si l'option --mdp-grub n'a pas été spécifiée, alors on passe 906 # à la suite sans rien faire. Sinon, il faut mettre en place 907 # un mot de passe Grub. 908 if "$OPTION_MDP_GRUB"; then 909 910 afficher "Mise en place du mot de passe Grub (le login sera « admin »)." 911 912 # Installation temporaire qui permet de rendre le fichier 913 # /dev/random plus loquace ce qui permet ainsi de rectifier 914 # un bug de la commande grub-mkpasswd-pbkdf2. Ces installations 915 # seront supprimées ensuite, une fois la mise en place du 916 # mot de passe Grub terminée. 917 apt-get install --reinstall --yes --force-yes $PAQUETS_RANDOM > $SORTIE 2>&1 918 echo "HRNGDEVICE=/dev/urandom" >> "/etc/default/rng-tools" 919 invoke-rc.d rng-tools stop > $SORTIE 2>&1 920 invoke-rc.d rng-tools start > $SORTIE 2>&1 921 922 if [ -z "$MDP_GRUB" ]; then 923 # MDP_GRUB est vide (l'option --mdp-grub a été spécifiée 924 # sans paramètre), il faut donc demander à l'utilisateur 925 # le mot de passe. 926 demander_mot_de_passe # La variable mot_de_passe est alors définie. 927 MDP_GRUB=$mot_de_passe 928 else 929 # MDP_GRUB a été spécifié via le paramètre de l'option 930 # --mdp-grub. Il n'y a rien à faire dans ce cas. 931 true 932 fi 933 934 # On hache le mot de passe Grub. 935 mdp_grub_hache=$(hacher_mot_de_passe_grub "$MDP_GRUB") 936 937 # On édite le fichier /etc/grub.d/40_custom. 938 fichier_grub_custom="/etc/grub.d/40_custom" 939 restaurer_via_save "$fichier_grub_custom" 940 echo 'set superusers="admin"' >> "$fichier_grub_custom" 941 echo "password_pbkdf2 admin $mdp_grub_hache" >> "$fichier_grub_custom" 942 943 # On met à jour la configuration de Grub. 944 update-grub > $SORTIE 2>&1 945 if [ "$?" != "0" ]; then 946 afficher "Attention, la commande « update_grub » ne s'est pas" \ 947 "effectuée correctement, a priori Grub n'est pas" \ 948 "opérationnel. Il faut rectifier la configuration de" \ 949 "Grub jusqu'à ce que la commande se déroule sans erreur." 950 exit 1 951 fi 952 953 unset -v mot_de_passe mdp_grub_hache fichier_grub_custom 954 955 # Désinstallation de PAQUETS_RANDOM. 956 apt-get remove --purge --yes $PAQUETS_RANDOM > $SORTIE 2>&1 957 958 fi 959 960 ###################################################### 961 # Annulation du timeout de démarrage 962 ###################################################### 963 sed -r -i -e 's/^\GRUB_TIMEOUT=5.*$/GRUB_TIMEOUT=-1/g' /etc/default/grub 964 update-grub > $SORTIE 2>&1 965 966 967 ####################################################### 968 ####################################################### 969 ### Mise en place (éventuelle) du mot de passe root ### 970 ####################################################### 971 ####################################################### 972 973 # Si l'option --mdp-root n'a pas été spécifiée, alors on passe 974 # à la suite sans rien faire. Sinon, il faut modifier le 975 # mot de passe root. 976 if "$OPTION_MDP_ROOT"; then 977 978 afficher "Changement du mot de passe root." 979 980 if [ -z "$MDP_ROOT" ]; then 981 # MDP_ROOT est vide (l'option --mdp-root a été spécifiée 982 # sans paramètre), il faut donc demander à l'utilisateur 983 # le mot de passe. 984 demander_mot_de_passe # La variable mot_de_passe est alors définie. 985 MDP_ROOT=$mot_de_passe 986 else 987 # MDP_ROOT a été spécifié via le paramètre de l'option 988 # --mdp-root. Il n'y a rien à faire dans ce cas. 989 true 990 fi 991 992 # On peut alors changer le mot de passe de root. 993 changer_mot_de_passe_root "$MDP_ROOT" 994 995 unset -v mot_de_passe 996 997 fi 998 999 1000 1001 1002 ######################################################################### 1003 ######################################################################### 1004 ### Désinstallation des paquets network-manager network-manager-gnome ### 1005 ######################################################################### 1006 ######################################################################### 1007 1008 # Avant de désinstaller network-manager*, on énumère les cartes 1009 # réseau présentes sur le système, sachant que ça inclut « lo ». 1010 cartes_reseau=$(ifconfig | grep -i '^[a-z]' | cut -d' ' -f 1) 1011 1012 config_cartes="/etc/network/interfaces" 1013 1014 afficher "Les paquets network-manager et network-manager-gnome vont être" \ 1015 "désinstallés. C'est le fichier $config_cartes qui permettra" \ 1016 "désormais de paramétrer la configuration IP des cartes réseau." \ 1017 "Par défaut, toutes les cartes réseau vont être configurées" \ 1018 "via le DHCP." 1019 1020 apt-get remove --purge --yes network-manager network-manager-gnome > $SORTIE 2>&1 1021 1022 echo " 1023 # Fichier édité lors de l'intégration de la machine au domaine SE3. 1024 # NetworkManager a été désinstallé du système et c'est maintenant ce 1025 # fichier qui gère la configuration des cartes réseau de la machines. 1026 1027 auto lo 1028 iface lo inet loopback 1029 " > "$config_cartes" 1030 1031 for carte in $cartes_reseau; do 1032 [ "$carte" = "lo" ] && continue 1033 echo "auto $carte" >> "$config_cartes" 1034 echo "iface $carte inet dhcp" >> "$config_cartes" 1035 echo "" >> "$config_cartes" 1036 done 1037 1038 invoke-rc.d networking stop > $SORTIE 2>&1 1039 invoke-rc.d networking start > $SORTIE 2>&1 1040 1041 # On vérifie à nouveau que le Se3 est bien accessible via un ping. 1042 if ! ping -c 5 -W 2 "$SE3" >$SORTIE 2>&1; then 1043 afficher "Désolé, le Se3 est inaccessible via la commande ping." \ 1044 "Fin du script." 1045 exit 1 1046 fi 1047 1048 unset -v cartes_reseau config_cartes 1049 1050 1051 1052 1053 ################################ 1054 ################################ 1055 ### Installation des paquets ### 1056 ################################ 1057 ################################ 1058 1059 afficher "Installation des paquets nécessaires à l'intégration." 1060 1061 # Utilisation de debconf pour rendre l'installation non-interactive 1062 # mais adaptée à la situation présente. 1063 debconf_parametres=$(mktemp) 1064 echo " 1065 libnss-ldapd libnss-ldapd/nsswitch multiselect group, passwd, shadow 1066 libnss-ldapd libnss-ldapd/clean_nsswitch boolean false 1067 libpam-ldapd libpam-ldapd/enable_shadow boolean true 1068 nslcd nslcd/ldap-bindpw password 1069 nslcd nslcd/ldap-starttls boolean false 1070 nslcd nslcd/ldap-base string $BASE_DN 1071 nslcd nslcd/ldap-reqcert select 1072 nslcd nslcd/ldap-uris string ldap://$SE3/ 1073 nslcd nslcd/ldap-binddn string 1074 samba-common samba-common/encrypt_passwords boolean true 1075 samba-common samba-common/dhcp boolean false 1076 samba-common samba-common/workgroup string WORKGROUP 1077 samba-common samba-common/do_debconf boolean true 1078 " > "$debconf_parametres" 1079 debconf-set-selections < "$debconf_parametres" 1080 rm -f "$debconf_parametres" 1081 unset -v debconf_parametres 1082 1083 apt-get install --no-install-recommends --yes --reinstall $PAQUETS_AUTRES > $SORTIE 2>&1 1084 1085 # Cas particulier. Sur Squeeze, on a besoin du paquet sudo. 1086 apt-get install --yes sudo > $SORTIE 2>&1 1087 1088 # On désinstalle le gestionnaire de fenêtres TWM pour qu'au moment 1089 # de l'ouverture de session l'utilisateur ne puisse choisir que Gnome 1090 # et seulement Gnome. 1091 apt-get remove --purge --yes twm >$SORTIE 2>&1 1092 afficher "Installation des paquets terminée." 1093 1094 1095 1096 1097 afficher "Configuration post-installation du système." 1098 1099 1100 1101 1102 ############################ 1103 ############################ 1104 ### Configuration de PAM ### 1105 ############################ 1106 ############################ 1107 1108 afficher "Configuration de PAM afin que seul gdm3 (la fenêtre de login)" \ 1109 "consulte l'annuaire LDAP du serveur pour l'authentification. Une" \ 1110 "authentification via ssh (par exemple) ne sera possible qu'avec" \ 1111 "un compte local." 1112 1113 # L'installation des paquets a eu lieu et maintenant les fichiers 1114 # "/etc/pam.d/common-*" tiennent compte de LDAP. On va les renommer 1115 # de manière explicite, avec l'extension « .AVEC-LDAP », et on va 1116 # remettre les fichiers "/etc/pam.d/common-*" d'origine. 1117 # Ensuite, dans le fichier "/etc/pam.d/gdm3" et lui seul, on va 1118 # changer les instructions « @include » pour importer les fichiers 1119 # "/etc/pam.d/common-*.AVEC-LDAP". Ainsi, gdm3 sera la seule application 1120 # utilisant PAM qui tiendra compte de LDAP. Par exemple, les comptes 1121 # LDAP ne pourront pas se connecter au système via la console ou via 1122 # ssh. 1123 1124 # Si des fichiers ayant pour nom "common-*.AVEC-LDAP", c'est sans 1125 # doute qu'il y a déjà eu tentative d'intégration, alors on supprime 1126 # ces fichiers. 1127 for f in "/etc/pam.d/common-"*".AVEC-LDAP"; do 1128 [ "$f" = "/etc/pam.d/common-*.AVEC-LDAP" ] && continue 1129 rm -f "$f" 1130 done 1131 1132 # On renomme les fichiers "common-*" en ajoutant l'extension « .AVEC-LDAP » 1133 # et on restaure sa version d'origine. 1134 for f in "/etc/pam.d/common-"*; do 1135 [ "$f" = "/etc/pam.d/common-*" ] && continue 1136 mv -f "$f" "$f.AVEC-LDAP" 1137 restaurer_via_save "$f" 1138 done 1139 1140 # Dans les trois fichiers common-(auth|account|session).AVEC-LDAP, on 1141 # remplace, au niveau de la ligne faisant appel à pam_unix.so, 1142 # l'instruction de contrôle par « sufficient ». Le but est que, 1143 # en cas de panne du serveur, la connexion avec les comptes locaux 1144 # ne soit pas ralentie pour autant (ce qui est le cas si on laisse 1145 # en l'état la configuration. 1146 sed -i -r -e 's/^.*pam_unix\.so.*$/account sufficient pam_unix.so/g' "/etc/pam.d/common-account.AVEC-LDAP" 1147 sed -i -r -e 's/^.*pam_unix\.so.*$/auth sufficient pam_unix.so/g' "/etc/pam.d/common-auth.AVEC-LDAP" 1148 sed -i -r -e 's/^.*pam_unix\.so.*$/session sufficient pam_unix.so/g' "/etc/pam.d/common-session.AVEC-LDAP" 1149 1150 # On modifie le fichier /etc/pam.d/gdm3 ou /etc/pam.d/lightdm afin que : 1151 # 1) Il fasse appel à la bibliothèque pam_script.so. 1152 # 2) Il y ait des « includes » des fichiers "/etc/pam.d/common-*.AVEC-LDAP". 1153 1154 gdm="$(cat /etc/X11/default-display-manager | cut -d / -f 4)" 1155 echo "Gestionnaire graphique installé $gdm" 1156 restaurer_via_save "/etc/pam.d/$gdm}" 1157 # Insertion de la ligne « auth optional pam_script.so ». 1158 awk '{ print $0 } /^auth.*pam_gnome_keyring\.so/ { print "auth\toptional\tpam_script.so" }' \ 1159 "$REP_SAVE_LOCAL}/etc/pam.d/$gdm}" > "/etc/pam.d/$gdm}" 1160 # Inclusion des fichiers "/etc/pam.d/common-*.AVEC-LDAP". 1161 sed -i -r 's/@include\s+(common\-[a-z]+)\s*$/@include \1\.AVEC-LDAP/' "/etc/pam.d/$gdm}" 1162 1163 # Création du fichier PAM_SCRIPT_AUTH. 1164 echo '#! /bin/bash 1165 1166 function est_utilisateur_local () 1167 { 1168 if grep -q "^$1:" "/etc/passwd"; then 1169 return 0 1170 else 1171 return 1 1172 fi 1173 } 1174 1175 if est_utilisateur_local "$PAM_USER"; then 1176 # On ne fait rien. 1177 exit 0 1178 fi 1179 1180 # Sinon, on écrit les identifiants. 1181 1182 echo "username=$PAM_USER 1183 password=$PAM_AUTHTOK" > "__CREDENTIALS__" 1184 1185 exit 0 1186 ' > "$PAM_SCRIPT_AUTH" 1187 1188 # Attention, il faut prendre « : » comme délimiteur car « / » 1189 # est présent dans le chemin du fichier CREDENTIALS. 1190 sed -r -i -e "s:__CREDENTIALS__:$CREDENTIALS:g" "$PAM_SCRIPT_AUTH" 1191 chown "root:root" "$PAM_SCRIPT_AUTH" 1192 chmod "555" "$PAM_SCRIPT_AUTH" 1193 1194 1195 # Paramétrage de gnome-screensaver utiliser quand une session 1196 # doit être déverrouillée. 1197 restaurer_via_save "/etc/pam.d/gnome-screensaver" 1198 sed -i -r 's/@include\s+(common\-[a-z]+)\s*$/@include \1\.AVEC-LDAP/' "/etc/pam.d/gnome-screensaver" 1199 1200 1201 1202 1203 ###################################################################### 1204 ###################################################################### 1205 ### Réécriture des fichiers /etc/hosts et /etc/dhcp/dhclient.conf #### 1206 ###################################################################### 1207 ###################################################################### 1208 1209 # Peu importe que l'option --nom-client ait été spécifiée ou non, 1210 # nous allons réécriture le fichier /etc/hosts. 1211 1212 afficher "Réécriture complète du fichier /etc/hosts." 1213 1214 echo " 1215 127.0.0.1 localhost 1216 127.0.1.1 $NOM_CLIENT 1217 1218 # The following lines are desirable for IPv6 capable hosts 1219 ::1 ip6-localhost ip6-loopback 1220 fe00::0 ip6-localnet 1221 ff00::0 ip6-mcastprefix 1222 ff02::1 ip6-allnodes 1223 ff02::2 ip6-allrouters 1224 " > "/etc/hosts" 1225 1226 #Modification inutile sur Wheezy 1227 #afficher "Modification du fichier /etc/dhcp/chclient.conf afin que le" \ 1228 # "nom de la machine soit envoyé au serveur DHCP par le client DHCP." 1229 1230 # Et nous allons également modifier le fichier 1231 # /etc/dhcp/chclient.conf afin que le nom de machine soit 1232 # envoyé au serveur DHCP. 1233 #restaurer_via_save "/etc/dhcp/dhclient.conf" 1234 #sed -i -r -e "s/^.*send host-name.*$/send host-name \"$NOM_CLIENT\";/g" "/etc/dhcp/dhclient.conf" 1235 1236 1237 1238 1239 ############################################# 1240 ############################################# 1241 ### Réécriture du fichier /etc/nslcd.conf ### 1242 ############################################# 1243 ############################################# 1244 1245 afficher "Réécriture complète du fichier /etc/nslcd.conf afin que la" \ 1246 "communication LDAP entre le client et le serveur (notamment" \ 1247 "au moment de l'authentification) soit cryptée." 1248 1249 echo " 1250 # /etc/nslcd.conf 1251 # nslcd configuration file. See nslcd.conf(5) for details. 1252 1253 # The user and group nslcd should run as. 1254 uid nslcd 1255 gid nslcd 1256 1257 # The location at which the LDAP server(s) should be reachable. 1258 uri ldap://$SE3/ 1259 1260 # The search base that will be used for all queries. 1261 base $BASE_DN 1262 1263 # SSL options 1264 ssl start_tls 1265 tls_reqcert never 1266 1267 " > "/etc/nslcd.conf" 1268 1269 invoke-rc.d nslcd stop > $SORTIE 2>&1 1270 invoke-rc.d nslcd start > $SORTIE 2>&1 1271 1272 1273 1274 ############################################################################## 1275 ############################################################################## 1276 ### Modification du fichier smb.conf (s'il s'avère qu'on a installé Samba) ### 1277 ############################################################################## 1278 ############################################################################## 1279 1280 # À faire seulement si le fichier existe bien sûr. 1281 if [ -f "/etc/samba/smb.conf" ]; then 1282 afficher "Modification du fichier /etc/samba/smb.conf afin d'indiquer" \ 1283 "à la machine cliente que le serveur SambaÉdu est le" \ 1284 "serveur WINS du domaine." 1285 sed -i -r -e "s/^.*wins +server +=.*$/wins server = $SE3/" "/etc/samba/smb.conf" 1286 invoke-rc.d samba restart > $SORTIE 2>&1 1287 fi 1288 1289 1290 1291 ####################################### 1292 ####################################### 1293 ### Configuration de ntpdate-debian ### 1294 ####################################### 1295 ####################################### 1296 1297 1298 afficher "Réécriture complète du fichier /etc/default/ntpdate" \ 1299 "afin que l'heure du système soit mise à jour via le" \ 1300 "serveur NTP indiqué dans le script d'intégration." 1301 1302 # On réécrit simplement le fichier de configuration 1303 # associé (/etc/default/ntpdate). Ensuite, tout se passe comme si, 1304 # à chaque démarrage, la commande « ntpdate-debian » était lancée 1305 # en tant que root. 1306 echo " 1307 # The settings in this file are used by the program ntpdate-debian, but not 1308 # by the upstream program ntpdate. 1309 1310 # Set to \"yes\" to take the server list from /etc/ntp.conf, from package ntp, 1311 # so you only have to keep it in one place. 1312 NTPDATE_USE_NTP_CONF=no 1313 1314 # List of NTP servers to use (Separate multiple servers with spaces.) 1315 # Not used if NTPDATE_USE_NTP_CONF is yes. 1316 NTPSERVERS=\"$SERVEUR_NTP\" 1317 1318 # Additional options to pass to ntpdate 1319 NTPOPTIONS=\"\" 1320 " > "/etc/default/ntpdate" 1321 1322 1323 ######################################### 1324 ######################################### 1325 ### Configurations des gestionnaires ### 1326 ### graphiques d'ouverture de session ### 1327 ######################################### 1328 ######################################### 1329 1330 1331 if [ "$gdm" = "gdm3" ]; then 1332 configurer_gdm3 1333 fi 1334 1335 if [ "$gdm" = "lightdm" ]; then 1336 configurer_lightdm 1337 fi 1338 1339 ############################### 1340 ############################### 1341 ### Configurations diverses ### 1342 ############################### 1343 ############################### 1344 1345 ########################################################### 1346 ### Modification du fichier /etc/xdg/user-dirs.defaults ### 1347 ########################################################### 1348 1349 afficher "Modification du fichier /etc/xdg/user-dirs.defaults afin" \ 1350 "que « Bureau » soit le seul répertoire créé automatiquement" \ 1351 "dans le home d'un utilisateur." 1352 1353 # Ce fichier permet de gérer les répertoires créés par défaut dans 1354 # le /home de l'utilisateur (comme le répertoire Bureau ou Images etc). 1355 restaurer_via_save "/etc/xdg/user-dirs.defaults" 1356 1357 # On édite carrément le fichier de A à Z. 1358 echo " 1359 # Le bureau sera le seul répertoire créé par défaut 1360 # dans le /home de l'utilisateur. 1361 1362 DESKTOP=Desktop 1363 1364 " > "/etc/xdg/user-dirs.defaults" 1365 1366 1367 1368 1369 ######################################################################################### 1370 ### Modification du fichier /usr/share/polkit-1/actions/org.freedesktop.upower.policy ### 1371 ######################################################################################### 1372 1373 afficher "Modification du fichier /usr/share/polkit-1/actions/org.freedesktop.upower.policy" \ 1374 "afin de désactiver l'hibernation et la mise en veille du système." 1375 1376 # Ce fichier permet de désactiver l'hibernation et la mise en veille 1377 # qui mettent souvent la pagaille sous Linux. 1378 1379 # On crée le fichier en partant de sa version sauvegardée dont on 1380 # est sûr qu'elle est non bidouillée. 1381 restaurer_via_save "/usr/share/polkit-1/actions/org.freedesktop.upower.policy" 1382 sed -i -r \ 1383 -e 's:<allow_inactive>no</allow_inactive>:<allow_inactive>yes</allow_inactive>:g' \ 1384 -e 's:<allow_active>yes</allow_active>:<allow_active>no</allow_active>:g' \ 1385 "/usr/share/polkit-1/actions/org.freedesktop.upower.policy" 1386 1387 1388 1389 1390 ############################ 1391 ############################ 1392 ### FIN DE L'INTÉGRATION ### 1393 ############################ 1394 ############################ 1395 1396 1397 afficher "Fin de l'intégration." \ 1398 "Si ce n'est pas déjà fait, pensez à effectuer une réservation" \ 1399 "d'adresse IP du client via" \ 1400 "le serveur DHCP du SambaÉdu, afin d'inscrire le nom" \ 1401 "de la machine cliente dans l'annuaire." 1402 1403 if "$OPTION_REDEMARRER"; then 1404 afficher "La machine va redémarrer dans 10 secondes." 1405 echo "" 1406 for i in 1 2 3 4 5 6 7 8 9 10; do 1407 sleep 1 1408 echo -n "$i... " 1409 done 1410 printf "\n" 1411 reboot 1412 exit 0 1413 else 1414 afficher "Pour pour que le système soit opérationnel, vous devez le redémarrer." 1415 exit 0 1416 fi 1417 1418 1419 1420
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Tue Mar 17 22:47:18 2015 | Cross-referenced by PHPXref 0.7.1 |