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