[Ubuntu-QC] Aide pour déboguer un petit script.sh

Philippe Gauthier philippe.gauthier at deuxpi.ca
Mar 13 Avr 17:44:14 BST 2010


Bonjour René!

Je viens de jeter un coup d'oeil sur la page:
> http://doc.ubuntu-fr.org/points_de_restauration_pour_un_systeme_linux#script

Il y a un détail qui m'accroche... c'est la commande pour rendre le
script "exécutable". Je me permets une petite digression :) La page
dit :

  sudo chmod -R +rwx PointDeRestauration.sh

Ceci n'est pas trop efficace. D'abord, la commande sudo ne serait
nécessaire que si le fichier PointDeRestauration.sh ne pouvait être
altéré que par le super-utilisateur (root). C'est le cas de la plupart
des fichiers installés sur le système, mais puisqu'on vient de créer ce
fichier à la main, on dispose certainement des permissions pour le
modifier. Bye bye sudo. Ce qui nous amène à :

  chmod -R +rwx PointDeRestauration.sh

Mais qu'est-ce que ces chmod, R, rwx et autres codes secrets? :) "chmod"
sert à modifier certaines informations à propos d'un fichier ou d'un
répertoire -- les droits d'accès, et certaines fonctionnalités comme
"exécutable". "-R" modifie la commande pour la rendre récursive.
Autrement dit, si on l'applique sur un répertoire, la commande modifie
le répertoire lui-même puis poursuit sur sa lancée en modifiant tous les
fichiers et sous-répertoires inclus. Finalement, "+rwx" sont les codes
correspondant aux informations à modifier. Dans le cas présent, on
ajoute (+), les permissions de lecture (r), d'écriture (w), puis le mode
"exécutable" (x). Ici, l'ajout du droit à la lecture et à l'écriture
(pour tous les utilisateurs) ne nous intéresse pas vraiment.

Puisqu'on ne veut modifier qu'un seul fichier, on vire le "-R". Comme ça
on risque moins de faire des dégâts qui se propagent (ce qui peut être
particulièrement grave si on a utilisé "sudo"!) En final (ouf!) :

  chmod +w PointDeRestauration.sh


Pour ce qui est du script, ça fonctionne bien ! Je pense l'utiliser sur
un serveur...



Des détails, des détails... :)

Ligne 5, pour déterminer si le répertoire existe, je préfère toujours le
demander explicitement à bash (voir "man test" pour les détails) plutôt
que de tenter de provoquer un code d'erreur :

  if [ -d ~/PointDeRestauration ]

Un autre façon de faire serait de carrément éliminer la vérification et
demander à mkdir de s'en charger :

  mkdir -p ~/PointDeRestauration

Le nom 2010-04-12, c'est plus facile à saisir pour mon vieux neurone que
100412. On peut ajouter la vérification de la commande dpkg pour des
points bonis :

  1)
    point=$(date +%F)
    if dpkg --get-selections > ~/PointDeRestauration/$point; then
      echo "Le point de restauration « $point » a est créé."
    else
      echo "La création du point de restauration a échoué."
    fi
    ;;

Entre les lignes 28 et 29, j'ajouterais une vérification que
l'utilisateur a tapé le nom d'un point de vérification correctement (et
donner de l'aide sinon). J'ai tapé le chemin complet d'un point de
restauration (puisque c'est cela que le script m'a donné comme info et
qu'autrement je ne sais pas lire les instructions) et j'ai reçu une
erreur pas jolie comme quoi le fichier n'existait pas. Ci-dessous, le
"cd" nous permet de lister que le nom des points de restauration plutôt
que d'obtenir le leur chemin complet.

  2)
    echo "Quel point de restauration souhaitez-vous utiliser ?"
    echo
    cd ~/PointDeRestauration; ls
    read point
    if [ -f ~/PointDeRestauration/$point ]; then
      sudo dpkg --clear-selections
      if sudo dpkg --set-selections < ~/PointDeRestauration/$point; then
        echo "Votre système a été restauré au point « $point »."
      else
        echo "La restauration a échoué."
      fi
    else
      echo "La date de restauration « $point » n'est pas disponible."
    fi
    ;;


Pour d'autres points bonis :) On remarque que "~/PointDeRestauration/"
est recopié 5 ou 6 fois dans le script. On pourrait ajouter une variable
en tête du script qui contiendrait le nom du répertoire, puis utiliser
cette variable dans le code. Si on décide de changer l'endroit où sont
enregistrés les points (je pense à quelque chose comme /var/...), ce
serait vraiment plus facile à faire.



(Est-ce que ça parait trop que je pratique pour le LPIC-1 ? :)

-- 
Philippe Gauthier <philippe.gauthier at deuxpi.ca>
http://www.deuxpi.ca/





Plus d'informations sur la liste de diffusion Ubuntu-quebec