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