[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

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


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