[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

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


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