[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/se3-clients-linux/home/netlogon/clients-linux/distribs/squeeze/integration/ -> integration_squeeze.bash (source)

   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  


Generated: Tue Mar 17 22:47:18 2015 Cross-referenced by PHPXref 0.7.1