#! /bin/bash #--%<----%<----%<----%<----%<----%<----%<----%<----%<----%<----%<-- SE3="__SE3__" BASE_DN="__BASE_DN__" SERVEUR_NTP="__SERVEUR_NTP__" #--%<----%<----%<----%<----%<----%<----%<----%<----%<----%<----%<-- # Pour avoir des sorties les plus simples possibles, c'est-à-dire # en anglais avec des caractères 100% ASCII ! Ce changement de locales # est temporaire et ne durera que le temps de l'exécution du script. export LC_ALL="C" # Pour faire des installations via apt-get non interactives. export DEBIAN_FRONTEND=noninteractive ####################################### ####################################### ### Quelques variables importantes. ### ####################################### ####################################### # Le nom de ce script. NOM_DU_SCRIPT=${0##*/} # Nom actuel de la machine cliente. NOM_CLIENT_ANCIEN=$(cat "/etc/hostname") # Le nom de code de la distribution (par exemple "squeeze"). NOM_DE_CODE=$(lsb_release --codename | cut -f 2) #NOM_DE_CODE="wheezy" # Le partage du Se3. NOM_PARTAGE_NETLOGON="netlogon-linux" CHEMIN_PARTAGE_NETLOGON="//$SE3/$NOM_PARTAGE_NETLOGON" # Les répertoires/fichiers importants suite au montage du partage. REP_MONTAGE="/mnt" REP_NETLOGON="$REP_MONTAGE/netlogon" REP_SAVE="$REP_NETLOGON/distribs/$NOM_DE_CODE/save" REP_SKEL="$REP_NETLOGON/distribs/$NOM_DE_CODE/skel" REP_BIN="$REP_NETLOGON/bin" REP_INTEGRATION="$REP_NETLOGON/distribs/$NOM_DE_CODE/integration" # Les répertoires/fichiers importants locaux au client. REP_SE3_LOCAL="/etc/se3" REP_SAVE_LOCAL="$REP_SE3_LOCAL/save" REP_BIN_LOCAL="$REP_SE3_LOCAL/bin" REP_SKEL_LOCAL="$REP_SE3_LOCAL/skel" REP_UNEFOIS_LOCAL="$REP_SE3_LOCAL/unefois" REP_LOG_LOCAL="$REP_SE3_LOCAL/log" REP_TMP_LOCAL="$REP_SE3_LOCAL/tmp" LOGON_SCRIPT_LOCAL="$REP_BIN_LOCAL/logon" PAM_SCRIPT_AUTH="/usr/share/libpam-script/pam_script_auth" CREDENTIALS="$REP_TMP_LOCAL/credentials" # Les options de base pour un montage CIFS. OPTIONS_MOUNT_CIFS_BASE="nobrl,serverino,iocharset=utf8,sec=ntlmv2" # Variable de sortie en cas de debuggage SORTIE="/dev/null" ######################## ######################## ### Fonctions utiles ### ######################## ######################## # Fonction pour afficher des messages. function afficher () { echo "" # On écrira des lignes de 65 caractères maximum. echo "$@" | fmt -w 65 sleep 0.5 } # Fonction qui teste si le nom du client est un nom valide. # Elle prend un argument qui est le nom à tester bien sûr. # Elle renvoie 0 si tout est Ok, 1 sinon (et dans ce cas un # message d'erreur est envoyé). function tester_nom_client () { # $1 représente le nom du client # La classe [a-z] dépend de la locale : sur mon système (Debian Squeeze) # et avec la locale fr_FR.utf8 la classe [a-z] attrape les caractères # accentués ce que je ne souhaite pas. Mais avec la locale C, # la classe [a-z] n'attrape pas les caractères accentués. # Devant ce comportement un peu versatile, je préfère mettre explicitement # la locale "C", même si en principe elle est déjà définie au début # du script. if echo "$1" | LC_ALL=C grep -Eiq '^[-a-z0-9]{1,15}$'; then return 0 else return 1 fi } # Affiche un message d'erreur concernant le nom du client à intégrer. function afficher_erreur_nom_client () { afficher "Désolé, le client ne peut pas être intégré au" \ "domaine car son nom doit être uniquement constitué" \ "des caractères « -A-Za-z0-9 » avec 15 caractères maximum." } # Fonction qui Demande un mot de passe à l'utilisateur avec confirmation # et définit ensuite la variable « mot_de_passe » qui contient alors # la saisie de l'utilisateur. function demander_mot_de_passe () { local mdp1 local mdp2 printf "Saissez le mot de passe : " read -s -r mdp1 printf "\n" printf "Saissez le mot de passe à nouveau : " read -s -r mdp2 printf "\n" while [ "$mdp1" != "$mdp2" ]; do printf "Désolé, mais vos deux saisies ne sont pas identiques. Recommencez.\n" printf "Saissez le mot de passe : " read -s -r mdp1 printf "\n" printf "Saissez le mot de passe à nouveau : " read -s -r mdp2 printf "\n" done mot_de_passe="$mdp1" } # Fonction qui permet d'obtenir le hachage version Grub2 d'un mot # de passe donné. La fonction prend un argument qui est le mot de # passe en question. function hacher_mot_de_passe_grub () { { echo "$1"; echo "$1"; } \ | grub-mkpasswd-pbkdf2 -c 30 -l 30 -s 30 2>$SORTIE \ | grep -v 'password' \ | sed -r 's/Your PBKDF2 is (.+)$/\1/' } # Fonction qui permet de changer le mot de passe root. Elle prend # un argument qui correspond au mot de passe souhaité. function changer_mot_de_passe_root () { { echo "$1"; echo "$1"; } | passwd root > $SORTIE 2>&1 } # Fonction qui restaure, en préservant les droits, un fichier # à partir de sa version dans REP_SAVE_LOCAL. Le nom du fichier est donné # en unique paramètre. 1) Le fichier doit exister dans REP_SAVE_LOCAL et # 2) son nom doit être exprimé sous la forme d'un chemin absolu, correspondant # à son emplacement dans le système. Par exemple "/etc/machin" comme paramètre # implique que "$REP_SAVE_LOCAL"/etc/machin" doit exister. function restaurer_via_save () { # Si la cible existe déjà, elle sera écrasée. cp -a "${REP_SAVE_LOCAL}$1" "$1" } # Fonction qui permettra de supprimer le montage REP_NETLOGON # (entre autres) si le script se termine incorrectement. function nettoyer_avant_de_sortir () { case "$?" in "0") # Tout va bien, on ne fait rien. true ;; "1") # Là, il y a eu un problème. Il faut démonter REP_NETLOGON # et supprimer le répertoire. afficher "Nettoyage du système avant de quitter." if mountpoint -q "$REP_NETLOGON"; then umount "$REP_NETLOGON" && rmdir "$REP_NETLOGON" else if [ -d "$REP_NETLOGON" ]; then rmdir "$REP_NETLOGON" fi fi if [ -e "$REP_SE3_LOCAL" ]; then if mountpoint -q "$REP_TMP_LOCAL"; then umount "$REP_TMP_LOCAL" fi rm -fR "$REP_SE3_LOCAL" fi # On supprime les paquets installés. apt-get purge --yes $PAQUETS_TOUS >$SORTIE 2>&1 ;; *) # On ne fait rien. true ;; esac } function configurer_gdm3 () { ############################# ############################# ### Configuration de gdm3 ### ############################# ############################# afficher "Configuration de gdm3 afin que le script de logon soit" \ "exécuté au démarrage de gdm3, à l'ouverture et à la" \ "fermeture de session" ###################################################### ### Modification du fichier /etc/gdm3/Init/Default ### ###################################################### # Ce fichier est exécuté à chaque fois que la fenêtre de connexion # gdm3 est affichée, à savoir à chaque démarrage du système et après # chaque fermeture de session d'un utilisateur. C'est dans l'exécution # de ce script, entre autres, que le partage NOM_PARTAGE_NETLOGON va # être monté. # Modification du fichier en partant de la version sauvegardée. # On supprime le « exit 0 » à la fin. grep -v '^exit 0' "$REP_SAVE_LOCAL/etc/gdm3/Init/Default" > "/etc/gdm3/Init/Default" # Puis on y ajoute ceci : echo " ########################################################################### ### Modification pour l'intégration au domaine ### ########################################################################### if [ -x '$LOGON_SCRIPT_LOCAL' ]; then '$LOGON_SCRIPT_LOCAL' 'initialisation' fi #######################FIN DE LA MODIFICATION############################## exit 0 " >> "/etc/gdm3/Init/Default" # Modifications des droits (les droits par défaut me semblent trop # permissifs. chown "root:root" "/etc/gdm3/Init/Default" chmod "700" "/etc/gdm3/Init/Default" ######################################################### #### Création du fichier /etc/gdm3/PostLogin/Default #### ######################################################### # Ce script sera lancé à l'ouverture de session, juste après avoir # entré le mot de passe. touch "/etc/gdm3/PostLogin/Default" chown "root:root" "/etc/gdm3/PostLogin/Default" chmod "700" "/etc/gdm3/PostLogin/Default" # On édite le fichier /etc/gdm3/PostLogin/Default de A à Z. echo "#! /bin/bash ########################################################################### ### Création du fichier pour l'intégration au domaine ### ########################################################################### if [ -x '$LOGON_SCRIPT_LOCAL' ]; then '$LOGON_SCRIPT_LOCAL' 'ouverture' fi #######################FIN DE LA MODIFICATION############################## exit 0 " > "/etc/gdm3/PostLogin/Default" ############################################################# ### Modification du fichier /etc/gdm3/PostSession/Default ### ############################################################# # Ce script sera lancé à la fermeture de session. # On édite carrément ce fichier de A à Z. echo "#! /bin/bash ########################################################################### ### Modification pour l'intégration au domaine ### ########################################################################### if [ -x '$LOGON_SCRIPT_LOCAL' ]; then '$LOGON_SCRIPT_LOCAL' 'fermeture' fi #######################FIN DE LA MODIFICATION############################## exit 0 " > "/etc/gdm3/PostSession/Default" # Modifications des droits. chown "root:" "/etc/gdm3/PostSession/Default" chmod "700" "/etc/gdm3/PostSession/Default" ######################################################## ### Modification de /etc/gdm3/greeter.gsettings ### ######################################################## # Ce fichier permet de gérer quelques options de la fenêtre de # connexion qui s'affiche après le démarrage du système. # Modification du fichier en partant de la version sauvegardée # toujours pour être sûr de partir d'un fichier « clean ». restaurer_via_save "/etc/gdm3/greeter.gsettings" echo " ########################################################################### ### Modification pour l'intégration au domaine ### ###########################################################################" sed -r -i -e 's/^\# disable-user-list=true.*$/disable-user-list=true/g' /etc/gdm3/greeter.gsettings } function configurer_lightdm () { restaurer_via_save "/etc/lightdm/lightdm.conf" sed -r -i "s|#greeter-setup-script.*$|greeter-setup-script=\"${LOGON_SCRIPT_LOCAL}\" initialisation|g" /etc/lightdm/lightdm.conf sed -r -i "s|#session-setup-script.*$|session-setup-script=\"${LOGON_SCRIPT_LOCAL}\" ouverture|g" /etc/lightdm/lightdm.conf sed -r -i "s|#session-cleanup-script.*$|session-cleanup-script=\"${LOGON_SCRIPT_LOCAL}\" fermeture|g" /etc/lightdm/lightdm.conf } # Avec de se terminer la fonction nettoyer_avant_de_sortir sera appelée. trap 'nettoyer_avant_de_sortir' EXIT ################### ################### ### Les options ### ################### ################### # Une options longue avec les « :: » signifie que le paramètre est optionnel # (par exemple « --nom-client » ou « --nom-client="S121-HPS-04" »). # getopt réorganise les chaînes de caractères de "$@" pour que si par # exemple "$@" vaut « --nom-client=TOTO arg1 arg2 », alors LISTE_OPTIONS # vaut « --nom-client 'TOTO' -- 'arg1' 'arg2' ». suite_options="help" suite_options="$suite_options,nom-client::,nc::" suite_options="$suite_options,mdp-grub::,mg::" suite_options="$suite_options,mdp-root::,mr::" suite_options="$suite_options,ignorer-verification-ldap,ivl" suite_options="$suite_options,redemarrer-client,rc" suite_options="$suite_options,installer-samba,is" suite_options="$suite_options,debug,d" LISTE_OPTIONS=$(getopt --options h --longoptions "$suite_options" -n "$NOM_DU_SCRIPT" -- "$@") # Si l'appel est syntaxiquement incorrect on arrête le script. if [ $? != 0 ] ; then echo "Arrêt du script $NOM_DU_SCRIPT." >&2; exit 1; fi unset -v suite_options # Évaluation de la chaîne $LISTE_OPTIONS afin de positionner # $1, $2 comme étant la succession des mots de $LISTE_OPTIONS. eval set -- "$LISTE_OPTIONS" # On peut détruire la variable LISTE_OPTIONS. unset -v LISTE_OPTIONS # On définit des variables indiquant si les options ont été # appelées. Par défaut, elles ont la valeur "false", c'est-à-dire # qu'il n'y a pas eu appel des options. OPTION_NOM_CLIENT="false" OPTION_MDP_GRUB="false" OPTION_MDP_ROOT="false" OPTION_IV_LDAP="false" OPTION_REDEMARRER="false" OPTION_INSTALLER_SAMBA="false" # La commande shift décale les paramètres $1, $2 etc. # Par exemple après "shift 2" $3 devient accessible via $1 etc. # On sortira forcément de la boucle car (et c'est entre autres le # travail de getopt), la chaîne LISTE_OPTIONS évaluée précédemment # contient forcément un "--" qui séparent les options (à gauche) et les # arguments du script et qui ne sont pas des options (à droite de --). while true ; do case "$1" in -h|--help) afficher "Aide : voir la documentation (au format pdf) associée." exit 0 ;; --nom-client|--nc) OPTION_NOM_CLIENT="true" NOM_CLIENT="$2" shift 2 ;; --mdp-grub|--mg) OPTION_MDP_GRUB="true" MDP_GRUB="$2" shift 2 ;; --mdp-root|--mr) OPTION_MDP_ROOT="true" MDP_ROOT="$2" shift 2 ;; --ignorer-verification-ldap|--ivl) OPTION_IV_LDAP="true" shift 1 ;; --redemarrer-client|--rc) OPTION_REDEMARRER="true" shift 1 ;; --installer-samba|--is) OPTION_INSTALLER_SAMBA="true" shift 1 ;; --debug|--d) SORTIE=">&1" shift 1 ;; --) shift break ;; *) afficher "Erreur: «$1» est une option non implémentée." exit 1 ;; esac done if [ -n "$1" ]; then afficher "Désolé le script ne prend aucun argument à part des" \ "options de la forme « --xxx ». Fin du script." exit 1 fi # Les paquets nécessaires à l'intégration. Ne peuvent être définis qu'après # avoir connaissance de l'activation éventuelle de l'option --installer-samba. PAQUETS_MONTAGE_CIFS="cifs-utils" PAQUETS_CLIENT_LDAP="ldap-utils" PAQUETS_RANDOM="rng-tools" PAQUETS_AUTRES="libnss-ldapd libpam-ldapd nscd nslcd libpam-script rsync ntpdate xterm imagemagick" if "$OPTION_INSTALLER_SAMBA"; then PAQUETS_AUTRES="$PAQUETS_AUTRES samba" fi PAQUETS_TOUS="$PAQUETS_MONTAGE_CIFS $PAQUETS_CLIENT_LDAP $PAQUETS_RANDOM $PAQUETS_AUTRES" ################################### ################################### ### Vérifications sur le client ### ################################### ################################### afficher "Vérifications sur le système client..." # On vérifie que l'utilisateur a bien les droits de root. # Tester « "$USER" == "root" » est possible mais la variable # $USER peut être modifiée par n'importe quel utilisateur, # tandis que la variable $UID est en lecture seule. if [ "$UID" != "0" ]; then afficher "Désolé, vous devez avoir les droits « root » pour lancer" \ "le script. Fin du script." exit 1 fi # On vérifie que le système est bien Debian Wheezy. if [ "$NOM_DE_CODE" != "wheezy" ]; then afficher "Désolé, le script doit être exécuté sur Debian Wheezy." \ "Fin du script." exit 1 fi # Vérification du nom du client à intégrer. if "$OPTION_NOM_CLIENT"; then # L'option a été spécifiée. if [ -n "$NOM_CLIENT" ]; then # Si $NOM_CLIENT n'est pas vide, c'est que l'option a # été spécifiée avec paramètre. if ! tester_nom_client "$NOM_CLIENT"; then afficher_erreur_nom_client exit 1 fi else # $NOM_CLIENT est vide et l'utilisateur va choisir # manuellement le nom du client plus loin. Pas de test. true fi else # L'option n'a pas été spécifiée, il faut vérifier le nom # actuel du client. if ! tester_nom_client "$NOM_CLIENT_ANCIEN"; then afficher_erreur_nom_client exit 1 fi fi # On vérifie que le répertoire de montage existe bien. if [ ! -d "$REP_MONTAGE" ]; then afficher "Désolé, le répertoire $REP_MONTAGE n'existe pas." \ "Sa présence est nécessaire pour le script." \ "Fin du script." exit 1 fi # On vérifie l'absence de montage dans le répertoire de montage. if df | grep -q "$REP_MONTAGE"; then afficher "Désolé, le répertoire $REP_MONTAGE ne doit contenir aucun" \ "montage de système de fichiers. Charge à vous d'enlever" \ "le ou les montages et de supprimer le ou les répertoires" \ "associés. Relancez le script d'intégration ensuite." \ "Fin du script." exit 1 fi # On vérifie alors qu'il n'existe pas de fichier ou répertoire REP_NETLOGON. if [ -e "$REP_NETLOGON" ]; then afficher "Désolé, un répertoire ou fichier $REP_NETLOGON existe déjà" \ "dans $REP_MONTAGE. Charge à vous de le supprimer." \ "Relancez le script d'intégration ensuite. Fin du script." exit 1 fi # Vérification du bon fonctionnement de « apt-get update ». # Cette commande semble renvoyer la valeur 0 à chaque fois, # même quand les dépôts ne sont pas accessibles par exemple. # Du coup, je ne vois rien de mieux que de compter le nombre # de lignes écrites sur la sortie standard des erreurs. if [ $(apt-get update 2>&1 >$SORTIE | wc -l) -gt 0 ]; then afficher "Désolé, la commande « apt-get update » ne fonctionne pas" \ "correctement. Il y des erreurs que vous devez rectifier." \ "Relancez le script d'intégration ensuite. Fin du script." exit 1 fi # Vérification de la disponibilité des paquets nécessaires à l'intégration. for paquet in $PAQUETS_TOUS; do if ! apt-get install "$paquet" --yes --simulate >$SORTIE 2>&1; then afficher "Désolé, le paquet $paquet n'est pas disponible dans" \ "les dépôts alors que celui-ci est nécessaire pour" \ "effectuer l'intégration de la machine cliente." \ "La liste des dépôts dans le fichier /etc/apt/sources.list" \ "est sans doute incomplète. Fin du script." exit 1 fi done # On teste la variable SE3 pour savoir si son contenu est une IP ou non. # Si ce n'est pas une IP (et donc un nom), on teste sa résolution # en adresse IP. octet="[0-9]{1,3}" if ! echo "$SE3" | grep -qE "^$octet\.$octet\.$octet\.$octet$"; then if ! host "$SE3" >$SORTIE; then afficher "Désolé, le nom d'hôte du SambaÉdu ($SE3) n'est pas résolu" \ "par la machine cliente. Fin du script." exit 1 fi fi unset -v octet # Pas de client mDNS (le paquet tout seul est désinstallé). # En effet, lors de la résolution d'un nom, ce protocole est # utilisé avant DNS si et seulement si le nom d'hôte se termine # par ".local". Et comme sur un réseau pédagogique il n'y a pas # serveur mDNS, la résolution ne fonctionne pas. Et par défaut, # quand la résolution mDNS n'aboutit pas, le protocole DNS n'est # pas utilisé ensuite si bien que le nom d'hôte n'est pas résolu. # Ça provient de la ligne # « hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4 » # dans le fichier /etc/nsswitch.conf. Bref, ce protocole ne sert # à rien dans un réseau pédagogique et il peut même entraîner # des erreurs (par exemple un simple « ping se3.intranet.local » # ne fonctionnera pas alors que « ping se3 » fonctionnera). apt-get remove --purge --yes libnss-mdns >$SORTIE 2>&1 # Arrêt définitif du service avahi-daemon. C'est la partie serveur # du protocole mDNS dont on n'a que faire. Désintaller le paquet # avahi-daemon ne doit pas être tenté car, par le jeu des dépendances, # le paquet gnome-desktop-environment a besoin de avahi-daemon # et du coup, si on désintalle avahi-daemon, gnome-desktop-environment # se désinstalle et avec lui de très nombreuses dépendances ce qui # ampute le système de plein de fonctionnalités. Le mieux, c'est donc # de stopper ce daemon et d'empêcher son lancement lors du démarrage # du système. invoke-rc.d avahi-daemon stop >$SORTIE 2>&1 update-rc.d -f avahi-daemon remove >$SORTIE 2>&1 # On vérifie que le Se3 est bien accessible via un ping. if ! ping -c 5 -W 2 "$SE3" >$SORTIE 2>&1; then afficher "Désolé, le SambaÉdu est inaccessible via la commande ping." \ "Fin du script." exit 1 fi afficher "Vérifications OK." # Purge des paquets pour repartir sur une base saine et pouvoir # enchaîner deux intégrations de suite sur le même client. # Peut-être que l'option --installer-samba n'est pas activée # et dans ce cas $PAQUETS_TOUS ne contient pas samba. # Donc on l'ajoute dans la liste pour être sûr qu'il soit # désintallé. apt-get purge --yes $PAQUETS_TOUS samba >$SORTIE 2>&1 # On stoppe définitivement le daemon exim4 qui ne sert pas dans le # cas d'une station cliente et qui peut bloquer pendant quelques secondes # (voire quelques minutes) l'arrivée du prompt de login sur tty[1-6]. invoke-rc.d exim4 stop >$SORTIE 2>&1 update-rc.d -f exim4 remove >$SORTIE 2>&1 ############################################### ############################################### ### Montage du partage NOM_PARTAGE_NETLOGON ### ############################################### ############################################### afficher "Montage du partage « $NOM_PARTAGE_NETLOGON » du serveur." # Nous allons installer PAQUETS_MONTAGE_CIFS nécessaire pour les montages CIFS, # mais ce paquet nécessite l'installation du paquet samba-common # qui lui-même pose des questions à l'utilisateur au moment de # l'installation. D'où la nécessité de renseigner la configuration # de ce paquet via debconf. debconf_parametres=$(mktemp) echo " samba-common samba-common/encrypt_passwords boolean true samba-common samba-common/dhcp boolean false samba-common samba-common/workgroup string WORKGROUP samba-common samba-common/do_debconf boolean true " > "$debconf_parametres" debconf-set-selections < "$debconf_parametres" rm -f "$debconf_parametres" unset -v debconf_parametres # On installe le paquet qui contient la commande « mount.cifs ». L'option # --no-install-recommends permet d'éviter l'installation du paquet # samba-common-bin qui ferait du client un serveur Samba ce qui serait # inutile ici. apt-get install --no-install-recommends --reinstall --yes $PAQUETS_MONTAGE_CIFS >$SORTIE 2>&1 # Montage du partage NOM_PARTAGE_NETLOGON. mkdir "$REP_NETLOGON" chown "root:root" "$REP_NETLOGON" chmod 700 "$REP_NETLOGON" mount -t cifs "$CHEMIN_PARTAGE_NETLOGON" "$REP_NETLOGON" -o ro,guest,"$OPTIONS_MOUNT_CIFS_BASE" >$SORTIE 2>&1 if [ "$?" != "0" ]; then rmdir "$REP_NETLOGON" afficher "Échec du montage du partage $NOM_PARTAGE_NETLOGON du SambaÉdu." \ "Fin du script." exit 1 fi ####################################################### ####################################################### ### Mise en place du répertoire local REP_SE3_LOCAL ### ####################################################### ####################################################### afficher "Mise en place du répertoire local $REP_SE3_LOCAL." # On efface le fichier ou répertoire REP_SE3_LOCAL s'il existe # pour créer un répertoire vide qui sera rempli ensuite. if [ -e "$REP_SE3_LOCAL" ]; then if mountpoint -q "$REP_TMP_LOCAL"; then umount "$REP_TMP_LOCAL" fi rm -fR "$REP_SE3_LOCAL" fi mkdir -p "$REP_SE3_LOCAL" chown "root:" "$REP_SE3_LOCAL" chmod "700" "$REP_SE3_LOCAL" # Copie du répertoire REP_BIN. cp -r "$REP_BIN" "$REP_BIN_LOCAL" rm -fr "$REP_BIN_LOCAL/logon_perso" # En revanche le fichier logon_perso est inutile. # On y ajoute les scripts d'intégration et de désintégration. cp "$REP_INTEGRATION/"*"$NOM_DE_CODE"* "$REP_BIN_LOCAL" chown -R "root:" "$REP_BIN_LOCAL" chmod -R "700" "$REP_BIN_LOCAL" # Copie du répertoire REP_SKEL et mise en place de droits cohérents. cp -r "$REP_SKEL" "$REP_SKEL_LOCAL" chown -R "root:" "$REP_SKEL_LOCAL" chmod "700" "$REP_SKEL_LOCAL" # Pour le premier find, il y a l'option « -mindepth 1 » car sinon # les droits du répertoire « racine » REP_SKEL_LOCAL vont être # redéfinis par find. find "$REP_SKEL_LOCAL" -mindepth 1 -type d -exec chmod u=rwx,g=rwx,o='',u-s,g-s,o-t '{}' \; find "$REP_SKEL_LOCAL" -type f -exec chmod u=rw,g=rw,o='',u-s,g-s,o-t '{}' \; # Copie du répertoire REP_SAVE cp -r "$REP_SAVE" "$REP_SAVE_LOCAL" chown -R "root:" "$REP_SAVE_LOCAL" chmod "700" "$REP_SAVE_LOCAL" # Mise en place des droits sur les fichiers tels qu'ils sont # sur un système « clean ». Pour ce faire, on utilise le fichier # "droits" qui contient, sous un certain format, toutes les # informations nécessaires. cat "$REP_SAVE_LOCAL/droits" | while read; do nom="$REP_SAVE_LOCAL$(echo "$REPLY" | cut -d ':' -f 1)" proprietaire="$(echo "$REPLY" | cut -d ':' -f 2)" groupe_proprietaire="$(echo "$REPLY" | cut -d ':' -f 3)" droits="$(echo "$REPLY" | cut -d ':' -f 4)" chown "$proprietaire:$groupe_proprietaire" "$nom" chmod "$droits" "$nom" done unset -v nom proprietaire groupe_proprietaire droits # Création du répertoire REP_UNEFOIS_LOCAL mkdir -p "$REP_UNEFOIS_LOCAL" chown "root:" "$REP_UNEFOIS_LOCAL" chmod 700 "$REP_UNEFOIS_LOCAL" # Création du répertoire REP_LOG_LOCAL mkdir -p "$REP_LOG_LOCAL" chown "root:" "$REP_LOG_LOCAL" chmod 700 "$REP_LOG_LOCAL" # Création du répertoire REP_TMP_LOCAL mkdir -p "$REP_TMP_LOCAL" chown "root:" "$REP_TMP_LOCAL" chmod 700 "$REP_TMP_LOCAL" ###################################### ###################################### ### Renommage (éventuel) du client ### ###################################### ###################################### # On récupère le nom du client dans la variable NOM_CLIENT. if "$OPTION_NOM_CLIENT"; then # L'option a été spécifiée. if [ -z "$NOM_CLIENT" ]; then # Si $NOM_CLIENT est vide, c'est que l'option a été spécifié # sans paramètre et il faut demander à l'utilisateur le nom # qu'il souhaite pour le client. afficher "Saisissez le nom de la machine cliente :" read -r NOM_CLIENT if ! tester_nom_client "$NOM_CLIENT"; then afficher_erreur_nom_client exit 1 fi else # $NOM_CLIENT n'est pas vide et l'utilisateur a déjà # spécifié la valeur de ce paramètre. La vérification # sur les caractères a déjà été effectuée dans la partie # « Vérifications sur le client ». true fi else # L'option n'a pas été spécifiée et le nom (ancien) a déjà été # vérifié au niveau des caractères dans la partie # « Vérifications sur le client ». NOM_CLIENT="$NOM_CLIENT_ANCIEN" fi afficher "Installation de l'exécutable ldapsearch et vérification de la" \ "connexion avec l'annuaire LDAP du serveur à travers une" \ "recherche d'enregistrements en rapport avec le client (au niveau" \ "du nom de machine ou de l'adresse MAC ou de l'adresse IP)." # Installation du ou des paquets contenant un client LDAP (pour # faire des recherches. apt-get install --no-install-recommends --reinstall --yes "$PAQUETS_CLIENT_LDAP" >$SORTIE 2>&1 # Vérification de la connexion LDAP avec le Se3. ldapsearch -xLLL -h "$SE3" -b "ou=Computers,$BASE_DN" "(|(uid=$NOM_CLIENT$)(cn=$NOM_CLIENT))" "dn" > $SORTIE 2>&1 if [ "$?" != 0 ]; then afficher "Désolé, le serveur LDAP n'est pas joignable." \ "Fin du script." exit 1 fi # On passe à la recherche LDAP proprement dite. On va cherche dans l'annuaire # toute entrée de machine dont le nom, l'adresse MAC ou l'adresse IP seraient # identique à la machine cliente. # Liste des cartes réseau (eth0, lo etc). cartes_reseau=$(ifconfig | grep -i '^[a-z]' | cut -d' ' -f 1) # Variable contenant les lignes de la forme # nom-de-carte;adresse-mac;adresse-ip. carte_mac_ip=$(for carte in $cartes_reseau; do # On passe le cas où la carte est lo. [ "$carte" = "lo" ] && continue ifconfig "$carte" | awk 'BEGIN { v="rien"} /^'"$carte"' / { printf $1 ";" $NF ";" } /inet addr/ {v=$2; gsub("addr:", "", v); print v } END { if (v == "rien") print "SANS-IP" }' done) # Construction du filtrer de recherche LDAP, par rapport au nom du client, # à l'adresse MAC des cartes réseau ou à l'adresse IP des cartes réseau. filtre_recherche="(|(uid=$NOM_CLIENT$)(cn=$NOM_CLIENT)" for i in $carte_mac_ip; do carte=$(echo "$i" | cut -d";" -f 1) adresse_mac=$(echo "$i" | cut -d";" -f 2) adresse_ip=$(echo "$i" | cut -d";" -f 3) # Si jamais "$adresse_ip" = "SANS-IP", on ajoute simplement un critère inutile # dans la recherche mais ce n'est pas un problème. filtre_recherche="$filtre_recherche(ipHostNumber=$adresse_ip)(macAddress=$adresse_mac)" done # On ferme la parenthèse. filtre_recherche="$filtre_recherche)" # On effectue enfin la recherche LDAP qu'on affiche. resultat=$(ldapsearch -xLLL -h "$SE3" -b "ou=Computers,$BASE_DN" "$filtre_recherche" dn ipHostNumber macAddress) if [ "$resultat" = "" ]; then resultat="AUCUNE ENTRÉE CORRESPONDANT DANS L'ANNUAIRE." fi afficher "Résultat de la recherche LDAP :" echo "-------------------------------------------------" echo "$resultat" echo "-------------------------------------------------" # On affiche quelques informations sur les cartes réseau de la # machine cliente. afficher "Pour information, voici l'adresse MAC et l'adresse IP des cartes" \ "réseau de la machine cliente ($NOM_CLIENT) :" for i in $carte_mac_ip; do carte=$(echo "$i" | cut -d";" -f 1) adresse_mac=$(echo "$i" | cut -d";" -f 2) adresse_ip=$(echo "$i" | cut -d";" -f 3) # On ne saute pas de ligne ici, alors on utilise echo. echo "* $carte <--> $adresse_mac (IP: $adresse_ip)" done if "$OPTION_IV_LDAP"; then afficher "Vous avez choisi d'ignorer la vérification LDAP, le script" \ "d'intégration continue son exécution." else afficher "D'après les informations ci-dessus, voulez-vous continuer" \ "l'exécution du script d'intégration ? Si oui, alors répondez" \ "« oui » (en minuscules), sinon répondez autre chose :" read -r reponse if [ "$reponse" != "oui" ]; then afficher "Fin du script." exit 1 fi fi # Après les vérifications, on procède au renommage proprement # dit. Renommage qui n'a lieu que si l'option --nom-client a été # spécifié. if "$OPTION_NOM_CLIENT"; then afficher "Changement de nom du système." echo "$NOM_CLIENT" > "/etc/hostname" invoke-rc.d hostname.sh stop > $SORTIE 2>&1 invoke-rc.d hostname.sh start > $SORTIE 2>&1 fi unset -v cartes_reseau carte_mac_ip carte adresse_mac adresse_ip unset -v filtre_recherche resultat reponse ####################################################### ####################################################### ### Mise en place (éventuelle) du mot de passe Grub ### ####################################################### ####################################################### # Si l'option --mdp-grub n'a pas été spécifiée, alors on passe # à la suite sans rien faire. Sinon, il faut mettre en place # un mot de passe Grub. if "$OPTION_MDP_GRUB"; then afficher "Mise en place du mot de passe Grub (le login sera « admin »)." # Installation temporaire qui permet de rendre le fichier # /dev/random plus loquace ce qui permet ainsi de rectifier # un bug de la commande grub-mkpasswd-pbkdf2. Ces installations # seront supprimées ensuite, une fois la mise en place du # mot de passe Grub terminée. apt-get install --reinstall --yes --force-yes $PAQUETS_RANDOM > $SORTIE 2>&1 echo "HRNGDEVICE=/dev/urandom" >> "/etc/default/rng-tools" invoke-rc.d rng-tools stop > $SORTIE 2>&1 invoke-rc.d rng-tools start > $SORTIE 2>&1 if [ -z "$MDP_GRUB" ]; then # MDP_GRUB est vide (l'option --mdp-grub a été spécifiée # sans paramètre), il faut donc demander à l'utilisateur # le mot de passe. demander_mot_de_passe # La variable mot_de_passe est alors définie. MDP_GRUB=$mot_de_passe else # MDP_GRUB a été spécifié via le paramètre de l'option # --mdp-grub. Il n'y a rien à faire dans ce cas. true fi # On hache le mot de passe Grub. mdp_grub_hache=$(hacher_mot_de_passe_grub "$MDP_GRUB") # On édite le fichier /etc/grub.d/40_custom. fichier_grub_custom="/etc/grub.d/40_custom" restaurer_via_save "$fichier_grub_custom" echo 'set superusers="admin"' >> "$fichier_grub_custom" echo "password_pbkdf2 admin $mdp_grub_hache" >> "$fichier_grub_custom" # On met à jour la configuration de Grub. update-grub > $SORTIE 2>&1 if [ "$?" != "0" ]; then afficher "Attention, la commande « update_grub » ne s'est pas" \ "effectuée correctement, a priori Grub n'est pas" \ "opérationnel. Il faut rectifier la configuration de" \ "Grub jusqu'à ce que la commande se déroule sans erreur." exit 1 fi unset -v mot_de_passe mdp_grub_hache fichier_grub_custom # Désinstallation de PAQUETS_RANDOM. apt-get remove --purge --yes $PAQUETS_RANDOM > $SORTIE 2>&1 fi ###################################################### # Annulation du timeout de démarrage ###################################################### sed -r -i -e 's/^\GRUB_TIMEOUT=5.*$/GRUB_TIMEOUT=-1/g' /etc/default/grub update-grub > $SORTIE 2>&1 ####################################################### ####################################################### ### Mise en place (éventuelle) du mot de passe root ### ####################################################### ####################################################### # Si l'option --mdp-root n'a pas été spécifiée, alors on passe # à la suite sans rien faire. Sinon, il faut modifier le # mot de passe root. if "$OPTION_MDP_ROOT"; then afficher "Changement du mot de passe root." if [ -z "$MDP_ROOT" ]; then # MDP_ROOT est vide (l'option --mdp-root a été spécifiée # sans paramètre), il faut donc demander à l'utilisateur # le mot de passe. demander_mot_de_passe # La variable mot_de_passe est alors définie. MDP_ROOT=$mot_de_passe else # MDP_ROOT a été spécifié via le paramètre de l'option # --mdp-root. Il n'y a rien à faire dans ce cas. true fi # On peut alors changer le mot de passe de root. changer_mot_de_passe_root "$MDP_ROOT" unset -v mot_de_passe fi ######################################################################### ######################################################################### ### Désinstallation des paquets network-manager network-manager-gnome ### ######################################################################### ######################################################################### # Avant de désinstaller network-manager*, on énumère les cartes # réseau présentes sur le système, sachant que ça inclut « lo ». cartes_reseau=$(ifconfig | grep -i '^[a-z]' | cut -d' ' -f 1) config_cartes="/etc/network/interfaces" afficher "Les paquets network-manager et network-manager-gnome vont être" \ "désinstallés. C'est le fichier $config_cartes qui permettra" \ "désormais de paramétrer la configuration IP des cartes réseau." \ "Par défaut, toutes les cartes réseau vont être configurées" \ "via le DHCP." apt-get remove --purge --yes network-manager network-manager-gnome > $SORTIE 2>&1 echo " # Fichier édité lors de l'intégration de la machine au domaine SE3. # NetworkManager a été désinstallé du système et c'est maintenant ce # fichier qui gère la configuration des cartes réseau de la machines. auto lo iface lo inet loopback " > "$config_cartes" for carte in $cartes_reseau; do [ "$carte" = "lo" ] && continue echo "auto $carte" >> "$config_cartes" echo "iface $carte inet dhcp" >> "$config_cartes" echo "" >> "$config_cartes" done invoke-rc.d networking stop > $SORTIE 2>&1 invoke-rc.d networking start > $SORTIE 2>&1 # On vérifie à nouveau que le Se3 est bien accessible via un ping. if ! ping -c 5 -W 2 "$SE3" >$SORTIE 2>&1; then afficher "Désolé, le Se3 est inaccessible via la commande ping." \ "Fin du script." exit 1 fi unset -v cartes_reseau config_cartes ################################ ################################ ### Installation des paquets ### ################################ ################################ afficher "Installation des paquets nécessaires à l'intégration." # Utilisation de debconf pour rendre l'installation non-interactive # mais adaptée à la situation présente. debconf_parametres=$(mktemp) echo " libnss-ldapd libnss-ldapd/nsswitch multiselect group, passwd, shadow libnss-ldapd libnss-ldapd/clean_nsswitch boolean false libpam-ldapd libpam-ldapd/enable_shadow boolean true nslcd nslcd/ldap-bindpw password nslcd nslcd/ldap-starttls boolean false nslcd nslcd/ldap-base string $BASE_DN nslcd nslcd/ldap-reqcert select nslcd nslcd/ldap-uris string ldap://$SE3/ nslcd nslcd/ldap-binddn string samba-common samba-common/encrypt_passwords boolean true samba-common samba-common/dhcp boolean false samba-common samba-common/workgroup string WORKGROUP samba-common samba-common/do_debconf boolean true " > "$debconf_parametres" debconf-set-selections < "$debconf_parametres" rm -f "$debconf_parametres" unset -v debconf_parametres apt-get install --no-install-recommends --yes --reinstall $PAQUETS_AUTRES > $SORTIE 2>&1 # Cas particulier. Sur Squeeze, on a besoin du paquet sudo. apt-get install --yes sudo > $SORTIE 2>&1 # On désinstalle le gestionnaire de fenêtres TWM pour qu'au moment # de l'ouverture de session l'utilisateur ne puisse choisir que Gnome # et seulement Gnome. apt-get remove --purge --yes twm >$SORTIE 2>&1 afficher "Installation des paquets terminée." afficher "Configuration post-installation du système." ############################ ############################ ### Configuration de PAM ### ############################ ############################ afficher "Configuration de PAM afin que seul gdm3 (la fenêtre de login)" \ "consulte l'annuaire LDAP du serveur pour l'authentification. Une" \ "authentification via ssh (par exemple) ne sera possible qu'avec" \ "un compte local." # L'installation des paquets a eu lieu et maintenant les fichiers # "/etc/pam.d/common-*" tiennent compte de LDAP. On va les renommer # de manière explicite, avec l'extension « .AVEC-LDAP », et on va # remettre les fichiers "/etc/pam.d/common-*" d'origine. # Ensuite, dans le fichier "/etc/pam.d/gdm3" et lui seul, on va # changer les instructions « @include » pour importer les fichiers # "/etc/pam.d/common-*.AVEC-LDAP". Ainsi, gdm3 sera la seule application # utilisant PAM qui tiendra compte de LDAP. Par exemple, les comptes # LDAP ne pourront pas se connecter au système via la console ou via # ssh. # Si des fichiers ayant pour nom "common-*.AVEC-LDAP", c'est sans # doute qu'il y a déjà eu tentative d'intégration, alors on supprime # ces fichiers. for f in "/etc/pam.d/common-"*".AVEC-LDAP"; do [ "$f" = "/etc/pam.d/common-*.AVEC-LDAP" ] && continue rm -f "$f" done # On renomme les fichiers "common-*" en ajoutant l'extension « .AVEC-LDAP » # et on restaure sa version d'origine. for f in "/etc/pam.d/common-"*; do [ "$f" = "/etc/pam.d/common-*" ] && continue mv -f "$f" "$f.AVEC-LDAP" restaurer_via_save "$f" done # Dans les trois fichiers common-(auth|account|session).AVEC-LDAP, on # remplace, au niveau de la ligne faisant appel à pam_unix.so, # l'instruction de contrôle par « sufficient ». Le but est que, # en cas de panne du serveur, la connexion avec les comptes locaux # ne soit pas ralentie pour autant (ce qui est le cas si on laisse # en l'état la configuration. sed -i -r -e 's/^.*pam_unix\.so.*$/account sufficient pam_unix.so/g' "/etc/pam.d/common-account.AVEC-LDAP" sed -i -r -e 's/^.*pam_unix\.so.*$/auth sufficient pam_unix.so/g' "/etc/pam.d/common-auth.AVEC-LDAP" sed -i -r -e 's/^.*pam_unix\.so.*$/session sufficient pam_unix.so/g' "/etc/pam.d/common-session.AVEC-LDAP" # On modifie le fichier /etc/pam.d/gdm3 ou /etc/pam.d/lightdm afin que : # 1) Il fasse appel à la bibliothèque pam_script.so. # 2) Il y ait des « includes » des fichiers "/etc/pam.d/common-*.AVEC-LDAP". gdm="$(cat /etc/X11/default-display-manager | cut -d / -f 4)" echo "Gestionnaire graphique installé $gdm" restaurer_via_save "/etc/pam.d/${gdm}" # Insertion de la ligne « auth optional pam_script.so ». awk '{ print $0 } /^auth.*pam_gnome_keyring\.so/ { print "auth\toptional\tpam_script.so" }' \ "${REP_SAVE_LOCAL}/etc/pam.d/${gdm}" > "/etc/pam.d/${gdm}" # Inclusion des fichiers "/etc/pam.d/common-*.AVEC-LDAP". sed -i -r 's/@include\s+(common\-[a-z]+)\s*$/@include \1\.AVEC-LDAP/' "/etc/pam.d/${gdm}" # Création du fichier PAM_SCRIPT_AUTH. echo '#! /bin/bash function est_utilisateur_local () { if grep -q "^$1:" "/etc/passwd"; then return 0 else return 1 fi } if est_utilisateur_local "$PAM_USER"; then # On ne fait rien. exit 0 fi # Sinon, on écrit les identifiants. echo "username=$PAM_USER password=$PAM_AUTHTOK" > "__CREDENTIALS__" exit 0 ' > "$PAM_SCRIPT_AUTH" # Attention, il faut prendre « : » comme délimiteur car « / » # est présent dans le chemin du fichier CREDENTIALS. sed -r -i -e "s:__CREDENTIALS__:$CREDENTIALS:g" "$PAM_SCRIPT_AUTH" chown "root:root" "$PAM_SCRIPT_AUTH" chmod "555" "$PAM_SCRIPT_AUTH" # Paramétrage de gnome-screensaver utiliser quand une session # doit être déverrouillée. restaurer_via_save "/etc/pam.d/gnome-screensaver" sed -i -r 's/@include\s+(common\-[a-z]+)\s*$/@include \1\.AVEC-LDAP/' "/etc/pam.d/gnome-screensaver" ###################################################################### ###################################################################### ### Réécriture des fichiers /etc/hosts et /etc/dhcp/dhclient.conf #### ###################################################################### ###################################################################### # Peu importe que l'option --nom-client ait été spécifiée ou non, # nous allons réécriture le fichier /etc/hosts. afficher "Réécriture complète du fichier /etc/hosts." echo " 127.0.0.1 localhost 127.0.1.1 $NOM_CLIENT # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters " > "/etc/hosts" #Modification inutile sur Wheezy #afficher "Modification du fichier /etc/dhcp/chclient.conf afin que le" \ # "nom de la machine soit envoyé au serveur DHCP par le client DHCP." # Et nous allons également modifier le fichier # /etc/dhcp/chclient.conf afin que le nom de machine soit # envoyé au serveur DHCP. #restaurer_via_save "/etc/dhcp/dhclient.conf" #sed -i -r -e "s/^.*send host-name.*$/send host-name \"$NOM_CLIENT\";/g" "/etc/dhcp/dhclient.conf" ############################################# ############################################# ### Réécriture du fichier /etc/nslcd.conf ### ############################################# ############################################# afficher "Réécriture complète du fichier /etc/nslcd.conf afin que la" \ "communication LDAP entre le client et le serveur (notamment" \ "au moment de l'authentification) soit cryptée." echo " # /etc/nslcd.conf # nslcd configuration file. See nslcd.conf(5) for details. # The user and group nslcd should run as. uid nslcd gid nslcd # The location at which the LDAP server(s) should be reachable. uri ldap://$SE3/ # The search base that will be used for all queries. base $BASE_DN # SSL options ssl start_tls tls_reqcert never " > "/etc/nslcd.conf" invoke-rc.d nslcd stop > $SORTIE 2>&1 invoke-rc.d nslcd start > $SORTIE 2>&1 ############################################################################## ############################################################################## ### Modification du fichier smb.conf (s'il s'avère qu'on a installé Samba) ### ############################################################################## ############################################################################## # À faire seulement si le fichier existe bien sûr. if [ -f "/etc/samba/smb.conf" ]; then afficher "Modification du fichier /etc/samba/smb.conf afin d'indiquer" \ "à la machine cliente que le serveur SambaÉdu est le" \ "serveur WINS du domaine." sed -i -r -e "s/^.*wins +server +=.*$/wins server = $SE3/" "/etc/samba/smb.conf" invoke-rc.d samba restart > $SORTIE 2>&1 fi ####################################### ####################################### ### Configuration de ntpdate-debian ### ####################################### ####################################### afficher "Réécriture complète du fichier /etc/default/ntpdate" \ "afin que l'heure du système soit mise à jour via le" \ "serveur NTP indiqué dans le script d'intégration." # On réécrit simplement le fichier de configuration # associé (/etc/default/ntpdate). Ensuite, tout se passe comme si, # à chaque démarrage, la commande « ntpdate-debian » était lancée # en tant que root. echo " # The settings in this file are used by the program ntpdate-debian, but not # by the upstream program ntpdate. # Set to \"yes\" to take the server list from /etc/ntp.conf, from package ntp, # so you only have to keep it in one place. NTPDATE_USE_NTP_CONF=no # List of NTP servers to use (Separate multiple servers with spaces.) # Not used if NTPDATE_USE_NTP_CONF is yes. NTPSERVERS=\"$SERVEUR_NTP\" # Additional options to pass to ntpdate NTPOPTIONS=\"\" " > "/etc/default/ntpdate" ######################################### ######################################### ### Configurations des gestionnaires ### ### graphiques d'ouverture de session ### ######################################### ######################################### if [ "$gdm" = "gdm3" ]; then configurer_gdm3 fi if [ "$gdm" = "lightdm" ]; then configurer_lightdm fi ############################### ############################### ### Configurations diverses ### ############################### ############################### ########################################################### ### Modification du fichier /etc/xdg/user-dirs.defaults ### ########################################################### afficher "Modification du fichier /etc/xdg/user-dirs.defaults afin" \ "que « Bureau » soit le seul répertoire créé automatiquement" \ "dans le home d'un utilisateur." # Ce fichier permet de gérer les répertoires créés par défaut dans # le /home de l'utilisateur (comme le répertoire Bureau ou Images etc). restaurer_via_save "/etc/xdg/user-dirs.defaults" # On édite carrément le fichier de A à Z. echo " # Le bureau sera le seul répertoire créé par défaut # dans le /home de l'utilisateur. DESKTOP=Desktop " > "/etc/xdg/user-dirs.defaults" ######################################################################################### ### Modification du fichier /usr/share/polkit-1/actions/org.freedesktop.upower.policy ### ######################################################################################### afficher "Modification du fichier /usr/share/polkit-1/actions/org.freedesktop.upower.policy" \ "afin de désactiver l'hibernation et la mise en veille du système." # Ce fichier permet de désactiver l'hibernation et la mise en veille # qui mettent souvent la pagaille sous Linux. # On crée le fichier en partant de sa version sauvegardée dont on # est sûr qu'elle est non bidouillée. restaurer_via_save "/usr/share/polkit-1/actions/org.freedesktop.upower.policy" sed -i -r \ -e 's:no:yes:g' \ -e 's:yes:no:g' \ "/usr/share/polkit-1/actions/org.freedesktop.upower.policy" ############################ ############################ ### FIN DE L'INTÉGRATION ### ############################ ############################ afficher "Fin de l'intégration." \ "Si ce n'est pas déjà fait, pensez à effectuer une réservation" \ "d'adresse IP du client via" \ "le serveur DHCP du SambaÉdu, afin d'inscrire le nom" \ "de la machine cliente dans l'annuaire." if "$OPTION_REDEMARRER"; then afficher "La machine va redémarrer dans 10 secondes." echo "" for i in 1 2 3 4 5 6 7 8 9 10; do sleep 1 echo -n "$i... " done printf "\n" reboot exit 0 else afficher "Pour pour que le système soit opérationnel, vous devez le redémarrer." exit 0 fi