EDIT: suite à la lecture du post de agentsteel, j’ai modifié dans le titre et dans mon post: “bash” par “dash”.
=========
Bonjour,
J’aimerai avoir vos conseils concernant le script joint à ce post.
Je n’ai jamais eu de cours de programmation si ce n’est en automatisme sur des API de type TSX47 et autres automates programmables, alors je suppose que je dois beaucoup manquer de respect à POSIX, dash et beaucoup d’autres programmes utilitaires en les utilisant de cette façon, mais j’ai fait ce que j’ai pu avec mes faibles connaissances.
Pour ce script, tout a commencé dans ce fil de discussion dans lequel fran.b a posté quelques scripts qui m’ont motivé dans la rédaction de celui-ci, mais je suis conscient qu’il me faudra beaucoup de travail, de lecture et donc de temps avant de savoir utiliser “sed” correctement, et plus particulièrement les “regex” de base.
J’ai récupéré des informations ici, et rassemblé (en vrac) quelques liens et documents ici et là que je consulte régulèrement, mais j’avoue ne pas avoir encore tout bien lu et surtout assimilé.
J’espère que vous voudrez bien me montrer les erreurs que j’ai pu faire et comment les éviter à l’avenir,
et vous remercie d’avance pour vos interventions éclairées par vos expériences.
#!/bin/sh -
#=================================================================================================
# NOM: isoLive2fr.sh
#
# SYNTAXE: isoLive2fr <fichier image ISO Live>
#
# BUT: Remplacer le menu de démarrage par une nouvelle entrée.
# Cette nouvelle entrée permettra un démarrage directement en français.
#
# NÉCESSITE: Commande Version Paquetage
# -------- ------- -----------
# isoinfo 1.1.11 genisoimage
# GNU dd 8.13 coreutils
# GNU basename 8.13 coreutils
# GNU awk 4.0.1 gawk
# GNU sed 4.2.1 sed
#
# AUTEUR: MicP (debian-fr)
#
# DATE: 18/07/2014
#
# VERSION: 0.04.05
#
#-------------------------------------------------------------------------------------------------
# NOTES: Ce n'est qu'une ébauche de script inspiré par ceux qui ont été postés par fran.b
# dans le fil de discussion suivant :
# http://www.debian-fr.org/franciser-l-iso-debian-7-5-live-nonfree-moins-de-2-minutes-t48948.html
#
# Ça fonctionne, mais je reviendrai plus tard pour rajouter des contrôles d'erreur, et plus...
#-------------------------------------------------------------------------------------------------
# Projets :
#
# - Ajouter la gestion des listes (tableau) en entrée
# depuis un "glissé" de nom de dossier, ou sélection multiple depuis l'interface graphique.
# - Adapter le script pour pouvoir modifier directement l'image "ISO Live" déjà "gravée" sur Clef USB.
# - Contrôler si le fichier n'a pas déjà été "francisé".
#---------------------------------------------------------------
# En prévision: (Pour le futur script pour le fichier de config)
# - Rechercher dans l'ISO à Franciser les fichiers des locales et clavier disponibles.
#=================================================================================================
fichImgEn="$1"
#-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# Ci dessous, la ligne des paramètres de boot qui sera utilisée par le menu de démarrage par défaut.
# Ce menu apparaîtra en premier dans la liste avec le nom: "Live Fr" (suivit du type d'architecture de votre machine).
#-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
nvParams="append boot=live config quiet splash lang=fr_FR.UTF-8 locales=fr_FR.UTF-8 keyboard-model=pc105 keyboard-layouts=fr keyboard-variant=latin9 timezone=Europe/Paris utc=yes"
#-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#------------------------------------------------------------
# Y-a t-il un paramètre sur la ligne de commande du script ?
#------------------------------------------------------------
test -z "${fichImgEn}" &&
{
printf "\n\nDonnez le chemin du fichier d'image \"ISO Live debian\" à franciser en paramètre de cette commande.\n\n Comme par exemple:\n\n\t$0 ~/Téléchargements/debian-live-7.5.0-amd64-xfce-desktop.iso\n\n\"$0\" vous remercie.\n\n"
exit 1
}
#----------------------------------------------------------------
# Le paramètre corresponds-t-il à un nom de fichier accessible ?
#----------------------------------------------------------------
test -f "${fichImgEn}" ||
{
printf "\n\n\"$0\" n'a pu avoir accès à \"${fichImgEn}\".\n\n\tEst-ce bien un nom de fichier ?\n\n"
exit 1
}
#-----------------------------------------------
# Récupérer la taille de bloc utilisé par l'ISO.
#-----------------------------------------------
chBlksSize="Logical block size is:"
isoBlckSiz=$(isoinfo -d -i "${fichImgEn}" | sed -n "/${chBlksSize}/p" | sed 's/.* //')
#--------------------------------------------------------------
# Est-ce bien un fichier d'image ISO de type "DEBIAN LIVE" ?
# pour le savoir, vérifier la présence du fichier "live.cfg".
#--------------------------------------------------------------
NmFichLive=" live.cfg"
varLiveCfg=$(isoinfo -l -R -i "${fichImgEn}" 2>/dev/null | sed -n "/${NmFichLive}/p" | awk '{print $5, $10}')
#----------------------------------------------------------
# Récupérer la taille et la position du fichier "live.cfg".
#----------------------------------------------------------
ficCFGsize=${varLiveCfg%% *} # récup de ce qui précède l'espace
blckOffset=${varLiveCfg##* } # récup de ce qui suit l'espace
octsOffset=$(( $blckOffset * $isoBlckSiz ))
#---------------------------------------------------
# Si le fichier "live.cfg" n'est pas là,
# l'annoncer par un message, et quitter le script.
#---------------------------------------------------
test -z "${varLiveCfg}" &&
{
printf "\n\"$0\" n'a pas pu trouver de fichier \"${NmFichLive}\" dans le fichier \"${fichImgEn}\".\n\n\tCe fichier n'est peut-être PAS un fichier d'image ISO \"Debian Live\"...\n\n"
exit 1
}
#----------------------------------------------------------------
# Préparer le nom pour renommer le fichier ISO une fois francisé.
# (insertion de "-FR" juste après "live")
#----------------------------------------------------------------
frAins="-FR"
insApres="live"
fichImgFr="${fichImgEn%$insApres*}${insApres}${frAins}${fichImgEn#*$insApres}"
#------------------------------------------------------------
# Créer quelques variables pour la création du menu Francisé.
#------------------------------------------------------------
chLive=" ^Live ("
chLiveFR=" ^Live Fr ("
chMenDef="\tmenu default"
chAppend="\tappend boot="
#--------------------------------------------------------------------
# Créer un nom unique dans le temps pour le fichier temporaire,
# dans un sous-répertoire de "/tmp/" au nom du script et utilisateur.
#--------------------------------------------------------------------
nomRepTmp="$(basename $0)"
nomRepTmp="/tmp/${nomRepTmp%.*}-${USER}"
test -d "${nomRepTmp}" || mkdir "${nomRepTmp}"
fichTmp="${nomRepTmp}/tmp-$(date +%s).dat"
#-----------------------------------------------------------------------------------
# Extraire le contenu du fichier "live.cfg",
# sélectionner le paragraphe concernant le premier menu,
# modifier le titre du label, supprimer la ligne des paramètres de boot,
# puis sauvegarder dans "$fichTmp".
#----------------------------------------------------------------------------------
dd bs=1 count=$ficCFGsize skip=$octsOffset if="${fichImgEn}" 2>/dev/null | \
sed -n "1,/${chAppend}/p" | sed -e "s/${chLive}/${chLiveFR}/" -e "/^${chAppend}/d" > "${fichTmp}"
#--------------------------------------------------
# Ajouter la nouvelle chaîne des paramètres de boot
# + une ligne vide à la fin du fichier temporaire.
#--------------------------------------------------
printf "\t${nvParams}\n\n" >> "${fichTmp}"
#-------------------------------------------
# Remplacer le contenu du fichier "live.cfg"
# par des caractères 0x00 sur l'image ISO.
#-------------------------------------------
dd bs=1 count=$ficCFGsize seek=$octsOffset if=/dev/zero of="${fichImgEn}" conv=notrunc,sync 2>/dev/null
#------------------------------------------------
# Copie du nouveau contenu du fichier "live.cfg".
#------------------------------------------------
dd bs=1 seek=$octsOffset if="${fichTmp}" of="${fichImgEn}" conv=notrunc,sync 2>/dev/null
#-----------------------------------------
# Renommer le fichier image ISO avec "FR".
#-----------------------------------------
mv "${fichImgEn}" "${fichImgFr}"
#---------------------------------------------
# Supprimer le sous-répertoire et son contenu:
# le fichier temporaire.
#---------------------------------------------
rm -rf "${nomRepTmp}"
#------------------------------
# Annoncer que tout a été fait.
#------------------------------
printf "\nVoilà voilà! \"${fichImgFr}\" est la version francisée.\n\nSomme MD5 :\n"
#-----------------------------------------------------------
# Calcul de la somme MD5 de la nouvelle image ISO francisée.
#-----------------------------------------------------------
md5sum "${fichImgFr}"
printf "\n\n"
#=================================================================================================
EDIT:
Étant donné ce que je viens de lire ici,
je remplace donc les lignes concernées :
…
varLiveCfg=`isoinfo -l -R -i "${fichImgEn}" 2>/dev/null | sed -n "/${NmFichLive}/p" | awk '{print $5, $10}'`
…
isoBlckSiz=`isoinfo -d -i "${fichImgEn}" | sed -n "/${chBlksSize}/p" | sed 's/.* //'`
…
par :
…
varLiveCfg=$(isoinfo -l -R -i "${fichImgEn}" 2>/dev/null | sed -n "/${NmFichLive}/p" | awk '{print $5, $10}')
…
isoBlckSiz=$(isoinfo -d -i "${fichImgEn}" | sed -n "/${chBlksSize}/p" | sed 's/.* //')
…
===========
Là :
…
#------------------------------------------------------------
# Y-a t-il un paramètre sur la ligne de commande du script ?
#------------------------------------------------------------
test "$fichImgEn" ||
…
je me demande si je n’aurai pas plutôt du utiliser: [mono]test -z “$fichImgEn”[/mono] ?
et bien sûr changer le [mono]||[/mono] en [mono]&&[/mono]
Je cherche …
Je change donc pour le [mono]test -z “$fichImgEn” &&[/mono].