Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#151 Le 15/03/2017, à 06:08

ar barzh paour

Re : [Projet terminé] correction anomalie de grub

le bash recup-fstab

#!/bin/bash

# V1 récupère le contenu des fichiers fstab qui peuvent exister sur la machine
# comment ?
#	récupération des dev existant par blkid
#	pour les partitions déjà montées (via mount)
#	lecture et traitement de <partition>/etc/fstab
#	et pour chacune des autres partitions
#	montage
#	lecture et traitement de <point de montage>/etc/fstab
#	démontage

#	le traitement consiste à écrire dans le fichier DevSd_UBoot_UPart.txt
#	pour chaque partition qui sera reconnue comme ayant un boot séparé
#	DevSd="/dev/sdxx" UPart="uuid de la partition avec boot" UBoot="uuid du boot" 

#	le traitement consiste à écrire dans le fichier DevSd_Uboot_Upart-date.txt
#	pour chaque partition qui sera reconnue comme ayant un boot séparé
#	DevSD="/dev/sdxx" UBoot="uuid du boot" UPart="uuid de la partition avec boot"

# V2 création fichier UBoot_UPart contenant les uuid d'un système avec boot séparé
# format uuid1-uuid2 et uuid2-uuid1 servira lors du traitement modif-grub



function OK {
# à cause de problème d'affichage


reponse=""
while [[ $reponse != [oOyYnN] ]]
do
titre="programme $0        /!\/!\/!\/!\    Répondez par : (oOyYnN)"
texte="
    (remarque  : il manque des soulignés dans le nom des fichiers !!!)
    le but principal de ce sous programme est de créer le fichier
    $fich_fstab_conc
    qui contiendra les uuid des sysèmes avec boot séparé
	
    il crée aussi (pour info d analyse) le fichier
	        DevSd_UBoot_UPart-$num.txt
    qui contiendra entre autre le fichier /etc/fsab des partitions présentes
	
    le fichier
            "$fich_fstab_court" 
    qui contient pour chaque partition 
	DevSd=\"/dev/sdxx\" UPart=\"uuid de la partition avec boot\" UBoot=\"uuid du boot\"
    
    et le fichier 
	"$fich_fstab_long"

 comment ? partie délicate
	récupération des dev existants par sudo blkid

	pour les partitions déjà montées (via mount)
	        lecture et traitement de <partition>/etc/fstab

	et pour chacune des autres partitions
	montage
	        lecture et traitement de <point de montage>$fich_recup
	démontage

 			SOUS-PROGRAMME DE MODIF GRUB
			tapez O puis valider pour continuer
			tapez A puis valider pour arrêter 

			O pour continuer / A pour arrêter le programme  
       "
       
reponse=`zenity --entry --title "$titre" --text "$texte" --width "800"`
case $reponse in
	[oOyY]	)	:												;;
	[aA]	)											exit 1	;;
	*		) 	echo "$reponse utilisez seulement oOyYnN S.V.P."			;;
esac	
done
}


function rech_uuid_dev { # si $1 est dans dev[] renvoi l'uuid correspondant
for i in ${!dev[@]}
do
	[[ "$1" = ${dev[$i]} ]] && uuid=${uuid[$i]} && break
done
}

function rech_uuid_label { # si $1 est dans label[] renvoi l'uuid correspondant
for i in ${!dev[@]}
do
	[[ "$1" = ${label[$i]} ]] && uuid=${uuid[$i]} && break
done
}


function ecrit_uuid1_uuid2 {  # recoit $1 $2 sous la fore UUID= ou LABEL= ou /dev/sdxx
# écrit uuid1-uuid2 et uuid2-uuid1 dans $fich_fstab_conc
# en remplacant le label ou le /dev/sdxx par l'uuid correspondant
# et en enlevant UUID= et LABEL=
uuid1=""
uuid2=""

echo "fonction ecrit_uuid1_uuid2 $1 $2"

#pour le premier paramètre
debut=`echo "$1" | cut -c1-5`
uuid=""
case "$debut" in
		\/dev\/ )
			rech_uuid_dev "$1" # /dev/sdxx on recherche l'uuid correspondant
			uuid1="$uuid"
		;;
		UUID\= )
			uuid1=`echo "$1" | cut -c6-` 			# si UUID= on prend ce qui se trouve après = 
		;;
		LABEL )
			rech_uuid_label `echo "$1" | cut -c7-`	# si LABEL on prend ce qui se trouve après = 
			uuid1="$uuid"							# et on recherche l'uuid correspondant
		;;
esac

#même chose pour le deuxième paramètre
debut=`echo "$2" | cut -c1-5`
uuid=""
case "$debut" in
		\/dev\/ )
			rech_uuid_dev "$2" # /dev/sdxx on recherche l'uuid correspondant
			uuid2="$uuid"
		;;
		UUID\= )
			uuid2=`echo "$2" | cut -c6-`			# UUID= on prend ce qui se trouve après = 
		;;
		LABEL )
			rech_uuid_label `echo "$2" | cut -c7-`	# LABEL on prend ce qui se trouve après =
			uuid2="$uuid"							# et on recherche l'uuid corespondant
		;;
esac

if [[ -n $uuid1 ]] && [[ -n $uuid2 ]]
then
# on écrit les deux combinaisons possibles , plus simple à traiter ensuite
echo $uuid1-$uuid2		>> $fich_fstab_conc
echo $uuid2-$uuid1		>> $fich_fstab_conc
fi

echo "fin de fonction ecrit_uuid1 uuid2 =1=>$uuid1<=== =2=>$uuid2<==="
}



function ecrit_ligne_court {	# ecrit $1 $2 $3 formatés dans un fichier
								# et si $3 (UBoot) non vide
								# uuid1-uuid2 dans UBoot_UPart

printf "DevSd=%-18s UPart=%-36s UBoot=%-36s\n" "$1" "$2" "$3" >> $fich_fstab_court

if [[ -n "$3" ]]			# si uboot non vide
	then
		ecrit_uuid1_uuid2 "$2" "$3" # envoie uuid de partition et uuid de boot
	fi
}


function trans_ligne_fstab { # récupère les champs d'une ligne
# champ1 champ2 champn mais on ne s'intérese qu'aux champs 1 et 2

# champ1 : UUID=uuid ou LABEL=label ou le dev [non traités : PARTUUID= PARTLABEL=]
# champ2 : le point de montage

champ1=`echo "$1"|awk -F" " '{printf ("%s",$1)}'`	# bloc spécial ou système de fichiers distant à monter	
champ2=`echo "$1"|awk -F" " '{printf ("%s",$2)}'`	# c'est le point de montage

case "$champ2" in
		\/ )
			dev_part=$champ1	# si champ2 est /     on positionne dev_part sur champ1
		;;
		\/boot )
			dev_boot=$champ1	# si champ2 est /boot on positionne dev_boot sur champ1
		;;
esac
}

# début du programme #####################################################################################

# variables
res_blkid="blkid-res.txt"	# le fichier contenant le résultat de sudo blkid
#########################################################
num=`date +%Y:%m:%d`-`date +%H:%M:%S`

 fich_fstab_long="DevSd_UBoot_UPart-$num.txt"	# fichier résultant commenté

fich_fstab_court="DevSd_UBoot_UPart.txt"		# fichier résultant court	DevSd=...U1...U2
 fich_fstab_conc="UBoot_UPart.txt"				# fichier résultant concaténé UUID1-UUID2
 fich_fstab_conc_num="UBoot_UPart-$num.txt"		# conserve les données , ménage à faire manuellement

rep_mnt=/mnt/jpb-$num							# répertoire pour montages/démontages

fich_recup=/etc/fstab							# le fichier à récupérer dans les partitions

rm $fich_fstab_court

echo "# $num : couples uuid-boot - uuid-systeme des menuentry en boot séparé" > $fich_fstab_conc 

OK # présentation du programme  / sortie ou non

reponse=""
while [[ $reponse != [oOyYnNaAcC] ]]
do
titre="récupération des UUID et LABEL des partitions des disques"
texte="
			Récupération des infos dans les fichiers $fich_recup des partitions
			ce programme travaille avec sudo pour
			récupérer les dev (blkid)
			effectuer des montages/démontages
			il vous demandera donc votre mot de passe d'administration

	répondez par	
			(oOyY) pour lancer la commande sudo blkid ( remise à jour du fichier) 
			(aA)   pour arrêter ce programme

					O pour récupérer les devices via SUDO
					A Arrêter
"
reponse=`zenity --entry --title "$titre" --text "$texte" --width "800"`
case $reponse in
	[oOyY]	) sudo blkid > $res_blkid								;;
	[aA]	) echo "arrêt du programme" 				; exit 1	;;
	*		) echo "$reponse utilisez seulement oOyYaA S.V.P."				;;
esac
done


# récupératon des dev label et UUID 
unset uuid
unset label
unset bdev	# V31 pour boot séparé
unset bmont # point de montage à cause du boot séparé
unset btype #le type de la partition


maxuuid=-1
while read ligne 		# lecture et traitement du fichier généré par sudo blkid
do
# c'est le même script que dans modif-grub
# certaine lignes sont inutiles mais je les ai laissées
	[[ -z $ligne ]] && echo "ligne vide je passe" && continue		# correction ligne vide
	((maxuuid++))
	tableau=($ligne) # découper la ligne en champ

	#le dev est le premier champ
	tmp=`sed 's/://g' <<< ${tableau[0]}` # donne /dev/sdxx
	[[ -z `grep "^\/dev" <<< $tmp` ]] && echo \
		&& echo "il manque /dev dans la ligne $ligne du fichier de référence UUID-LABEL" \
		&& exit 1

	# init variables d'indice maxuuid
	dev[maxuuid]=$tmp			# le dev de la ligne blkid
	label[maxuuid]=""			# le label de la ligne blkid
	uuid[maxuuid]=""			# l'uuid de la ligne blkid
	btype[maxuuid]=""			# le type de la ligne blkid
	mnt_dev[maxuuid]="1" 		# modifié par mount : 0 si le dev est monté
	p_dev[maxuuid]="" 			# modifié par mount : point de montage

	echo ${tableau[@]}

	# positionnemnt des variables d'indice maxuuid en fonction de la ligne blkid	
	for champ in ${tableau[@]}
		do
			deb=` echo $champ | cut -c1-5`
			case $deb in
				LABEL)		# en enlevant les guillemets donne U16.04-b7
					label[maxuuid]=`sed 's/"//g' <<< ${champ##*=}`
					;;
				UUID\=)		# en enlevant les guillemets donne c63335c7-b....2be94
					uuid[maxuuid]=`sed 's/"//g' <<< ${champ##*=}`
					;;
				TYPE\=)		# en enlevant les guillemets donne swap ntfs ext4 ....
					btype[maxuuid]=`sed 's/"//g' <<< ${champ##*=}`
			esac
	done

done <$res_blkid


#récupération des partitions déjà montées

mount | grep '^\/dev' > tmp.txt
#     1         2   3        4    5    6
#    /dev/sda11 on /media/SH type ext4 (rw,relatime,data=ordered)

	# remarque :
	# awk -F" " '{printf ("%s ",$1)}' tmp.txt 
	# donne
	# tous les dev séparés par une espace grace à "%s "

	# awk -F" " '{printf ("%s ",$3)}' tmp.txt 
	# donne
	# tous les points de montage séparés par une espace grace à "%s "

mdev=(`awk -F" " '{printf ("%s ",$1)}' tmp.txt`)	# les dev montés dans un tableau
mont=(`awk -F" " '{printf ("%s ",$3)}' tmp.txt`)	# les points de montage dans un tableau


# positionnement montée ou non de chaque dev
for i in ${!dev[@]}						# pour tous les indices des dev
do
	for j in ${!mdev[@]}				# pour tous les indices des partitions montées
		do
			if [[ "${dev[$i]}" = "${mdev[$j]}" ]]
				then
					mnt_dev[i]="0"			# 0 indique que le dev est montée
					p_dev[i]=${mont[$j]}    # le point de montage du dev
					break
				fi
		done
done


# sortie des uuid label pour info
		rm tmp_u_l.txt
echo
		p=0
		while [[ $p -le $maxuuid ]]
		do
			aff_dev="${dev[$p]}"		 	# && [[ -z "$aff_dev"	 ]]	&& aff_dev="_"
			aff_mnt_dev="${mnt_dev[$p]}" 	# && [[ -z "$aff_mnt_dev" ]] && aff_mnt_dev="_"
			aff_p_dev="${p_dev[$p]}"	 	# && [[ -z "$aff_p_dev"	 ]] && aff_p_dev="_"

			# avec en plus modif d'affichage 
			aff_uuid="${uuid[$p]}"		&& [[ -z "$aff_uuid"	 ]]	&& aff_uuid="_"
			aff_label="${label[$p]}"	&& [[ -z "$aff_label"	 ]]	&& aff_label="_"
			aff_btype="${btype[$p]}"	&& [[ -z "$aff_btype"	 ]]	&& aff_btype="_"

			case $aff_mnt_dev in		# si monté il y a p_dev sinon il n'y a pas !
			0)
				printf "%02s %-10s %-36s LABEL %-20s sur %-20s TYPE : %-10s\n" $p $aff_dev $aff_uuid $aff_label $aff_p_dev $aff_btype  | tee -a tmp_u_l.txt
			;;
			1)
				printf "%02s %-10s %-36s LABEL %-20s                          TYPE : %-10s\n" $p $aff_dev $aff_uuid $aff_label  $aff_btype			| tee -a tmp_u_l.txt
			;;
			esac	

			((p++))											
		done

reponse=""
titre="concordances     dev<=>LABEL<=>UUID<=>point de montage (de blkid)     Visualiser   puis Valider pour continuer"
zenity --text-info --title "$titre" --filename "tmp_u_l.txt" --height "640" --width "1280" --font "Courier New Bold 10"
code=$?
if [[ $code -eq 0 ]]
then
	echo "OK je continue"
else
	echo ; echo "Annulation demandée" ; echo ; exit 1
fi


##################################################
# pour cette partie il est absolument nécessaire d'avoir une liste des dev corrects
# d'où le sudo blkid effectué plus haut !
##################################################

echo "récupération des fstab de toutes les partitions"			 > $fich_fstab_long
echo 															>> $fich_fstab_long

############################################################
echo "pour les partitions déjà montées :" 						>> $fich_fstab_long
echo ${!dev[@]}

for i in ${!dev[@]} # pour tous les indices du tableau dev

	do
		echo $i ${dev[$i]} ${mnt_dev[$i]}
		[[ ${mnt_dev[$i]} = "1" ]]	&& continue		# non monté suivant !
		[[ ${btype[$i]} = "ntfs" ]]	&& continue 	# ntfs      suivant !
		[[ ${btype[$i]} = "swap" ]]	&& continue 	# swap      suivant !
		# on pourrait en ajouter d'autres

		echo  													>> $fich_fstab_long
		echo ${dev[$i]} "montée sur" ${p_dev[$i]} 				>> $fich_fstab_long

		#pour chaque dev monté on récupére les infos de fstab
		fich=${p_dev[$i]}$fich_recup 
		fich=`sed 's/\/\//\//g' <<< $fich` # supprime les doubles // (à cause de  //etc/fstab)

		echo $fich	#soit /etc/fstab soit /xxx/xxx/etc/fstab
		
		if [[ -e $fich ]]
			then
				echo  											>> $fich_fstab_long
				echo "$fich de ${dev[$i]}"  					>> $fich_fstab_long
				# on ne garde que les lignes non commentées et non vide

				dev_part=""
				dev_boot=""
				while read l_fstab
					do
						tmp=` grep '^[[:blank:]]*\#' <<< $l_fstab`
						#si tmp n est pas vide , elle commence par #
						if [[ -z $tmp ]] && [[ -n $l_fstab ]]
							then 
								echo $l_fstab >> $fich_fstab_long
								trans_ligne_fstab "$l_fstab"
							fi
					done < $fich
		ecrit_ligne_court "${dev[$i]}" "$dev_part" "$dev_boot"
			else
				echo 									>> $fich_fstab_long
				echo "pour ${dev[$i]} (${label[$i]}) /etc/fstab est inexistant"	>> $fich_fstab_long
			fi
	done

echo >> $fich_fstab_long

##############################################################
echo "pour les partitions non montées :" >> $fich_fstab_long


if [[ -e "/mnt" ]]
then
	echo "réperoire /mnt présent"
else
	echo "le répertoire /mnt n'existe pas !!!"
	exit 1
fi


rep_mnt_tmp="/mnt/jpb-$num"
echo "création du répertoire $rep_mnt_tmp pour monter les partitions"

sudo mkdir $rep_mnt_tmp

for i in ${!dev[@]} # pour tous les indices du tableau dev
do
	echo $i ${dev[$i]}

	[[ ${mnt_dev[$i]} = "0" ]]	&& continue		# montée    suivant !
	[[ ${btype[$i]} = "ntfs" ]]	&& continue 	# ntfs      suivant !
	[[ ${btype[$i]} = "swap" ]]	&& continue 	# swap      suivant !

	echo
	echo "traitement de $i ${dev[$i]} (${btype[$i]})"
	echo "montage de       ${dev[$i]} sur $rep_mnt_tmp"
	sudo mount ${dev[$i]} $rep_mnt_tmp
	code=$?
	
	echo "code de retour montage de ${dev[$i]} sur $rep_mnt_tmp : $code"
	if [[ $code = 0 ]]	# si le montage est réussi
		#################### montage réussi ####################
		then
			fich=$rep_mnt_tmp/etc/fstab
			if [[ -e $fich ]]
				then
					echo 							>> $fich_fstab_long
					echo ${dev[$i]} montée sur $rep_mnt_tmp	>> $fich_fstab_long
					dev_part=""
					dev_boot=""					
					while read l_fstab
							do
								tmp=` grep '^[[:blank:]]*\#' <<< $l_fstab`
								# si ne commence pas par # , tmp est vide 
								# et si la ligne n'est pas vide on l'écrit
							if [[ -z $tmp ]] && [[ -n $l_fstab ]]
								then 
									echo $l_fstab 					>> $fich_fstab_long
									trans_ligne_fstab "$l_fstab"
								fi
							done < $fich
		ecrit_ligne_court "${dev[$i]}" "$dev_part" "$dev_boot"
				else
		echo															>> $fich_fstab_long
		echo "pour ${dev[$i]} (${label[$i]}) /etc/fstab est inexistant" >> $fich_fstab_long
				fi
			# puis on le démonte avec boucle sinon le démontage ne se fait pas toujours
			boucle=0
			code=1
			while [[ $code -ne 0 ]]
			do
				sudo umount "$rep_mnt_tmp"
				code=$?
				echo "boucle $boucle  : ${dev[$i]} code de retour de umount $code"
				if [[ $code = 0 ]]
					then
						echo 
						echo "boucle $boucle : ${dev[$i]} démontage effectué (code retour $code)"
						ls -ails $rep_mnt_tmp
					else
						echo
						echo "boucle $boucle : ${dev[$i]} non démonté (code retour $code)"
						sleep 1 # attente en cas de non démontage
						((boucle++))
						if [[ $boucle -ge 10 ]]
							then
								echo "problème de démontage de ${dev[$i]}"
								exit 1
							fi	
					fi
			done # boucle while
		############################ échec de montage ###################
		else
			echo																	>> $fich_fstab_long
			echo "impossible de monter ${dev[$i]}  code echec de montage :$code"	>> $fich_fstab_long
		fi
done # boucle for i dev

echo ; echo
echo "fin de récupération des données de /etc/fstab des partitions présentes sur la machine"
echo ; echo

# sauvegarde de UBoot_UPart pour une utilisation personnelle
cp "$fich_fstab_conc" "$fich_fstab_conc_num"

echo "suppression du répertoire $rep_mnt_tmp en cours"
sudo rmdir $rep_mnt_tmp
code=$?

if [[ $code -ne 0 ]]
	then 
	#rmdir: échec de suppression de '/mnt/jpb-2017:03:11-12:02:43': Périphérique ou ressource occupé
		echo
		ls -ails /mnt/jpb*
		echo "vérifier le contenu du répertoire /mnt/jpb"
		echo "faire le ménage dans ce répertoire"
		exit 1
	fi

echo "supression réussie"
echo "fin normale du programme $0"
exit 0

PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#152 Le 15/03/2017, à 06:10

ar barzh paour

Re : [Projet terminé] correction anomalie de grub

la version modif_grub_V35
###########################################################################
EDIT 16-03-2017 : ajout de # en ligne 40
le fichier à traiter ne doit pas commencer par ### BEGIN /etc/grub.d/10_linux ###
devient
# le fichier à traiter ne doit pas commencer par ### BEGIN /etc/grub.d/10_linux ###

dans le même paragraphe
remplacer

read ligne < $fich_source

par

read ligne < "$fich_source"

et

return1

par

exit 1

dans la fonction trier_fichier  , mettre la ligne

ne_commence_pas_par_begin

après les lignes echo , deb= , fin=
FIN d'EDIT
############################################################################

#!/bin/bash

# V24 2017-03-06

#V25 
# chaine_linux="linux.*\/vmlinu" pour prise en compte de "linux	/@/boot/vmlinuz"

#V26 function sort_info_transforme donne des traces

# V28 2017-03-08
# présentation de concordances UUID-LABEL
# un ligne menuentry et submenu peut comporter des blank après   } 
# variable fin_submenu pour prise en compte des lignes menuentry se terminant par }  }

# V29 2017-03-09
# correction due à l'utilisation de ${#uuid[*]} dans la construction concordance label-uuid
# remplacement de tous les while ${#menu[*]} par for ${!menu[@]}

# V30 idem V29 sans les commentaires superflus
# si boot séparé on sort !!!!

# V33 ajout du sous programme recup_fstab_V2 ( étude système à boot séparé)

# V34 suite à V33 , suppression de certaines fonctions devenue inutiles
# réorganisation de certaines fonctions

# V35 le programme ne traite plus que les lignes comprises entre 
#    ### BEGIN /etc/grub.d/10_linux ###
# et
#    ### BEGIN /etc/grub.d/40_custom ###
#
# le fichier à traiter doit commencer par un #
# la ligne ### BEGIN /etc/grub.d/10_linux ### est obligatoire
# si la ligne ### BEGIN /etc/grub.d/40_custom ### est absente
# le programme traitera le fichier jusqu'à la fin



function ne_commence_pas_par_begin {
# le fichier à traiter ne doit pas commencer par ### BEGIN /etc/grub.d/10_linux ###
read ligne < "$fich_source"
if [[ $ligne =~ ^"$deb" ]]
	then
		echo "désolé"
		echo "le fichier source à traiter ( $fich_source )"
		echo "doit bien commencer par un commentaire"
		echo "et en plus"
		echo "ne doit pas commencer par"
		echo "$deb"
	
		exit 1
	fi
}




function trier_fichier {

echo $fich_source
deb="### BEGIN /etc/grub.d/10_linux ###"
fin="### BEGIN /etc/grub.d/40_custom ###"

ne_commence_pas_par_begin

# création de 3 fichiers tmp0-<date>.txt tmp1-<date>.txt tmp3-<date>.txt


fich_source_0=tmp0_$num.txt # lignes du fichier à traiter de 1 à 10_linux
fich_source_1=tmp1_$num.txt # lignes du fichier à traiter de 10_linux à 40_custom
fich_source_2=tmp2_$num.txt # lignes du fichier à traiter de 40_custom à la fin

[[ -e "$fich_source_0" ]] && rm "$fich_source_0" # inutile mais évite message d'erreur rm
[[ -e "$fich_source_1" ]] && rm "$fich_source_1" # inutile mais évite message d'erreur rm
[[ -e "$fich_source_2" ]] && rm "$fich_source_2" # inutile mais évite message d'erreur rm

fich="$fich_source_0"
presence_10_linux=1

while read ligne
do
	case "$ligne" in
		$deb ) fich="$fich_source_1" ;  presence_10_linux=0		;;
		$fin ) fich="$fich_source_2" 							;;
	esac
	echo $ligne >> $fich
done < $fich_source

if [[ $presence_10_linux -eq 1 ]]
then
	echo "la présence de la ligne $deb est obligatoire"
	echo "le traitement ne commence qu'à partir de cette ligne"	
	echo "ajouter cette ligne au fichier"
	exit 0
fi
	
}






function verifier_presence_dev { # dans le cas d'utilisation d'un blkid personnel
echo
# mettre les dev de "blkid-res.txt" dans un tableau
dev1=(`awk -F" " '{printf("%s ",$1)}' "blkid-res.txt"`)

# mettre les dev de $res_blkid dans un tableau
dev2=(`awk -F" " '{printf("%s ",$1)}' "$res_blkid"`)

manque=""
for d1 in ${dev1[@]} # /dev/sdxy: /dev/sdzt: de blkid
do
	res=`grep $d1 <<< ${dev2[@]}`
	[[ -z $res ]] && manque="$manque $d1" # si non trouvé , ajout
done
	if [[ -n $manque ]]
		then 
			echo "dans le fichier $res_blkid il manque"
			echo ; echo $manque ; echo
			echo "tous les dev présents sur la machine doivent être déclarés dans ce fichier"
			echo "veuillez éditer ce fichier"
			echo "format habituel dev/sdxx: LABEL=\"xxxx\"  UUID=\"xxxx\"" 
			exit 0
		fi
}




function modif_ligne1_grub { # récupère la première ligne et modifie en y mettant la date

res=`echo "$1" | grep "^ *	*#"`



if [[  -n $res ]] # la ligne est bien un commentaire (commence par #)
	then
		trans="#### $num : $fich_source modifié par $0 ####"
		echo $trans			> "$fich_sauv"
		((nb_lignes_cons++))
		((nb_lignes_hors_menu++))
sort_info_transforme "$1" "première ligne modifiée en" "$trans"

	else
		echo "la première ligne du fichier est "
		echo $1
		echo	
		echo "mais il faut que la première ligne du fichier"
		echo "$fich_source"
		echo "commence par un #"
		echo "ajouter cette ligne de commentaire au début de ce fichier"
		echo "arrêt du programme"
		exit 0
	fi #[[ -n $res  ]]

}


function OK {
rep=""
while [[ $rep != [oOyYnN] ]]
do
titre="programme $0        /!\/!\/!\/!\    Répondez par : (oOyYnN)"
texte="cette partie de programme supprime des lignes supposées inutiles de grub 
 ( paragraphes  contenant ......$rech_dev.....$rech_dev........... AVANT la chaine $rech_class )
 ( menuentry n'ayant pas des UUID égaux dans la ligne search et la ligne linux)
 (à partir de V34 les menuentry sur boot séparé devraient être conservés)	

 le programme demande le nom du fichier à traiter .. 
 en réel ce devrait être <partition>/boot/gub/grub.cfg ..
 et créera un fichier grub-OK-date qui pourra être utilisé pour remplacer le fichier grub
 il utilise aussi le label des partitions ou du fichier de référence 
 pour informer plus précisement la ligne menuentry de grub
 on peut utiliser un fichier de référence uuid label (au format blkid)
 
     remarque :pour des essais , on peut traiter n'importe quel fichier ayant un format grub
     si le fichier à traiter n'est pas au format grub , il ne fonctionnera pas correctement
     et en réel il serait préférable de lancer ce programme après avoir lancé un update-grub

trois fichiers peuvent être créés :
    grub-OK-<aaaa:mm:dd-hh:mm:ss>.txt         (le grub récupérable)
    grub-sup-<aaaa:mm:dd-hh:mm:ss>.txt        (les menuentry qui ont été supprimés)
    fich_transforme-<aaaa:mm:dd-hh:mm:ss>.txt (les lignes modifiées)

	vous pourrez analyser ces fichiers pour voir ce qui s'est passé
    avant de remplacer le grub 
    (en fin de traitement répondez alors non à la demande de remplacement
     et faites le remplacement manuellement)

lors du traitement .....
 les  x  qui défilent indiquent des lignes de menu qui seront supprimées
 les  c  qui défilent indiquent les lignes de menu qui seront conservées
 les  .  qui défilent indiquent les autres lignes  (qui seront conservées)
 un   S  indique un début de submenu
 un   M  indique un début de menuentry
 un   m  indique la suite de menuentry 
 
			tapez O puis valider pour continuer
			tapez A puis valider pour arrêter 

			O pour continuer / A pour arrêter le programme  
       "
       
rep=`zenity --entry --title "$titre" --text "$texte" --width "800"`
case $rep in
	[oOyY]	)	:												;;
	[aA]	)											exit 1	;;
	*		) 	echo "utilisez seulement oOyYaA S.V.P."			;;
esac	
done
}


function choix_fichier_blkid { # retourne 0 si fichier blkid choisi
fich_source=""
titre="$0               Sélectionnez le fichier contenant UUID et LABEL des partitions"
#fich_source=`zenity --file-selection --filename="../blkid/*" --title="$titre"`
fich_source=`zenity --file-selection --title="$titre"`

case $? in	#$? est le code de retour de zenity
 	0)	res_blkid="$fich_source"									;;
	1)	echo "Aucun fichier UUID-LABEL sélectionné."	; exit 1	;;
	-1)	echo "Une erreur inattendue est survenue." 		; exit 1	;;	
	*)	echo "erreur non reconnue" 						; exit 1	;;	
esac
}


function critere_suppression_2 { # se fait après une initialisation de menu[0 ...n]

##### attention les codes de retour ont changé
# 0 si ligne search et ligne linux et uuid égaux (menu conservé + label dans menu[0])
# 1 si pas de ligne search ou linux              (menu conservé intégralement)
# ligne search et linux trouvées
# 3 aucun UUID trouvé dans fichier UUID-LABEL
# 2 si uuid différents                           (menu supprimé à revoir?)

uuid_search="x"
uuid_linux="y"

ligne_search=""
ligne_linux=""

# recherche dans le tableau menu[1..n] de la ligne search

#TEST

for i in ${!menu[@]}				# pour tous les indices 0..n
do
	[[ $i = 0 ]] && continue		# sauf dans menu[0]
	res=`grep "$chaine_search" <<< "${menu[i]}"` # dans menu[1..n]
	if [[ -n $res ]]
		then
			ligne_search="${menu[i]}"
			break					# 1er menu[n] trouvé est le bon
		fi

	done


if [[ -z "$ligne_search" ]]
then
	return 1 # pas de chaine search => on conservera le menu intégralement
fi

# recherche dans le tableau menu[] de la ligne linux


for i in ${!menu[@]}				# pour tous les indices 0..n
do
	[[ $i = 0 ]] && continue		# sauf dans menu[0]
	tmp=`sed 's/[[:blank:]]//g'	<<< "${menu[i]}"` #suppression des blank de menu
	res=`grep "$chaine_linux"   <<< "${menu[i]}"` # dans menu[1..n]
	if [[ -n $res ]]
		then
			ligne_linux="${menu[i]}"
			break					# 1er menu[n] trouvé est le bon
		fi

	done


if [[ -z "$ligne_linux" ]]
then
	return 1 # pas de chaine linux => menu conservé sans modif
fi

#uuid ligne search présent dans fichier de réf uuid-label ?
# si trouvé positionne uuid_search
n=-1
while [[ $n -lt $maxuuid ]]
	do
	((n++))					# recherche de uuid[0..n]
	if [[ -n ${uuid[$n]} ]] # précaution supplémentaire uuid non vide
	then
		res=`grep ${uuid[$n]} <<< "$ligne_search"`	#  y-a-t-il l'UUID
		if [[ -n $res ]] 
			then
				uuid_search=${uuid[$n]}
				break 				# le premier uuid trouvé dans blkid sera le bon
		fi
	fi 
done 


# uuid ligne linux présent dans fichier de réf uuid-label ?
# si trouvé positionne uuid_linux
n=-1
while [[ $n -lt $maxuuid ]]
	do
	((n++))					# recherche de uuid[0..n]
	if [[ -n ${uuid[$n]} ]] # précaution supplémentaire uuid non vide 
	then
		res=`grep ${uuid[$n]} <<< "$ligne_linux"`	#  y-a-t-il l'UUID
		if [[ -n $res ]] 
			then
				uuid_linux=${uuid[$n]}
				break 				# le premier uuid trouvé dans blkid sera le bon
		fi
	fi 
done


# analyse des résultats

if [[ ${uuid_search}${uuid_linux} = "xy" ]]
then
	return 3 # aucun des uuid n'a été trouvé dans blkid ( peuvent être égaux ou non )
fi 

####################################################################################
# on peut avoir uuid_search  uuid_linux
#               x            1ea0....  : n'existe pas  , existe       : code retour 2
#               a04f...      y         :   existe      , n'existe pas : code retour 2
#               bcde...      fghi....  : uuids existants et différents: code retour 2
#               1234...      1234....  : uuids existants et égaux     : code retour 0
#####################################################################################



# si $uuid_search-$uuid_linux est dans UBoot on renvoie 4
# ce menu correspond à une partition avec boot séparée

for i in ${!UBoot[@]}		# pour tous les indices 0..n
do

	[[ $uuid_search-$uuid_linux = ${UBoot[$i]} ]] && return 4 

done


if [[ "$uuid_search" != "$uuid_linux" ]]
	then
		return 2 #  uuid différents on supprimera ce menu
	else
		return 0 # uuid egaux on conservera ce menu après modif de menu[0]
fi

} # fin function critere_suppression_2


function ajout_label_menuentry { # ajoute un label à menu[0] (search ou linux)
rech_uuid_label_menuentry "$1" 	# retour 0 si label trouvé , pas zéro sinon
code=$?
if [[ $code -eq 0 ]]
  then # on a un label
	  tmp=${menu[0]}	
	  menu[0]=`sed "s/menuentry '/menuentry '$label_trouve : /" <<< ${menu[0]}`
	  menu[0]=`sed "s/menuentry \"/menuentry \"$label_trouve : /" <<< ${menu[0]}`
	  menu[0]=`sed "s/${label_trouve} *:* *${label_trouve}/${label_trouve}/" <<<${menu[0]}`
	  if [[ $tmp != ${menu[0]} ]]
		then
			sort_info_transforme "$tmp" "	LIGNE transformée en" "${menu[0]}" 
		fi #[[ $tmp != ${menu[0]} ]]
	  fi # [[ $code -eq 0 ]]
}


function memorise_menuentry { # mémorise menuentry de submenu pour écriture ultérieure
	for  p in ${!menu[@]}	# pour tous les indices de menu[]
		do
			((i_s++))
			ligne_sousmenu[i_s]=${menu[$p]} 	# mémorise menu[0 ..n]
			((nb_lignes_menu_cons++))			# stat
		done 
}


function ecrire_lignes_memorisees { # écrit les lignes dans sauv

for p in ${!ligne_sousmenu[@]}	# pour tous les indices de ligne_sousmenu[]
	do
		echo "${ligne_sousmenu[$p]}" >> "$fich_sauv"	# écriture l_s[0..n]
		((nb_lignes_cons++))							# stat
	done
}


function traite_ligne_submenu { # reçoit $1 (ligne submenu '.......{

fin_submenu=1 # sera mise à 0 si un menuentry se termine par }  }
submenu="$1" #mise en mémoire de cette ligne

# j'utilise la mémorisation label_submenu du label d'un menuentry précédent  

if [[ -n $label_submenu ]]
then
# ajout du label et suppression double label
submenu=`sed "s/submenu '/submenu '${label_submenu} : /"   <<< $submenu`
submenu=`sed "s/submenu \"/submenu \"${label_submenu} : /" <<< $submenu`
submenu=`sed "s/${label_submenu} *:* *${label_submenu}/${label_submenu}/" <<<$submenu`
fi

i_s=0
unset ligne_sousmenu

ligne_sousmenu[0]="$submenu"	# mémorisation pour sortie finale
((nb_lignes_hors_menu++))		# ligne considérée comme hors menu

# lire les lignes qui suivent submenu jusquà trouver ligne ......} hors menuentry)

while read ligne
do
((nb_lignes_lues++))
		# si on trouve .... } hors menuentry on est au bout du submenu
		# il faut sauvegarder la ligne submenu , les lignes intermédiaires et menuentry
		# je ne traite pas du cas où on trouverait une ligne menuentry terminée par  } }
		# V28 et suivante ce cas est traité
		# une ligne menuentry terminée par } } provoque la fin du submenu  ($fin_submenu 0)

# on sort de la boucle si on trouve } en fin de ligne hors menuentry

tmp=`sed 's/[[:blank:]]//g' <<<"$ligne"` # supprime les blancs de la ligne

if [[ "$tmp" =~ }$ || "$fin_submenu" = 0 ]]   ### on est en fin de submenu ###
				# pas tout à fait exact
				# si on peut  avoir { ...... } hors menuentry
		then
			((i_s++))
			ligne_sousmenu[i_s]="$ligne"	# mémoriser cette ligne
			((nb_lignes_hors_menu++))		# stat
			echo -e ".\c"
			ecrire_lignes_memorisees		# écriture de ces lignes de submenu
			label_submenu=""
			return							# fin de traitement de submenu
		fi # [[ "$tmp" =~ }$ ]]

# V28 élargissement aux blancs de grep après {
res=`echo "$ligne" | grep "^[	 ]*menuentry.*{[ 	]*$"`
mem=`echo "$ligne" | grep "^[	 ]*menuentry ['\"]Memory test.*{[ 	]*$"`

if [[ -n $mem ]]
then			
	res=""		# si on trouve la chaine Memory pas intéressant on force res à vide
fi

if  [[ -z $res ]]
	then								# ni menuentry ..{ ni memory ...{
		((i_s++))						# 
		ligne_sousmenu[i_s]="$ligne"	# mise en mémoire pour écriture ultérieure
		((nb_lignes_hors_menu++))		# stat
		echo -e ".\c"	
	
	else
		lire_menuentry 					# menu[0..n]  et ((nb_lignes_lues++))
		trt_menu2 "${menu[0]}" 			# 1 si contient dev dev
		code_dev_dev=$?

		if [[ $code_dev_dev -eq 1 ]]	# 1 la ligne contient /dev /dev
			then
				sort_menu_1 " " "menu supprimé : trop de /dev/sd"		# suppression de ce menu
				((nb_menu_sup++))		# stat
			else 						# pas 1 : ne contient pas dev dev
				critere_suppression_2
				code_crit2=$?			# 0 1 2 3 

				case $code_crit2 in
				0)						# les uuid sont égaux modifier menu[0]
					ajout_label_menuentry "$chaine_search"
					memorise_menuentry	# mettre en mémoire ces lignes de menuentry
					((nb_menu_cons++))	# stat non prévu dans memorise_menuentry
				;;
				1)						# pas de search ni de linux on garde sans modif
					memorise_menuentry	# mettre en mémoire ces lignes de menu
sort_info_transforme "${menu[0]}" "menu dans submenu conservé (sans search ou linux)"
					((nb_menu_cons++))	# stat non prévu dans memorise_menuentry
				;;
				2)						# uuid différents on supprime ce menu
					sort_menu_1 " " "menu supprimé : uuid différents"
					((nb_menu_sup++))	# stat non prévu
				;;
				3)						# uuid non trouvé (search et linux existent)
					memorise_menuentry	# mettre en mémoire ces lignes de menu
sort_info_transforme "${menu[0]}" "menu dans submenu conservé : uuid (search-linux) non trouvé"
					((nb_menu_cons++))	# stat non prévu
					((nb_menu_sans_uuid++))
				;;
				4)						# uuid != mais boot séparé
					# revoir pour le label
					ajout_label_menuentry "$chaine_linux"
					memorise_menuentry	# mettre en mémoire ces lignes de menuentry
					((nb_menu_cons++))	# stat non prévu dans memorise_menuentry
					((nb_menu_boot_cons++))
					
				;;					
				esac
			fi # [[ $code_dev_dev -eq 1 ]]
	fi # [[ -z $res ]]
done

# si on arrive ici il y a erreur de traitement quelque part
echo
echo " ligne bach $LINENO"
echo " erreur de format ? dans le fichier $fich_source !!!!!!!!!!"
echo " dernière ligne de menu lue :"
echo
echo ${menu[0]}
echo
echo " dernière ligne lue : $nb_lignes_lues"
echo " $ligne"
sleep 100
exit 0 
}


function rech_uuid_label_ligne { # recherche uuid et label  de $1 dans uuid[0..n]
# renvoie 0 uuid trouvé et label trouvé	uuid_trouve=xxx  label_trouve="yyy"
# renvoie 1 uuid trouvé et label vide	uuid_trouve=xxx  label_trouve=""
# renvoie 2 uuid non trouvé				uuid_trouve=""   label_trouve=""	
uuid_trouve=""
label_trouve=""
n=-1
while [[ $n -lt $maxuuid ]]
	do
	((n++))								# uuid suivant
	if [[ -n ${uuid[$n]} ]]				# précaution supplémentaire uuid non vide 
	then
		res=`grep ${uuid[$n]} <<< $1`	#  $1 est une ligne de menu
		if [[ -n $res ]] 
			then
				uuid_trouve=${uuid[$n]}
				if [[ -n ${label[$n]} ]]
				then
					label_trouve=${label[$n]}	# si label non vide positionne label_trouve
					return 0					# uuid trouvé / label non vide trouvé
				else
					return 1					# uuid trouvé / label ""
				fi
		fi
	fi 
done 
return 2										# uuid non trouvé 
}


function rech_uuid_label_menuentry { # recherche uuid et label dans la ligne $1 de menu[1 ..n]

for p in ${!menu[@]}	# pour tous les indices du tableau 0..n
do
	[[ $p = 0 ]] && continue	# mais pas dans menu[0]
	res=`echo ${menu[$p]} | grep "$1"`	
	if [[ -n $res ]]
		then
			rech_uuid_label_ligne ${menu[$p]}		# donne uuid_trouve / label_trouve
			return $?								# 0 uuid égaux 
													# 1 uuid trouvé , label vide
													# 2 pas d'uuid dans search 
		fi
	done
return 3	# pas de search trouvé , (donc pas d'uuid , et donc pas de label) !!!
}




function transforme_ligne_menuentry {	# modifie la première ligne d'un menuentry conservé
# recherche l'UUID dans la ligne search --no-floppy --fs-uuid --set=root
# si trouvé , on récupère le label
# si label vide on ne fait rien
# sinon on rajoute avec : en tête après menuentry ' ou menuentry " 
# 

label_trouve=""
uuid_trouve=""
tmp=${menu[0]}					# servira de test pour sortie si modifié
rech_uuid_label_menuentry "$1"	# positionne le label à la bonne valeur
code=$?							# retour de la fonction

case $code in
	0)		# UUID trouvé : $uuid_trouve LABEL trouvé : $label_trouve

			if [[ $label_submenu = "" ]]	# servira dans traitement d'un submenu éventuel
				then						# on memorise le premier label menuentry trouvé	
					label_submenu="$label_trouve"
				fi	
			menu[0]=`sed "s/menuentry '/menuentry '$label_trouve : /" <<< ${menu[0]}`
			menu[0]=`sed "s/menuentry \"/menuentry \"$label_trouve : /" <<< ${menu[0]}`
			#suppression double labels dans cette ligne
			menu[0]=`sed "s/${label_trouve} *:* *${label_trouve}/${label_trouve}/" <<<${menu[0]}`

			if [[ $tmp != ${menu[0]} ]]
			then #TEST
				sort_info_transforme "$tmp" "	LIGNE transformée en" "${menu[0]}"
			fi
	;;
	1)		# LABEL vide #TEST
				sort_info_transforme "$tmp" "pas de label pour $uuid_trouve"
	;;
	2)		#LABEL vide uuid non trouvé #TEST
				sort_info_transforme "$tmp" "uuid de ligne search non trouvé"
	;;
	3)		# pas de ligne search trouvée dans menuentry v
				sort_info_transforme "$tmp" "ligne search non trouvée"
	;;	
	*) # ???? #TEST
				sort_info_transforme "$tmp" "code inconnu : $code"
	;;
esac

return $code
}


function lire_menuentry { # met dans tableau menu[n] jusqu'à trouvé } seul sur la ligne
unset menu
i=0
menu[0]="$ligne"								# menu[0] est la première ligne
echo -e "M\c"									# trace début de menuentry
while read ligne								# ligne suivante
do
	((i++))
	((nb_lignes_lues++))
	menu[$i]="$ligne"							# mémorisée dans menu [1 .. n]
	echo -e "m\c"								# trace écran
	tmp=`sed 's/[[:blank:]]//g' <<<"$ligne"`	# suppression des blancs pour test

	if [[ "$tmp" =~ }}$ ]]
		then
			fin_submenu=0						# termine par  }   } fin de submenu !!!
		fi

	if [[ "$tmp" =~ }$ ]]   					# la ligne se termine par } ?
		then
			return								# oui fin de menuentry
		fi
			# et si pas de ... } on ira jusqu'en fin de fichier !!!!
			# c'est un critère de format de grub
done
}

function sort_menu_0 {	# écrit menu[0..n] dans le fichier de sauvegarde

for p in ${!menu[@]}						# pour tous les indices
	do
		echo "${menu[$p]}" >> "$fich_sauv"	# écriture menu[0..n]
		((nb_lignes_cons++))				# stat
		((nb_lignes_menu_cons++))			# stat
		echo -e "c\c"						# suivi écran
	done
}


function sort_menu_1 {	# écrit menu[0..n] dans le fichier suppression

#écriture des paramètres reçus dans fich_sup
	echo "#########################"	>> $fich_sup
	for arg in "$@"		# prends $1 $2 ... $n
	do
		echo $arg		>> $fich_sup
		#echo			>> $fich_sup
	done

# écriture du menu dans fichier sup
for p in ${!menu[@]}					# pour tous les indices
do
	echo "${menu[$p]}" >> "$fich_sup"	# écriture menu[0..n]
	((nb_lignes_sup++))					# stat
	echo -e "x\c"						# suivi écran
	done
}



function sort_info_transforme { # écrit les paramètres reçus fich_transforme

	echo "#########################"	>> $fich_transforme
	for arg in "$@"	# ( $1 $2 ... $n )
		do
			echo $arg		>> $fich_transforme
			#echo			>> $fich_transforme
		done
}


function trt_menu2 { # analyse le paramètre $1
	# renvoie 1 si $1 contient plus d'une fois /dev/sd  avant --class (suppresion)
	# renvoie 0 sinon

IFS=" "		# il faut l'espace comme délimiteur
tableau=($1)	# mise en tableau de la ligne
IFS="~"		# peut-être utile pour la suite ?

nbdevsd=0 					# nombre de fois que l'on trouve /dev/sd (avant --class)

for n in ${!tableau[@]} # de 0 1 2 .... x
do
	r_class=`echo ${tableau[$n]} | grep "$rech_class"`	# test présence --class
	if [[  -n $r_class ]] 								# --class ou pas ?
		then
			break				# --class est trouvé, sort de la boucle for
		else
			r_dev=`echo ${tableau[$n]} | grep "$rech_dev"`   #  test présence /dev/sd
			if [[ -n $r_dev ]]
				then
					((nbdevsd++))							# incrémente si on a /dev/sd 
					if [[ $nbdevsd -gt 1 ]]					# si plus d une fois /dev/sd
						then
							return 1 						# on sort en renvoyant 1
						fi #[[ $nbdevsd -gt 1 ]]
				fi #[[ -n $r_dev ]]
		fi #[[  -n $r_class ]]
done

if [[ $nbdevsd -gt 1 ]]	# test nombre
	then
		return 1 # 1 si plus d'une fois /dev/sd
	else
		return 0 # 0 sinon
fi
}



# début du programme ##################################################################################
######### variables ################################### 
rech_class="\-\-class"		# jusqu'à trouver la chaine --class dans menuentry
rech_dev="\/dev\/sd"		# la présence de la chaine  /dev/sd dans menuentry
res_blkid="blkid-res.txt"	# le fichier contenant le résultat de sudo blkid
chaine_search="search \-\-no\-floppy \-\-fs\-uuid \-\-set=root"
	 						# protection des tirets pour les recherche par \  d'où les \-
chaine_linux="linux.*\/vmlinu" 			# + général "linux......./vmlinu"
label_submenu=""						# label valide du menuentry précédent
fich_fstab_conc="UBoot_UPart.txt" # créé par recup-fstab contient les uuid ayant boot séparé
#########################################################
num=`date +%Y:%m:%d`-`date +%H:%M:%S`
fich_sauv=grub-OK-$num.txt
fich_sup=grub-sup-$num.txt
fich_transforme=fich_transforme-$num.txt
fich_fstab=fich_fstab-$num.txt
##### pour les stat #####################################
nb_menu_cons=0
nb_menu_boot_cons=0
nb_menu_sup=0
nb_menu_sans_uuid=0
nb_lignes_sup=0
nb_lignes_cons=0
nb_lignes_lues=0
nb_lignes_hors_menu=0
nb_lignes_menus_cons=0
#########################################################

prg="./recup_fstab_V2"	# création de $fich_fstab_conc (UBoot_UPart.txt)

echo "lancement du programme $prg"

#si le programme n'existe pas on sort
! [[ -e "$prg" ]] && echo "il manque le fichier $prg de récupération de infos de fstab" && exit 0
# créé le fichier UBoot_UPart.txt contenant uuid1-uuid2 des systèmes boot séparés
code=0		# permet des essais sans lancer prg , en diésant seulement la ligne qui suit
./$prg		# pour des essais mettre #./$prg
code=$? 

if [[ $code -ne 0 ]]
	then
		echo "  il y a eu un problème de traitement du programme  $prg"
		echo "  si l'arrêt n'est pas volontaire"
		echo "  vérifier que le répertoire /mnt/jpb ne comporte pas des résidus de fichiers"
		echo "  éventuellement faire le ménage dans ce répertoire"
		exit 0
	fi

echo "suite du programme $0"

if ! [[ -e $fich_fstab_conc  ]]	# normalement il a été créé par recup_fstab
	then
		echo "le fichier  $fich_fstab_conc est introuvable"
		echo "il faut d'abord exécuter recup_fstab"
		exit 0
	else
		echo ; echo 
		echo "  vérification des uuid correspondants à des systèmes sur boot séparés"
		echo "  remarque : il existe deux lignes par couple"
		echo "  une ligne uuid1-uuid2 et une ligne uuid2-uuid1"
		echo ; echo
		echo "#############################################"
		cat $fich_fstab_conc
		echo "#############################################"
		echo ; echo
		echo "  vérifier visuellement le contenu des lignes comprises entre les ###"
		echo tapez sur entrée pour continuer
		read g
	fi

# lecture et mise en mémoire des infos donnée par le fichier $fich_fstab_conc ("UBoot_UPart.txt")
max_boot=-1
while read l_boot
do
	[[ -z $l_boot ]] && echo "ligne vide je passe" && continue		# si ligne vide ou commentée
	[[ $l_boot =~ ^[[:blank:]]*# ]] && echo "ligne commentée $l_boot je passe" && continue
	((max_boot++))
	echo $l_boot
	UBoot[$max_boot]=$l_boot # format uuid1-uuid2 à la suite
done <$fich_fstab_conc

OK # présentation du programme

rep=""
while [[ $rep != [oOyYaAcC] ]]
do
titre="     Utilisation des UUID et LABEL des partitions des disques"
texte="
			Choix du fichier de références  LABEL et UUID

	répondez par
			(aA)     pour arrêter ce programme
	
			(oOyY)   si vous voulez ré-utiliser le fichier $res_blkid existant
                         ce fichier a été créé précédemment
						(les labels utilisés pour mettre à jour le grub
						 seront alors ceux déclarés sur la partition)

			(cC)     permet de choisir un fichier de référence UUID LABEL
						(les labels utilisés pour mettre à jour le grub
						 seront alors ceux déclarés dans ce fichier de référence)

				     !!!!!	à partir de V31 ce fichier devra aussi comporter le champ /dev
						    chaque partition doit être déclarée
							le champ UUID est OBLIGATOIRE pour un traitement correct
							le champ type est conseillé

							ce choix peut servir si vous ne voulez pas labelliser les
							partitions mais mettre quand même un label dans grub
							ou bien effctuer des essais
							(ce choix un peu tordu est un peu difficile à comprendre ?)

							le champ /dev/sdxx en premier
							le champ LABEL="xxxxxx"
							le champ UUID="xxxxxx"
							le champ TYPE="xxxxx"							
							une ligne sera donc de la forme

/dev/sdxx LABEL=\"un label correct\" UUID=\"un uuid correct\" TYPE=\"le  type correspondant\"

				!!!!	en cas de doute utilisez le choix oOyY 

	puis Valider

					si vous répondez non , ce sera le fichier $res_blkid qui sera
					utilisé pour mettre à jour le titre des menus et sous menus
					dans le fichier traité (surtout utile pour des essais)

					O pour réutilisation du fichier blkid 
					C pour choisir un fichier de référence UUID LABEL
					A Arrêter
"
rep=`zenity --entry --title "$titre" --text "$texte" --width "800"`

case $rep in
	[oOyY]	) echo "réutilisation du fichier $res_blkid créé précédemment" ;;
	[aA]	) echo "arrêt du programme" 		; exit 0				;;
	[cC] 	) echo "choix du fichier des uuid" 	; choix_fichier_blkid 	;;
	*		) echo "utilisez seulement oO yY aA cC S.V.P."				;;
esac
done

# si le fichier de concordance n'existe pas sortie 

! [[ -e "$res_blkid" ]] && echo " $0 fichier UUID-LABEL $res_blkid inexistant" && read g && exit 0

# récupératon dev label UUID dans des tableaux
unset dev
unset uuid
unset label
unset bdev	# V31 pour boot séparé
unset btype #le type de la partition
unset bmont # point de montage à cause du boot séparé

############## récupération dev label uuid btype dans le fichier choisi ###################
maxuuid=-1
while read ligne
do
#TEST simplification par continue
	[[ -z $ligne ]] && echo "ligne vide je passe" && continue		# correction ligne vide
	((maxuuid++))
	tableau=($ligne) # découper la ligne en champ
	tmp=`sed 's/://g' <<< ${tableau[0]}` # supprime les : donne /dev/sdxx
	[[ -z `grep "^\/dev" <<< $tmp` ]] && echo \
		&& echo "il manque /dev dans la ligne $ligne du fichier de référence UUID-LABEL" \
		&& exit 0
  
	dev[maxuuid]=$tmp			#récupération du dev de la ligne
	label[maxuuid]=""
	uuid[maxuuid]=""
	btype[maxuuid]=""
	
	echo ${tableau[@]}
	
	for champ in ${tableau[@]}
		do
			deb=` echo $champ | cut -c1-5`
			case $deb in
				LABEL)		# en enlevant les guillemets donne U16.04-b7
					label[maxuuid]=`sed 's/"//g' <<< ${champ##*=}`
					;;
				UUID\=)		# en enlevant les guillemets donne c63335c7-b....2be94
					uuid[maxuuid]=`sed 's/"//g' <<< ${champ##*=}`
					;;
				TYPE\=)		# en enlevant les guillemets donne swap ntfs ext4 ....
					btype[maxuuid]=`sed 's/"//g' <<< ${champ##*=}`
			esac
	done

done < $res_blkid

##############################################################################
if [[ "$res_blkid" != "blkid-res.txt" ]]
then
	verifier_presence_dev # vérifie que tous les dev du fichier choisi sont bien déclarés
fi
###############################################################################
# sortie des uuid label pour info
		rm tmp_u_l.txt
echo
		p=0
		while [[ $p -le $maxuuid ]]
		do
			aff_dev="${dev[$p]}"		&& [[ -z "$aff_dev"		]]	&& aff_dev="_"
			aff_label="${label[$p]}"	&& [[ -z "$aff_label"	]]	&& aff_label="___"
			aff_uuid="${uuid[$p]}"		&& [[ -z "$aff_uuid"	]]	&& aff_uuid="___"
			aff_btype="${btype[$p]}"	&& [[ -z "$aff_btype"	]]	&& aff_btype="___"

# car si l'un des $ est "" , il y a erreur d'affichage

			printf "%02s %-10s UUID %-36s LABEL: %-20s  TYPE : %-10s\n" \
					$p $aff_dev $aff_uuid $aff_label $aff_btype  | tee -a tmp_u_l.txt
			((p++))											
		done

titre="Affichage des concordances LABEL <=> UUID      Visualiser puis  Valider pour continuer"
zenity --text-info --title "$titre" --filename "tmp_u_l.txt" --height "640" --width "1280" --font "Courier New Bold 10"
code=$?
if [[ $code -ne 0 ]]
	then
		echo $code
		exit 0 #sortie si on ne valide pas
	else
		echo $code

	fi

################ début de traitement du fichier GRUB ###############################

# Quel fichier grub traiter ?
titre="$0               Sélectionnez le fichier GRUB à traiter"
fich_source=`zenity --file-selection --filename="../fichier-grub/*" --title="$titre"`
case $? in	# $? est le code de retour de zenity
	0)	:														;;
	1)	echo "Aucun fichier sélectionné."			; exit 1	;;
	-1)	echo "Une erreur inattendue est survenue."	; exit 1	;;	
	*)	echo "erreur non reconnue"					; exit 1	;;	
esac


#### lecture et traitement du fichier GRUB #######

trier_fichier # création des 3 fichiers de 1 à 10 linux 10 linux à 40 custom 40 custom à la fin 

################# traitement jusqu'à 10_linux #####################
prem=0
while read ligne
do 
((nb_lignes_lues++))
if  [[ $prem -eq 0 ]]
	then
				modif_ligne1_grub "$ligne" ; ((prem++))
	else
				echo $ligne >> "$fich_sauv"
				((nb_lignes_cons++))
				((nb_lignes_hors_menu++))

fi
done < "$fich_source_0"

################# traitement de 10_linux à 40_custom
IFS="~"
while read ligne
do
((nb_lignes_lues++))

if  [[ $prem -eq 0 ]] # pourrait être supprimé depuis V34
	then
				modif_ligne1_grub "$ligne" ; ((prem++))
	else
				# entre les crochets on a tab et espace élargisement après {
	res=`echo "$ligne" | grep "^[	 ]*menuentry.*{[ 	]*$"`
	mem=`echo "$ligne" | grep "^[	 ]*menuentry ['\"]Memory test.*{[ 	]*$"`

	# res est vide s'il n'y a pas menuentry {
	# mem est non vide si on a Memory test -ne pas traiter menuentry 'Memory test

	if [[ -n $mem ]]
	then			# si Memory test on force res à vide
		res=""
	fi

	if  [[ -z $res ]]
		then 											# pas menuentry 
			subm=`echo "$ligne" | grep "^[	 ]*submenu.*{[ 	]*$"`
			if [[ -z $subm ]]
				then 									# pas menuentry pas submenu
					echo "$ligne" >> $fich_sauv			# écriture de cette ligne dans sauv
					((nb_lignes_cons++))				# stat
					((nb_lignes_hors_menu++))			# stat
					echo -e ".\c"						# trace écran
				else 									# contient submenu
					echo -e "S\c"						# trace
					traite_ligne_submenu "$ligne"		# traitement de submenu
			fi
		
		else								# on a menuentry
			lire_menuentry					# mettre en mémoire dans menu[0..n]
			trt_menu2 "${menu[0]}" 			# rem : 1 si /dev/sd /dev/sd
			code_dev_dev=$?
			if [[ $code_dev_dev -eq 1 ]]	# si 1 on supprime
				then						# le bloc menuentry contient /dev /dev
					sort_menu_1	" " "menu supprimé : trop de /dev/sd"	# fich_sup
					((nb_menu_sup++))

				else  						# menuentry ne contient pas /dev/sd /dev/sd
					critere_suppression_2	# analyse des uuid et recherche de label
					code_crit2=$?
					case $code_crit2 in
					0)						# les uuid sont égaux
						transforme_ligne_menuentry "$chaine_search"	# mettre un label dans menu[0]
						sort_menu_0					# écrire le menu dans fich_sauv
						((nb_menu_cons++))			# stat
					;;
					1)						# menu sans modif (ni search ni linux)
						sort_menu_0					# écrire le menu dans fich_sauv
sort_info_transforme "${menu[0]}" "menu conservé (sans search ou linux)"
						((nb_menu_cons++))			# stat
					;;
					2)						# uuid différents on supprime ce menu
						sort_menu_1	" " "menu supprimé : uuid différents"	# écrire dans fich_sup
						((nb_menu_sup++))				# stat
					;;
					3)						# uuid non trouvé (search et linux existent)
						sort_menu_0					# écrire le menu dans fich_sauv
sort_info_transforme "${menu[0]}" "menu conservé : UUID search-linux non trouvé"
						((nb_menu_cons++))			# ce menu étant conservé
						((nb_menu_sans_uuid++))
					;;
					4)						# uuid != mais boot séparé
						transforme_ligne_menuentry "$chaine_linux" # met label dans menu[0]
						sort_menu_0					# écrire le menu dans fich_sauv
						((nb_menu_cons++))	# stat non prévu dans memorise_menuentry
						((nb_menu_boot_cons++))
					;;
					esac

				fi # [[ $code_dev_dev -eq 1 ]]
		fi #[[ -z $res ]]
	fi #[[ $prem -eq 0 ]]
#done < "$fich_source"
done < "$fich_source_1"

echo $nb_lignes_lues

################# traitement 40_custom à fin #####################
if [[ -e "$fich_source_2" ]] # en cas d'essai sans ligne 40_custom
	then
		while read ligne
		do 
			((nb_lignes_lues++))
			((nb_lignes_cons++))
			((nb_lignes_hors_menu++))
			echo $ligne >> "$fich_sauv"
		done < "$fich_source_2"
	fi
#################################################################

echo $nb_lignes_lues

# fin présentation des résultats sur l'écran

echo
echo
printf "%-40s %s %s\n" "fichier traité" " : " "$fich_source"
printf "%-40s %s %s\n" "le résultat se trouve dans"  " : " "$fich_sauv"
echo
printf "%-39s %s %5d\n" "nombre de lignes lues" " : " "$nb_lignes_lues"
printf "%-40s %s %5d\n" "lignes conservées" " : " "$nb_lignes_cons"
printf "%-40s %s %5d\n" "lignes supprimées" " : " "$nb_lignes_sup"
if [[ $nb_lignes_sup -gt 0 ]]
	then
printf "%-40s %s %s\n" "fichier des lignes supprimées" " : " "$fich_sup"
	echo
	fi
printf "%-40s %s %5d\n" "nombre de menus conservés" " : " "$nb_menu_cons"
printf "%-40s %s %5d\n" "nombre de menus supprimés" " : " "$nb_menu_sup"
printf "%-40s %s %5d\n" "nombre de menus avec boot conservés" " : " "$nb_menu_boot_cons"
if [[ $nb_menu_sans_uuid -gt 0 ]]
	then
printf "%-40s %s %5d\n" "nombre de menus sans uuid trouvé" " : " "$nb_menu_sans_uuid"
	fi
echo
printf "%-40s %s %5d\n" "lignes conservées (hors menu)" " : " "$nb_lignes_hors_menu"
printf "%-40s %s %5d\n" "lignes conservées (menu)" " : " "$nb_lignes_menu_cons"


echo "après avoir vérifié manuellement le fichier"
echo "$fich_sauv"
echo "vous pourrez remplacer grub.cfg par celui-ci à vos risques et périls"
echo


rep=""
while [[ $rep != [oOyYnN] ]]
do

################ mise à jour du fichier traité  ou non ###########################
titre="       remplacement de GRUB"
texte="Voulez-vous remplacer le grub original par le nouveau fichier généré (oOyYnN)
	
       mais par précaution si vous répondez oui le fichier
 $fich_source (fichier original choisi)
          sera sauvegardé dans
 $fich_source-$num

	   Attention
 $fich_source 
	sera remplacé par le contenu du fichier
 $fich_sauv  (le résultat OK obtenu)
       donc si avez choisi de traiter /boot/grub
       /boot/grub sera remplacé par le fichier résultant ... prenez vos précautions

		personnellement si je traite le fichier réel je réponds N

        pour vérifier le contenu du fichier créé 

        puis j'effectue manuellement la copie

                   répondez par (oOyYnN)"

rep=`zenity --entry --title "$titre" --text "$texte" --width "800"`
case $rep in
	[oOyY] )	# sauvegarde de "grub" , je conserve $num	
			echo "OK je sauvegarde le fichier original $fich_source dans $fich_source-$num"
			sudo cp "$fich_source" "$fich_source-$num"

			#et fich_sauv remplace grub
			echo "et je remplace $fich_source par $fich_sauv"
			sudo mv "$fich_sauv" "$fich_source"
	;;
	[nN]	)	
             echo ; echo "grub non remplacé"
             echo "  mais le fichier $fich_sauv est à disposition"
	;;
	*	) 	echo "utilisez seulement oOyYnN S.V.P."
	;;
esac
done

echo "taper entrée pour terminer"
read g #pour attendre
exit 0

Dernière modification par ar barzh paour (Le 17/03/2017, à 08:56)


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#153 Le 15/03/2017, à 11:30

Babdu89

Re : [Projet terminé] correction anomalie de grub

Bonjour.
@ ar barzh paour.
Je n'ai pas trop pigé ce qu'il faut faire avec les scripts.

Depuis l'Os de tests avec partition /boot séparée.
Il faut passer le deux scripts recup_fstabV2, en laissant en place les fichiers créés par ce script. Puis le modif_grub_V35 ?.
Ou directement le modif_grub_V35?.

Édit;
OK, je pense avoir pigé en relisant tes posts et les scripts recup-fstabV2 et modif_grub_v35 .
Après nettoyage de tous les fichiers de travail des tests précédents.
Il faut mettre les deux scripts dans le même répertoire, chez moi dans mon dossier perso. Le script modif_grub_V35 lance le script  recup-fstabV2 puisque présent dans le répertoire.

Je teste çà dans la soirée.
@+.   Babdu89  .

Dernière modification par Babdu89 (Le 15/03/2017, à 11:51)


J'ai découvert Ubuntu avec la 07.10.... Et alors?!...  Depuis je regarde de temps en temps si Windows marche toujours....

Hors ligne

#154 Le 15/03/2017, à 17:52

ar barzh paour

Re : [Projet terminé] correction anomalie de grub

@Babdu
oui
j'ai édité mon post 150


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#155 Le 16/03/2017, à 01:31

Babdu89

Re : [Projet terminé] correction anomalie de grub

Bonsoir.
@ar barzh paour.

Test fait depuis, l'Os avec partition /boot séparée.
seule partition système de la config montée, celle du deuxième Os de tests de la clé de tests.

Lancement modif_grub_V35.sh
./recup_fstab_V2 fait bien son travail. Si besoin je posterais les fichiers créés.

Souci dans le fonctionnement du script; modif_grub_V35.sh
Il s'arrête lorsque j'indique et valide le chemin d'accès fichier grub.cfg à traiter.

/boot/grub/tests-modif_grub_V35 et recup_fstab_V2/grub(avec-boot-separe) (copie).cfg

Il ne change rien dans le fichier grub.cfg à traiter.

Retour terminal lancement du script modif_grub_V35.sh

bernard@bernard-System-Product-Name:~$ sudo bash modif_grub_V35.sh
[sudo] Mot de passe de bernard : 
lancement du programme ./recup_fstab_V2
rm: impossible de supprimer 'DevSd_UBoot_UPart.txt': Aucun fichier ou dossier de ce type
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
/dev/sda1: LABEL="XP-MASSY" UUID="B664A19764A16ABF" TYPE="ntfs" PARTUUID="00000001-01"
/dev/sda5: LABEL="DONNEES_WD" UUID="3336D5F95125508C" TYPE="ntfs" PARTUUID="00000001-05"
/dev/sda6: UUID="0b82c97d-d077-4191-ae87-de7f2787ba44" TYPE="swap" PARTUUID="00000001-06"
/dev/sda7: LABEL="xubuntu-14-sys-m" UUID="5ed81f97-295e-4246-8aa1-7ae54d6c9e7c" TYPE="ext4" PARTUUID="00000001-07"
/dev/sda8: LABEL="xubuntu-14-hom-m" UUID="08201295-445e-4de7-a95b-a56990a0a9dd" TYPE="ext4" PARTUUID="00000001-08"
/dev/sda9: LABEL="fusion-12-hom-m" UUID="878a2332-9b22-4ca6-b125-d09c3821cf80" TYPE="ext4" PARTUUID="00000001-09"
/dev/sda10: LABEL="ubu-mate-16.04-m" UUID="ea999dc0-aaad-46bb-84ab-6e510bd28348" TYPE="ext4" PARTUUID="00000001-0a"
/dev/sda11: LABEL="fusion-12-sys-m" UUID="aec00812-bb57-4bbe-a5ed-90228e770e48" TYPE="ext4" PARTUUID="00000001-0b"
/dev/sda12: LABEL="voyager16.04.1.1" UUID="2f5e2fc1-c492-408e-956b-1d56a72eb7d3" TYPE="ext4" PARTUUID="00000001-0c"
/dev/sda13: LABEL="fusion-14-massy" UUID="29e5afbd-d25d-4050-816c-e2c8bc7984a2" TYPE="ext4" PARTUUID="00000001-0d"
/dev/sda14: LABEL="xubuntu-16-sys-m" UUID="75df6dda-088e-42e0-bb24-0558de998d09" TYPE="ext4" PARTUUID="00000001-0e"
/dev/sdb1: LABEL="hyb-systemback" UUID="1aced9e1-d845-46bb-a6e2-448666be4a21" TYPE="ext4" PARTUUID="00006711-01"
/dev/sdb2: UUID="5147bb57-b517-4a46-9344-c690575331e1" TYPE="swap" PARTUUID="00006711-02"
/dev/sdb3: LABEL="SB@boot" UUID="13e83c99-8624-4136-a61d-10e67e670ba3" TYPE="ext4" PARTUUID="00006711-03"
/dev/sdb4: LABEL="SB@" UUID="2ffbf271-02fa-4d6f-a8e6-dee7a63894e5" TYPE="ext4" PARTUUID="00006711-04"
rm: impossible de supprimer 'tmp_u_l.txt': Aucun fichier ou dossier de ce type

 0 /dev/sda1  B664A19764A16ABF                     LABEL XP-MASSY                                      TYPE : ntfs      
 1 /dev/sda5  3336D5F95125508C                     LABEL DONNEES_WD                                    TYPE : ntfs      
 2 /dev/sda6  0b82c97d-d077-4191-ae87-de7f2787ba44 LABEL _                                             TYPE : swap      
 3 /dev/sda7  5ed81f97-295e-4246-8aa1-7ae54d6c9e7c LABEL xubuntu-14-sys-m                              TYPE : ext4      
 4 /dev/sda8  08201295-445e-4de7-a95b-a56990a0a9dd LABEL xubuntu-14-hom-m                              TYPE : ext4      
 5 /dev/sda9  878a2332-9b22-4ca6-b125-d09c3821cf80 LABEL fusion-12-hom-m                               TYPE : ext4      
 6 /dev/sda10 ea999dc0-aaad-46bb-84ab-6e510bd28348 LABEL ubu-mate-16.04-m                              TYPE : ext4      
 7 /dev/sda11 aec00812-bb57-4bbe-a5ed-90228e770e48 LABEL fusion-12-sys-m                               TYPE : ext4      
 8 /dev/sda12 2f5e2fc1-c492-408e-956b-1d56a72eb7d3 LABEL voyager16.04.1.1                              TYPE : ext4      
 9 /dev/sda13 29e5afbd-d25d-4050-816c-e2c8bc7984a2 LABEL fusion-14-massy                               TYPE : ext4      
10 /dev/sda14 75df6dda-088e-42e0-bb24-0558de998d09 LABEL xubuntu-16-sys-m                              TYPE : ext4      
11 /dev/sdb1  1aced9e1-d845-46bb-a6e2-448666be4a21 LABEL hyb-systemback       sur /media/bernard/hyb-systemback TYPE : ext4      
12 /dev/sdb2  5147bb57-b517-4a46-9344-c690575331e1 LABEL _                                             TYPE : swap      
13 /dev/sdb3  13e83c99-8624-4136-a61d-10e67e670ba3 LABEL SB@boot              sur /boot                TYPE : ext4      
14 /dev/sdb4  2ffbf271-02fa-4d6f-a8e6-dee7a63894e5 LABEL SB@                  sur /                    TYPE : ext4      
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
OK je continue
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
0 /dev/sda1 1
1 /dev/sda5 1
2 /dev/sda6 1
3 /dev/sda7 1
4 /dev/sda8 1
5 /dev/sda9 1
6 /dev/sda10 1
7 /dev/sda11 1
8 /dev/sda12 1
9 /dev/sda13 1
10 /dev/sda14 1
11 /dev/sdb1 0
/media/bernard/hyb-systemback/etc/fstab
12 /dev/sdb2 1
13 /dev/sdb3 0
/boot/etc/fstab
14 /dev/sdb4 0
/etc/fstab
fonction ecrit_uuid1_uuid2 UUID=2ffbf271-02fa-4d6f-a8e6-dee7a63894e5 UUID=13e83c99-8624-4136-a61d-10e67e670ba3
fin de fonction ecrit_uuid1 uuid2 =1=>2ffbf271-02fa-4d6f-a8e6-dee7a63894e5<=== =2=>13e83c99-8624-4136-a61d-10e67e670ba3<===
réperoire /mnt présent
création du répertoire /mnt/jpb-2017:03:16-00:40:22 pour monter les partitions
0 /dev/sda1
1 /dev/sda5
2 /dev/sda6
3 /dev/sda7

traitement de 3 /dev/sda7 (ext4)
montage de       /dev/sda7 sur /mnt/jpb-2017:03:16-00:40:22
code de retour montage de /dev/sda7 sur /mnt/jpb-2017:03:16-00:40:22 : 0
boucle 0  : /dev/sda7 code de retour de umount 0

boucle 0 : /dev/sda7 démontage effectué (code retour 0)
total 8
268622 4 drwxr-xr-x 2 root root 4096 mars  16 00:41 .
260610 4 drwxr-xr-x 3 root root 4096 mars  16 00:41 ..
4 /dev/sda8

traitement de 4 /dev/sda8 (ext4)
montage de       /dev/sda8 sur /mnt/jpb-2017:03:16-00:40:22
code de retour montage de /dev/sda8 sur /mnt/jpb-2017:03:16-00:40:22 : 0
boucle 0  : /dev/sda8 code de retour de umount 0

boucle 0 : /dev/sda8 démontage effectué (code retour 0)
total 8
268622 4 drwxr-xr-x 2 root root 4096 mars  16 00:41 .
260610 4 drwxr-xr-x 3 root root 4096 mars  16 00:41 ..
5 /dev/sda9

traitement de 5 /dev/sda9 (ext4)
montage de       /dev/sda9 sur /mnt/jpb-2017:03:16-00:40:22
code de retour montage de /dev/sda9 sur /mnt/jpb-2017:03:16-00:40:22 : 0
boucle 0  : /dev/sda9 code de retour de umount 0

boucle 0 : /dev/sda9 démontage effectué (code retour 0)
total 8
268622 4 drwxr-xr-x 2 root root 4096 mars  16 00:41 .
260610 4 drwxr-xr-x 3 root root 4096 mars  16 00:41 ..
6 /dev/sda10

traitement de 6 /dev/sda10 (ext4)
montage de       /dev/sda10 sur /mnt/jpb-2017:03:16-00:40:22
code de retour montage de /dev/sda10 sur /mnt/jpb-2017:03:16-00:40:22 : 0
boucle 0  : /dev/sda10 code de retour de umount 0

boucle 0 : /dev/sda10 démontage effectué (code retour 0)
total 8
268622 4 drwxr-xr-x 2 root root 4096 mars  16 00:41 .
260610 4 drwxr-xr-x 3 root root 4096 mars  16 00:41 ..
7 /dev/sda11

traitement de 7 /dev/sda11 (ext4)
montage de       /dev/sda11 sur /mnt/jpb-2017:03:16-00:40:22
code de retour montage de /dev/sda11 sur /mnt/jpb-2017:03:16-00:40:22 : 0
boucle 0  : /dev/sda11 code de retour de umount 0

boucle 0 : /dev/sda11 démontage effectué (code retour 0)
total 8
268622 4 drwxr-xr-x 2 root root 4096 mars  16 00:41 .
260610 4 drwxr-xr-x 3 root root 4096 mars  16 00:41 ..
8 /dev/sda12

traitement de 8 /dev/sda12 (ext4)
montage de       /dev/sda12 sur /mnt/jpb-2017:03:16-00:40:22
code de retour montage de /dev/sda12 sur /mnt/jpb-2017:03:16-00:40:22 : 0
boucle 0  : /dev/sda12 code de retour de umount 0

boucle 0 : /dev/sda12 démontage effectué (code retour 0)
total 8
268622 4 drwxr-xr-x 2 root root 4096 mars  16 00:41 .
260610 4 drwxr-xr-x 3 root root 4096 mars  16 00:41 ..
9 /dev/sda13

traitement de 9 /dev/sda13 (ext4)
montage de       /dev/sda13 sur /mnt/jpb-2017:03:16-00:40:22
code de retour montage de /dev/sda13 sur /mnt/jpb-2017:03:16-00:40:22 : 0
boucle 0  : /dev/sda13 code de retour de umount 0

boucle 0 : /dev/sda13 démontage effectué (code retour 0)
total 8
268622 4 drwxr-xr-x 2 root root 4096 mars  16 00:41 .
260610 4 drwxr-xr-x 3 root root 4096 mars  16 00:41 ..
10 /dev/sda14

traitement de 10 /dev/sda14 (ext4)
montage de       /dev/sda14 sur /mnt/jpb-2017:03:16-00:40:22
code de retour montage de /dev/sda14 sur /mnt/jpb-2017:03:16-00:40:22 : 0
boucle 0  : /dev/sda14 code de retour de umount 0

boucle 0 : /dev/sda14 démontage effectué (code retour 0)
total 8
268622 4 drwxr-xr-x 2 root root 4096 mars  16 00:41 .
260610 4 drwxr-xr-x 3 root root 4096 mars  16 00:41 ..
11 /dev/sdb1
12 /dev/sdb2
13 /dev/sdb3
14 /dev/sdb4


fin de récupération des données de /etc/fstab des partitions présentes sur la machine


suppression du répertoire /mnt/jpb-2017:03:16-00:40:22 en cours
supression réussie
fin normale du programme ././recup_fstab_V2
suite du programme modif_grub_V35.sh


  vérification des uuid correspondants à des systèmes sur boot séparés
  remarque : il existe deux lignes par couple
  une ligne uuid1-uuid2 et une ligne uuid2-uuid1


#############################################
# 2017:03:16-00:40:22 : couples uuid-boot - uuid-systeme des menuentry en boot séparé
2ffbf271-02fa-4d6f-a8e6-dee7a63894e5-13e83c99-8624-4136-a61d-10e67e670ba3
13e83c99-8624-4136-a61d-10e67e670ba3-2ffbf271-02fa-4d6f-a8e6-dee7a63894e5
#############################################


  vérifier visuellement le contenu des lignes comprises entre les ###
tapez sur entrée pour continuer

ligne commentée # 2017:03:16-00:40:22 : couples uuid-boot - uuid-systeme des menuentry en boot séparé je passe
2ffbf271-02fa-4d6f-a8e6-dee7a63894e5-13e83c99-8624-4136-a61d-10e67e670ba3
13e83c99-8624-4136-a61d-10e67e670ba3-2ffbf271-02fa-4d6f-a8e6-dee7a63894e5
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
réutilisation du fichier blkid-res.txt créé précédemment
/dev/sda1: LABEL="XP-MASSY" UUID="B664A19764A16ABF" TYPE="ntfs" PARTUUID="00000001-01"
/dev/sda5: LABEL="DONNEES_WD" UUID="3336D5F95125508C" TYPE="ntfs" PARTUUID="00000001-05"
/dev/sda6: UUID="0b82c97d-d077-4191-ae87-de7f2787ba44" TYPE="swap" PARTUUID="00000001-06"
/dev/sda7: LABEL="xubuntu-14-sys-m" UUID="5ed81f97-295e-4246-8aa1-7ae54d6c9e7c" TYPE="ext4" PARTUUID="00000001-07"
/dev/sda8: LABEL="xubuntu-14-hom-m" UUID="08201295-445e-4de7-a95b-a56990a0a9dd" TYPE="ext4" PARTUUID="00000001-08"
/dev/sda9: LABEL="fusion-12-hom-m" UUID="878a2332-9b22-4ca6-b125-d09c3821cf80" TYPE="ext4" PARTUUID="00000001-09"
/dev/sda10: LABEL="ubu-mate-16.04-m" UUID="ea999dc0-aaad-46bb-84ab-6e510bd28348" TYPE="ext4" PARTUUID="00000001-0a"
/dev/sda11: LABEL="fusion-12-sys-m" UUID="aec00812-bb57-4bbe-a5ed-90228e770e48" TYPE="ext4" PARTUUID="00000001-0b"
/dev/sda12: LABEL="voyager16.04.1.1" UUID="2f5e2fc1-c492-408e-956b-1d56a72eb7d3" TYPE="ext4" PARTUUID="00000001-0c"
/dev/sda13: LABEL="fusion-14-massy" UUID="29e5afbd-d25d-4050-816c-e2c8bc7984a2" TYPE="ext4" PARTUUID="00000001-0d"
/dev/sda14: LABEL="xubuntu-16-sys-m" UUID="75df6dda-088e-42e0-bb24-0558de998d09" TYPE="ext4" PARTUUID="00000001-0e"
/dev/sdb1: LABEL="hyb-systemback" UUID="1aced9e1-d845-46bb-a6e2-448666be4a21" TYPE="ext4" PARTUUID="00006711-01"
/dev/sdb2: UUID="5147bb57-b517-4a46-9344-c690575331e1" TYPE="swap" PARTUUID="00006711-02"
/dev/sdb3: LABEL="SB@boot" UUID="13e83c99-8624-4136-a61d-10e67e670ba3" TYPE="ext4" PARTUUID="00006711-03"
/dev/sdb4: LABEL="SB@" UUID="2ffbf271-02fa-4d6f-a8e6-dee7a63894e5" TYPE="ext4" PARTUUID="00006711-04"

 0 /dev/sda1  UUID B664A19764A16ABF                     LABEL: XP-MASSY              TYPE : ntfs      
 1 /dev/sda5  UUID 3336D5F95125508C                     LABEL: DONNEES_WD            TYPE : ntfs      
 2 /dev/sda6  UUID 0b82c97d-d077-4191-ae87-de7f2787ba44 LABEL: ___                   TYPE : swap      
 3 /dev/sda7  UUID 5ed81f97-295e-4246-8aa1-7ae54d6c9e7c LABEL: xubuntu-14-sys-m      TYPE : ext4      
 4 /dev/sda8  UUID 08201295-445e-4de7-a95b-a56990a0a9dd LABEL: xubuntu-14-hom-m      TYPE : ext4      
 5 /dev/sda9  UUID 878a2332-9b22-4ca6-b125-d09c3821cf80 LABEL: fusion-12-hom-m       TYPE : ext4      
 6 /dev/sda10 UUID ea999dc0-aaad-46bb-84ab-6e510bd28348 LABEL: ubu-mate-16.04-m      TYPE : ext4      
 7 /dev/sda11 UUID aec00812-bb57-4bbe-a5ed-90228e770e48 LABEL: fusion-12-sys-m       TYPE : ext4      
 8 /dev/sda12 UUID 2f5e2fc1-c492-408e-956b-1d56a72eb7d3 LABEL: voyager16.04.1.1      TYPE : ext4      
 9 /dev/sda13 UUID 29e5afbd-d25d-4050-816c-e2c8bc7984a2 LABEL: fusion-14-massy       TYPE : ext4      
10 /dev/sda14 UUID 75df6dda-088e-42e0-bb24-0558de998d09 LABEL: xubuntu-16-sys-m      TYPE : ext4      
11 /dev/sdb1  UUID 1aced9e1-d845-46bb-a6e2-448666be4a21 LABEL: hyb-systemback        TYPE : ext4      
12 /dev/sdb2  UUID 5147bb57-b517-4a46-9344-c690575331e1 LABEL: ___                   TYPE : swap      
13 /dev/sdb3  UUID 13e83c99-8624-4136-a61d-10e67e670ba3 LABEL: SB@boot               TYPE : ext4      
14 /dev/sdb4  UUID 2ffbf271-02fa-4d6f-a8e6-dee7a63894e5 LABEL: SB@                   TYPE : ext4      
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
0
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
modif_grub_V35.sh: ligne 36: le : commande introuvable
modif_grub_V35.sh: ligne 37: $fich_source : redirection ambiguë
/boot/grub/tests-modif_grub_V35 et recup_fstab_V2/grub(avec-boot-separe) (copie).cfg
rm: impossible de supprimer 'tmp0_2017:03:16-00:40:22.txt': Aucun fichier ou dossier de ce type
rm: impossible de supprimer 'tmp1_2017:03:16-00:40:22.txt': Aucun fichier ou dossier de ce type
rm: impossible de supprimer 'tmp2_2017:03:16-00:40:22.txt': Aucun fichier ou dossier de ce type
modif_grub_V35.sh: ligne 54: $fich_source : redirection ambiguë
la présence de la ligne ### BEGIN /etc/grub.d/10_linux ### est obligatoire
le traitement ne commence qu'à partir de cette ligne
ajouter cette ligne au fichier
bernard@bernard-System-Product-Name:~$ 

@+.  Babdu89  .


J'ai découvert Ubuntu avec la 07.10.... Et alors?!...  Depuis je regarde de temps en temps si Windows marche toujours....

Hors ligne

#156 Le 16/03/2017, à 15:56

ar barzh paour

Re : [Projet terminé] correction anomalie de grub

fin normale du programme ././recup_fstab_V2

déjà ce programme s'est bien déroulé ......

modif_grub_V35.sh: ligne 36: le : commande introuvable

le numéro de ligne est bizarre normalement ce devrait être 40

en plus c'est une ligne de commentaire que j'ai du ajouter après mon test

il faut ajouter un # devant cette ligne !!!!!!!!!!!
j'édite la ligne dans le post
remplacement de

le fichier à traiter ne doit pas commencer par ### BEGIN /etc/grub.d/10_linux ###

par

# le fichier à traiter ne doit pas commencer par ### BEGIN /etc/grub.d/10_linux ###

pour le message

modif_grub_V35.sh: ligne 37: $fich_source : redirection ambiguë

il faut effectuer le remplacement suivant dans la ligne qui suit (ligne 41)

read ligne < $fich_source

par

read ligne < "$fich_source"

cela n'a pas généré d'erreur mais
en ligne 50
il faut remplacer return 1 par exit 1

pour le message

la présence de la ligne ### BEGIN /etc/grub.d/10_linux ### est obligatoire

IL FAUT que tu ajoutes cette ligne dans ton fichier et AVANT les lignes que tu veux traiter
si cette ligne n'est pas présente le programme  ne modifiera rien !!!!
le programme est prévu comme ça !!!

donc
soit tu fais les modifs dans le fichier modif-grub que tu as récupéré soit tu recharges le fichier au post 150
(j'ai fais quelques autres modifs mineures)

un petit truc qui t'évitera de d'avoir à relancer recup-ftsab
(le fichier UBoot_UPart.txt doit exister dans le répertoire de lancement)
vers les lignes 780
au lieu de

./$prg
code=$?

mets

code=0
# ./$prg
code=$?

dans le fichier du post 150 il suffit de diésé la ligne ./$prg
ne pas oublié après les essais de remettre la ligne ./$prg sans dièse

Dernière modification par ar barzh paour (Le 16/03/2017, à 19:04)


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#157 Le 16/03/2017, à 22:48

Babdu89

Re : [Projet terminé] correction anomalie de grub

J'ai recopier le contenu du script  modif_grub_V35 que tu as corrigé.

en ligne 50
il faut remplacer return 1 par exit 1

Dans ta correction, on a  exit1 manque un espace, non? j 'ai corrigé. (exit 1)

Le contenu du fichier grub.cfg à traiter.

#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
  set have_grubenv=true
  load_env
fi
if [ "${next_entry}" ] ; then
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   set boot_once=true
else
   set default="0"
fi

if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
else
  menuentry_id_option=""
fi

export menuentry_id_option

if [ "${prev_saved_entry}" ]; then
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true
fi

function savedefault {
  if [ -z "${boot_once}" ]; then
    saved_entry="${chosen}"
    save_env saved_entry
  fi
}
function recordfail {
  set recordfail=1
  if [ -n "${have_grubenv}" ]; then if [ -z "${boot_once}" ]; then save_env recordfail; fi; fi
}
function load_video {
  if [ x$feature_all_video_module = xy ]; then
    insmod all_video
  else
    insmod efi_gop
    insmod efi_uga
    insmod ieee1275_fb
    insmod vbe
    insmod vga
    insmod video_bochs
    insmod video_cirrus
  fi
}

if [ x$feature_default_font_path = xy ] ; then
   font=unicode
else
insmod part_msdos
insmod ext2
set root='hd1,msdos4'
if [ x$feature_platform_search_hint = xy ]; then
  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos4 --hint-efi=hd1,msdos4 --hint-baremetal=ahci1,msdos4  2ffbf271-02fa-4d6f-a8e6-dee7a63894e5
else
  search --no-floppy --fs-uuid --set=root 2ffbf271-02fa-4d6f-a8e6-dee7a63894e5
fi
    font="/usr/share/grub/unicode.pf2"
fi

if loadfont $font ; then
  set gfxmode=auto
  load_video
  insmod gfxterm
  set locale_dir=$prefix/locale
  set lang=fr_FR
  insmod gettext
fi
terminal_output gfxterm
if [ "${recordfail}" = 1 ] ; then
  set timeout=30
else
  if [ x$feature_timeout_style = xy ] ; then
    set timeout_style=menu
    set timeout=10
  # Fallback normal timeout code in case the timeout_style feature is
  # unavailable.
  else
    set timeout=10
  fi
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
if background_color 60,59,55; then
  clear
fi

color_normal=light-gray/black

if [ -e ${prefix}/themes/ubuntu-mate/theme.txt ]; then
  insmod png
  theme=${prefix}/themes/ubuntu-mate/theme.txt
fi
### END /etc/grub.d/05_debian_theme ###

### BEGIN /etc/grub.d/10_linux ###
function gfxmode {
	set gfxpayload="${1}"
	if [ "${1}" = "keep" ]; then
		set vt_handoff=vt.handoff=7
	else
		set vt_handoff=
	fi
}
if [ "${recordfail}" != 1 ]; then
  if [ -e ${prefix}/gfxblacklist.txt ]; then
    if hwmatch ${prefix}/gfxblacklist.txt 3; then
      if [ ${match} = 0 ]; then
        set linux_gfx_mode=keep
      else
        set linux_gfx_mode=text
      fi
    else
      set linux_gfx_mode=text
    fi
  else
    set linux_gfx_mode=keep
  fi
else
  set linux_gfx_mode=text
fi
export linux_gfx_mode
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-2ffbf271-02fa-4d6f-a8e6-dee7a63894e5' {
	recordfail
	load_video
	gfxmode $linux_gfx_mode
	insmod gzio
	if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
	insmod part_msdos
	insmod ext2
	set root='hd1,msdos3'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos3 --hint-efi=hd1,msdos3 --hint-baremetal=ahci1,msdos3  13e83c99-8624-4136-a61d-10e67e670ba3
	else
	  search --no-floppy --fs-uuid --set=root 13e83c99-8624-4136-a61d-10e67e670ba3
	fi
	linux	/vmlinuz-4.4.0-66-generic root=UUID=2ffbf271-02fa-4d6f-a8e6-dee7a63894e5 ro  quiet splash $vt_handoff
	initrd	/initrd.img-4.4.0-66-generic
}
submenu 'Options avancées pour Ubuntu' $menuentry_id_option 'gnulinux-advanced-2ffbf271-02fa-4d6f-a8e6-dee7a63894e5' {
	menuentry 'Ubuntu, avec Linux 4.4.0-66-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-66-generic-advanced-2ffbf271-02fa-4d6f-a8e6-dee7a63894e5' {
		recordfail
		load_video
		gfxmode $linux_gfx_mode
		insmod gzio
		if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos3'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos3 --hint-efi=hd1,msdos3 --hint-baremetal=ahci1,msdos3  13e83c99-8624-4136-a61d-10e67e670ba3
		else
		  search --no-floppy --fs-uuid --set=root 13e83c99-8624-4136-a61d-10e67e670ba3
		fi
		echo	'Chargement de Linux 4.4.0-66-generic…'
		linux	/vmlinuz-4.4.0-66-generic root=UUID=2ffbf271-02fa-4d6f-a8e6-dee7a63894e5 ro  quiet splash $vt_handoff
		echo	'Chargement du disque mémoire initial…'
		initrd	/initrd.img-4.4.0-66-generic
	}
	menuentry 'Ubuntu, with Linux 4.4.0-66-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-66-generic-recovery-2ffbf271-02fa-4d6f-a8e6-dee7a63894e5' {
		recordfail
		load_video
		insmod gzio
		if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos3'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos3 --hint-efi=hd1,msdos3 --hint-baremetal=ahci1,msdos3  13e83c99-8624-4136-a61d-10e67e670ba3
		else
		  search --no-floppy --fs-uuid --set=root 13e83c99-8624-4136-a61d-10e67e670ba3
		fi
		echo	'Chargement de Linux 4.4.0-66-generic…'
		linux	/vmlinuz-4.4.0-66-generic root=UUID=2ffbf271-02fa-4d6f-a8e6-dee7a63894e5 ro recovery nomodeset 
		echo	'Chargement du disque mémoire initial…'
		initrd	/initrd.img-4.4.0-66-generic
	}
	menuentry 'Ubuntu, avec Linux 4.4.0-64-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-64-generic-advanced-2ffbf271-02fa-4d6f-a8e6-dee7a63894e5' {
		recordfail
		load_video
		gfxmode $linux_gfx_mode
		insmod gzio
		if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos3'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos3 --hint-efi=hd1,msdos3 --hint-baremetal=ahci1,msdos3  13e83c99-8624-4136-a61d-10e67e670ba3
		else
		  search --no-floppy --fs-uuid --set=root 13e83c99-8624-4136-a61d-10e67e670ba3
		fi
		echo	'Chargement de Linux 4.4.0-64-generic…'
		linux	/vmlinuz-4.4.0-64-generic root=UUID=2ffbf271-02fa-4d6f-a8e6-dee7a63894e5 ro  quiet splash $vt_handoff
		echo	'Chargement du disque mémoire initial…'
		initrd	/initrd.img-4.4.0-64-generic
	}
	menuentry 'Ubuntu, with Linux 4.4.0-64-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-64-generic-recovery-2ffbf271-02fa-4d6f-a8e6-dee7a63894e5' {
		recordfail
		load_video
		insmod gzio
		if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos3'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos3 --hint-efi=hd1,msdos3 --hint-baremetal=ahci1,msdos3  13e83c99-8624-4136-a61d-10e67e670ba3
		else
		  search --no-floppy --fs-uuid --set=root 13e83c99-8624-4136-a61d-10e67e670ba3
		fi
		echo	'Chargement de Linux 4.4.0-64-generic…'
		linux	/vmlinuz-4.4.0-64-generic root=UUID=2ffbf271-02fa-4d6f-a8e6-dee7a63894e5 ro recovery nomodeset 
		echo	'Chargement du disque mémoire initial…'
		initrd	/initrd.img-4.4.0-64-generic
	}
}

### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/20_linux_xen ###

### END /etc/grub.d/20_linux_xen ###

### BEGIN /etc/grub.d/20_memtest86+ ###
menuentry 'Memory test (memtest86+)' {
	insmod part_msdos
	insmod ext2
	set root='hd1,msdos3'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos3 --hint-efi=hd1,msdos3 --hint-baremetal=ahci1,msdos3  13e83c99-8624-4136-a61d-10e67e670ba3
	else
	  search --no-floppy --fs-uuid --set=root 13e83c99-8624-4136-a61d-10e67e670ba3
	fi
	knetbsd	/memtest86+.elf
}
menuentry 'Memory test (memtest86+, serial console 115200)' {
	insmod part_msdos
	insmod ext2
	set root='hd1,msdos3'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos3 --hint-efi=hd1,msdos3 --hint-baremetal=ahci1,msdos3  13e83c99-8624-4136-a61d-10e67e670ba3
	else
	  search --no-floppy --fs-uuid --set=root 13e83c99-8624-4136-a61d-10e67e670ba3
	fi
	linux16	/memtest86+.bin console=ttyS0,115200n8
}
### END /etc/grub.d/20_memtest86+ ###

### BEGIN /etc/grub.d/30_os-prober ###
menuentry 'Start XP Massy GRUB4DOS Essayer-Installer des iso Linux lancees en live (sur /dev/sda1)' --class windows --class os $menuentry_id_option 'osprober-chain-B664A19764A16ABF' {
	insmod part_msdos
	insmod ntfs
	set root='hd0,msdos1'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  B664A19764A16ABF
	else
	  search --no-floppy --fs-uuid --set=root B664A19764A16ABF
	fi
	parttool ${root} hidden-
	drivemap -s (hd0) ${root}
	chainloader +1
}
menuentry 'Ubuntu 16.04.2 LTS (16.04) (sur /dev/sda10)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-simple-ea999dc0-aaad-46bb-84ab-6e510bd28348' {
	insmod part_msdos
	insmod ext2
	set root='hd0,msdos10'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos10 --hint-efi=hd0,msdos10 --hint-baremetal=ahci0,msdos10  ea999dc0-aaad-46bb-84ab-6e510bd28348
	else
	  search --no-floppy --fs-uuid --set=root ea999dc0-aaad-46bb-84ab-6e510bd28348
	fi
	linux /boot/vmlinuz-4.4.0-66-generic root=UUID=ea999dc0-aaad-46bb-84ab-6e510bd28348 ro quiet splash $vt_handoff
	initrd /boot/initrd.img-4.4.0-66-generic
}
submenu 'Options avancées pour Ubuntu 16.04.2 LTS (16.04) (sur /dev/sda10)' $menuentry_id_option 'osprober-gnulinux-advanced-ea999dc0-aaad-46bb-84ab-6e510bd28348' {
	menuentry 'PT-UBUNTU-MATE XENIAL GNU/Linux (sur /dev/sda10)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-66-generic--ea999dc0-aaad-46bb-84ab-6e510bd28348' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos10'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos10 --hint-efi=hd0,msdos10 --hint-baremetal=ahci0,msdos10  ea999dc0-aaad-46bb-84ab-6e510bd28348
		else
		  search --no-floppy --fs-uuid --set=root ea999dc0-aaad-46bb-84ab-6e510bd28348
		fi
		linux /boot/vmlinuz-4.4.0-66-generic root=UUID=ea999dc0-aaad-46bb-84ab-6e510bd28348 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.4.0-66-generic
	}
	menuentry 'PT-UBUNTU-MATE XENIAL GNU/Linux, avec Linux 4.4.0-66-generic (sur /dev/sda10)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-66-generic--ea999dc0-aaad-46bb-84ab-6e510bd28348' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos10'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos10 --hint-efi=hd0,msdos10 --hint-baremetal=ahci0,msdos10  ea999dc0-aaad-46bb-84ab-6e510bd28348
		else
		  search --no-floppy --fs-uuid --set=root ea999dc0-aaad-46bb-84ab-6e510bd28348
		fi
		linux /boot/vmlinuz-4.4.0-66-generic root=UUID=ea999dc0-aaad-46bb-84ab-6e510bd28348 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.4.0-66-generic
	}
	menuentry 'PT-UBUNTU-MATE XENIAL GNU/Linux, with Linux 4.4.0-66-generic (recovery mode) (sur /dev/sda10)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-66-generic-root=UUID=ea999dc0-aaad-46bb-84ab-6e510bd28348 ro recovery nomodeset-ea999dc0-aaad-46bb-84ab-6e510bd28348' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos10'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos10 --hint-efi=hd0,msdos10 --hint-baremetal=ahci0,msdos10  ea999dc0-aaad-46bb-84ab-6e510bd28348
		else
		  search --no-floppy --fs-uuid --set=root ea999dc0-aaad-46bb-84ab-6e510bd28348
		fi
		linux /boot/vmlinuz-4.4.0-66-generic root=UUID=ea999dc0-aaad-46bb-84ab-6e510bd28348 ro recovery nomodeset
		initrd /boot/initrd.img-4.4.0-66-generic
	}
	menuentry 'PT-UBUNTU-MATE XENIAL GNU/Linux, avec Linux 4.4.0-64-generic (sur /dev/sda10)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-64-generic--ea999dc0-aaad-46bb-84ab-6e510bd28348' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos10'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos10 --hint-efi=hd0,msdos10 --hint-baremetal=ahci0,msdos10  ea999dc0-aaad-46bb-84ab-6e510bd28348
		else
		  search --no-floppy --fs-uuid --set=root ea999dc0-aaad-46bb-84ab-6e510bd28348
		fi
		linux /boot/vmlinuz-4.4.0-64-generic root=UUID=ea999dc0-aaad-46bb-84ab-6e510bd28348 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.4.0-64-generic
	}
	menuentry 'PT-UBUNTU-MATE XENIAL GNU/Linux, with Linux 4.4.0-64-generic (recovery mode) (sur /dev/sda10)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-64-generic-root=UUID=ea999dc0-aaad-46bb-84ab-6e510bd28348 ro recovery nomodeset-ea999dc0-aaad-46bb-84ab-6e510bd28348' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos10'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos10 --hint-efi=hd0,msdos10 --hint-baremetal=ahci0,msdos10  ea999dc0-aaad-46bb-84ab-6e510bd28348
		else
		  search --no-floppy --fs-uuid --set=root ea999dc0-aaad-46bb-84ab-6e510bd28348
		fi
		linux /boot/vmlinuz-4.4.0-64-generic root=UUID=ea999dc0-aaad-46bb-84ab-6e510bd28348 ro recovery nomodeset
		initrd /boot/initrd.img-4.4.0-64-generic
	}
}

menuentry 'Ubuntu 12.04.5 LTS (12.04) (sur /dev/sda11)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-simple-aec00812-bb57-4bbe-a5ed-90228e770e48' {
	insmod part_msdos
	insmod ext2
	set root='hd0,msdos11'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos11 --hint-efi=hd0,msdos11 --hint-baremetal=ahci0,msdos11  aec00812-bb57-4bbe-a5ed-90228e770e48
	else
	  search --no-floppy --fs-uuid --set=root aec00812-bb57-4bbe-a5ed-90228e770e48
	fi
	linux /boot/vmlinuz-3.13.0-77-generic root=UUID=aec00812-bb57-4bbe-a5ed-90228e770e48 ro quiet splash $vt_handoff
	initrd /boot/initrd.img-3.13.0-77-generic
}
submenu 'Options avancées pour Ubuntu 12.04.5 LTS (12.04) (sur /dev/sda11)' $menuentry_id_option 'osprober-gnulinux-advanced-aec00812-bb57-4bbe-a5ed-90228e770e48' {
	menuentry 'HYBRYDE FUSION 12.04_PART11, avec Linux 3.13.0-77-generic (sur /dev/sda11)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-77-generic--aec00812-bb57-4bbe-a5ed-90228e770e48' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos11'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos11 --hint-efi=hd0,msdos11 --hint-baremetal=ahci0,msdos11  aec00812-bb57-4bbe-a5ed-90228e770e48
		else
		  search --no-floppy --fs-uuid --set=root aec00812-bb57-4bbe-a5ed-90228e770e48
		fi
		linux /boot/vmlinuz-3.13.0-77-generic root=UUID=aec00812-bb57-4bbe-a5ed-90228e770e48 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-3.13.0-77-generic
	}
	menuentry 'HYBRYDE FUSION 12.04_PART11, with Linux 3.13.0-77-generic (recovery mode) (sur /dev/sda11)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-77-generic-root=UUID=aec00812-bb57-4bbe-a5ed-90228e770e48 ro recovery nomodeset-aec00812-bb57-4bbe-a5ed-90228e770e48' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos11'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos11 --hint-efi=hd0,msdos11 --hint-baremetal=ahci0,msdos11  aec00812-bb57-4bbe-a5ed-90228e770e48
		else
		  search --no-floppy --fs-uuid --set=root aec00812-bb57-4bbe-a5ed-90228e770e48
		fi
		linux /boot/vmlinuz-3.13.0-77-generic root=UUID=aec00812-bb57-4bbe-a5ed-90228e770e48 ro recovery nomodeset
		initrd /boot/initrd.img-3.13.0-77-generic
	}
	menuentry 'HYBRYDE FUSION 12.04_PART11, avec Linux 3.13.0-76-generic (sur /dev/sda11)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-76-generic--aec00812-bb57-4bbe-a5ed-90228e770e48' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos11'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos11 --hint-efi=hd0,msdos11 --hint-baremetal=ahci0,msdos11  aec00812-bb57-4bbe-a5ed-90228e770e48
		else
		  search --no-floppy --fs-uuid --set=root aec00812-bb57-4bbe-a5ed-90228e770e48
		fi
		linux /boot/vmlinuz-3.13.0-76-generic root=UUID=aec00812-bb57-4bbe-a5ed-90228e770e48 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-3.13.0-76-generic
	}
	menuentry 'HYBRYDE FUSION 12.04_PART11, with Linux 3.13.0-76-generic (recovery mode) (sur /dev/sda11)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-76-generic-root=UUID=aec00812-bb57-4bbe-a5ed-90228e770e48 ro recovery nomodeset-aec00812-bb57-4bbe-a5ed-90228e770e48' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos11'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos11 --hint-efi=hd0,msdos11 --hint-baremetal=ahci0,msdos11  aec00812-bb57-4bbe-a5ed-90228e770e48
		else
		  search --no-floppy --fs-uuid --set=root aec00812-bb57-4bbe-a5ed-90228e770e48
		fi
		linux /boot/vmlinuz-3.13.0-76-generic root=UUID=aec00812-bb57-4bbe-a5ed-90228e770e48 ro recovery nomodeset
		initrd /boot/initrd.img-3.13.0-76-generic
	}
}

menuentry 'Ubuntu 16.04.2 LTS (16.04) (sur /dev/sda12)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-simple-2f5e2fc1-c492-408e-956b-1d56a72eb7d3' {
	insmod part_msdos
	insmod ext2
	set root='hd0,msdos12'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos12 --hint-efi=hd0,msdos12 --hint-baremetal=ahci0,msdos12  2f5e2fc1-c492-408e-956b-1d56a72eb7d3
	else
	  search --no-floppy --fs-uuid --set=root 2f5e2fc1-c492-408e-956b-1d56a72eb7d3
	fi
	linux /boot/vmlinuz-4.4.0-64-generic root=UUID=2f5e2fc1-c492-408e-956b-1d56a72eb7d3 ro quiet splash $vt_handoff
	initrd /boot/initrd.img-4.4.0-64-generic
}
submenu 'Options avancées pour Ubuntu 16.04.2 LTS (16.04) (sur /dev/sda12)' $menuentry_id_option 'osprober-gnulinux-advanced-2f5e2fc1-c492-408e-956b-1d56a72eb7d3' {
	menuentry 'PT-VOYAGER-16.04.1.1_Massy GNU/Linux (sur /dev/sda12)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-64-generic--2f5e2fc1-c492-408e-956b-1d56a72eb7d3' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos12'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos12 --hint-efi=hd0,msdos12 --hint-baremetal=ahci0,msdos12  2f5e2fc1-c492-408e-956b-1d56a72eb7d3
		else
		  search --no-floppy --fs-uuid --set=root 2f5e2fc1-c492-408e-956b-1d56a72eb7d3
		fi
		linux /boot/vmlinuz-4.4.0-64-generic root=UUID=2f5e2fc1-c492-408e-956b-1d56a72eb7d3 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.4.0-64-generic
	}
	menuentry 'PT-VOYAGER-16.04.1.1_Massy GNU/Linux, avec Linux 4.4.0-64-generic (sur /dev/sda12)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-64-generic--2f5e2fc1-c492-408e-956b-1d56a72eb7d3' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos12'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos12 --hint-efi=hd0,msdos12 --hint-baremetal=ahci0,msdos12  2f5e2fc1-c492-408e-956b-1d56a72eb7d3
		else
		  search --no-floppy --fs-uuid --set=root 2f5e2fc1-c492-408e-956b-1d56a72eb7d3
		fi
		linux /boot/vmlinuz-4.4.0-64-generic root=UUID=2f5e2fc1-c492-408e-956b-1d56a72eb7d3 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.4.0-64-generic
	}
	menuentry 'PT-VOYAGER-16.04.1.1_Massy GNU/Linux, with Linux 4.4.0-64-generic (upstart) (sur /dev/sda12)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-64-generic--2f5e2fc1-c492-408e-956b-1d56a72eb7d3' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos12'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos12 --hint-efi=hd0,msdos12 --hint-baremetal=ahci0,msdos12  2f5e2fc1-c492-408e-956b-1d56a72eb7d3
		else
		  search --no-floppy --fs-uuid --set=root 2f5e2fc1-c492-408e-956b-1d56a72eb7d3
		fi
		linux /boot/vmlinuz-4.4.0-64-generic root=UUID=2f5e2fc1-c492-408e-956b-1d56a72eb7d3 ro quiet splash $vt_handoff init=/sbin/upstart
		initrd /boot/initrd.img-4.4.0-64-generic
	}
	menuentry 'PT-VOYAGER-16.04.1.1_Massy GNU/Linux, with Linux 4.4.0-64-generic (recovery mode) (sur /dev/sda12)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-64-generic-root=UUID=2f5e2fc1-c492-408e-956b-1d56a72eb7d3 ro recovery nomodeset-2f5e2fc1-c492-408e-956b-1d56a72eb7d3' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos12'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos12 --hint-efi=hd0,msdos12 --hint-baremetal=ahci0,msdos12  2f5e2fc1-c492-408e-956b-1d56a72eb7d3
		else
		  search --no-floppy --fs-uuid --set=root 2f5e2fc1-c492-408e-956b-1d56a72eb7d3
		fi
		linux /boot/vmlinuz-4.4.0-64-generic root=UUID=2f5e2fc1-c492-408e-956b-1d56a72eb7d3 ro recovery nomodeset
		initrd /boot/initrd.img-4.4.0-64-generic
	}
	menuentry 'PT-VOYAGER-16.04.1.1_Massy GNU/Linux, avec Linux 4.4.0-63-generic (sur /dev/sda12)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-63-generic--2f5e2fc1-c492-408e-956b-1d56a72eb7d3' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos12'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos12 --hint-efi=hd0,msdos12 --hint-baremetal=ahci0,msdos12  2f5e2fc1-c492-408e-956b-1d56a72eb7d3
		else
		  search --no-floppy --fs-uuid --set=root 2f5e2fc1-c492-408e-956b-1d56a72eb7d3
		fi
		linux /boot/vmlinuz-4.4.0-63-generic root=UUID=2f5e2fc1-c492-408e-956b-1d56a72eb7d3 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.4.0-63-generic
	}
	menuentry 'PT-VOYAGER-16.04.1.1_Massy GNU/Linux, with Linux 4.4.0-63-generic (upstart) (sur /dev/sda12)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-63-generic--2f5e2fc1-c492-408e-956b-1d56a72eb7d3' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos12'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos12 --hint-efi=hd0,msdos12 --hint-baremetal=ahci0,msdos12  2f5e2fc1-c492-408e-956b-1d56a72eb7d3
		else
		  search --no-floppy --fs-uuid --set=root 2f5e2fc1-c492-408e-956b-1d56a72eb7d3
		fi
		linux /boot/vmlinuz-4.4.0-63-generic root=UUID=2f5e2fc1-c492-408e-956b-1d56a72eb7d3 ro quiet splash $vt_handoff init=/sbin/upstart
		initrd /boot/initrd.img-4.4.0-63-generic
	}
	menuentry 'PT-VOYAGER-16.04.1.1_Massy GNU/Linux, with Linux 4.4.0-63-generic (recovery mode) (sur /dev/sda12)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-63-generic-root=UUID=2f5e2fc1-c492-408e-956b-1d56a72eb7d3 ro recovery nomodeset-2f5e2fc1-c492-408e-956b-1d56a72eb7d3' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos12'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos12 --hint-efi=hd0,msdos12 --hint-baremetal=ahci0,msdos12  2f5e2fc1-c492-408e-956b-1d56a72eb7d3
		else
		  search --no-floppy --fs-uuid --set=root 2f5e2fc1-c492-408e-956b-1d56a72eb7d3
		fi
		linux /boot/vmlinuz-4.4.0-63-generic root=UUID=2f5e2fc1-c492-408e-956b-1d56a72eb7d3 ro recovery nomodeset
		initrd /boot/initrd.img-4.4.0-63-generic
	}
}

menuentry 'Ubuntu 14.04.5 LTS (14.04) (sur /dev/sda13)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-simple-29e5afbd-d25d-4050-816c-e2c8bc7984a2' {
	insmod part_msdos
	insmod ext2
	set root='hd0,msdos13'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos13 --hint-efi=hd0,msdos13 --hint-baremetal=ahci0,msdos13  29e5afbd-d25d-4050-816c-e2c8bc7984a2
	else
	  search --no-floppy --fs-uuid --set=root 29e5afbd-d25d-4050-816c-e2c8bc7984a2
	fi
	linux /boot/vmlinuz-3.13.0-110-generic root=UUID=29e5afbd-d25d-4050-816c-e2c8bc7984a2 ro quiet splash $vt_handoff
	initrd /boot/initrd.img-3.13.0-110-generic
}
submenu 'Options avancées pour Ubuntu 14.04.5 LTS (14.04) (sur /dev/sda13)' $menuentry_id_option 'osprober-gnulinux-advanced-29e5afbd-d25d-4050-816c-e2c8bc7984a2' {
	menuentry 'PT-HYBRYDE FUSION 14.04_Massy GNU/Linux (sur /dev/sda13)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-110-generic--29e5afbd-d25d-4050-816c-e2c8bc7984a2' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos13'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos13 --hint-efi=hd0,msdos13 --hint-baremetal=ahci0,msdos13  29e5afbd-d25d-4050-816c-e2c8bc7984a2
		else
		  search --no-floppy --fs-uuid --set=root 29e5afbd-d25d-4050-816c-e2c8bc7984a2
		fi
		linux /boot/vmlinuz-3.13.0-110-generic root=UUID=29e5afbd-d25d-4050-816c-e2c8bc7984a2 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-3.13.0-110-generic
	}
	menuentry 'PT-HYBRYDE FUSION 14.04_Massy GNU/Linux, avec Linux 3.13.0-110-generic (sur /dev/sda13)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-110-generic--29e5afbd-d25d-4050-816c-e2c8bc7984a2' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos13'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos13 --hint-efi=hd0,msdos13 --hint-baremetal=ahci0,msdos13  29e5afbd-d25d-4050-816c-e2c8bc7984a2
		else
		  search --no-floppy --fs-uuid --set=root 29e5afbd-d25d-4050-816c-e2c8bc7984a2
		fi
		linux /boot/vmlinuz-3.13.0-110-generic root=UUID=29e5afbd-d25d-4050-816c-e2c8bc7984a2 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-3.13.0-110-generic
	}
	menuentry 'PT-HYBRYDE FUSION 14.04_Massy GNU/Linux, with Linux 3.13.0-110-generic (recovery mode) (sur /dev/sda13)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-110-generic-root=UUID=29e5afbd-d25d-4050-816c-e2c8bc7984a2 ro recovery nomodeset-29e5afbd-d25d-4050-816c-e2c8bc7984a2' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos13'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos13 --hint-efi=hd0,msdos13 --hint-baremetal=ahci0,msdos13  29e5afbd-d25d-4050-816c-e2c8bc7984a2
		else
		  search --no-floppy --fs-uuid --set=root 29e5afbd-d25d-4050-816c-e2c8bc7984a2
		fi
		linux /boot/vmlinuz-3.13.0-110-generic root=UUID=29e5afbd-d25d-4050-816c-e2c8bc7984a2 ro recovery nomodeset
		initrd /boot/initrd.img-3.13.0-110-generic
	}
	menuentry 'PT-HYBRYDE FUSION 14.04_Massy GNU/Linux, avec Linux 3.13.0-109-generic (sur /dev/sda13)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-109-generic--29e5afbd-d25d-4050-816c-e2c8bc7984a2' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos13'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos13 --hint-efi=hd0,msdos13 --hint-baremetal=ahci0,msdos13  29e5afbd-d25d-4050-816c-e2c8bc7984a2
		else
		  search --no-floppy --fs-uuid --set=root 29e5afbd-d25d-4050-816c-e2c8bc7984a2
		fi
		linux /boot/vmlinuz-3.13.0-109-generic root=UUID=29e5afbd-d25d-4050-816c-e2c8bc7984a2 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-3.13.0-109-generic
	}
	menuentry 'PT-HYBRYDE FUSION 14.04_Massy GNU/Linux, with Linux 3.13.0-109-generic (recovery mode) (sur /dev/sda13)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-109-generic-root=UUID=29e5afbd-d25d-4050-816c-e2c8bc7984a2 ro recovery nomodeset-29e5afbd-d25d-4050-816c-e2c8bc7984a2' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos13'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos13 --hint-efi=hd0,msdos13 --hint-baremetal=ahci0,msdos13  29e5afbd-d25d-4050-816c-e2c8bc7984a2
		else
		  search --no-floppy --fs-uuid --set=root 29e5afbd-d25d-4050-816c-e2c8bc7984a2
		fi
		linux /boot/vmlinuz-3.13.0-109-generic root=UUID=29e5afbd-d25d-4050-816c-e2c8bc7984a2 ro recovery nomodeset
		initrd /boot/initrd.img-3.13.0-109-generic
	}
}

menuentry 'Ubuntu 16.04.2 LTS (16.04) (sur /dev/sda14)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-simple-75df6dda-088e-42e0-bb24-0558de998d09' {
	insmod part_msdos
	insmod ext2
	set root='hd0,msdos14'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos14 --hint-efi=hd0,msdos14 --hint-baremetal=ahci0,msdos14  75df6dda-088e-42e0-bb24-0558de998d09
	else
	  search --no-floppy --fs-uuid --set=root 75df6dda-088e-42e0-bb24-0558de998d09
	fi
	linux /boot/vmlinuz-4.4.0-64-generic root=UUID=75df6dda-088e-42e0-bb24-0558de998d09 ro quiet splash $vt_handoff
	initrd /boot/initrd.img-4.4.0-64-generic
}
submenu 'Options avancées pour Ubuntu 16.04.2 LTS (16.04) (sur /dev/sda14)' $menuentry_id_option 'osprober-gnulinux-advanced-75df6dda-088e-42e0-bb24-0558de998d09' {
	menuentry 'PT-Xubuntu-16.04.1 GNU/Linux (sur /dev/sda14)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-64-generic--75df6dda-088e-42e0-bb24-0558de998d09' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos14'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos14 --hint-efi=hd0,msdos14 --hint-baremetal=ahci0,msdos14  75df6dda-088e-42e0-bb24-0558de998d09
		else
		  search --no-floppy --fs-uuid --set=root 75df6dda-088e-42e0-bb24-0558de998d09
		fi
		linux /boot/vmlinuz-4.4.0-64-generic root=UUID=75df6dda-088e-42e0-bb24-0558de998d09 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.4.0-64-generic
	}
	menuentry 'PT-Xubuntu-16.04.1 GNU/Linux, avec Linux 4.4.0-64-generic (sur /dev/sda14)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-64-generic--75df6dda-088e-42e0-bb24-0558de998d09' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos14'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos14 --hint-efi=hd0,msdos14 --hint-baremetal=ahci0,msdos14  75df6dda-088e-42e0-bb24-0558de998d09
		else
		  search --no-floppy --fs-uuid --set=root 75df6dda-088e-42e0-bb24-0558de998d09
		fi
		linux /boot/vmlinuz-4.4.0-64-generic root=UUID=75df6dda-088e-42e0-bb24-0558de998d09 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.4.0-64-generic
	}
	menuentry 'PT-Xubuntu-16.04.1 GNU/Linux, with Linux 4.4.0-64-generic (upstart) (sur /dev/sda14)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-64-generic--75df6dda-088e-42e0-bb24-0558de998d09' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos14'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos14 --hint-efi=hd0,msdos14 --hint-baremetal=ahci0,msdos14  75df6dda-088e-42e0-bb24-0558de998d09
		else
		  search --no-floppy --fs-uuid --set=root 75df6dda-088e-42e0-bb24-0558de998d09
		fi
		linux /boot/vmlinuz-4.4.0-64-generic root=UUID=75df6dda-088e-42e0-bb24-0558de998d09 ro quiet splash $vt_handoff init=/sbin/upstart
		initrd /boot/initrd.img-4.4.0-64-generic
	}
	menuentry 'PT-Xubuntu-16.04.1 GNU/Linux, with Linux 4.4.0-64-generic (recovery mode) (sur /dev/sda14)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-64-generic-root=UUID=75df6dda-088e-42e0-bb24-0558de998d09 ro recovery nomodeset-75df6dda-088e-42e0-bb24-0558de998d09' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos14'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos14 --hint-efi=hd0,msdos14 --hint-baremetal=ahci0,msdos14  75df6dda-088e-42e0-bb24-0558de998d09
		else
		  search --no-floppy --fs-uuid --set=root 75df6dda-088e-42e0-bb24-0558de998d09
		fi
		linux /boot/vmlinuz-4.4.0-64-generic root=UUID=75df6dda-088e-42e0-bb24-0558de998d09 ro recovery nomodeset
		initrd /boot/initrd.img-4.4.0-64-generic
	}
	menuentry 'PT-Xubuntu-16.04.1 GNU/Linux, avec Linux 4.4.0-63-generic (sur /dev/sda14)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-63-generic--75df6dda-088e-42e0-bb24-0558de998d09' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos14'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos14 --hint-efi=hd0,msdos14 --hint-baremetal=ahci0,msdos14  75df6dda-088e-42e0-bb24-0558de998d09
		else
		  search --no-floppy --fs-uuid --set=root 75df6dda-088e-42e0-bb24-0558de998d09
		fi
		linux /boot/vmlinuz-4.4.0-63-generic root=UUID=75df6dda-088e-42e0-bb24-0558de998d09 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.4.0-63-generic
	}
	menuentry 'PT-Xubuntu-16.04.1 GNU/Linux, with Linux 4.4.0-63-generic (upstart) (sur /dev/sda14)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-63-generic--75df6dda-088e-42e0-bb24-0558de998d09' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos14'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos14 --hint-efi=hd0,msdos14 --hint-baremetal=ahci0,msdos14  75df6dda-088e-42e0-bb24-0558de998d09
		else
		  search --no-floppy --fs-uuid --set=root 75df6dda-088e-42e0-bb24-0558de998d09
		fi
		linux /boot/vmlinuz-4.4.0-63-generic root=UUID=75df6dda-088e-42e0-bb24-0558de998d09 ro quiet splash $vt_handoff init=/sbin/upstart
		initrd /boot/initrd.img-4.4.0-63-generic
	}
	menuentry 'PT-Xubuntu-16.04.1 GNU/Linux, with Linux 4.4.0-63-generic (recovery mode) (sur /dev/sda14)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-63-generic-root=UUID=75df6dda-088e-42e0-bb24-0558de998d09 ro recovery nomodeset-75df6dda-088e-42e0-bb24-0558de998d09' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos14'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos14 --hint-efi=hd0,msdos14 --hint-baremetal=ahci0,msdos14  75df6dda-088e-42e0-bb24-0558de998d09
		else
		  search --no-floppy --fs-uuid --set=root 75df6dda-088e-42e0-bb24-0558de998d09
		fi
		linux /boot/vmlinuz-4.4.0-63-generic root=UUID=75df6dda-088e-42e0-bb24-0558de998d09 ro recovery nomodeset
		initrd /boot/initrd.img-4.4.0-63-generic
	}
}

menuentry 'Ubuntu 14.04.5 LTS (14.04) (sur /dev/sda7)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-simple-5ed81f97-295e-4246-8aa1-7ae54d6c9e7c' {
	insmod part_msdos
	insmod ext2
	set root='hd0,msdos7'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos7 --hint-efi=hd0,msdos7 --hint-baremetal=ahci0,msdos7  5ed81f97-295e-4246-8aa1-7ae54d6c9e7c
	else
	  search --no-floppy --fs-uuid --set=root 5ed81f97-295e-4246-8aa1-7ae54d6c9e7c
	fi
	linux /boot/vmlinuz-3.13.0-110-generic root=UUID=5ed81f97-295e-4246-8aa1-7ae54d6c9e7c ro quiet splash $vt_handoff
	initrd /boot/initrd.img-3.13.0-110-generic
}
submenu 'Options avancées pour Ubuntu 14.04.5 LTS (14.04) (sur /dev/sda7)' $menuentry_id_option 'osprober-gnulinux-advanced-5ed81f97-295e-4246-8aa1-7ae54d6c9e7c' {
	menuentry 'PT-Xubuntu-14.04 GNU/Linux (sur /dev/sda7)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-110-generic--5ed81f97-295e-4246-8aa1-7ae54d6c9e7c' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos7'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos7 --hint-efi=hd0,msdos7 --hint-baremetal=ahci0,msdos7  5ed81f97-295e-4246-8aa1-7ae54d6c9e7c
		else
		  search --no-floppy --fs-uuid --set=root 5ed81f97-295e-4246-8aa1-7ae54d6c9e7c
		fi
		linux /boot/vmlinuz-3.13.0-110-generic root=UUID=5ed81f97-295e-4246-8aa1-7ae54d6c9e7c ro quiet splash $vt_handoff
		initrd /boot/initrd.img-3.13.0-110-generic
	}
	menuentry 'PT-Xubuntu-14.04 GNU/Linux, avec Linux 3.13.0-110-generic (sur /dev/sda7)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-110-generic--5ed81f97-295e-4246-8aa1-7ae54d6c9e7c' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos7'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos7 --hint-efi=hd0,msdos7 --hint-baremetal=ahci0,msdos7  5ed81f97-295e-4246-8aa1-7ae54d6c9e7c
		else
		  search --no-floppy --fs-uuid --set=root 5ed81f97-295e-4246-8aa1-7ae54d6c9e7c
		fi
		linux /boot/vmlinuz-3.13.0-110-generic root=UUID=5ed81f97-295e-4246-8aa1-7ae54d6c9e7c ro quiet splash $vt_handoff
		initrd /boot/initrd.img-3.13.0-110-generic
	}
	menuentry 'PT-Xubuntu-14.04 GNU/Linux, with Linux 3.13.0-110-generic (recovery mode) (sur /dev/sda7)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-110-generic-root=UUID=5ed81f97-295e-4246-8aa1-7ae54d6c9e7c ro recovery nomodeset-5ed81f97-295e-4246-8aa1-7ae54d6c9e7c' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos7'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos7 --hint-efi=hd0,msdos7 --hint-baremetal=ahci0,msdos7  5ed81f97-295e-4246-8aa1-7ae54d6c9e7c
		else
		  search --no-floppy --fs-uuid --set=root 5ed81f97-295e-4246-8aa1-7ae54d6c9e7c
		fi
		linux /boot/vmlinuz-3.13.0-110-generic root=UUID=5ed81f97-295e-4246-8aa1-7ae54d6c9e7c ro recovery nomodeset
		initrd /boot/initrd.img-3.13.0-110-generic
	}
	menuentry 'PT-Xubuntu-14.04 GNU/Linux, avec Linux 3.13.0-109-generic (sur /dev/sda7)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-109-generic--5ed81f97-295e-4246-8aa1-7ae54d6c9e7c' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos7'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos7 --hint-efi=hd0,msdos7 --hint-baremetal=ahci0,msdos7  5ed81f97-295e-4246-8aa1-7ae54d6c9e7c
		else
		  search --no-floppy --fs-uuid --set=root 5ed81f97-295e-4246-8aa1-7ae54d6c9e7c
		fi
		linux /boot/vmlinuz-3.13.0-109-generic root=UUID=5ed81f97-295e-4246-8aa1-7ae54d6c9e7c ro quiet splash $vt_handoff
		initrd /boot/initrd.img-3.13.0-109-generic
	}
	menuentry 'PT-Xubuntu-14.04 GNU/Linux, with Linux 3.13.0-109-generic (recovery mode) (sur /dev/sda7)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-109-generic-root=UUID=5ed81f97-295e-4246-8aa1-7ae54d6c9e7c ro recovery nomodeset-5ed81f97-295e-4246-8aa1-7ae54d6c9e7c' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos7'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos7 --hint-efi=hd0,msdos7 --hint-baremetal=ahci0,msdos7  5ed81f97-295e-4246-8aa1-7ae54d6c9e7c
		else
		  search --no-floppy --fs-uuid --set=root 5ed81f97-295e-4246-8aa1-7ae54d6c9e7c
		fi
		linux /boot/vmlinuz-3.13.0-109-generic root=UUID=5ed81f97-295e-4246-8aa1-7ae54d6c9e7c ro recovery nomodeset
		initrd /boot/initrd.img-3.13.0-109-generic
	}
}

menuentry 'Ubuntu 14.04.5 LTS (14.04) (sur /dev/sdb1)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-simple-1aced9e1-d845-46bb-a6e2-448666be4a21' {
	insmod part_msdos
	insmod ext2
	set root='hd1,msdos1'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1  1aced9e1-d845-46bb-a6e2-448666be4a21
	else
	  search --no-floppy --fs-uuid --set=root 1aced9e1-d845-46bb-a6e2-448666be4a21
	fi
	linux /boot/vmlinuz-3.13.0-110-generic root=UUID=1aced9e1-d845-46bb-a6e2-448666be4a21 ro quiet splash $vt_handoff
	initrd /boot/initrd.img-3.13.0-110-generic
}
submenu 'Options avancées pour Ubuntu 14.04.5 LTS (14.04) (sur /dev/sdb1)' $menuentry_id_option 'osprober-gnulinux-advanced-1aced9e1-d845-46bb-a6e2-448666be4a21' {
	menuentry 'PT-HYBRYDE FUSION 14.04_USB-Verbatim GNU/Linux (sur /dev/sdb1)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-110-generic--1aced9e1-d845-46bb-a6e2-448666be4a21' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos1'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1  1aced9e1-d845-46bb-a6e2-448666be4a21
		else
		  search --no-floppy --fs-uuid --set=root 1aced9e1-d845-46bb-a6e2-448666be4a21
		fi
		linux /boot/vmlinuz-3.13.0-110-generic root=UUID=1aced9e1-d845-46bb-a6e2-448666be4a21 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-3.13.0-110-generic
	}
	menuentry 'PT-HYBRYDE FUSION 14.04_USB-Verbatim GNU/Linux, avec Linux 3.13.0-110-generic (sur /dev/sdb1)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-110-generic--1aced9e1-d845-46bb-a6e2-448666be4a21' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos1'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1  1aced9e1-d845-46bb-a6e2-448666be4a21
		else
		  search --no-floppy --fs-uuid --set=root 1aced9e1-d845-46bb-a6e2-448666be4a21
		fi
		linux /boot/vmlinuz-3.13.0-110-generic root=UUID=1aced9e1-d845-46bb-a6e2-448666be4a21 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-3.13.0-110-generic
	}
	menuentry 'PT-HYBRYDE FUSION 14.04_USB-Verbatim GNU/Linux, with Linux 3.13.0-110-generic (recovery mode) (sur /dev/sdb1)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-110-generic-root=UUID=1aced9e1-d845-46bb-a6e2-448666be4a21 ro recovery nomodeset-1aced9e1-d845-46bb-a6e2-448666be4a21' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos1'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1  1aced9e1-d845-46bb-a6e2-448666be4a21
		else
		  search --no-floppy --fs-uuid --set=root 1aced9e1-d845-46bb-a6e2-448666be4a21
		fi
		linux /boot/vmlinuz-3.13.0-110-generic root=UUID=1aced9e1-d845-46bb-a6e2-448666be4a21 ro recovery nomodeset
		initrd /boot/initrd.img-3.13.0-110-generic
	}
	menuentry 'PT-HYBRYDE FUSION 14.04_USB-Verbatim GNU/Linux, avec Linux 3.13.0-109-generic (sur /dev/sdb1)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-109-generic--1aced9e1-d845-46bb-a6e2-448666be4a21' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos1'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1  1aced9e1-d845-46bb-a6e2-448666be4a21
		else
		  search --no-floppy --fs-uuid --set=root 1aced9e1-d845-46bb-a6e2-448666be4a21
		fi
		linux /boot/vmlinuz-3.13.0-109-generic root=UUID=1aced9e1-d845-46bb-a6e2-448666be4a21 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-3.13.0-109-generic
	}
	menuentry 'PT-HYBRYDE FUSION 14.04_USB-Verbatim GNU/Linux, with Linux 3.13.0-109-generic (recovery mode) (sur /dev/sdb1)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-109-generic-root=UUID=1aced9e1-d845-46bb-a6e2-448666be4a21 ro recovery nomodeset-1aced9e1-d845-46bb-a6e2-448666be4a21' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos1'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1  1aced9e1-d845-46bb-a6e2-448666be4a21
		else
		  search --no-floppy --fs-uuid --set=root 1aced9e1-d845-46bb-a6e2-448666be4a21
		fi
		linux /boot/vmlinuz-3.13.0-109-generic root=UUID=1aced9e1-d845-46bb-a6e2-448666be4a21 ro recovery nomodeset
		initrd /boot/initrd.img-3.13.0-109-generic
	}
	menuentry 'Ubuntu 14.04.5 LTS (14.04) (sur /dev/sda13) (sur /dev/sdb1)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-110-generic--1aced9e1-d845-46bb-a6e2-448666be4a21' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos1'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1  1aced9e1-d845-46bb-a6e2-448666be4a21
		else
		  search --no-floppy --fs-uuid --set=root 1aced9e1-d845-46bb-a6e2-448666be4a21
		fi
		linux /boot/vmlinuz-3.13.0-110-generic root=UUID=29e5afbd-d25d-4050-816c-e2c8bc7984a2 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-3.13.0-110-generic
	}
	menuentry 'PT-HYBRYDE FUSION 14.04_Massy GNU/Linux (sur /dev/sda13) (sur /dev/sdb1)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-110-generic--1aced9e1-d845-46bb-a6e2-448666be4a21' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos1'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1  1aced9e1-d845-46bb-a6e2-448666be4a21
		else
		  search --no-floppy --fs-uuid --set=root 1aced9e1-d845-46bb-a6e2-448666be4a21
		fi
		linux /boot/vmlinuz-3.13.0-110-generic root=UUID=29e5afbd-d25d-4050-816c-e2c8bc7984a2 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-3.13.0-110-generic
	}
	menuentry 'PT-HYBRYDE FUSION 14.04_Massy GNU/Linux, avec Linux 3.13.0-110-generic (sur /dev/sda13) (sur /dev/sdb1)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-110-generic--1aced9e1-d845-46bb-a6e2-448666be4a21' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos1'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1  1aced9e1-d845-46bb-a6e2-448666be4a21
		else
		  search --no-floppy --fs-uuid --set=root 1aced9e1-d845-46bb-a6e2-448666be4a21
		fi
		linux /boot/vmlinuz-3.13.0-110-generic root=UUID=29e5afbd-d25d-4050-816c-e2c8bc7984a2 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-3.13.0-110-generic
	}
	menuentry 'PT-HYBRYDE FUSION 14.04_Massy GNU/Linux, with Linux 3.13.0-110-generic (recovery mode) (sur /dev/sda13) (sur /dev/sdb1)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-110-generic-root=UUID=29e5afbd-d25d-4050-816c-e2c8bc7984a2 ro recovery nomodeset-1aced9e1-d845-46bb-a6e2-448666be4a21' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos1'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1  1aced9e1-d845-46bb-a6e2-448666be4a21
		else
		  search --no-floppy --fs-uuid --set=root 1aced9e1-d845-46bb-a6e2-448666be4a21
		fi
		linux /boot/vmlinuz-3.13.0-110-generic root=UUID=29e5afbd-d25d-4050-816c-e2c8bc7984a2 ro recovery nomodeset
		initrd /boot/initrd.img-3.13.0-110-generic
	}
	menuentry 'PT-HYBRYDE FUSION 14.04_Massy GNU/Linux, avec Linux 3.13.0-109-generic (sur /dev/sda13) (sur /dev/sdb1)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-109-generic--1aced9e1-d845-46bb-a6e2-448666be4a21' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos1'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1  1aced9e1-d845-46bb-a6e2-448666be4a21
		else
		  search --no-floppy --fs-uuid --set=root 1aced9e1-d845-46bb-a6e2-448666be4a21
		fi
		linux /boot/vmlinuz-3.13.0-109-generic root=UUID=29e5afbd-d25d-4050-816c-e2c8bc7984a2 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-3.13.0-109-generic
	}
	menuentry 'PT-HYBRYDE FUSION 14.04_Massy GNU/Linux, with Linux 3.13.0-109-generic (recovery mode) (sur /dev/sda13) (sur /dev/sdb1)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-109-generic-root=UUID=29e5afbd-d25d-4050-816c-e2c8bc7984a2 ro recovery nomodeset-1aced9e1-d845-46bb-a6e2-448666be4a21' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos1'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1  1aced9e1-d845-46bb-a6e2-448666be4a21
		else
		  search --no-floppy --fs-uuid --set=root 1aced9e1-d845-46bb-a6e2-448666be4a21
		fi
		linux /boot/vmlinuz-3.13.0-109-generic root=UUID=29e5afbd-d25d-4050-816c-e2c8bc7984a2 ro recovery nomodeset
		initrd /boot/initrd.img-3.13.0-109-generic
	}
	menuentry 'Ubuntu 14.04.5 LTS (14.04) (sur /dev/sda7) (sur /dev/sdb1)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-110-generic--1aced9e1-d845-46bb-a6e2-448666be4a21' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos1'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1  1aced9e1-d845-46bb-a6e2-448666be4a21
		else
		  search --no-floppy --fs-uuid --set=root 1aced9e1-d845-46bb-a6e2-448666be4a21
		fi
		linux /boot/vmlinuz-3.13.0-110-generic root=UUID=5ed81f97-295e-4246-8aa1-7ae54d6c9e7c ro quiet splash $vt_handoff
		initrd /boot/initrd.img-3.13.0-110-generic
	}
	menuentry 'PT-Xubuntu-14.04 GNU/Linux (sur /dev/sda7) (sur /dev/sdb1)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-110-generic--1aced9e1-d845-46bb-a6e2-448666be4a21' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos1'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1  1aced9e1-d845-46bb-a6e2-448666be4a21
		else
		  search --no-floppy --fs-uuid --set=root 1aced9e1-d845-46bb-a6e2-448666be4a21
		fi
		linux /boot/vmlinuz-3.13.0-110-generic root=UUID=5ed81f97-295e-4246-8aa1-7ae54d6c9e7c ro quiet splash $vt_handoff
		initrd /boot/initrd.img-3.13.0-110-generic
	}
	menuentry 'PT-Xubuntu-14.04 GNU/Linux, avec Linux 3.13.0-110-generic (sur /dev/sda7) (sur /dev/sdb1)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-110-generic--1aced9e1-d845-46bb-a6e2-448666be4a21' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos1'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1  1aced9e1-d845-46bb-a6e2-448666be4a21
		else
		  search --no-floppy --fs-uuid --set=root 1aced9e1-d845-46bb-a6e2-448666be4a21
		fi
		linux /boot/vmlinuz-3.13.0-110-generic root=UUID=5ed81f97-295e-4246-8aa1-7ae54d6c9e7c ro quiet splash $vt_handoff
		initrd /boot/initrd.img-3.13.0-110-generic
	}
	menuentry 'PT-Xubuntu-14.04 GNU/Linux, with Linux 3.13.0-110-generic (recovery mode) (sur /dev/sda7) (sur /dev/sdb1)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-110-generic-root=UUID=5ed81f97-295e-4246-8aa1-7ae54d6c9e7c ro recovery nomodeset-1aced9e1-d845-46bb-a6e2-448666be4a21' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos1'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1  1aced9e1-d845-46bb-a6e2-448666be4a21
		else
		  search --no-floppy --fs-uuid --set=root 1aced9e1-d845-46bb-a6e2-448666be4a21
		fi
		linux /boot/vmlinuz-3.13.0-110-generic root=UUID=5ed81f97-295e-4246-8aa1-7ae54d6c9e7c ro recovery nomodeset
		initrd /boot/initrd.img-3.13.0-110-generic
	}
	menuentry 'PT-Xubuntu-14.04 GNU/Linux, avec Linux 3.13.0-109-generic (sur /dev/sda7) (sur /dev/sdb1)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-109-generic--1aced9e1-d845-46bb-a6e2-448666be4a21' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos1'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1  1aced9e1-d845-46bb-a6e2-448666be4a21
		else
		  search --no-floppy --fs-uuid --set=root 1aced9e1-d845-46bb-a6e2-448666be4a21
		fi
		linux /boot/vmlinuz-3.13.0-109-generic root=UUID=5ed81f97-295e-4246-8aa1-7ae54d6c9e7c ro quiet splash $vt_handoff
		initrd /boot/initrd.img-3.13.0-109-generic
	}
	menuentry 'PT-Xubuntu-14.04 GNU/Linux, with Linux 3.13.0-109-generic (recovery mode) (sur /dev/sda7) (sur /dev/sdb1)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-3.13.0-109-generic-root=UUID=5ed81f97-295e-4246-8aa1-7ae54d6c9e7c ro recovery nomodeset-1aced9e1-d845-46bb-a6e2-448666be4a21' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos1'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1  1aced9e1-d845-46bb-a6e2-448666be4a21
		else
		  search --no-floppy --fs-uuid --set=root 1aced9e1-d845-46bb-a6e2-448666be4a21
		fi
		linux /boot/vmlinuz-3.13.0-109-generic root=UUID=5ed81f97-295e-4246-8aa1-7ae54d6c9e7c ro recovery nomodeset
		initrd /boot/initrd.img-3.13.0-109-generic
	}
}

set timeout_style=menu
if [ "${timeout}" = 0 ]; then
  set timeout=10
fi
### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/30_uefi-firmware ###
### END /etc/grub.d/30_uefi-firmware ###

### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###

### BEGIN /etc/grub.d/41_custom ###
if [ -f  ${config_directory}/custom.cfg ]; then
  source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f  $prefix/custom.cfg ]; then
  source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###

Dans ce fichier j'ai bien la ligne;

### BEGIN /etc/grub.d/10_linux ###

Çà coince encore à cet endroit là, retour terminal de lancement du script  modif_grub_V35 .

bernard@bernard-System-Product-Name:~$ sudo bash modif_grub_V35.sh
[sudo] Mot de passe de bernard : 
lancement du programme ./recup_fstab_V2
rm: impossible de supprimer 'DevSd_UBoot_UPart.txt': Aucun fichier ou dossier de ce type
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
/dev/sda1: LABEL="XP-MASSY" UUID="B664A19764A16ABF" TYPE="ntfs" PARTUUID="00000001-01"
/dev/sda5: LABEL="DONNEES_WD" UUID="3336D5F95125508C" TYPE="ntfs" PARTUUID="00000001-05"
/dev/sda6: UUID="0b82c97d-d077-4191-ae87-de7f2787ba44" TYPE="swap" PARTUUID="00000001-06"
/dev/sda7: LABEL="xubuntu-14-sys-m" UUID="5ed81f97-295e-4246-8aa1-7ae54d6c9e7c" TYPE="ext4" PARTUUID="00000001-07"
/dev/sda8: LABEL="xubuntu-14-hom-m" UUID="08201295-445e-4de7-a95b-a56990a0a9dd" TYPE="ext4" PARTUUID="00000001-08"
/dev/sda9: LABEL="fusion-12-hom-m" UUID="878a2332-9b22-4ca6-b125-d09c3821cf80" TYPE="ext4" PARTUUID="00000001-09"
/dev/sda10: LABEL="ubu-mate-16.04-m" UUID="ea999dc0-aaad-46bb-84ab-6e510bd28348" TYPE="ext4" PARTUUID="00000001-0a"
/dev/sda11: LABEL="fusion-12-sys-m" UUID="aec00812-bb57-4bbe-a5ed-90228e770e48" TYPE="ext4" PARTUUID="00000001-0b"
/dev/sda12: LABEL="voyager16.04.1.1" UUID="2f5e2fc1-c492-408e-956b-1d56a72eb7d3" TYPE="ext4" PARTUUID="00000001-0c"
/dev/sda13: LABEL="fusion-14-massy" UUID="29e5afbd-d25d-4050-816c-e2c8bc7984a2" TYPE="ext4" PARTUUID="00000001-0d"
/dev/sda14: LABEL="xubuntu-16-sys-m" UUID="75df6dda-088e-42e0-bb24-0558de998d09" TYPE="ext4" PARTUUID="00000001-0e"
/dev/sdb1: LABEL="hyb-systemback" UUID="1aced9e1-d845-46bb-a6e2-448666be4a21" TYPE="ext4" PARTUUID="00006711-01"
/dev/sdb2: UUID="5147bb57-b517-4a46-9344-c690575331e1" TYPE="swap" PARTUUID="00006711-02"
/dev/sdb3: LABEL="SB@boot" UUID="13e83c99-8624-4136-a61d-10e67e670ba3" TYPE="ext4" PARTUUID="00006711-03"
/dev/sdb4: LABEL="SB@" UUID="2ffbf271-02fa-4d6f-a8e6-dee7a63894e5" TYPE="ext4" PARTUUID="00006711-04"
rm: impossible de supprimer 'tmp_u_l.txt': Aucun fichier ou dossier de ce type

 0 /dev/sda1  B664A19764A16ABF                     LABEL XP-MASSY                                      TYPE : ntfs      
 1 /dev/sda5  3336D5F95125508C                     LABEL DONNEES_WD                                    TYPE : ntfs      
 2 /dev/sda6  0b82c97d-d077-4191-ae87-de7f2787ba44 LABEL _                                             TYPE : swap      
 3 /dev/sda7  5ed81f97-295e-4246-8aa1-7ae54d6c9e7c LABEL xubuntu-14-sys-m                              TYPE : ext4      
 4 /dev/sda8  08201295-445e-4de7-a95b-a56990a0a9dd LABEL xubuntu-14-hom-m                              TYPE : ext4      
 5 /dev/sda9  878a2332-9b22-4ca6-b125-d09c3821cf80 LABEL fusion-12-hom-m                               TYPE : ext4      
 6 /dev/sda10 ea999dc0-aaad-46bb-84ab-6e510bd28348 LABEL ubu-mate-16.04-m                              TYPE : ext4      
 7 /dev/sda11 aec00812-bb57-4bbe-a5ed-90228e770e48 LABEL fusion-12-sys-m                               TYPE : ext4      
 8 /dev/sda12 2f5e2fc1-c492-408e-956b-1d56a72eb7d3 LABEL voyager16.04.1.1                              TYPE : ext4      
 9 /dev/sda13 29e5afbd-d25d-4050-816c-e2c8bc7984a2 LABEL fusion-14-massy                               TYPE : ext4      
10 /dev/sda14 75df6dda-088e-42e0-bb24-0558de998d09 LABEL xubuntu-16-sys-m                              TYPE : ext4      
11 /dev/sdb1  1aced9e1-d845-46bb-a6e2-448666be4a21 LABEL hyb-systemback       sur /media/bernard/hyb-systemback TYPE : ext4      
12 /dev/sdb2  5147bb57-b517-4a46-9344-c690575331e1 LABEL _                                             TYPE : swap      
13 /dev/sdb3  13e83c99-8624-4136-a61d-10e67e670ba3 LABEL SB@boot              sur /boot                TYPE : ext4      
14 /dev/sdb4  2ffbf271-02fa-4d6f-a8e6-dee7a63894e5 LABEL SB@                  sur /                    TYPE : ext4      
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
OK je continue
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
0 /dev/sda1 1
1 /dev/sda5 1
2 /dev/sda6 1
3 /dev/sda7 1
4 /dev/sda8 1
5 /dev/sda9 1
6 /dev/sda10 1
7 /dev/sda11 1
8 /dev/sda12 1
9 /dev/sda13 1
10 /dev/sda14 1
11 /dev/sdb1 0
/media/bernard/hyb-systemback/etc/fstab
12 /dev/sdb2 1
13 /dev/sdb3 0
/boot/etc/fstab
14 /dev/sdb4 0
/etc/fstab
fonction ecrit_uuid1_uuid2 UUID=2ffbf271-02fa-4d6f-a8e6-dee7a63894e5 UUID=13e83c99-8624-4136-a61d-10e67e670ba3
fin de fonction ecrit_uuid1 uuid2 =1=>2ffbf271-02fa-4d6f-a8e6-dee7a63894e5<=== =2=>13e83c99-8624-4136-a61d-10e67e670ba3<===
réperoire /mnt présent
création du répertoire /mnt/jpb-2017:03:16-22:18:00 pour monter les partitions
0 /dev/sda1
1 /dev/sda5
2 /dev/sda6
3 /dev/sda7

traitement de 3 /dev/sda7 (ext4)
montage de       /dev/sda7 sur /mnt/jpb-2017:03:16-22:18:00
code de retour montage de /dev/sda7 sur /mnt/jpb-2017:03:16-22:18:00 : 0
boucle 0  : /dev/sda7 code de retour de umount 0

boucle 0 : /dev/sda7 démontage effectué (code retour 0)
total 8
309860 4 drwxr-xr-x 2 root root 4096 mars  16 22:18 .
260610 4 drwxr-xr-x 3 root root 4096 mars  16 22:18 ..
4 /dev/sda8

traitement de 4 /dev/sda8 (ext4)
montage de       /dev/sda8 sur /mnt/jpb-2017:03:16-22:18:00
code de retour montage de /dev/sda8 sur /mnt/jpb-2017:03:16-22:18:00 : 0
boucle 0  : /dev/sda8 code de retour de umount 0

boucle 0 : /dev/sda8 démontage effectué (code retour 0)
total 8
309860 4 drwxr-xr-x 2 root root 4096 mars  16 22:18 .
260610 4 drwxr-xr-x 3 root root 4096 mars  16 22:18 ..
5 /dev/sda9

traitement de 5 /dev/sda9 (ext4)
montage de       /dev/sda9 sur /mnt/jpb-2017:03:16-22:18:00
code de retour montage de /dev/sda9 sur /mnt/jpb-2017:03:16-22:18:00 : 0
boucle 0  : /dev/sda9 code de retour de umount 0

boucle 0 : /dev/sda9 démontage effectué (code retour 0)
total 8
309860 4 drwxr-xr-x 2 root root 4096 mars  16 22:18 .
260610 4 drwxr-xr-x 3 root root 4096 mars  16 22:18 ..
6 /dev/sda10

traitement de 6 /dev/sda10 (ext4)
montage de       /dev/sda10 sur /mnt/jpb-2017:03:16-22:18:00
code de retour montage de /dev/sda10 sur /mnt/jpb-2017:03:16-22:18:00 : 0
boucle 0  : /dev/sda10 code de retour de umount 0

boucle 0 : /dev/sda10 démontage effectué (code retour 0)
total 8
309860 4 drwxr-xr-x 2 root root 4096 mars  16 22:18 .
260610 4 drwxr-xr-x 3 root root 4096 mars  16 22:18 ..
7 /dev/sda11

traitement de 7 /dev/sda11 (ext4)
montage de       /dev/sda11 sur /mnt/jpb-2017:03:16-22:18:00
code de retour montage de /dev/sda11 sur /mnt/jpb-2017:03:16-22:18:00 : 0
boucle 0  : /dev/sda11 code de retour de umount 0

boucle 0 : /dev/sda11 démontage effectué (code retour 0)
total 8
309860 4 drwxr-xr-x 2 root root 4096 mars  16 22:18 .
260610 4 drwxr-xr-x 3 root root 4096 mars  16 22:18 ..
8 /dev/sda12

traitement de 8 /dev/sda12 (ext4)
montage de       /dev/sda12 sur /mnt/jpb-2017:03:16-22:18:00
code de retour montage de /dev/sda12 sur /mnt/jpb-2017:03:16-22:18:00 : 0
boucle 0  : /dev/sda12 code de retour de umount 0

boucle 0 : /dev/sda12 démontage effectué (code retour 0)
total 8
309860 4 drwxr-xr-x 2 root root 4096 mars  16 22:18 .
260610 4 drwxr-xr-x 3 root root 4096 mars  16 22:18 ..
9 /dev/sda13

traitement de 9 /dev/sda13 (ext4)
montage de       /dev/sda13 sur /mnt/jpb-2017:03:16-22:18:00
code de retour montage de /dev/sda13 sur /mnt/jpb-2017:03:16-22:18:00 : 0
boucle 0  : /dev/sda13 code de retour de umount 0

boucle 0 : /dev/sda13 démontage effectué (code retour 0)
total 8
309860 4 drwxr-xr-x 2 root root 4096 mars  16 22:18 .
260610 4 drwxr-xr-x 3 root root 4096 mars  16 22:18 ..
10 /dev/sda14

traitement de 10 /dev/sda14 (ext4)
montage de       /dev/sda14 sur /mnt/jpb-2017:03:16-22:18:00
code de retour montage de /dev/sda14 sur /mnt/jpb-2017:03:16-22:18:00 : 0
boucle 0  : /dev/sda14 code de retour de umount 0

boucle 0 : /dev/sda14 démontage effectué (code retour 0)
total 8
309860 4 drwxr-xr-x 2 root root 4096 mars  16 22:18 .
260610 4 drwxr-xr-x 3 root root 4096 mars  16 22:18 ..
11 /dev/sdb1
12 /dev/sdb2
13 /dev/sdb3
14 /dev/sdb4


fin de récupération des données de /etc/fstab des partitions présentes sur la machine


suppression du répertoire /mnt/jpb-2017:03:16-22:18:00 en cours
supression réussie
fin normale du programme ././recup_fstab_V2
suite du programme modif_grub_V35.sh


  vérification des uuid correspondants à des systèmes sur boot séparés
  remarque : il existe deux lignes par couple
  une ligne uuid1-uuid2 et une ligne uuid2-uuid1


#############################################
# 2017:03:16-22:18:00 : couples uuid-boot - uuid-systeme des menuentry en boot séparé
2ffbf271-02fa-4d6f-a8e6-dee7a63894e5-13e83c99-8624-4136-a61d-10e67e670ba3
13e83c99-8624-4136-a61d-10e67e670ba3-2ffbf271-02fa-4d6f-a8e6-dee7a63894e5
#############################################


  vérifier visuellement le contenu des lignes comprises entre les ###
tapez sur entrée pour continuer

ligne commentée # 2017:03:16-22:18:00 : couples uuid-boot - uuid-systeme des menuentry en boot séparé je passe
2ffbf271-02fa-4d6f-a8e6-dee7a63894e5-13e83c99-8624-4136-a61d-10e67e670ba3
13e83c99-8624-4136-a61d-10e67e670ba3-2ffbf271-02fa-4d6f-a8e6-dee7a63894e5
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
réutilisation du fichier blkid-res.txt créé précédemment
/dev/sda1: LABEL="XP-MASSY" UUID="B664A19764A16ABF" TYPE="ntfs" PARTUUID="00000001-01"
/dev/sda5: LABEL="DONNEES_WD" UUID="3336D5F95125508C" TYPE="ntfs" PARTUUID="00000001-05"
/dev/sda6: UUID="0b82c97d-d077-4191-ae87-de7f2787ba44" TYPE="swap" PARTUUID="00000001-06"
/dev/sda7: LABEL="xubuntu-14-sys-m" UUID="5ed81f97-295e-4246-8aa1-7ae54d6c9e7c" TYPE="ext4" PARTUUID="00000001-07"
/dev/sda8: LABEL="xubuntu-14-hom-m" UUID="08201295-445e-4de7-a95b-a56990a0a9dd" TYPE="ext4" PARTUUID="00000001-08"
/dev/sda9: LABEL="fusion-12-hom-m" UUID="878a2332-9b22-4ca6-b125-d09c3821cf80" TYPE="ext4" PARTUUID="00000001-09"
/dev/sda10: LABEL="ubu-mate-16.04-m" UUID="ea999dc0-aaad-46bb-84ab-6e510bd28348" TYPE="ext4" PARTUUID="00000001-0a"
/dev/sda11: LABEL="fusion-12-sys-m" UUID="aec00812-bb57-4bbe-a5ed-90228e770e48" TYPE="ext4" PARTUUID="00000001-0b"
/dev/sda12: LABEL="voyager16.04.1.1" UUID="2f5e2fc1-c492-408e-956b-1d56a72eb7d3" TYPE="ext4" PARTUUID="00000001-0c"
/dev/sda13: LABEL="fusion-14-massy" UUID="29e5afbd-d25d-4050-816c-e2c8bc7984a2" TYPE="ext4" PARTUUID="00000001-0d"
/dev/sda14: LABEL="xubuntu-16-sys-m" UUID="75df6dda-088e-42e0-bb24-0558de998d09" TYPE="ext4" PARTUUID="00000001-0e"
/dev/sdb1: LABEL="hyb-systemback" UUID="1aced9e1-d845-46bb-a6e2-448666be4a21" TYPE="ext4" PARTUUID="00006711-01"
/dev/sdb2: UUID="5147bb57-b517-4a46-9344-c690575331e1" TYPE="swap" PARTUUID="00006711-02"
/dev/sdb3: LABEL="SB@boot" UUID="13e83c99-8624-4136-a61d-10e67e670ba3" TYPE="ext4" PARTUUID="00006711-03"
/dev/sdb4: LABEL="SB@" UUID="2ffbf271-02fa-4d6f-a8e6-dee7a63894e5" TYPE="ext4" PARTUUID="00006711-04"

 0 /dev/sda1  UUID B664A19764A16ABF                     LABEL: XP-MASSY              TYPE : ntfs      
 1 /dev/sda5  UUID 3336D5F95125508C                     LABEL: DONNEES_WD            TYPE : ntfs      
 2 /dev/sda6  UUID 0b82c97d-d077-4191-ae87-de7f2787ba44 LABEL: ___                   TYPE : swap      
 3 /dev/sda7  UUID 5ed81f97-295e-4246-8aa1-7ae54d6c9e7c LABEL: xubuntu-14-sys-m      TYPE : ext4      
 4 /dev/sda8  UUID 08201295-445e-4de7-a95b-a56990a0a9dd LABEL: xubuntu-14-hom-m      TYPE : ext4      
 5 /dev/sda9  UUID 878a2332-9b22-4ca6-b125-d09c3821cf80 LABEL: fusion-12-hom-m       TYPE : ext4      
 6 /dev/sda10 UUID ea999dc0-aaad-46bb-84ab-6e510bd28348 LABEL: ubu-mate-16.04-m      TYPE : ext4      
 7 /dev/sda11 UUID aec00812-bb57-4bbe-a5ed-90228e770e48 LABEL: fusion-12-sys-m       TYPE : ext4      
 8 /dev/sda12 UUID 2f5e2fc1-c492-408e-956b-1d56a72eb7d3 LABEL: voyager16.04.1.1      TYPE : ext4      
 9 /dev/sda13 UUID 29e5afbd-d25d-4050-816c-e2c8bc7984a2 LABEL: fusion-14-massy       TYPE : ext4      
10 /dev/sda14 UUID 75df6dda-088e-42e0-bb24-0558de998d09 LABEL: xubuntu-16-sys-m      TYPE : ext4      
11 /dev/sdb1  UUID 1aced9e1-d845-46bb-a6e2-448666be4a21 LABEL: hyb-systemback        TYPE : ext4      
12 /dev/sdb2  UUID 5147bb57-b517-4a46-9344-c690575331e1 LABEL: ___                   TYPE : swap      
13 /dev/sdb3  UUID 13e83c99-8624-4136-a61d-10e67e670ba3 LABEL: SB@boot               TYPE : ext4      
14 /dev/sdb4  UUID 2ffbf271-02fa-4d6f-a8e6-dee7a63894e5 LABEL: SB@                   TYPE : ext4      
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
0
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
/boot/grub/tests-modif_grub_V35 et recup_fstab_V2/grub(avec-boot-separe) (copie).cfg
modif_grub_V35.sh: ligne 58: $fich_source : redirection ambiguë
la présence de la ligne ### BEGIN /etc/grub.d/10_linux ### est obligatoire
le traitement ne commence qu'à partir de cette ligne
ajouter cette ligne au fichier
bernard@bernard-System-Product-Name:~$ 

Je n'ai pas trop compris dans le script.
Le début de la rubrique /grub.d/10_linux , c'est   ### BEGIN /etc/grub.d/10_linux ###
La fin de la rubrique, c'est  ; ### END /etc/grub.d/10_linux ###

Tu veux traiter tout ce qu'il y a depuis la Ligne   ### BEGIN /etc/grub.d/10_linux ###
jusqu'à la ligne  ; ### BEGIN /etc/grub.d/40_custom ### ??.

Pour info.
Je vais être absent pour quelques jours, retour à la campagne. Je retrouverai une autre machine là-bas.

@+.   Babdu89  .

Dernière modification par Babdu89 (Le 16/03/2017, à 23:11)


J'ai découvert Ubuntu avec la 07.10.... Et alors?!...  Depuis je regarde de temps en temps si Windows marche toujours....

Hors ligne

#158 Le 17/03/2017, à 09:07

ar barzh paour

Re : [Projet terminé] correction anomalie de grub

je suis pris tout le week-end je n'aurais pas le temps de regarder

oui c'est bien exit 1 avec une espace !! , ( j'ai édité directement dans le forum )

je chercherais pourquoi on a toujours
modif_grub_V35.sh: ligne 58: $fich_source : redirection ambiguë


Tu veux traiter tout ce qu'il y a depuis la Ligne   ### BEGIN /etc/grub.d/10_linux ###
jusqu'à la ligne  ; ### BEGIN /etc/grub.d/40_custom ### ??.

oui , il me semble que cela avait été demandé dans l'un des post

le fichier à traiter doit être de la forme
#
ligne 2
.......
ligne n
### BEGIN /etc/grub.d/10_linux ###     (ligne obligatoire)
ligne p
.....
ligne p+x
### BEGIN /etc/grub.d/40_custom ###    (cette ligne n'est pas obligatoire)
ligne q
..
ligne q+t
fin de fichier

si 40 custom est présent , le programme traitera de 10 à 40
si 40 custom n'est pas présente le programme traitera de 10 à la fin (valable pour les essais , puisqu'en réel cette ligne est présente

Dernière modification par ar barzh paour (Le 21/03/2017, à 08:53)


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#159 Le 17/03/2017, à 19:55

ar barzh paour

Re : [Projet terminé] correction anomalie de grub

nouvelle version modif_grub_V37
et recup_fstab_V3

le fichier généré fonctionne sur ma machine

#!/bin/bash

# V24 2017-03-06

#V25 
# chaine_linux="linux.*\/vmlinu" pour prise en compte de "linux	/@/boot/vmlinuz"

#V26 function sort_info_transforme donne des traces

# V28 2017-03-08
# présentation de concordances UUID-LABEL
# un ligne menuentry et submenu peut comporter des blank après   } 
# variable fin_submenu pour prise en compte des lignes menuentry se terminant par }  }

# V29 2017-03-09
# correction due à l'utilisation de ${#uuid[*]} dans la construction concordance label-uuid
# remplacement de tous les while ${#menu[*]} par for ${!menu[@]}

# V30 idem V29 sans les commentaires superflus
# si boot séparé on sort !!!!

# V33 ajout du sous programme recup_fstab_V2 ( étude système à boot séparé)

# V34 suite à V33 , suppression de certaines fonctions devenue inutiles
# réorganisation de certaines fonctions

# V35 le programme ne traite plus que les lignes comprises entre 
#    ### BEGIN /etc/grub.d/10_linux ###
# et
#    ### BEGIN /etc/grub.d/40_custom ###
# le fichier à traiter doit commencer par un #
# la ligne ### BEGIN /etc/grub.d/10_linux ### est obligatoire
# mais ne doit pas commencer le fichier
# si la ligne ### BEGIN /etc/grub.d/40_custom ### est absente
# le programme traitera le fichier jusqu'à la fin

#V37 ajout de l'option --sansfstab 
#   ( permet de ne pas lancer la récupération des fichiers fstab
# la création du fichier de concordance UUID-Part-UUIDBoot ne sera pas faite
# le fichier 

function ne_commence_pas_par_begin {
# le fichier à traiter ne doit pas commencer par ### BEGIN /etc/grub.d/10_linux ###
read ligne < "$fich_source"
if [[ "$ligne" =~ ^"$deb" ]]
	then
		echo ; echo
		echo "désolé"
		echo "si le fichier grub à traiter ( $fich_source )"
		echo "n'a pas le droit de commencer par la ligne"
		echo "$deb"
		echo "rappel :" 
		echo "    1- cette ligne"
		echo "       $deb"
		echo "       DOIT apparaître plus loin dans le fichier"
		echo "            même pour un fichier grub d'essai"
		echo
		echo "    2- le fichier à traiter DOIT commencer par une ligne de commentaire"
		echo "         (car cette première ligne sera modifiée)"
		echo
		echo "    3- en réel le fichier grub commence par #"
		exit 1 # au lieu de return 1
	fi
}

function trier_fichier {
echo ; echo
echo "fichier grub choisi : $fich_source"
deb="### BEGIN /etc/grub.d/10_linux ###"
fin="### BEGIN /etc/grub.d/40_custom ###"

ne_commence_pas_par_begin

# création de 3 fichiers tmp0-<date>.txt tmp1-<date>.txt tmp3-<date>.txt




fich_source_0=tmp0_$num.txt	# lignes du fichier à traiter de 1 à 10_linux
fich_source_1=tmp1_$num.txt # lignes du fichier à traiter de 10_linux à 40_custom
fich_source_2=tmp2_$num.txt # lignes du fichier à traiter de 40_custom à la fin

[[ -e "$fich_source_0" ]] && rm "$fich_source_0" # inutile mais évite message d'erreur rm
[[ -e "$fich_source_1" ]] && rm "$fich_source_1" # inutile mais évite message d'erreur rm
[[ -e "$fich_source_2" ]] && rm "$fich_source_2" # inutile mais évite message d'erreur rm


fich="$fich_source_0"
presence_10_linux=1
IFS="~"
while read ligne
do
	case "$ligne" in
		$deb ) fich="$fich_source_1" ;  presence_10_linux=0		;;
		$fin ) fich="$fich_source_2" 							;;
	esac
	echo "$ligne" >> $fich
done < "$fich_source"


# après lecture du fichier on a du renconter le ligne 10_linux sinon
if [[ $presence_10_linux -eq 1 ]]
then
	echo "la présence de la ligne $deb est obligatoire"
	echo "le traitement ne commence qu'à partir de cette ligne"	
	echo "ajouter cette ligne au fichier"
	exit 0
fi
	
}






function verifier_presence_dev { # dans le cas d'utilisation d'un blkid personnel
echo
# mettre les dev de "blkid-res.txt" dans un tableau
dev1=(`awk -F" " '{printf("%s ",$1)}' "blkid-res.txt"`)

# mettre les dev de $res_blkid dans un tableau
dev2=(`awk -F" " '{printf("%s ",$1)}' "$res_blkid"`)

manque=""
for d1 in ${dev1[@]} # /dev/sdxy: /dev/sdzt: de blkid
do
	res=`grep $d1 <<< ${dev2[@]}`
	[[ -z $res ]] && manque="$manque $d1" # si non trouvé , ajout
done
	if [[ -n $manque ]]
		then 
			echo "dans le fichier $res_blkid il manque"
			echo ; echo $manque ; echo
			echo "tous les dev présents sur la machine doivent être déclarés dans ce fichier"
			echo "veuillez éditer ce fichier"
			echo "format habituel dev/sdxx: LABEL=\"xxxx\"  UUID=\"xxxx\"" 
			exit 0
		fi
}




function modif_ligne1_grub { # récupère la première ligne et modifie en y mettant la date

res=`echo "$1" | grep "^ *	*#"`



if [[  -n $res ]] # la ligne est bien un commentaire (commence par #)
	then
		trans="#### $num : $fich_source modifié par $0 ####"
		echo $trans			> "$fich_sauv"
		((nb_lignes_cons++))
		((nb_lignes_hors_menu++))
sort_info_transforme "$1" "première ligne modifiée en" "$trans"

	else
		echo "la première ligne du fichier est "
		echo $1
		echo	
		echo "mais il faut que la première ligne du fichier"
		echo "$fich_source"
		echo "commence par un #"
		echo "ajouter cette ligne de commentaire au début de ce fichier"
		echo "arrêt du programme"
		exit 0
	fi #[[ -n $res  ]]

}


function OK {
rep=""
while [[ $rep != [oOyYnN] ]]
do
titre="programme $0        /!\/!\/!\/!\    Répondez par : (oOyYnN)"
texte="cette partie de programme supprime des lignes supposées inutiles de grub 
 ( paragraphes  contenant ......$rech_dev.....$rech_dev........... AVANT la chaine $rech_class )
 ( menuentry n'ayant pas des UUID égaux dans la ligne search et la ligne linux)
 (à partir de V34 les menuentry sur boot séparé devraient être conservés)	

 le programme demande le nom du fichier à traiter .. 
 en réel ce devrait être <partition>/boot/gub/grub.cfg ..
 et créera un fichier grub-OK-date qui pourra être utilisé pour remplacer le fichier grub
 il utilise aussi le label des partitions ou du fichier de référence 
 pour informer plus précisement la ligne menuentry de grub
 on peut utiliser un fichier de référence uuid label (au format blkid)
 
     remarque :pour des essais , on peut traiter n'importe quel fichier ayant un format grub
     si le fichier à traiter n'est pas au format grub , il ne fonctionnera pas correctement
     et en réel il serait préférable de lancer ce programme après avoir lancé un update-grub

trois fichiers peuvent être créés :
    grub-OK-<aaaa:mm:dd-hh:mm:ss>.txt         (le grub récupérable)
    grub-sup-<aaaa:mm:dd-hh:mm:ss>.txt        (les menuentry qui ont été supprimés)
    fich_transforme-<aaaa:mm:dd-hh:mm:ss>.txt (les lignes modifiées)

	vous pourrez analyser ces fichiers pour voir ce qui s'est passé
    avant de remplacer le grub 
    (en fin de traitement répondez alors non à la demande de remplacement
     et faites le remplacement manuellement)

lors du traitement .....
 les  x  qui défilent indiquent des lignes de menu qui seront supprimées
 les  c  qui défilent indiquent les lignes de menu qui seront conservées
 les  .  qui défilent indiquent les autres lignes  (qui seront conservées)
 un   S  indique un début de submenu
 un   M  indique un début de menuentry
 un   m  indique la suite de menuentry 
 
			tapez O puis valider pour continuer
			tapez A puis valider pour arrêter 

			O pour continuer / A pour arrêter le programme  
       "
       
rep=`zenity --entry --title "$titre" --text "$texte" --width "800"`
case $rep in
	[oOyY]	)	:												;;
	[aA]	)											exit 1	;;
	*		) 	echo "utilisez seulement oOyYaA S.V.P."			;;
esac	
done
}


function choix_fichier_blkid { # retourne 0 si fichier blkid choisi
fich_source=""
titre="$0               Sélectionnez le fichier contenant UUID et LABEL des partitions"
#fich_source=`zenity --file-selection --filename="../blkid/*" --title="$titre"`
fich_source=`zenity --file-selection --title="$titre"`

case $? in	#$? est le code de retour de zenity
 	0)	res_blkid="$fich_source"									;;
	1)	echo "Aucun fichier UUID-LABEL sélectionné."	; exit 1	;;
	-1)	echo "Une erreur inattendue est survenue." 		; exit 1	;;	
	*)	echo "erreur non reconnue" 						; exit 1	;;	
esac
}


function critere_suppression_2 { # se fait après une initialisation de menu[0 ...n]

##### attention les codes de retour ont changé
# 0 si ligne search et ligne linux et uuid égaux (menu conservé + label dans menu[0])
# 1 si pas de ligne search ou linux              (menu conservé intégralement)
# ligne search et linux trouvées
# 3 aucun UUID trouvé dans fichier UUID-LABEL
# 2 si uuid différents                           (menu supprimé à revoir?)

uuid_search="x"
uuid_linux="y"

ligne_search=""
ligne_linux=""

# recherche dans le tableau menu[1..n] de la ligne search

#TEST

for i in ${!menu[@]}				# pour tous les indices 0..n
do
	[[ $i = 0 ]] && continue		# sauf dans menu[0]
	res=`grep "$chaine_search" <<< "${menu[i]}"` # dans menu[1..n]
	if [[ -n $res ]]
		then
			ligne_search="${menu[i]}"
			break					# 1er menu[n] trouvé est le bon
		fi

	done


if [[ -z "$ligne_search" ]]
then
	return 1 # pas de chaine search => on conservera le menu intégralement
fi

# recherche dans le tableau menu[] de la ligne linux


for i in ${!menu[@]}				# pour tous les indices 0..n
do
	[[ $i = 0 ]] && continue		# sauf dans menu[0]
	tmp=`sed 's/[[:blank:]]//g'	<<< "${menu[i]}"` #suppression des blank de menu
	res=`grep "$chaine_linux"   <<< "${menu[i]}"` # dans menu[1..n]
	if [[ -n $res ]]
		then
			ligne_linux="${menu[i]}"
			break					# 1er menu[n] trouvé est le bon
		fi

	done


if [[ -z "$ligne_linux" ]]
then
	return 1 # pas de chaine linux => menu conservé sans modif
fi

#uuid ligne search présent dans fichier de réf uuid-label ?
# si trouvé positionne uuid_search
n=-1
while [[ $n -lt $maxuuid ]]
	do
	((n++))					# recherche de uuid[0..n]
	if [[ -n ${uuid[$n]} ]] # précaution supplémentaire uuid non vide
	then
		res=`grep ${uuid[$n]} <<< "$ligne_search"`	#  y-a-t-il l'UUID
		if [[ -n $res ]] 
			then
				uuid_search=${uuid[$n]}
				break 				# le premier uuid trouvé dans blkid sera le bon
		fi
	fi 
done 


# uuid ligne linux présent dans fichier de réf uuid-label ?
# si trouvé positionne uuid_linux
n=-1
while [[ $n -lt $maxuuid ]]
	do
	((n++))					# recherche de uuid[0..n]
	if [[ -n ${uuid[$n]} ]] # précaution supplémentaire uuid non vide 
	then
		res=`grep ${uuid[$n]} <<< "$ligne_linux"`	#  y-a-t-il l'UUID
		if [[ -n $res ]] 
			then
				uuid_linux=${uuid[$n]}
				break 				# le premier uuid trouvé dans blkid sera le bon
		fi
	fi 
done


# analyse des résultats

if [[ ${uuid_search}${uuid_linux} = "xy" ]]
then
	return 3 # aucun des uuid n'a été trouvé dans blkid ( peuvent être égaux ou non )
fi 

####################################################################################
# on peut avoir uuid_search  uuid_linux
#               x            1ea0....  : n'existe pas  , existe       : code retour 2
#               a04f...      y         :   existe      , n'existe pas : code retour 2
#               bcde...      fghi....  : uuids existants et différents: code retour 2
#               1234...      1234....  : uuids existants et égaux     : code retour 0
#####################################################################################



# si $uuid_search-$uuid_linux est dans UBoot on renvoie 4
# ce menu correspond à une partition avec boot séparée

for i in ${!UBoot[@]}		# pour tous les indices 0..n
do

	[[ $uuid_search-$uuid_linux = ${UBoot[$i]} ]] && return 4 

done


if [[ "$uuid_search" != "$uuid_linux" ]]
	then
		return 2 #  uuid différents on supprimera ce menu
	else
		return 0 # uuid egaux on conservera ce menu après modif de menu[0]
fi

} # fin function critere_suppression_2


function ajout_label_menuentry { # ajoute un label à menu[0] (search ou linux)
rech_uuid_label_menuentry "$1" 	# retour 0 si label trouvé , pas zéro sinon
code=$?
if [[ $code -eq 0 ]]
  then # on a un label
	  tmp=${menu[0]}	
	  menu[0]=`sed "s/menuentry '/menuentry '$label_trouve : /" <<< ${menu[0]}`
	  menu[0]=`sed "s/menuentry \"/menuentry \"$label_trouve : /" <<< ${menu[0]}`
	  menu[0]=`sed "s/${label_trouve} *:* *${label_trouve}/${label_trouve}/" <<<${menu[0]}`
	  if [[ $tmp != ${menu[0]} ]]
		then
			sort_info_transforme "$tmp" "	LIGNE transformée en" "${menu[0]}" 
		fi #[[ $tmp != ${menu[0]} ]]
	  fi # [[ $code -eq 0 ]]
}


function memorise_menuentry { # mémorise menuentry de submenu pour écriture ultérieure
	for  p in ${!menu[@]}	# pour tous les indices de menu[]
		do
			((i_s++))
			ligne_sousmenu[i_s]=${menu[$p]} 	# mémorise menu[0 ..n]
			((nb_lignes_menu_cons++))			# stat
		done 
}


function ecrire_lignes_memorisees { # écrit les lignes dans sauv

for p in ${!ligne_sousmenu[@]}	# pour tous les indices de ligne_sousmenu[]
	do
		echo "${ligne_sousmenu[$p]}" >> "$fich_sauv"	# écriture l_s[0..n]
		((nb_lignes_cons++))							# stat
	done
}


function traite_ligne_submenu { # reçoit $1 (ligne submenu '.......{

fin_submenu=1 # sera mise à 0 si un menuentry se termine par }  }
submenu="$1" #mise en mémoire de cette ligne

# j'utilise la mémorisation label_submenu du label d'un menuentry précédent  

if [[ -n $label_submenu ]]
then
# ajout du label et suppression double label
submenu=`sed "s/submenu '/submenu '${label_submenu} : /"   <<< $submenu`
submenu=`sed "s/submenu \"/submenu \"${label_submenu} : /" <<< $submenu`
submenu=`sed "s/${label_submenu} *:* *${label_submenu}/${label_submenu}/" <<<$submenu`
fi

i_s=0
unset ligne_sousmenu

ligne_sousmenu[0]="$submenu"	# mémorisation pour sortie finale
((nb_lignes_hors_menu++))		# ligne considérée comme hors menu

# lire les lignes qui suivent submenu jusquà trouver ligne ......} hors menuentry)

while read ligne
do
((nb_lignes_lues++))
		# si on trouve .... } hors menuentry on est au bout du submenu
		# il faut sauvegarder la ligne submenu , les lignes intermédiaires et menuentry
		# je ne traite pas du cas où on trouverait une ligne menuentry terminée par  } }
		# V28 et suivante ce cas est traité
		# une ligne menuentry terminée par } } provoque la fin du submenu  ($fin_submenu 0)

# on sort de la boucle si on trouve } en fin de ligne hors menuentry

tmp=`sed 's/[[:blank:]]//g' <<<"$ligne"` # supprime les blancs de la ligne

if [[ "$tmp" =~ }$ || "$fin_submenu" = 0 ]]   ### on est en fin de submenu ###
				# pas tout à fait exact
				# si on peut  avoir { ...... } hors menuentry
		then
			((i_s++))
			ligne_sousmenu[i_s]="$ligne"	# mémoriser cette ligne
			((nb_lignes_hors_menu++))		# stat
			echo -e ".\c"
			ecrire_lignes_memorisees		# écriture de ces lignes de submenu
			label_submenu=""
			return							# fin de traitement de submenu
		fi # [[ "$tmp" =~ }$ ]]

# V28 élargissement aux blancs de grep après {
res=`echo "$ligne" | grep "^[	 ]*menuentry.*{[ 	]*$"`
mem=`echo "$ligne" | grep "^[	 ]*menuentry ['\"]Memory test.*{[ 	]*$"`

if [[ -n $mem ]]
then			
	res=""		# si on trouve la chaine Memory pas intéressant on force res à vide
fi

if  [[ -z $res ]]
	then								# ni menuentry ..{ ni memory ...{
		((i_s++))						# 
		ligne_sousmenu[i_s]="$ligne"	# mise en mémoire pour écriture ultérieure
		((nb_lignes_hors_menu++))		# stat
		echo -e ".\c"	
	
	else
		lire_menuentry 					# menu[0..n]  et ((nb_lignes_lues++))
		trt_menu2 "${menu[0]}" 			# 1 si contient dev dev
		code_dev_dev=$?

		if [[ $code_dev_dev -eq 1 ]]	# 1 la ligne contient /dev /dev
			then
				sort_menu_1 " " "menu supprimé : trop de /dev/sd"		# suppression de ce menu
				((nb_menu_sup++))		# stat
			else 						# pas 1 : ne contient pas dev dev
				critere_suppression_2
				code_crit2=$?			# 0 1 2 3 

				case $code_crit2 in
				0)						# les uuid sont égaux modifier menu[0]
					ajout_label_menuentry "$chaine_search"
					memorise_menuentry	# mettre en mémoire ces lignes de menuentry
					((nb_menu_cons++))	# stat non prévu dans memorise_menuentry
				;;
				1)						# pas de search ni de linux on garde sans modif
					memorise_menuentry	# mettre en mémoire ces lignes de menu
sort_info_transforme "${menu[0]}" "menu dans submenu conservé (sans search ou linux)"
					((nb_menu_cons++))	# stat non prévu dans memorise_menuentry
				;;
				2)						# uuid différents on supprime ce menu
					sort_menu_1 " " "menu supprimé : uuid différents"
					((nb_menu_sup++))	# stat non prévu
				;;
				3)						# uuid non trouvé (search et linux existent)
					memorise_menuentry	# mettre en mémoire ces lignes de menu
sort_info_transforme "${menu[0]}" "menu dans submenu conservé : uuid (search-linux) non trouvé"
					((nb_menu_cons++))	# stat non prévu
					((nb_menu_sans_uuid++))
				;;
				4)						# uuid != mais boot séparé
					# revoir pour le label
					ajout_label_menuentry "$chaine_linux"
					memorise_menuentry	# mettre en mémoire ces lignes de menuentry
					((nb_menu_cons++))	# stat non prévu dans memorise_menuentry
					((nb_menu_boot_cons++))
					
				;;					
				esac
			fi # [[ $code_dev_dev -eq 1 ]]
	fi # [[ -z $res ]]
done

# si on arrive ici il y a erreur de traitement quelque part
echo
echo " ligne bach $LINENO"
echo " erreur de format ? dans le fichier $fich_source !!!!!!!!!!"
echo " dernière ligne de menu lue :"
echo
echo ${menu[0]}
echo
echo " dernière ligne lue : $nb_lignes_lues"
echo " $ligne"
sleep 100
exit 0 
}


function rech_uuid_label_ligne { # recherche uuid et label  de $1 dans uuid[0..n]
# renvoie 0 uuid trouvé et label trouvé	uuid_trouve=xxx  label_trouve="yyy"
# renvoie 1 uuid trouvé et label vide	uuid_trouve=xxx  label_trouve=""
# renvoie 2 uuid non trouvé				uuid_trouve=""   label_trouve=""	
uuid_trouve=""
label_trouve=""
n=-1
while [[ $n -lt $maxuuid ]]
	do
	((n++))								# uuid suivant
	if [[ -n ${uuid[$n]} ]]				# précaution supplémentaire uuid non vide 
	then
		res=`grep ${uuid[$n]} <<< $1`	#  $1 est une ligne de menu
		if [[ -n $res ]] 
			then
				uuid_trouve=${uuid[$n]}
				if [[ -n ${label[$n]} ]]
				then
					label_trouve=${label[$n]}	# si label non vide positionne label_trouve
					return 0					# uuid trouvé / label non vide trouvé
				else
					return 1					# uuid trouvé / label ""
				fi
		fi
	fi 
done 
return 2										# uuid non trouvé 
}


function rech_uuid_label_menuentry { # recherche uuid et label dans la ligne $1 de menu[1 ..n]

for p in ${!menu[@]}	# pour tous les indices du tableau 0..n
do
	[[ $p = 0 ]] && continue	# mais pas dans menu[0]
	res=`echo ${menu[$p]} | grep "$1"`	
	if [[ -n $res ]]
		then
			rech_uuid_label_ligne ${menu[$p]}		# donne uuid_trouve / label_trouve
			return $?								# 0 uuid égaux 
													# 1 uuid trouvé , label vide
													# 2 pas d'uuid dans search 
		fi
	done
return 3	# pas de search trouvé , (donc pas d'uuid , et donc pas de label) !!!
}




function transforme_ligne_menuentry {	# modifie la première ligne d'un menuentry conservé
# recherche l'UUID dans la ligne search --no-floppy --fs-uuid --set=root
# si trouvé , on récupère le label
# si label vide on ne fait rien
# sinon on rajoute avec : en tête après menuentry ' ou menuentry " 
# 

label_trouve=""
uuid_trouve=""
tmp=${menu[0]}					# servira de test pour sortie si modifié
rech_uuid_label_menuentry "$1"	# positionne le label à la bonne valeur
code=$?							# retour de la fonction

case $code in
	0)		# UUID trouvé : $uuid_trouve LABEL trouvé : $label_trouve

			if [[ $label_submenu = "" ]]	# servira dans traitement d'un submenu éventuel
				then						# on memorise le premier label menuentry trouvé	
					label_submenu="$label_trouve"
				fi	
			menu[0]=`sed "s/menuentry '/menuentry '$label_trouve : /" <<< ${menu[0]}`
			menu[0]=`sed "s/menuentry \"/menuentry \"$label_trouve : /" <<< ${menu[0]}`
			#suppression double labels dans cette ligne
			menu[0]=`sed "s/${label_trouve} *:* *${label_trouve}/${label_trouve}/" <<<${menu[0]}`

			if [[ $tmp != ${menu[0]} ]]
			then #TEST
				sort_info_transforme "$tmp" "	LIGNE transformée en" "${menu[0]}"
			fi
	;;
	1)		# LABEL vide #TEST
				sort_info_transforme "$tmp" "pas de label pour $uuid_trouve"
	;;
	2)		#LABEL vide uuid non trouvé #TEST
				sort_info_transforme "$tmp" "uuid de ligne search non trouvé"
	;;
	3)		# pas de ligne search trouvée dans menuentry v
				sort_info_transforme "$tmp" "ligne search non trouvée"
	;;	
	*) # ???? #TEST
				sort_info_transforme "$tmp" "code inconnu : $code"
	;;
esac

return $code
}


function lire_menuentry { # met dans tableau menu[n] jusqu'à trouvé } seul sur la ligne
unset menu
i=0
menu[0]="$ligne"								# menu[0] est la première ligne
echo -e "M\c"									# trace début de menuentry
while read ligne								# ligne suivante
do
	((i++))
	((nb_lignes_lues++))
	menu[$i]="$ligne"							# mémorisée dans menu [1 .. n]
	echo -e "m\c"								# trace écran
	tmp=`sed 's/[[:blank:]]//g' <<<"$ligne"`	# suppression des blancs pour test

	if [[ "$tmp" =~ }}$ ]]
		then
			fin_submenu=0						# termine par  }   } fin de submenu !!!
		fi

	if [[ "$tmp" =~ }$ ]]   					# la ligne se termine par } ?
		then
			return								# oui fin de menuentry
		fi
			# et si pas de ... } on ira jusqu'en fin de fichier !!!!
			# c'est un critère de format de grub
done
}

function sort_menu_0 {	# écrit menu[0..n] dans le fichier de sauvegarde

for p in ${!menu[@]}						# pour tous les indices
	do
		echo "${menu[$p]}" >> "$fich_sauv"	# écriture menu[0..n]
		((nb_lignes_cons++))				# stat
		((nb_lignes_menu_cons++))			# stat
		echo -e "c\c"						# suivi écran
	done
}


function sort_menu_1 {	# écrit menu[0..n] dans le fichier suppression

#écriture des paramètres reçus dans fich_sup
	echo "#########################"	>> $fich_sup
	for arg in "$@"		# prends $1 $2 ... $n
	do
		echo $arg		>> $fich_sup
		#echo			>> $fich_sup
	done

# écriture du menu dans fichier sup
for p in ${!menu[@]}					# pour tous les indices
do
	echo "${menu[$p]}" >> "$fich_sup"	# écriture menu[0..n]
	((nb_lignes_sup++))					# stat
	echo -e "x\c"						# suivi écran
	done
}



function sort_info_transforme { # écrit les paramètres reçus fich_transforme

	echo "#########################"	>> $fich_transforme
	for arg in "$@"	# ( $1 $2 ... $n )
		do
			echo $arg		>> $fich_transforme
			#echo			>> $fich_transforme
		done
}


function trt_menu2 { # analyse le paramètre $1
	# renvoie 1 si $1 contient plus d'une fois /dev/sd  avant --class (suppresion)
	# renvoie 0 sinon

IFS=" "		# il faut l'espace comme délimiteur
tableau=($1)	# mise en tableau de la ligne
IFS="~"		# peut-être utile pour la suite ?

nbdevsd=0 					# nombre de fois que l'on trouve /dev/sd (avant --class)

for n in ${!tableau[@]} # de 0 1 2 .... x
do
	r_class=`echo ${tableau[$n]} | grep "$rech_class"`	# test présence --class
	if [[  -n $r_class ]] 								# --class ou pas ?
		then
			break				# --class est trouvé, sort de la boucle for
		else
			r_dev=`echo ${tableau[$n]} | grep "$rech_dev"`   #  test présence /dev/sd
			if [[ -n $r_dev ]]
				then
					((nbdevsd++))							# incrémente si on a /dev/sd 
					if [[ $nbdevsd -gt 1 ]]					# si plus d une fois /dev/sd
						then
							return 1 						# on sort en renvoyant 1
						fi #[[ $nbdevsd -gt 1 ]]
				fi #[[ -n $r_dev ]]
		fi #[[  -n $r_class ]]
done

if [[ $nbdevsd -gt 1 ]]	# test nombre
	then
		return 1 # 1 si plus d'une fois /dev/sd
	else
		return 0 # 0 sinon
fi
}



# début du programme ##################################################################################
######### variables ################################### 
rech_class="\-\-class"		# jusqu'à trouver la chaine --class dans menuentry
rech_dev="\/dev\/sd"		# la présence de la chaine  /dev/sd dans menuentry
res_blkid="blkid-res.txt"	# le fichier contenant le résultat de sudo blkid
chaine_search="search \-\-no\-floppy \-\-fs\-uuid \-\-set=root"
	 						# protection des tirets pour les recherche par \  d'où les \-
chaine_linux="linux.*\/vmlinu" 			# + général "linux......./vmlinu"
label_submenu=""						# label valide du menuentry précédent
fich_fstab_conc="UBoot_UPart.txt" # créé par recup-fstab contient les uuid ayant boot séparé
#########################################################
num=`date +%Y:%m:%d`-`date +%H:%M:%S`
fich_sauv=grub-OK-$num.txt
fich_sup=grub-sup-$num.txt
fich_transforme=fich_transforme-$num.txt
fich_fstab=fich_fstab-$num.txt
##### pour les stat #####################################
nb_menu_cons=0
nb_menu_boot_cons=0
nb_menu_sup=0
nb_menu_sans_uuid=0
nb_lignes_sup=0
nb_lignes_cons=0
nb_lignes_lues=0
nb_lignes_hors_menu=0
nb_lignes_menus_cons=0
#########################################################

prg="./recup_fstab_V3"	# création de $fich_fstab_conc (UBoot_UPart.txt)

echo "lancement du programme $prg"

#si le programme n'existe pas on sort
! [[ -e "$prg" ]] && echo "il manque le fichier $prg de récupération de infos de fstab" && exit 0
 
# créé le fichier UBoot_UPart.txt contenant uuid1-uuid2 des systèmes boot séparés

code=0		# permet des essais sans lancer prg , en diésant seulement la ligne qui suit

./$prg		# pour des essais mettre #./$prg

code=$?  

if [[ $code -ne 0 ]]
	then
		echo "  il y a eu un problème de traitement du programme  $prg"
		echo "  si l'arrêt n'est pas volontaire"
		echo "  vérifier que le répertoire /mnt/jpb ne comporte pas des résidus de fichiers"
		echo "  éventuellement faire le ménage dans ce répertoire"
		exit 0
	fi

echo
echo "suite du programme $0"
echo ; echo

if ! [[ -e $fich_fstab_conc  ]]	# normalement il a été créé par recup_fstab
	then
		echo "le fichier  $fich_fstab_conc est introuvable"
		echo "il faut d'abord exécuter $prg" 
		echo "ou mettre à disposition manuellement le fichier $fich_fstab_conc"
		echo ; echo
		exit 0
	else  
		echo "  vérification des uuid correspondants à des systèmes sur boot séparés"
		echo "  la première ligne est une ligne de commentaire puis"
		echo "  il existe deux lignes par couple"
		echo "  une ligne uuid1-uuid2"
		echo "  une ligne uuid2-uuid1"
		echo ; echo
		echo "###### contenu du fichier $fich_fstab_conc ############################"
		cat $fich_fstab_conc
		echo "#######################################################################"
		echo ; echo
		echo "  vérifier visuellement le contenu des lignes comprises entre les ###"
		echo "  tapez sur entrée pour continuer"
		read g
	fi

# lecture et mise en mémoire des infos donnée par le fichier $fich_fstab_conc ("UBoot_UPart.txt")
#################################################################################################
max_boot=-1
while read l_boot
do
	[[ -z $l_boot ]] && echo "ligne vide je passe" && continue		# si ligne vide ou commentée
	[[ $l_boot =~ ^[[:blank:]]*# ]] && echo "ligne commentée $l_boot je passe" && continue
	((max_boot++))
	echo $l_boot
	UBoot[$max_boot]=$l_boot # format uuid1-uuid2 à la suite
done < $fich_fstab_conc
#################################################################################################

OK # présentation du programme

code=1
while [[ $code = 1 ]]
do
rep=""
while [[ $rep != [oOyYaAcC] ]]
do
titre="     Utilisation des UUID et LABEL des partitions des disques"
texte="     Choix du fichier de références  LABEL et UUID
	répondez par
			(aA)     pour arrêter ce programme
	
			(oOyY)   si vous voulez ré-utiliser le fichier $res_blkid existant
                         ce fichier a été créé précédemment
						(les labels utilisés pour mettre à jour le grub
						 seront alors ceux déclarés sur la partition)

			(cC)     permet de choisir un fichier de référence UUID LABEL
						(les labels utilisés pour mettre à jour le grub
						 seront alors ceux déclarés dans ce fichier de référence)

				     !!!!!	à partir de V31 ce fichier devra aussi comporter le champ /dev
						    chaque partition doit être déclarée
							le champ UUID est OBLIGATOIRE pour un traitement correct
							le champ type est conseillé
							ce choix peut servir si vous ne voulez pas labelliser les
							partitions mais mettre quand même un label dans grub
							ou bien effctuer des essais
							(ce choix un peu tordu est un peu difficile à comprendre ?)
							le champ /dev/sdxx en premier
							le champ LABEL="xxxxxx"
							le champ UUID="xxxxxx"
							le champ TYPE="xxxxx"							
							une ligne sera donc de la forme
/dev/sdxx LABEL=\"un label correct\" UUID=\"un uuid correct\" TYPE=\"le  type correspondant\"

				            !!!!	en cas de doute utilisez le choix oOyY 	puis Valider

					si vous répondez non , c'est le fichier $res_blkid qui sera
					utilisé pour mettre à jour le titre des menus et sous menus
					dans le fichier traité (surtout utile pour des essais)

					O pour réutilisation du fichier blkid 
					C pour choisir un fichier de référence UUID LABEL
					A Arrêter
"
rep=`zenity --entry --title "$titre" --text "$texte" --width "800"`

case $rep in
	[oOyY]	) echo "réutilisation du fichier $res_blkid créé précédemment" ;;
	[aA]	) echo "arrêt du programme" 		; exit 0				;;
	[cC] 	) echo "choix du fichier des uuid" 	; choix_fichier_blkid 	;;
	*		) echo "utilisez seulement oO yY aA cC S.V.P."				;;
esac
done


# si le fichier de concordance n'existe pas sortie 

if ! [[ -e "$res_blkid" ]]
	then
		echo ; echo
		echo " $0 n'a pas trouvé le fichier"
		echo " $res_blkid"
		echo " que vous avez choisi comme référence UUID-LABEL"
		echo " Modifier votre choix de fichier"
		echo "    ou bien mettez à disposition ce fichier pour continuer" 
		echo ; echo ; sleep 5
		# exit 0
	else
		code=0
	fi

done	# sors de la boucle uniquement si code=0



# récupératon dev label UUID dans des tableaux
unset dev
unset uuid
unset label
unset bdev	# V31 pour boot séparé
unset btype #le type de la partition
unset bmont # point de montage à cause du boot séparé

############## récupération dev label uuid btype dans le fichier choisi ###################
maxuuid=-1
while read ligne
do
#TEST simplification par continue
	[[ -z $ligne ]] && echo "ligne vide je passe" && continue		# correction ligne vide
	((maxuuid++))
	tableau=($ligne) # découper la ligne en champ
	tmp=`sed 's/://g' <<< ${tableau[0]}` # supprime les : donne /dev/sdxx
	[[ -z `grep "^\/dev" <<< $tmp` ]] && echo \
		&& echo "il manque /dev dans la ligne $ligne du fichier de référence UUID-LABEL" \
		&& exit 0
  
	dev[maxuuid]=$tmp			#récupération du dev de la ligne
	label[maxuuid]=""
	uuid[maxuuid]=""
	btype[maxuuid]=""
	
	echo ${tableau[@]}
	
	for champ in ${tableau[@]}
		do
			deb=` echo $champ | cut -c1-5`
			case $deb in
				LABEL)		# en enlevant les guillemets donne U16.04-b7
					label[maxuuid]=`sed 's/"//g' <<< ${champ##*=}`
					;;
				UUID\=)		# en enlevant les guillemets donne c63335c7-b....2be94
					uuid[maxuuid]=`sed 's/"//g' <<< ${champ##*=}`
					;;
				TYPE\=)		# en enlevant les guillemets donne swap ntfs ext4 ....
					btype[maxuuid]=`sed 's/"//g' <<< ${champ##*=}`
			esac
	done

done < $res_blkid

##############################################################################
if [[ "$res_blkid" != "blkid-res.txt" ]]
then
	verifier_presence_dev # vérifie que tous les dev du fichier choisi sont bien déclarés
fi
###############################################################################
# sortie des uuid label pour info
		rm tmp_u_l.txt
echo
		p=0
		while [[ $p -le $maxuuid ]]
		do
			aff_dev="${dev[$p]}"		&& [[ -z "$aff_dev"		]]	&& aff_dev="_"
			aff_label="${label[$p]}"	&& [[ -z "$aff_label"	]]	&& aff_label="___"
			aff_uuid="${uuid[$p]}"		&& [[ -z "$aff_uuid"	]]	&& aff_uuid="___"
			aff_btype="${btype[$p]}"	&& [[ -z "$aff_btype"	]]	&& aff_btype="___"

# car si l'un des $ est "" , il y a erreur d'affichage

			printf "%02s %-10s UUID %-36s LABEL: %-20s  TYPE : %-10s\n" \
					$p $aff_dev $aff_uuid $aff_label $aff_btype  | tee -a tmp_u_l.txt
			((p++))											
		done

titre="Affichage des concordances LABEL <=> UUID      Visualiser puis  Valider pour continuer"
zenity --text-info --title "$titre" --filename "tmp_u_l.txt" --height "640" --width "1280" --font "Courier New Bold 10"
code=$?
if [[ $code -ne 0 ]]
	then
		echo $code
		exit 0 #sortie si on ne valide pas
	else
		echo $code

	fi

################ début de traitement du fichier GRUB ###############################

# Quel fichier grub traiter ?
titre="$0               Sélectionnez le fichier GRUB à traiter"
fich_source=`zenity --file-selection --filename="../fichier-grub/*" --title="$titre"`
case $? in	# $? est le code de retour de zenity
	0)	:														;;
	1)	echo "Aucun fichier sélectionné."			; exit 1	;;
	-1)	echo "Une erreur inattendue est survenue."	; exit 1	;;	
	*)	echo "erreur non reconnue"					; exit 1	;;	
esac


#### lecture et traitement du fichier GRUB #######

trier_fichier # création des 3 fichiers de 1 à 10 linux 10 linux à 40 custom 40 custom à la fin 

################# traitement jusqu'à 10_linux #####################
prem=0
while read ligne
do 
((nb_lignes_lues++))
if  [[ $prem -eq 0 ]]
	then
				modif_ligne1_grub "$ligne" ; ((prem++))
	else
				echo $ligne >> "$fich_sauv"
				((nb_lignes_cons++))
				((nb_lignes_hors_menu++))

fi
done < "$fich_source_0"

################# traitement de 10_linux à 40_custom
IFS="~"
while read ligne
do
((nb_lignes_lues++))

if  [[ $prem -eq 0 ]] # pourrait être supprimé depuis V34
	then
				modif_ligne1_grub "$ligne" ; ((prem++))
	else
				# entre les crochets on a tab et espace élargisement après {
	res=`echo "$ligne" | grep "^[	 ]*menuentry.*{[ 	]*$"`
	mem=`echo "$ligne" | grep "^[	 ]*menuentry ['\"]Memory test.*{[ 	]*$"`

	# res est vide s'il n'y a pas menuentry {
	# mem est non vide si on a Memory test -ne pas traiter menuentry 'Memory test

	if [[ -n $mem ]]
	then			# si Memory test on force res à vide
		res=""
	fi

	if  [[ -z $res ]]
		then 											# pas menuentry 
			subm=`echo "$ligne" | grep "^[	 ]*submenu.*{[ 	]*$"`
			if [[ -z $subm ]]
				then 									# pas menuentry pas submenu
					echo "$ligne" >> $fich_sauv			# écriture de cette ligne dans sauv
					((nb_lignes_cons++))				# stat
					((nb_lignes_hors_menu++))			# stat
					echo -e ".\c"						# trace écran
				else 									# contient submenu
					echo -e "S\c"						# trace
					traite_ligne_submenu "$ligne"		# traitement de submenu
			fi
		
		else								# on a menuentry
			lire_menuentry					# mettre en mémoire dans menu[0..n]
			trt_menu2 "${menu[0]}" 			# rem : 1 si /dev/sd /dev/sd
			code_dev_dev=$?
			if [[ $code_dev_dev -eq 1 ]]	# si 1 on supprime
				then						# le bloc menuentry contient /dev /dev
					sort_menu_1	" " "menu supprimé : trop de /dev/sd"	# fich_sup
					((nb_menu_sup++))

				else  						# menuentry ne contient pas /dev/sd /dev/sd
					critere_suppression_2	# analyse des uuid et recherche de label
					code_crit2=$?
					case $code_crit2 in
					0)						# les uuid sont égaux
						transforme_ligne_menuentry "$chaine_search"	# mettre un label dans menu[0]
						sort_menu_0					# écrire le menu dans fich_sauv
						((nb_menu_cons++))			# stat
					;;
					1)						# menu sans modif (ni search ni linux)
						sort_menu_0					# écrire le menu dans fich_sauv
sort_info_transforme "${menu[0]}" "menu conservé (sans search ou linux)"
						((nb_menu_cons++))			# stat
					;;
					2)						# uuid différents on supprime ce menu
						sort_menu_1	" " "menu supprimé : uuid différents"	# écrire dans fich_sup
						((nb_menu_sup++))				# stat
					;;
					3)						# uuid non trouvé (search et linux existent)
						sort_menu_0					# écrire le menu dans fich_sauv
sort_info_transforme "${menu[0]}" "menu conservé : UUID search-linux non trouvé"
						((nb_menu_cons++))			# ce menu étant conservé
						((nb_menu_sans_uuid++))
					;;
					4)						# uuid != mais boot séparé
						transforme_ligne_menuentry "$chaine_linux" # met label dans menu[0]
						sort_menu_0					# écrire le menu dans fich_sauv
						((nb_menu_cons++))	# stat non prévu dans memorise_menuentry
						((nb_menu_boot_cons++))
					;;
					esac

				fi # [[ $code_dev_dev -eq 1 ]]
		fi #[[ -z $res ]]
	fi #[[ $prem -eq 0 ]]
done < "$fich_source_1"

echo $nb_lignes_lues

################# traitement 40_custom à fin #####################
if [[ -e "$fich_source_2" ]] # en cas d'essai sans ligne 40_custom
	then
		while read ligne
		do 
			((nb_lignes_lues++))
			((nb_lignes_cons++))
			((nb_lignes_hors_menu++))
			echo $ligne >> "$fich_sauv"
		done < "$fich_source_2"
	fi
#################################################################

echo $nb_lignes_lues

# fin présentation des résultats sur l'écran

echo
echo
printf "%-40s %s %s\n" "fichier traité" " : " "$fich_source"
printf "%-40s %s %s\n" "le résultat se trouve dans"  " : " "$fich_sauv"
echo
printf "%-39s %s %5d\n" "nombre de lignes lues" " : " "$nb_lignes_lues"
printf "%-40s %s %5d\n" "lignes conservées" " : " "$nb_lignes_cons"
printf "%-40s %s %5d\n" "lignes supprimées" " : " "$nb_lignes_sup"
if [[ $nb_lignes_sup -gt 0 ]]
	then
printf "%-40s %s %s\n" "fichier des lignes supprimées" " : " "$fich_sup"
	echo
	fi
printf "%-40s %s %5d\n" "nombre de menus conservés" " : " "$nb_menu_cons"
printf "%-40s %s %5d\n" "nombre de menus supprimés" " : " "$nb_menu_sup"
printf "%-40s %s %5d\n" "nombre de menus avec boot conservés" " : " "$nb_menu_boot_cons"
if [[ $nb_menu_sans_uuid -gt 0 ]]
	then
printf "%-40s %s %5d\n" "nombre de menus sans uuid trouvé" " : " "$nb_menu_sans_uuid"
	fi
echo
printf "%-40s %s %5d\n" "lignes conservées (hors menu)" " : " "$nb_lignes_hors_menu"
printf "%-40s %s %5d\n" "lignes conservées (menu)" " : " "$nb_lignes_menu_cons"


echo "après avoir vérifié manuellement le fichier"
echo "$fich_sauv"
echo "en réel vous pourrez remplacer grub.cfg à vos risques et périls"
echo


rep=""
while [[ $rep != [oOyYnN] ]]
do

################ mise à jour du fichier traité  ou non ###########################
titre="    ################       remplacement de GRUB    ###########"
texte="
       Voulez-vous remplacer le fichier choisi par le nouveau fichier généré (oOyYnN)
	
       mais par précaution si vous répondez oui le fichier
 $fich_source (fichier original choisi)
          sera sauvegardé dans
 $fich_source-$num

	   Attention
 $fich_source 
	sera remplacé par le contenu du fichier
 $fich_sauv  (le résultat OK obtenu)
       donc si avez choisi de traiter /boot/grub
       /boot/grub sera remplacé par le fichier résultant ... prenez vos précautions

		personnellement si je traite le fichier réel je réponds N

        pour vérifier le contenu du fichier créé 

        puis j'effectue manuellement la copie

                   répondez par (oOyYnN)"

rep=`zenity --entry --title "$titre" --text "$texte" --width "800"`
case $rep in
	[oOyY] )	# sauvegarde de "grub" , je conserve $num	
			echo "
            OK mais avant je sauvegarde le fichier original
            $fich_source
            dans 
            $fich_source-$num
            mais il me faut le mot de passe"
 			sudo cp "$fich_source" "$fich_source-$num"
			code=$?
			if [[ $code != 0 ]]
				then
					echo "il y a eu un problème lors de la sauvegarde du fichier
                         (code erreur : $code) je sors"
					exit 0
				fi

			#et fich_sauv remplace grub
			echo "
            OK je remplace
            $fich_source
            par
            $fich_sauv"
			sudo mv "$fich_sauv" "$fich_source"
			code=$?
			if [[ $code != 0 ]]
				then
					echo "il y a eu un problème lors du remplacement du fichier
                         (code erreur : $code) je sors"
					exit 0
				fi			

	;;
	[nN]	)	
             echo ; echo "fichier oiginal non remplacé"
             echo "  mais le fichier résultant $fich_sauv est à disposition"
	;;
	*	) 	echo "utilisez seulement oOyYnN S.V.P."
	;;
esac
done

echo "taper entrée pour terminer"
read g #pour attendre
exit 0

Dernière modification par ar barzh paour (Le 18/03/2017, à 09:44)


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#160 Le 17/03/2017, à 19:57

ar barzh paour

Re : [Projet terminé] correction anomalie de grub

le fichier recup_fstab_V3

#!/bin/bash

# V1 récupère le contenu des fichiers fstab qui peuvent exister sur la machine
# comment ?
# récupération des dev présents par blkid
# création du fichier blkid-res.txt
# pour les partitions déjà montées (via mount)
# lecture et traitement de <partition>/etc/fstab

# et pour chacune des autres partitions
# montage
# lecture et traitement de <point de montage>/etc/fstab
# démontage

# le traitement consiste à écrire dans le fichier DevSd_UBoot_UPart.txt
# pour chaque partition qui sera reconnue comme ayant un boot séparé
# DevSd="/dev/sdxx" UPart="uuid de la partition avec boot" UBoot="uuid du boot" 

# le traitement consiste à écrire dans le fichier DevSd_Uboot_Upart-date.txt
# pour chaque partition qui sera reconnue comme ayant un boot séparé
# DevSD="/dev/sdxx" UBoot="uuid du boot" UPart="uuid de la partition avec boot"

# V2 création fichier UBoot_UPart contenant les uuid d'un système avec boot séparé
# format uuid1-uuid2 et uuid2-uuid1 servira lors du traitement modif-grub

# V3 remise en forme

function OK {
# à cause de problème d'affichage


reponse=""
while [[ $reponse != [oOyYnN] ]]
do
titre="programme $0        /!\/!\/!\/!\    Répondez par : (oOyYnN)"
texte="
    (remarque  : il manque des soulignés dans le nom des fichiers !!!)
    le but principal de ce sous programme est de créer le fichier
    $fich_fstab_conc
    qui contiendra les uuid des sysèmes avec boot séparé

    il met a disposition le fichier $res_blkid
    qui contient le résultat de la commande sudo blkid
	
    il crée aussi (pour info d analyse) le fichier
	        DevSd_UBoot_UPart-$num.txt
    qui contiendra entre autre le fichier /etc/fsab des partitions présentes
	
    le fichier
            "$fich_fstab_court" 
    qui contient pour chaque partition 
	DevSd=\"/dev/sdxx\" UPart=\"uuid de la partition avec boot\" UBoot=\"uuid du boot\"
    
    et le fichier 
	"$fich_fstab_long"

 comment ? partie délicate
	récupération des dev existants par sudo blkid

	pour les partitions déjà montées (via mount)
	        lecture et traitement de <partition>/etc/fstab

	et pour chacune des autres partitions
	montage
	        lecture et traitement de <point de montage>$fich_recup
	démontage

 			SOUS-PROGRAMME DE MODIF GRUB
			tapez O puis valider pour continuer
			tapez A puis valider pour arrêter 

			O pour continuer / A pour arrêter le programme  
       "
       
reponse=`zenity --entry --title "$titre" --text "$texte" --width "800"`
case $reponse in
	[oOyY]	)	:												;;
	[aA]	)											exit 1	;;
	*		) 	echo "$reponse utilisez seulement oOyYnN S.V.P."			;;
esac	
done
}


function rech_uuid_dev { # si $1 est dans dev[] renvoi l'uuid correspondant
for i in ${!dev[@]}
do
	[[ "$1" = ${dev[$i]} ]] && uuid=${uuid[$i]} && break
done
}

function rech_uuid_label { # si $1 est dans label[] renvoi l'uuid correspondant
for i in ${!dev[@]}
do
	[[ "$1" = ${label[$i]} ]] && uuid=${uuid[$i]} && break
done
}


function ecrit_uuid1_uuid2 {  # recoit $1 $2 sous la fore UUID= ou LABEL= ou /dev/sdxx
# écrit uuid1-uuid2 et uuid2-uuid1 dans $fich_fstab_conc
# en remplacant le label ou le /dev/sdxx par l'uuid correspondant
# et en enlevant UUID= et LABEL=
uuid1=""
uuid2=""

echo "fonction ecrit_uuid1_uuid2 $1 $2"

#pour le premier paramètre
debut=`echo "$1" | cut -c1-5`
uuid=""
case "$debut" in
		\/dev\/ )
			rech_uuid_dev "$1" # /dev/sdxx on recherche l'uuid correspondant
			uuid1="$uuid"
		;;
		UUID\= )
			uuid1=`echo "$1" | cut -c6-` 			# si UUID= on prend ce qui se trouve après = 
		;;
		LABEL )
			rech_uuid_label `echo "$1" | cut -c7-`	# si LABEL on prend ce qui se trouve après = 
			uuid1="$uuid"							# et on recherche l'uuid correspondant
		;;
esac

#même chose pour le deuxième paramètre
debut=`echo "$2" | cut -c1-5`
uuid=""
case "$debut" in
		\/dev\/ )
			rech_uuid_dev "$2" # /dev/sdxx on recherche l'uuid correspondant
			uuid2="$uuid"
		;;
		UUID\= )
			uuid2=`echo "$2" | cut -c6-`			# UUID= on prend ce qui se trouve après = 
		;;
		LABEL )
			rech_uuid_label `echo "$2" | cut -c7-`	# LABEL on prend ce qui se trouve après =
			uuid2="$uuid"							# et on recherche l'uuid corespondant
		;;
esac

if [[ -n $uuid1 ]] && [[ -n $uuid2 ]]
then
# on écrit les deux combinaisons possibles , plus simple à traiter ensuite
echo $uuid1-$uuid2		>> $fich_fstab_conc
echo $uuid2-$uuid1		>> $fich_fstab_conc
fi

echo "fin de fonction ecrit_uuid1 uuid2 =1=>$uuid1<=== =2=>$uuid2<==="
}



function ecrit_ligne_court {	# ecrit $1 $2 $3 formatés dans un fichier
								# et si $3 (UBoot) non vide
								# uuid1-uuid2 dans UBoot_UPart

printf "DevSd=%-18s UPart=%-36s UBoot=%-36s\n" "$1" "$2" "$3" >> $fich_fstab_court

if [[ -n "$3" ]]			# si uboot non vide
	then
		ecrit_uuid1_uuid2 "$2" "$3" # envoie uuid de partition et uuid de boot
	fi
}


function trans_ligne_fstab { # récupère les champs d'une ligne
# champ1 champ2 champn mais on ne s'intérese qu'aux champs 1 et 2

# champ1 : UUID=uuid ou LABEL=label ou le dev [non traités : PARTUUID= PARTLABEL=]
# champ2 : le point de montage

champ1=`echo "$1"|awk -F" " '{printf ("%s",$1)}'`	# bloc spécial ou système de fichiers distant à monter	
champ2=`echo "$1"|awk -F" " '{printf ("%s",$2)}'`	# c'est le point de montage

case "$champ2" in
		\/ )
			dev_part=$champ1	# si champ2 est /     on positionne dev_part sur champ1
		;;
		\/boot )
			dev_boot=$champ1	# si champ2 est /boot on positionne dev_boot sur champ1
		;;
esac
}

# début du programme 
#########################################################################################
# variables
                 num=`date +%Y:%m:%d`-`date +%H:%M:%S`
           res_blkid="blkid-res.txt"				# résultat de sudo blkid
     fich_fstab_long="DevSd_UBoot_UPart-$num.txt"	# résultant commenté
    fich_fstab_court="DevSd_UBoot_UPart.txt"		# résultant court	DevSd=...U1...U2
     fich_fstab_conc="UBoot_UPart.txt"				# résultant concaténé UUID1-UUID2
 fich_fstab_conc_num="UBoot_UPart-$num.txt"			# sauvegarde,à supprimer manuellement
             rep_mnt=/mnt/jpb-$num					# répertoire pour montages/démontages
          fich_recup=/etc/fstab						# fichier à récupérer dans part.
#########################################################################################

[[ -e $fich_fstab_court ]] && rm $fich_fstab_court

echo "# $num : couples uuid-boot - uuid-systeme des menuentry en boot séparé" > $fich_fstab_conc 

OK 								# présentation du programme  / sortie ou non

reponse=""
while [[ $reponse != [oOyYnNaAcC] ]]
do
titre="récupération des UUID et LABEL des partitions des disques"
texte="
			Récupération des infos dans les fichiers $fich_recup des partitions
			ce programme travaille avec sudo pour
			récupérer les dev (blkid)
			effectuer des montages/démontages
			il vous demandera donc votre mot de passe d'administration

	répondez par	
			(oOyY) pour lancer la commande sudo blkid ( remise à jour du fichier) 
			(aA)   pour arrêter ce programme

					O pour récupérer les devices via SUDO
					A Arrêter
"
reponse=`zenity --entry --title "$titre" --text "$texte" --width "800"`
case $reponse in
	[oOyY]	) sudo blkid > $res_blkid								;;
	[aA]	) echo "arrêt du programme" 				; exit 1	;;
	*		) echo "$reponse utilisez seulement oOyYaA S.V.P."				;;
esac
done


# récupération des dev label et UUID 
unset uuid
unset label
unset bdev		# V31 pour boot séparé
unset bmont 	# pour le point de montage à cause du boot séparé
unset btype 	# le type de la partition


maxuuid=-1
while read ligne 		# lecture et traitement du fichier généré par sudo blkid
do
# c'est le même script que dans modif-grub
# certaine lignes sont inutiles mais je les ai laissées
	[[ -z $ligne ]] && echo "ligne vide je passe" && continue		# correction ligne vide
	((maxuuid++))
	tableau=($ligne) # découper la ligne en champ

	# le dev est le premier champ
	tmp=`sed 's/://g' <<< ${tableau[0]}` # donne /dev/sdxx
	[[ -z `grep "^\/dev" <<< $tmp` ]] && echo \
		&& echo "il manque /dev dans la ligne $ligne du fichier de référence UUID-LABEL" \
		&& exit 1

	# init variables d'indice maxuuid
	   dev[maxuuid]=$tmp		# le dev de la ligne blkid
	  label[maxuuid]=""			# le label de la ligne blkid
	   uuid[maxuuid]=""			# l'uuid de la ligne blkid
	  btype[maxuuid]=""			# le type de la ligne blkid
	mnt_dev[maxuuid]="1"		# modifié par mount : 0 si le dev est monté
	  p_dev[maxuuid]=""			# modifié par mount : point de montage

	# echo ${tableau[@]}			# liste des indices

	# positionnemnt des variables d'indice maxuuid en fonction de la ligne blkid	
	for champ in ${tableau[@]}
		do
			deb=` echo $champ | cut -c1-5`
			case $deb in
				LABEL)		# en enlevant les guillemets donne U16.04-b7
					label[maxuuid]=`sed 's/"//g' <<< ${champ##*=}`
					;;
				UUID\=)		# en enlevant les guillemets donne c63335c7-b....2be94
					uuid[maxuuid]=`sed 's/"//g' <<< ${champ##*=}`
					;;
				TYPE\=)		# en enlevant les guillemets donne swap ntfs ext4 ....
					btype[maxuuid]=`sed 's/"//g' <<< ${champ##*=}`
			esac
		done

done <$res_blkid


#récupération des partitions déjà montées

mount | grep '^\/dev' > tmp.txt
#     1         2   3        4    5    6
#    /dev/sda11 on /media/SH type ext4 (rw,relatime,data=ordered)

	# remarque :
	# awk -F" " '{printf ("%s ",$1)}' tmp.txt 
	# donne
	# tous les dev séparés par une espace grace à "%s "

	# awk -F" " '{printf ("%s ",$3)}' tmp.txt 
	# donne
	# tous les points de montage séparés par une espace grace à "%s "

mdev=(`awk -F" " '{printf ("%s ",$1)}' tmp.txt`)	# les dev montés dans un tableau
mont=(`awk -F" " '{printf ("%s ",$3)}' tmp.txt`)	# les points de montage dans un tableau


# positionnement montée ou non de chaque dev
for i in ${!dev[@]}						# pour tous les indices des dev
do
	for j in ${!mdev[@]}				# pour tous les indices des partitions montées
		do
			if [[ "${dev[$i]}" = "${mdev[$j]}" ]]
				then
					mnt_dev[i]="0"			# 0 indique que le dev est montée
					p_dev[i]=${mont[$j]}    # le point de montage du dev
					break
				fi
		done
done


# sortie des uuid label pour info
		[[ -e "tmp_u_l.txt" ]] && rm "tmp_u_l.txt"
echo
		p=0
		while [[ $p -le $maxuuid ]]
		do
			    aff_dev="${dev[$p]}"	 	# jamais vide
			aff_mnt_dev="${mnt_dev[$p]}" 	# vaut 0 (monté)  ou 1 (non monté)
			  aff_p_dev="${p_dev[$p]}"		# (affichage en fonction du précédent)
			# pour les corrections d'affichage 
			 aff_uuid="${uuid[$p]}"		&& [[ -z "$aff_uuid"	 ]]	&& aff_uuid="_"
			aff_label="${label[$p]}"	&& [[ -z "$aff_label"	 ]]	&& aff_label="_"
			aff_btype="${btype[$p]}"	&& [[ -z "$aff_btype"	 ]]	&& aff_btype="_"

			case $aff_mnt_dev in
			0)
				printf "%02s %-10s %-36s LABEL %-20s sur %-20s TYPE : %-10s\n" $p $aff_dev $aff_uuid $aff_label $aff_p_dev $aff_btype  | tee -a tmp_u_l.txt ;;
			1)
				printf "%02s %-10s %-36s LABEL %-20s                          TYPE : %-10s\n" $p $aff_dev $aff_uuid $aff_label  $aff_btype			| tee -a tmp_u_l.txt ;;
			esac	

			((p++))											
		done

reponse=""
titre="concordances     dev<=>LABEL<=>UUID<=>point de montage (de blkid)     Visualiser   puis Valider pour continuer"
zenity --text-info --title "$titre" --filename "tmp_u_l.txt" --height "640" --width "1280" --font "Courier New Bold 10"
code=$?
if [[ $code -eq 0 ]]
then
	echo "OK je continue"
else
	echo ; echo "Annulation demandée" ; echo ; exit 1
fi


##################################################
# pour cette partie il est absolument nécessaire d'avoir une liste des dev corrects
# d'où le sudo blkid effectué plus haut !
##################################################

echo "récupération des fstab de toutes les partitions"			 > $fich_fstab_long
echo 															>> $fich_fstab_long

############################################################
echo "pour les partitions déjà montées :" 						>> $fich_fstab_long
echo ${!dev[@]}

for i in ${!dev[@]} # pour tous les indices du tableau dev

	do
		echo $i ${dev[$i]} ${mnt_dev[$i]}
		[[ ${mnt_dev[$i]} = "1" ]]	&& continue		# non monté suivant !
		[[ ${btype[$i]} = "ntfs" ]]	&& continue 	# ntfs      suivant !
		[[ ${btype[$i]} = "swap" ]]	&& continue 	# swap      suivant !
		# on pourrait en ajouter d'autres

		echo  													>> $fich_fstab_long
		echo ${dev[$i]} "montée sur" ${p_dev[$i]} 				>> $fich_fstab_long

		#pour chaque dev monté on récupére les infos de fstab
		fich=${p_dev[$i]}$fich_recup 
		fich=`sed 's/\/\//\//g' <<< $fich` # supprime les doubles // (à cause de  //etc/fstab)

		echo $fich	#soit /etc/fstab soit /xxx/xxx/etc/fstab
		
		if [[ -e $fich ]]
			then
				echo  											>> $fich_fstab_long
				echo "$fich de ${dev[$i]}"  					>> $fich_fstab_long
				# on ne garde que les lignes non commentées et non vide

				dev_part=""
				dev_boot=""
				while read l_fstab
					do
						tmp=` grep '^[[:blank:]]*\#' <<< $l_fstab`
						#si tmp n est pas vide , elle commence par #
						if [[ -z $tmp ]] && [[ -n $l_fstab ]]
							then 
								echo $l_fstab >> $fich_fstab_long
								trans_ligne_fstab "$l_fstab"
							fi
					done < $fich
		ecrit_ligne_court "${dev[$i]}" "$dev_part" "$dev_boot"
			else
				echo 									>> $fich_fstab_long
				echo "pour ${dev[$i]} (${label[$i]}) /etc/fstab est inexistant"	>> $fich_fstab_long
			fi
	done

echo >> $fich_fstab_long

##############################################################
echo "pour les partitions non montées :" >> $fich_fstab_long


if [[ -e "/mnt" ]]
then
	echo "réperoire /mnt présent"
else
	echo "le répertoire /mnt n'existe pas !!!"
	exit 1
fi


rep_mnt_tmp="/mnt/jpb-$num"
echo "création du répertoire $rep_mnt_tmp pour monter les partitions"

sudo mkdir $rep_mnt_tmp

for i in ${!dev[@]} # pour tous les indices du tableau dev
do
	echo $i ${dev[$i]}

	[[ ${mnt_dev[$i]} = "0" ]]	&& continue		# montée    suivant !
	[[ ${btype[$i]} = "ntfs" ]]	&& continue 	# ntfs      suivant !
	[[ ${btype[$i]} = "swap" ]]	&& continue 	# swap      suivant !

	echo
	echo "traitement de $i ${dev[$i]} (${btype[$i]})"
	echo "montage de       ${dev[$i]} sur $rep_mnt_tmp"
	sudo mount ${dev[$i]} $rep_mnt_tmp
	code=$?
	
	echo "code de retour montage de ${dev[$i]} sur $rep_mnt_tmp : $code"
	if [[ $code = 0 ]]	# si le montage est réussi
		#################### montage réussi ####################
		then
			fich=$rep_mnt_tmp/etc/fstab
			if [[ -e $fich ]]
				then
					echo 							>> $fich_fstab_long
					echo ${dev[$i]} montée sur $rep_mnt_tmp	>> $fich_fstab_long
					dev_part=""
					dev_boot=""					
					while read l_fstab
							do
								tmp=` grep '^[[:blank:]]*\#' <<< $l_fstab`
								# si ne commence pas par # , tmp est vide 
								# et si la ligne n'est pas vide on l'écrit
							if [[ -z $tmp ]] && [[ -n $l_fstab ]]
								then 
									echo $l_fstab 					>> $fich_fstab_long
									trans_ligne_fstab "$l_fstab"
								fi
							done < $fich
		ecrit_ligne_court "${dev[$i]}" "$dev_part" "$dev_boot"
				else
		echo															>> $fich_fstab_long
		echo "pour ${dev[$i]} (${label[$i]}) /etc/fstab est inexistant" >> $fich_fstab_long
				fi
			# puis on le démonte avec boucle sinon le démontage ne se fait pas toujours
			boucle=0
			code=1
			while [[ $code -ne 0 ]]
			do
				sudo umount "$rep_mnt_tmp"
				code=$?
				echo "boucle $boucle  : ${dev[$i]} code de retour de umount $code"
				if [[ $code = 0 ]]
					then
						echo 
						echo "boucle $boucle : ${dev[$i]} démontage effectué (code retour $code)"
						ls -ails $rep_mnt_tmp
					else
						echo
						echo "boucle $boucle : ${dev[$i]} non démonté (code retour $code)"
						sleep 1 # attente en cas de non démontage
						((boucle++))
						if [[ $boucle -ge 10 ]]
							then
								echo "problème de démontage de ${dev[$i]}"
								exit 1
							fi	
					fi
			done # boucle while
		############################ échec de montage ###################
		else
			echo																	>> $fich_fstab_long
			echo "impossible de monter ${dev[$i]}  code echec de montage :$code"	>> $fich_fstab_long
		fi
done # boucle for i dev

echo ; echo
echo "fin de récupération des données de /etc/fstab des partitions présentes sur la machine"
echo ; echo

# sauvegarde de UBoot_UPart pour une utilisation personnelle
cp "$fich_fstab_conc" "$fich_fstab_conc_num"

echo "suppression du répertoire $rep_mnt_tmp en cours"
sudo rmdir $rep_mnt_tmp
code=$?

if [[ $code -ne 0 ]]
	then 
	#rmdir: échec de suppression de '/mnt/jpb-2017:03:11-12:02:43': Périphérique ou ressource occupé
		echo
		ls -ails /mnt/jpb*
		echo "vérifier le contenu du répertoire /mnt/jpb"
		echo "faire le ménage dans ce répertoire"
		exit 1
	fi

echo "supression réussie"
echo "fin normale du programme $0"
exit 0

EDIT ligne 320 (sans conséquence)

Dernière modification par ar barzh paour (Le 20/03/2017, à 09:48)


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#161 Le 18/03/2017, à 23:48

Babdu89

Re : [Projet terminé] correction anomalie de grub

Bonsoir.

Depuis une autre machine, avec 4 hdd internes, contenant pas mal d'os.
Les scripts recup_fstab_V3 et modif__grub_V37 fonctionnent correctement aussi, chez moi.

Constat.
État des lieux;
Depuis la nouvelle config, mise à jour de grub des Os de la clé de tests, pour avoir des grub.cfg correcte

Testé depuis les Os, sans et avec partition /boot séparé (les Os de tests de la clé de tests).
Dossiers de tests créés dans /boot/grub des deux Os, contenant une copie du ficher grub.cfg à traiter par les scripts. Ceci pour préserver les fichier originaux.

Depuis les deux Os.
Les label des partitions lorsque présents ==>OK.
Les label dans les blocs submenu et menuentry avec nom de l'Os indiqué (modif dans /etc/default/grub), label suivi du nom de l'os ==> OK.
Blocs menuentry de l'Os avec partition /boot séparé (UUID différents) conservé dans les deux grub.cfg (avec et sans /boot séparé).==> OK.
Blocs menuentry à supprimer avec UUID différents, (multiplication de menuentry) supprimés ==> OK.
Fichiers grub.cfg modifiés par les script, traité plusieurs fois, plus de répétition des label dans les menuentry. ==> OK.

Tous les fichiers de travail des scripts sont laissés dans le dossier personnel et dans les dossiers de test dans /boot/grub. Même les fichiers tmp0, tmp1,tmp2, .
Si ce n'est pas supprimé, ou "rangé" dans des dossiers créé à cet effet, comme on va utiliser les scripts assez souvent, du fait de nouvelles installations, mises à jours système et autres maj de Grub. Çà va vite faire "fouillis" .
Qu'en penses -tu?.

Je teins à disposition les fichiers grub.cfg originaux et traités, les retours terminal, et fichiers de travail, pour les poster si nécessaire.

@+.   Babdu89  .


J'ai découvert Ubuntu avec la 07.10.... Et alors?!...  Depuis je regarde de temps en temps si Windows marche toujours....

Hors ligne

#162 Le 20/03/2017, à 08:46

ar barzh paour

Re : [Projet terminé] correction anomalie de grub

bien content que cela fonctionne

Babdu89 a écrit :

Tous les fichiers de travail des scripts

pour ces fichiers créés quelle méthode proposerais-tu ?

quelques solutions à choisir , je m'y mettrai dès que j'aurai quelque temps
- mise de ces fichiers dans un répertoire particulier , la suppression étant laissée à l'initiative de l'utilisateur
- je pense qu'il est aussi assez facile de les mettre dans /tmp
- suppression automatique de ces fichiers par le bash
- à la fin du bash demande si l'utilisateur veut supprimer les fichiers
- autres suggestions ....

par contre je garderai le fichier de sauvegarde du grub dans /boot/grub laissant à l'utilisateur le soin de le supprimer

Dernière modification par ar barzh paour (Le 20/03/2017, à 09:45)


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#163 Le 20/03/2017, à 11:46

Babdu89

Re : [Projet terminé] correction anomalie de grub

Bonjour.
Ah oui, j'oubliai aussi la multiplication de ces fichiers de travail, si l'utilisateur lance le script pour traiter les fichiers grub.cfg des autres Os de la config, depuis l'Os qui démarre la machine par défaut.
Je pense qu'il y a des fichiers qui peuvent être supprimé à la fin du traitement
Mais d'autres qui seraient à garder. Je pense à ;
blkid-res.txt et les sauvegardes des fichiers grub.cfg originaux à traiter.
Lors de mes tests, je faisais un dossier de travail dans /boot/grub de l'Os par défaut au démarrage. Il pourrait servir à stocker les fichiers de sauvegardes des grub.cfg . Il pourrait avoir comme nom "sav-grub.cfg" . Et que ce soit les script qui créé ce dossier, et y stocke les sauvegardes dedans.
Je faisais aussi un dossier dormant (ZZZ) dans le dossier personnel de l'Os par défaut au démarrage, pour y déplacer les fichiers de travail créés dans le dossier personnel.

Tu disais aussi qu'il valait mieux faire une maj de Grub de l'os qui sert à lancer le script, (Os par défaut au démarrage) avant de traiter son fichier grub.cfg.
Çà ne peut pas être la première manip que ferait les script, en l'incluant dedans? Il faut réfléchir aux conséquences...

@+.    Babdu89   .


J'ai découvert Ubuntu avec la 07.10.... Et alors?!...  Depuis je regarde de temps en temps si Windows marche toujours....

Hors ligne

#164 Le 23/03/2017, à 19:18

ar barzh paour

Re : [Projet terminé] correction anomalie de grub

pour répondre à ton post 163

je ne retiens pas la mise à jour automatique de grub ,
trop compliqué à mettre en oeuvre correctement

plusieurs fichiers temporaires sont maintenant supprimés automatiquement
d'autres non

ils sont conservés
soit dans le répertoire ZZZnum du répertoire d'appel
soit dans le répertoire d'appel pour blkid-res.txt et UBoot-Upart.txt

et en fin de traitement un petit programme propose une suppression des fichiers

remarque :j'ai repris cette portion de script et l'ai appelé supZZZnum
il est disponible dans un post suivant
il faut le mettre dans le même répertoire que modif_grub
quand on le lance il propose une suppression des fichiers temporaires de ZZZnum

dernière version : modif_grub_V41 et de recup_fstab_V5
voir au début du script quelques explications de fonctionnement

que je reprends ici
###########################################################################
# résumé des actions effectuées
# modif_grub permet
#  - de raccourcir la longueur d'un fichier au format grub en y supprimant des menus inutiles
#  - d'ajouter un label à un menu de grub pour avoir une présentation plus claire
#         pour cela deux solutions :
#                        - utilisation du label de la partition
#                        - utilisation d'un fichier personnel au format blkid
#         lorsqu'un label est modifié et que l'on retraite le fichier , ce label sera
# - l'action de remplacement d'un grub réel demande à l'utilisateur des précautions d'usage
#            être capable de revenir en arrière si problème !
#            c'est à dire être capable de remettre le grub d'origine
###########################################################################
###########################################################################
# les fichiers créés
#     les fichiers créés par recup_fstab
#         le fichier blkid-res.txt      ( correspondance dev-uuid-label)
#         le fichiers UBoot-UPart.txt   ( cas des OS avec boot séparé)
#     les fichiers créés par recup_fstab dans ZZZnum
#         le fichier DevSd-UBoot-UPart-<date> : contient les fichiers de /etc/fstab
#         le fichier UBoot-UPart-<date>.txt   : copie de  UBoot-UPart-<date>.txt
#
#     les autres fichiers qui sont créés dans ZZZnum par modif_grub
#         le fichier grub-OK-<date>-<....>.txt destiné à remplacer le fichier traité
#            ce fichier n'apparait plus si on a demandé le remplacement du fichier traité
#                 mais dans ce cas le fichier traité est sauvegardé (dans son nom-<date>)
#         les fichiers suivants sont plus ou moins intéressant à analyser
#             fichier grub-sup : contient les menus qui ont été supprimés
#             fichier stat-<date> : contient nombre de menus/lignes conservés/supprimés
#             fichier grub-mod : contient la 1ére ligne d'un menu qui a été modifié
#                                           ou qui a été conservé pour une raison X
#             les fichiers tmp[012]-<date> (coupures du fichier traité)
#############################################################################


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#165 Le 23/03/2017, à 19:20

ar barzh paour

Re : [Projet terminé] correction anomalie de grub

EDIT 2020-04-22 : pour la dernière version :voir
le fichier le fichier modif_grub_V46_bis post 178
https://forum.ubuntu-fr.org/viewtopic.p … #p22261874

le fichier recup_fstab_V8 post 179
https://forum.ubuntu-fr.org/viewtopic.p … #p22261876



Fichier modif_grub_V41 la dernière version est en post 172 (V44)

#!/bin/bash
#########################################################################################
# résumé des actions effectuées
# modif_grub permet
#  - de raccourcir la longueur d'un fichier au format grub 
#       en y supprimant des menus inutiles (menu contenant /dev /dev , uuid différents)
#    le fichier à traiter doit contenir
#                pemière ligne  : un commentaire commençant par #
#                la ligne       : ### BEGIN /etc/grub.d/10_linux ###
#
#                si la ligne    : ### BEGIN /etc/grub.d/40_custom ### apparait
#                seules les lignes entre 10_linux et 40_custom seront traitées
#                si cette ligne n'apparait pas
#                ce sont les lignes de 10_linux à la fin qui seront traitées           
#
#    un menu doit être de la forme 
#          menuentry ' ............ {  ou   menuentry " ..........{
#          des lignes intermédiaires à priori quelconques
#          la ligne terminant le menu ........ }
#
#    aucun caractère [hors blancs] ne doit apparaître après un { ou un }
#
#    un submenu doit être de la forme
#          submenu '................{ ou submenu "................{
#          des lignes quelconques ?
#          de menus au format ci-dessus
#          une ligne de fermeture    ......}    aucun caractères [hors blancs] après }
#          si cette ligne fait partie d'un menu elle sera alors de la forme
#               .........}    }
#       
#  - d'ajouter un label à un menu de grub pour avoir une présentation plus claire
#         pour cela deux solutions : 
#                        - utilisation du label de la partition
#                        - utilisation d'un fichier personnel au format blkid
#         lorsqu'un label est modifié et que l'on retraite le fichier , ce label sera 
# - l'action de remplacement d'un grub réel demande à l'utilisateur des précautions d'usage
#            être capable de revenir en arrière si problème !
#            c'est à dire être capable de remettre le grub d'origine
#########################################################################################
#########################################################################################
# les fichiers créés
#     les fichiers créés par recup_fstab
#         le fichier blkid-res.txt      ( correspondance dev-uuid-label)
#         le fichiers UBoot-UPart.txt   ( cas des OS avec boot séparé)
#     les fichiers créés par recup_fstab dans ZZZnum
#         le fichier DevSd-UBoot-UPart-<date> : contient les fichiers de /etc/fstab
#         le fichier UBoot-UPart-<date>.txt   : copie de  UBoot-UPart-<date>.txt
#
#     les autres fichiers qui sont créés dans ZZZnum par modif_grub
#         le fichier grub-OK-<date>-<....>.txt destiné à remplacer le fichier traité
#            ce fichier n'apparait plus si on a demandé le remplacement du fichier traité
#                 mais dans ce cas le fichier traité est sauvegardé (dans son nom-<date>)
#         les fichiers suivants sont plus ou moins intéressant à analyser
#             fichier grub-sup : contient les menus qui ont été supprimés
#             fichier stat-<date> : contient nombre de menus/lignes conservés/supprimés 
#             fichier grub-mod : contient la 1ére ligne d'un menu qui a été modifié
#                                           ou qui a été conservé pour une raison X
#             les fichiers tmp[012]-<date> (coupures du fichier traité) 
#########################################################################################

# quelques points d'historique

# V41 2017-03-23
#     prend en compte le changement de label par un autre label
#     ne fonctionnera que
#     si on traite un grub modifié par modif_grub à partir de V7 
#     remarque on peut aussi repartir d'un grub tout neuf par update-grub
#     les grub de tous les OS doivent être dans cet état
#     on peut le voir si la ligne du menu entry comporte  : après le label
#     exemple     	menuentry 'U16.04-P10-64b : Ubuntu, avec Linux .......  
#     par contre la ligne suivante avec un nouveau label NOUVEAU
#     	menuentry 'M16.04-P12-64b,Ubuntu  (sur /dev/sda12)' 
#     deviendrait
#     	menuentry 'NOUVEAU : M16.04-P12-64b,Ubuntu  (sur /dev/sda12)'

# V40 qui fonctionne avec recup_fstab_V5
#     les fichiers créés prennent un nom plus long (répertoire complet)
#     les statistiques sont conservées dans ZZZnum/stat-<date>
#     pour des raisons d'affichage , les _ des noms de fichiers créés sont remplacés par des -

# V39 répertoire des fichiers temporaires ZZZnum
#    demande de suppression fichers

# V38 avec recup_fstab_V4
#       ajout de l'option --sansfstab (permet de na pa lancer recup_fstab)
#  ===> la création du fichier de concordance UUID-Part-UUIDBoot ne sera pas faite
#       (hors ce fichier est nécessaire à modif_grub )
#       et le fichier blkid ne sera pas mis à jour automatiquement

# V35 le programme ne traite plus que les lignes comprises entre 
#     ### BEGIN /etc/grub.d/10_linux ###
# et
#     ### BEGIN /etc/grub.d/40_custom ###
#    le fichier à traiter doit commencer par un #
#    la ligne ### BEGIN /etc/grub.d/10_linux ### est obligatoire
#    mais ne doit pas commencer le fichier
#    si la ligne ### BEGIN /etc/grub.d/40_custom ### est absente
#    le programme traitera le fichier de 10_linux jusqu'à la fin

# V34 suppression de certaines fonctions devenue inutiles
#     réorganisation de certaines fonctions

# V33 ajout du sous programme recup_fstab_V2 ( étude système à boot séparé)

# V30 idem V29 sans les commentaires superflus
# si boot séparé on sort !!!!

# V29 2017-03-09
# correction due à l'utilisation de ${#uuid[*]} dans la construction concordance label-uuid
# remplacement de tous les while ${#menu[*]} par for ${!menu[@]}

# V28 2017-03-08
# présentation de concordances UUID-LABEL
# un ligne menuentry et submenu peut comporter des blank après   } 
# une ligne peut se terminer par }  }

#V26 function sort_info_transforme donne des traces

# V25 
# chaine_linux="linux.*\/vmlinu" pour prise en compte de "linux	/@/boot/vmlinuz"

# V8 2017-02-14
# adjonction critere_suppression_2
# suppression des menus qui ont des UUID différents dans search --no-floppy et dans linux /boot/
# conservation des menus qui n'ont pas de lignes search --no-floppy
# conservation des menus qui n'ont pas de lignes linux /boot/vmlinu
# anomalie redoublement label , non modification de la ligne submenu

# V7 2017-02-13
# la ligne de submenu est recherché par submenu ' ou par submenu " au lieu de submenu 'Options ..... 
# l' UUID (et donc le label) est récupéré dans le bloc suivant de menuentry


# V6 2017-02-13
# on récupère l'UUID dans la ligne search --no-floppy --fs-uuid --set=root du bloc

# V5 2017-02-12
# seules les lignes commençant par menuentry et finisant par { seront traitées comme menuentry
#       (le test se fait par ^[tab ]*menuentry.*{$)

# V4 2017-02-10
# il y aura suppression du menu si on trouve  ....../dev/sd...../dev/sd...... AVANT la chaine --class  ,
########################################################################################    




function confirmation_sortie {
	declare titre="Sortie de $0"	
	declare	ok="Confirmer la sortie"
	declare	texte="Pour Validez la sortie cliquer sur \"$ok\""
	declare	cancel="Abandonner la sortie"

	if zenity --question --title "$titre" --text "$texte" \
              --no-wrap --ok-label "$ok" --cancel-label "$cancel"
		then
			exit 63
		fi
}

function suppression_fichiers_temporaires {
    repertoire_a_vider="./$ZZZnum"
    fich="/tmp/liste_fichier.txt" # contient la liste des fich. du rép. à supprimer
    oklabel="Sortir si EXIT coché  / Supprimer fichiers cochés sinon"
    cancellabel="Re-cocher toutes les cases (sauf grub-OK)"
	texte="
        Des fichiers ont été créés lors de l'exécution du programme
            $0
        ci dessous ces fichiers encore existants dans le répertoire
        "$repertoire_a_vider"

        Pour supprimer des fichiers 
            1- Décocher la case EXIT 
            2- Cochez le case des fichiers que vous voulez supprimer
            3- Cliquer sur $oklabel
               ==> ce menu se relancera en indiquant
                   les fichiers encore existants

        Pour SORTIR de ce menu une seule solution
               Cochez la case EXIT puis cliquez sur \"$oklabel\"

         pour Recocher la case de tous les fichiers (sauf grub-OK) cliquer sur					
             $cancellabel
            "
while :
	do
		# listage des fichiers du répertoire
		ls "$repertoire_a_vider" > "$fich" # ligne à supprimer en réel
		liste_fichier="TRUE EXIT_(Sortir_du_menu)"
		while read ligne
			do                                    # problème zenity ?
				ligne=$(sed "s/ /*/g" <<< $ligne) # remplacer les espaces par *
				case $ligne in
					tmp[012][-_]20*  |     \
					tmp[-_]u[-_]l*      |     \
					tmp.txt       |     \
                    fich[-_]transforme-* | \
                    grub-mod*  |      \
                    stat-20*     |      \
                    DevSd[-_]UBoot* |      \
                    grub-sup-20* |      \
                    UBoot-UPart*         )
					liste_fichier="$liste_fichier TRUE $ligne"
					;;
                    blkid-res.txt |     \
					grub-OK*            )
					liste_fichier="$liste_fichier FALSE $ligne"
					;;
					esac
			done < "$fich"

	#sélection des fichiers à supprimer

	choix=`zenity --list \
	  --title="XXXXXXXXXXXXXXXXXXX : $0" \
	  --text="$texte" \
	  --checklist \
      --cancel-label "$cancellabel" \
      --ok-label "$oklabel" \
	  --height "750" \
	  --width "800" \
	  --column="CONS/SUP" --column="nom du(des) fichier(s) de $repertoire_a_vider" \
	  ${liste_fichier} \
	   	2>/dev/null `	# ne pas effacer cette ligne fin de choix
code=$?
echo "code de zenity $code"
	if [[ $code == 0 ]] # code retour zenity (0=normal,sinon clic/x  , Esc , )
	then
        [[ -n `echo $choix|grep "EXIT"` ]] && exit 0
		if [[ -z $choix ]] # $choix est vide
			then
				echo "Aucun choix effectué"
				continue # on recommence
			else
                echo "le choix est :"
                echo "$choix"
				IFS="|"
				list=($choix)
				echo "le 1er  est ${list[0]}"
				echo "le 2ème est ${list[1]}"
                echo ${list[@]}
				IFS="$OLDIFS"			
                 if zenity --question --title "SUPPRESSION" \
                          --text "Suppression de ${#list[@]} fichiers" \
                          --no-wrap --ok-label "Confirmer Suppression" \
                          --cancel-label "Abandonner la Suppression"
                  then
				  for i in ${list[@]}
				    do
					   i=$(sed "s/*/ /g" <<< $i) #remettre espace à la place des *
				       echo "je supprime $repertoire_a_vider/$i"
					   rm "$repertoire_a_vider/$i"
				    done
		           fi
                
                continue # on recommence
			fi
	else 
		[[ $code == 1 ]] && continue # on a cliqué sur Re-cocher
	fi
    confirmation_sortie
done
}

function ne_commence_pas_par_begin {
# le fichier à traiter ne doit pas commencer par ### BEGIN /etc/grub.d/10_linux ###
read ligne < "$fich_source"
if [[ "$ligne" =~ ^"$deb" ]]
	then
		echo ; echo
		echo "désolé"
		echo "si le fichier grub à traiter ( $fich_source )"
		echo "n'a pas le droit de commencer par la ligne"
		echo "$deb"
		echo "rappel :" 
		echo "    1- cette ligne"
		echo "       $deb"
		echo "       DOIT apparaître plus loin dans le fichier"
		echo "            même pour un fichier grub d'essai"
		echo
		echo "    2- le fichier à traiter DOIT commencer par une ligne de commentaire"
		echo "         (car cette première ligne sera modifiée)"
		echo
		echo "    3- en réel le fichier grub commence par #"
		exit 1 # au lieu de return 1
	fi
}

function trier_fichier {
echo ; echo
echo "fichier grub choisi : $fich_source"
deb="### BEGIN /etc/grub.d/10_linux ###"
fin="### BEGIN /etc/grub.d/40_custom ###"

ne_commence_pas_par_begin

# création de 3 fichiers tmp0-<date>.txt tmp1-<date>.txt tmp3-<date>.txt

[[ -e "$fich_source_0" ]] && rm "$fich_source_0" # inutile mais évite message d'erreur rm
[[ -e "$fich_source_1" ]] && rm "$fich_source_1" # inutile mais évite message d'erreur rm
[[ -e "$fich_source_2" ]] && rm "$fich_source_2" # inutile mais évite message d'erreur rm


fich="$fich_source_0"
presence_10_linux=1
IFS="~"
while read ligne
do
	case "$ligne" in
		$deb ) fich="$fich_source_1" ;  presence_10_linux=0		;;
		$fin ) fich="$fich_source_2" 							;;
	esac
	echo "$ligne" >> $fich
done < "$fich_source"
IFS="$OLDIFS"

# après lecture du fichier on a du renconter le ligne 10_linux sinon
if [[ $presence_10_linux -eq 1 ]]
then
	echo "la présence de la ligne $deb est obligatoire"
	echo "le traitement ne commence qu'à partir de cette ligne"	
	echo "ajouter cette ligne au fichier"
	exit 0
fi
	
}


function verifier_presence_dev { # dans le cas d'utilisation d'un blkid personnel
echo
# mettre les dev de "sudo blkid" dans un tableau
dev1=(`awk -F" " '{printf("%s ",$1)}' "$blkid"`)

# mettre les dev du fichier choisi dans un tableau
dev2=(`awk -F" " '{printf("%s ",$1)}' "$blkid_choisi"`)

manque=""
for d1 in ${dev1[@]} # /dev/sdxy: /dev/sdzt: de blkid
do
	res=`grep $d1 <<< ${dev2[@]}`
	[[ -z $res ]] && manque="$manque $d1" # si non trouvé , ajout
done
	if [[ -n $manque ]]
		then 
			echo "dans le fichier $blkid_choisi il manque"
			echo ; echo $manque ; echo
			echo "tous les dev présents sur la machine doivent être déclarés dans ce fichier"
			echo "veuillez éditer ce fichier"
			echo "format habituel dev/sdxx: LABEL=\"xxxx\"  UUID=\"xxxx\""
			echo " la présence de LABEL n'est pas obligatoire" 
			exit 0
		fi
}




function modif_ligne1_grub { # récupère la première ligne et modifie en y mettant la date

res=`echo "$1" | grep "^ *	*#"`



if [[  -n $res ]] # la ligne est bien un commentaire (commence par #)
	then
		trans="#### $num : $fich_source modifié par $0 ####"
		echo $trans			> "$fich_sauv"
		((nb_lignes_cons++))
		((nb_lignes_hors_menu++))
sort_info_transforme "$1" "première ligne modifiée en" "$trans"

	else
		echo "la première ligne du fichier est "
		echo $1
		echo	
		echo "mais il faut que la première ligne du fichier"
		echo "$fich_source"
		echo "commence par un #"
		echo "ajouter cette ligne de commentaire au début de ce fichier"
		echo "arrêt du programme"
		exit 0
	fi #[[ -n $res  ]]

}


function OK {
rep=""
while [[ $rep != [oOyYnN] ]]
do
titre="programme $0        /!\/!\/!\/!\    Répondez par : (oOyYnN)"
texte="cette partie de programme supprime des lignes supposées inutiles de grub 
 - paragraphes  contenant ......$rech_dev.....$rech_dev........... AVANT la chaine $rech_class
 - menuentry n'ayant pas des UUID égaux dans la ligne search et la ligne linux
    (à partir de V34 les menuentry sur boot séparé sont conservés)	

 le programme demande le nom du fichier à traiter .. 
 en réel ce devrait être <partition>/boot/gub/grub.cfg
 et créera un fichier grub-OK-date qui pourra être utilisé pour remplacer le fichier grub
 il utilise aussi le label des partitions ou du fichier de référence 
 pour informer plus précisement la ligne menuentry de grub
 on peut utiliser un fichier de référence uuid label (au format blkid)
 
     remarque :pour des essais , on peut traiter n'importe quel fichier ayant un format grub
     si le fichier à traiter n'est pas au format grub , il ne fonctionnera pas correctement
     et en réel il serait préférable de lancer ce programme après avoir lancé un update-grub

trois fichiers peuvent être créés :
    grub-OK-<aaaa:mm:dd-hh:mm:ss>.txt         (le grub récupérable)
    grub-sup-<aaaa:mm:dd-hh:mm:ss>.txt        (les menuentry qui ont été supprimés)
    grub-mod-<aaaa:mm:dd-hh:mm:ss>.txt        (les lignes modifiées)

	vous pourrez analyser ces fichiers pour voir ce qui s'est passé
    avant de remplacer le fichier traité (surtout si c'est grub.cfg)
    (en fin de traitement répondez alors non à la demande de remplacement
     et faites le remplacement manuellement)

lors du traitement ..... (c'est uniquement une info visuelle)
    les  x  qui défilent indiquent des lignes de menu qui seront supprimées
    les  c  qui défilent indiquent les lignes de menu qui seront conservées
    les  .  qui défilent indiquent les autres lignes  (qui seront conservées)
    un   S  indique un début de submenu
    un   M  indique un début de menuentry
    un   m  indique la suite de menuentry 
 
			tapez O puis valider pour continuer
			tapez A puis valider pour arrêter 

			O pour continuer / A pour arrêter le programme  
       "
       
rep=`zenity --entry --title "$titre" --text "$texte" --width "800"`
case $rep in
	[oOyY]	)	:												;;
	[aA]	)											exit 1	;;
	*		) 	echo "utilisez seulement oOyYaA S.V.P."			;;
esac	
done
}


function choix_fichier_blkid { # retourne 0 si fichier blkid choisi
fichier_source=""
titre="$0               Sélectionnez le fichier contenant UUID et LABEL des partitions"
fichier_source=`zenity --file-selection --title="$titre"`
case $? in	#$? est le code de retour de zenity
 	0)	blkid_choisi="$fichier_source"						            ;;
	1)	echo "Aucun fichier UUID-LABEL sélectionné."	; exit 1	;;
	-1)	echo "Une erreur inattendue est survenue." 		; exit 1	;;	
	*)	echo "erreur non reconnue" 						; exit 1	;;	
esac
}


function critere_suppression_2 { # se fait après une initialisation de menu[0 ...n]

##### attention les codes de retour ont changé
# 0 si ligne search et ligne linux et uuid égaux (menu conservé + label dans menu[0])
# 1 si pas de ligne search ou linux              (menu conservé intégralement)
# ligne search et linux trouvées
# 3 aucun UUID trouvé dans fichier UUID-LABEL
# 2 si uuid différents                           (menu supprimé à revoir?)

uuid_search="x"
uuid_linux="y"

ligne_search=""
ligne_linux=""

# recherche dans le tableau menu[1..n] de la ligne search

#TEST

for i in ${!menu[@]}				# pour tous les indices 0..n
do
	[[ $i = 0 ]] && continue		# sauf dans menu[0]
	res=`grep "$chaine_search" <<< "${menu[i]}"` # dans menu[1..n]
	if [[ -n $res ]]
		then
			ligne_search="${menu[i]}"
			break					# 1er menu[n] trouvé est le bon
		fi

	done


if [[ -z "$ligne_search" ]]
then
	return 1 # pas de chaine search => on conservera le menu intégralement
fi

# recherche dans le tableau menu[] de la ligne linux


for i in ${!menu[@]}				# pour tous les indices 0..n
do
	[[ $i = 0 ]] && continue		# sauf dans menu[0]
	tmp=`sed 's/[[:blank:]]//g'	<<< "${menu[i]}"` #suppression des blank de menu
	res=`grep "$chaine_linux"   <<< "${menu[i]}"` # dans menu[1..n]
	if [[ -n $res ]]
		then
			ligne_linux="${menu[i]}"
			break					# 1er menu[n] trouvé est le bon
		fi

	done


if [[ -z "$ligne_linux" ]]
then
	return 1 # pas de chaine linux => menu conservé sans modif
fi

#uuid ligne search présent dans fichier de réf uuid-label ?
# si trouvé positionne uuid_search
n=-1
while [[ $n -lt $maxuuid ]]
	do
	((n++))					# recherche de uuid[0..n]
	if [[ -n ${uuid[$n]} ]] # précaution supplémentaire uuid non vide
	then
		res=`grep ${uuid[$n]} <<< "$ligne_search"`	#  y-a-t-il l'UUID
		if [[ -n $res ]] 
			then
				uuid_search=${uuid[$n]}
				break 				# le premier uuid trouvé dans blkid sera le bon
		fi
	fi 
done 


# uuid ligne linux présent dans fichier de réf uuid-label ?
# si trouvé positionne uuid_linux
n=-1
while [[ $n -lt $maxuuid ]]
	do
	((n++))					# recherche de uuid[0..n]
	if [[ -n ${uuid[$n]} ]] # précaution supplémentaire uuid non vide 
	then
		res=`grep ${uuid[$n]} <<< "$ligne_linux"`	#  y-a-t-il l'UUID
		if [[ -n $res ]] 
			then
				uuid_linux=${uuid[$n]}
				break 				# le premier uuid trouvé dans blkid sera le bon
		fi
	fi 
done


# analyse des résultats

if [[ ${uuid_search}${uuid_linux} = "xy" ]]
then
	return 3 # aucun des uuid n'a été trouvé dans blkid ( peuvent être égaux ou non )
fi 

####################################################################################
# on peut avoir uuid_search  uuid_linux
#               x            1ea0....  : n'existe pas  , existe       : code retour 2
#               a04f...      y         :   existe      , n'existe pas : code retour 2
#               bcde...      fghi....  : uuids existants et différents: code retour 2
#               1234...      1234....  : uuids existants et égaux     : code retour 0
#####################################################################################



# si $uuid_search-$uuid_linux est dans UBoot on renvoie 4
# ce menu correspond à une partition avec boot séparée

for i in ${!UBoot[@]}		# pour tous les indices 0..n
do

	[[ $uuid_search-$uuid_linux = ${UBoot[$i]} ]] && return 4 

done


if [[ "$uuid_search" != "$uuid_linux" ]]
	then
		return 2 #  uuid différents on supprimera ce menu
	else
		return 0 # uuid egaux on conservera ce menu après modif de menu[0]
fi

} # fin function critere_suppression_2


function ajout_label_menuentry { # ajoute un label à menu[0] (search ou linux)
rech_uuid_label_menuentry "$1" 	# retour 0 si label trouvé , pas zéro sinon
code=$?
if [[ $code -eq 0 ]]
  then # on a un label
	  tmp=${menu[0]}	
#	  menu[0]=`sed "s/menuentry '/menuentry '$label_trouve : /" <<< ${menu[0]}`
#	  menu[0]=`sed "s/menuentry \"/menuentry \"$label_trouve : /" <<< ${menu[0]}`
#	  menu[0]=`sed "s/${label_trouve} *:* *${label_trouve}/${label_trouve}/" <<<${menu[0]}`

# 1 remplacement de l'ancien par le nouveau , (s'il n'y a pas d'ancien ,rien n'est changé)
            menu[0]=`sed "s/menuentry '.* : /menuentry '$label_trouve : /" <<< ${menu[0]}`
            menu[0]=`sed "s/menuentry \" .*: /menuentry \"$label_trouve : /" <<< ${menu[0]}`
# 2 ajout du nouveau en tête
            menu[0]=`sed "s/menuentry '/menuentry '$label_trouve : /" <<< ${menu[0]}`
            menu[0]=`sed "s/menuentry \"/menuentry \"$label_trouve : /" <<< ${menu[0]}`
# 3 suppression des doublons
            menu[0]=`sed "s/${label_trouve} *:* *${label_trouve}/${label_trouve}/" <<<${menu[0]}`






	  if [[ $tmp != ${menu[0]} ]]
		then
			sort_info_transforme "$tmp" "	LIGNE transformée en" "${menu[0]}" 
		fi #[[ $tmp != ${menu[0]} ]]
	  fi # [[ $code -eq 0 ]]
}


function memorise_menuentry { # mémorise menuentry de submenu pour écriture ultérieure
	for  p in ${!menu[@]}	# pour tous les indices de menu[]
		do
			((i_s++))
			ligne_sousmenu[i_s]=${menu[$p]} 	# mémorise menu[0 ..n]
			((nb_lignes_menu_cons++))			# stat
		done 
}


function ecrire_lignes_memorisees { # écrit les lignes dans sauv

for p in ${!ligne_sousmenu[@]}	# pour tous les indices de ligne_sousmenu[]
	do
		echo "${ligne_sousmenu[$p]}" >> "$fich_sauv"	# écriture l_s[0..n]
		((nb_lignes_cons++))							# stat
	done
}


function traite_ligne_submenu { # reçoit $1 (ligne submenu '.......{

fin_submenu=1 # sera mise à 0 si un menuentry se termine par }  }
submenu="$1" #mise en mémoire de cette ligne

# j'utilise la mémorisation label_submenu du label d'un menuentry précédent  

if [[ -n $label_submenu ]]
then
# ajout du label et suppression double label
submenu=`sed "s/submenu '/submenu '${label_submenu} : /"   <<< $submenu`
submenu=`sed "s/submenu \"/submenu \"${label_submenu} : /" <<< $submenu`
submenu=`sed "s/${label_submenu} *:* *${label_submenu}/${label_submenu}/" <<<$submenu`
fi

i_s=0
unset ligne_sousmenu

ligne_sousmenu[0]="$submenu"	# mémorisation pour sortie finale
((nb_lignes_hors_menu++))		# ligne considérée comme hors menu

# lire les lignes qui suivent submenu jusquà trouver ligne ......} hors menuentry)

while read ligne
do
((nb_lignes_lues++))
		# si on trouve .... } hors menuentry on est au bout du submenu
		# il faut sauvegarder la ligne submenu , les lignes intermédiaires et menuentry
		# je ne traite pas du cas où on trouverait une ligne menuentry terminée par  } }
		# V28 et suivante ce cas est traité
		# une ligne menuentry terminée par } } provoque la fin du submenu  ($fin_submenu 0)

# on sort de la boucle si on trouve } en fin de ligne hors menuentry

tmp=`sed 's/[[:blank:]]//g' <<<"$ligne"` # supprime les blancs de la ligne

if [[ "$tmp" =~ }$ || "$fin_submenu" = 0 ]]   ### on est en fin de submenu ###
				# pas tout à fait exact
				# si on peut  avoir { ...... } hors menuentry
		then
			((i_s++))
			ligne_sousmenu[i_s]="$ligne"	# mémoriser cette ligne
			((nb_lignes_hors_menu++))		# stat
			echo -e ".\c"
			ecrire_lignes_memorisees		# écriture de ces lignes de submenu
			label_submenu=""
			return							# fin de traitement de submenu
		fi # [[ "$tmp" =~ }$ ]]

# V28 élargissement aux blancs de grep après {
res=`echo "$ligne" | grep "^[	 ]*menuentry.*{[ 	]*$"`
mem=`echo "$ligne" | grep "^[	 ]*menuentry ['\"]Memory test.*{[ 	]*$"`

if [[ -n $mem ]]
then			
	res=""		# si on trouve la chaine Memory pas intéressant on force res à vide
fi

if  [[ -z $res ]]
	then								# ni menuentry ..{ ni memory ...{
		((i_s++))						# 
		ligne_sousmenu[i_s]="$ligne"	# mise en mémoire pour écriture ultérieure
		((nb_lignes_hors_menu++))		# stat
		echo -e ".\c"	
	
	else
		lire_menuentry 					# menu[0..n]  et ((nb_lignes_lues++))
		trt_menu2 "${menu[0]}" 			# 1 si contient dev dev
		code_dev_dev=$?

		if [[ $code_dev_dev -eq 1 ]]	# 1 la ligne contient /dev /dev
			then
				sort_menu_1 " " "menu supprimé : trop de /dev/sd"		# suppression de ce menu
				((nb_menu_sup++))		# stat
			else 						# pas 1 : ne contient pas dev dev
				critere_suppression_2
				code_crit2=$?			# 0 1 2 3 

				case $code_crit2 in
				0)						# les uuid sont égaux modifier menu[0]
					ajout_label_menuentry "$chaine_search"
					memorise_menuentry	# mettre en mémoire ces lignes de menuentry
					((nb_menu_cons++))	# stat non prévu dans memorise_menuentry
				;;
				1)						# pas de search ni de linux on garde sans modif
					memorise_menuentry	# mettre en mémoire ces lignes de menu
sort_info_transforme "${menu[0]}" "menu dans submenu conservé (pas de ligne search ou linux)"
					((nb_menu_cons++))	# stat non prévu dans memorise_menuentry
				;;
				2)						# uuid différents on supprime ce menu
					sort_menu_1 " " "menu supprimé : uuid différents"
					((nb_menu_sup++))	# stat non prévu
				;;
				3)						# uuid non trouvé (search et linux existent)
					memorise_menuentry	# mettre en mémoire ces lignes de menu
sort_info_transforme "${menu[0]}" "menu dans submenu conservé : uuid (search ou linux) non trouvé"
					((nb_menu_cons++))	# stat non prévu
					((nb_menu_sans_uuid++))
				;;
				4)						# uuid != mais boot séparé
					# revoir pour le label
					ajout_label_menuentry "$chaine_linux"
					memorise_menuentry	# mettre en mémoire ces lignes de menuentry
					((nb_menu_cons++))	# stat non prévu dans memorise_menuentry
					((nb_menu_boot_cons++))
					
				;;					
				esac
			fi # [[ $code_dev_dev -eq 1 ]]
	fi # [[ -z $res ]]
done

# si on arrive ici il y a erreur de traitement quelque part
echo
echo " ligne bach $LINENO"
echo " erreur de format ? dans le fichier $fich_source !!!!!!!!!!"
echo " dernière ligne de menu lue :"
echo
echo ${menu[0]}
echo
echo " dernière ligne lue : $nb_lignes_lues"
echo " $ligne"
sleep 100
exit 0 
}


function rech_uuid_label_ligne { # recherche uuid et label  de $1 dans uuid[0..n]
# renvoie 0 uuid trouvé et label trouvé	uuid_trouve=xxx  label_trouve="yyy"
# renvoie 1 uuid trouvé et label vide	uuid_trouve=xxx  label_trouve=""
# renvoie 2 uuid non trouvé				uuid_trouve=""   label_trouve=""	
uuid_trouve=""
label_trouve=""
n=-1
while [[ $n -lt $maxuuid ]]
	do
	((n++))								# uuid suivant
	if [[ -n ${uuid[$n]} ]]				# précaution supplémentaire uuid non vide 
	then
		res=`grep ${uuid[$n]} <<< $1`	#  $1 est une ligne de menu
		if [[ -n $res ]] 
			then
				uuid_trouve=${uuid[$n]}
				if [[ -n ${label[$n]} ]]
				then
					label_trouve=${label[$n]}	# si label non vide positionne label_trouve
					return 0					# uuid trouvé / label non vide trouvé
				else
					return 1					# uuid trouvé / label ""
				fi
		fi
	fi 
done 
return 2										# uuid non trouvé 
}


function rech_uuid_label_menuentry { # recherche uuid et label dans la ligne $1 de menu[1 ..n]

for p in ${!menu[@]}	# pour tous les indices du tableau 0..n
do
	[[ $p = 0 ]] && continue	# mais pas dans menu[0]
	res=`echo ${menu[$p]} | grep "$1"`	
	if [[ -n $res ]]
		then
			rech_uuid_label_ligne ${menu[$p]}		# donne uuid_trouve / label_trouve
			return $?								# 0 uuid égaux 
													# 1 uuid trouvé , label vide
													# 2 pas d'uuid dans search 
		fi
	done
return 3	# pas de search trouvé , (donc pas d'uuid , et donc pas de label) !!!
}




function transforme_ligne_menuentry {	# modifie la première ligne d'un menuentry conservé
# recherche l'UUID dans la ligne search --no-floppy --fs-uuid --set=root
# si trouvé , on récupère le label
# si label vide on ne fait rien
# sinon on rajoute avec : en tête après menuentry ' ou menuentry " 
# 

label_trouve=""
uuid_trouve=""
tmp=${menu[0]}					# servira de test pour sortie si modifié
rech_uuid_label_menuentry "$1"	# positionne le label à la bonne valeur
code=$?							# retour de la fonction

case $code in
	0)		# UUID trouvé : $uuid_trouve LABEL trouvé : $label_trouve

			if [[ $label_submenu = "" ]]	# servira dans traitement d'un submenu éventuel
				then						# on memorise le premier label menuentry trouvé	
					label_submenu="$label_trouve"
				fi	
#			menu[0]=`sed "s/menuentry '/menuentry '$label_trouve : /" <<< ${menu[0]}`
#			menu[0]=`sed "s/menuentry \"/menuentry \"$label_trouve : /" <<< ${menu[0]}`
			#suppression double labels dans cette ligne
#			menu[0]=`sed "s/${label_trouve} *:* *${label_trouve}/${label_trouve}/" <<<${menu[0]}`

# 1 remplacement de l'ancien par le nouveau , (s'il n'y a pas d'ancien ,rien n'est changé)
# 2 ajout du nouveau
# 3 suppression des doublons


# 1 remplacement de l'ancien par le nouveau , (s'il n'y a pas d'ancien ,rien n'est changé)
            menu[0]=`sed "s/menuentry '.* : /menuentry '$label_trouve : /" <<< ${menu[0]}`
            menu[0]=`sed "s/menuentry \" .*: /menuentry \"$label_trouve : /" <<< ${menu[0]}`
# 2 ajout du nouveau en tête
            menu[0]=`sed "s/menuentry '/menuentry '$label_trouve : /" <<< ${menu[0]}`
            menu[0]=`sed "s/menuentry \"/menuentry \"$label_trouve : /" <<< ${menu[0]}`
# 3 suppression des doublons
            menu[0]=`sed "s/${label_trouve} *:* *${label_trouve}/${label_trouve}/" <<<${menu[0]}`









			if [[ $tmp != ${menu[0]} ]]
			then #TEST
				sort_info_transforme "$tmp" "	LIGNE transformée en" "${menu[0]}"
			fi
	;;
	1)		# LABEL vide #TEST
				sort_info_transforme "$tmp" "pas de label pour $uuid_trouve dans $blkid_choisi"
	;;
	2)		#LABEL vide uuid non trouvé #TEST
				sort_info_transforme "$tmp" "uuid de ligne search non trouvé dans $blkid_choisi"
	;;
	3)		# pas de ligne search trouvée dans menuentry v
				sort_info_transforme "$tmp" "ligne search non trouvée"
	;;	
	*) # ???? #TEST
				sort_info_transforme "$tmp" "code inconnu : $code"
	;;
esac

return $code
}


function lire_menuentry { # met dans tableau menu[n] jusqu'à trouvé } seul sur la ligne
unset menu
i=0
menu[0]="$ligne"								# menu[0] est la première ligne
echo -e "M\c"									# trace début de menuentry
while read ligne								# ligne suivante
do
	((i++))
	((nb_lignes_lues++))
	menu[$i]="$ligne"							# mémorisée dans menu [1 .. n]
	echo -e "m\c"								# trace écran
	tmp=`sed 's/[[:blank:]]//g' <<<"$ligne"`	# suppression des blancs pour test

	if [[ "$tmp" =~ }}$ ]]
		then
			fin_submenu=0						# termine par  }   } fin de submenu !!!
		fi

	if [[ "$tmp" =~ }$ ]]   					# la ligne se termine par } ?
		then
			return								# oui fin de menuentry
		fi
			# et si pas de ... } on ira jusqu'en fin de fichier !!!!
			# c'est un critère de format de grub
done
}

function sort_menu_0 {	# écrit menu[0..n] dans le fichier de sauvegarde

for p in ${!menu[@]}						# pour tous les indices
	do
		echo "${menu[$p]}" >> "$fich_sauv"	# écriture menu[0..n]
		((nb_lignes_cons++))				# stat
		((nb_lignes_menu_cons++))			# stat
		echo -e "c\c"						# suivi écran
	done
}


function sort_menu_1 {	# écrit menu[0..n] dans le fichier suppression

#écriture des paramètres reçus dans fich_sup
	echo "#########################"	>> $fich_sup
	for arg in "$@"		# prends $1 $2 ... $n
	do
		echo $arg		>> $fich_sup
		#echo			>> $fich_sup
	done

# écriture du menu dans fichier sup
for p in ${!menu[@]}					# pour tous les indices
do
	echo "${menu[$p]}" >> "$fich_sup"	# écriture menu[0..n]
	((nb_lignes_sup++))					# stat
	echo -e "x\c"						# suivi écran
	done
}



function sort_info_transforme { # écrit les paramètres reçus fich_transforme

	echo "#########################"	>> $fich_transforme
	for arg in "$@"	# ( $1 $2 ... $n )
		do
			echo $arg		>> $fich_transforme
			#echo			>> $fich_transforme
		done
}


function trt_menu2 { # analyse le paramètre $1
	# renvoie 1 si $1 contient plus d'une fois /dev/sd  avant --class (suppresion)
	# renvoie 0 sinon

IFS="$OLDIFS"		# il faut l'espace comme délimiteur
tableau=($1)	# mise en tableau de la ligne
IFS="~"		# peut-être utile pour la suite ?

nbdevsd=0 					# nombre de fois que l'on trouve /dev/sd (avant --class)

for n in ${!tableau[@]} # de 0 1 2 .... x
do
	r_class=`echo ${tableau[$n]} | grep "$rech_class"`	# test présence --class
	if [[  -n $r_class ]] 								# --class ou pas ?
		then
			break				# --class est trouvé, sort de la boucle for
		else
			r_dev=`echo ${tableau[$n]} | grep "$rech_dev"`   #  test présence /dev/sd
			if [[ -n $r_dev ]]
				then
					((nbdevsd++))							# incrémente si on a /dev/sd 
					if [[ $nbdevsd -gt 1 ]]					# si plus d une fois /dev/sd
						then
							return 1 						# on sort en renvoyant 1
						fi #[[ $nbdevsd -gt 1 ]]
				fi #[[ -n $r_dev ]]
		fi #[[  -n $r_class ]]
done

if [[ $nbdevsd -gt 1 ]]	# test nombre
	then
		return 1 # 1 si plus d'une fois /dev/sd
	else
		return 0 # 0 sinon
fi
}



# début du programme ##################################################################################
######### variables ################################### 
OLDIFS="$IFS"               # sauvegarde IFS
rech_class="\-\-class"		# jusqu'à trouver la chaine --class dans menuentry
rech_dev="\/dev\/sd"		# la présence de la chaine  /dev/sd dans menuentry

                            # ne pas modifier le nom des fichiers suivants 
blkid="blkid-res.txt"       # (fichier contenant le résultat de sudo blkid)
fich_fstab_conc="UBoot-UPart.txt" # créé par recup-fstab contient les uuid ayant boot séparé

blkid_choisi=""	            # fichier personnel choisi contenant dev-label-uuid
chaine_search="search \-\-no\-floppy \-\-fs\-uuid \-\-set=root"
	 						# (un tiret doit être protégé par \ pour une recherche dans grep)
chaine_linux="linux.*\/vmlinu" 			# + général "linux......./vmlinu"
label_submenu=""						# label valide du menuentry précédent

ZZZnum="ZZZnum"         # le répertoire qui contiendra les fichiers temporaires xxxx-$num
prg="./recup_fstab_V5"	# création de $fich_fstab_conc (UBoot_UPart.txt)
#########################################################
num=`date +%Y:%m:%d`-`date +%H:%M:%S`

# ces 3 variables seront re-précisées en utilisant le nom complet du fichier grub traité
fich_sauv=""        
fich_sup=""
fich_transforme=""

fich_source_0="$ZZZnum/tmp0-$num.txt" # lignes de 1 à 10_linux[
fich_source_1="$ZZZnum/tmp1-$num.txt" # lignes de [10_linux à 40_custom[
fich_source_2="$ZZZnum/tmp2-$num.txt" # lignes de [40_custom à la fin]

##### pour les stat #####################################
fich_stat="$ZZZnum/stat-$num.txt"
nb_menu_cons=0
nb_menu_boot_cons=0
nb_menu_sup=0
nb_menu_sans_uuid=0
nb_lignes_sup=0
nb_lignes_cons=0
nb_lignes_lues=0
nb_lignes_hors_menu=0
nb_lignes_menus_cons=0
#########################################################




! [[ -e "$ZZZnum" ]] && mkdir "$ZZZnum" # pourrait être mis plus loin

#si le programme n'existe pas on sort
# voir pour utiliser getopts
# deux façons de lancer ce programme
# - en terminal  avec ou sans l'option --sansfstab
# - clic sur le fichier (sans l'option --sansfstab) 
case "$1" in
    --sansfstab )
            echo "
            Rappel :
                un fichier à jour au format blkid
                (dev  - uuid  - label éventuel) 
                est nécessaire au bon déroulement du programme

                s'il y a des OS avec boot séparés
                un fichier
                $fich_fstab_conc à jour
                est aussi nécessaire (il est créé par recup_fstab)
                (ce fichier donne l'uuid de la partition de boot
                        associé à l'uuid de la partition système)

                en cas de doute utilisez 

                $0 sans le paramètre --sansfstab
                pour re-créer correctement ces fichiers

            Taper sur Entrée pour continuer Ctrl C pour arrêter" 
            read g
             code=0            ;;
	*  )
       ! [[ -e "$prg" ]] && echo "fichier $prg de récup. (fstab et blkid)  manquant" && exit 0
                    echo "$0 lance le programme $prg"
                    ./$prg "$ZZZnum"
					code=$? 	    ;;
esac 
# echo "le code de retour est $code" ; exit 0

if [[ $code -ne 0 ]]
	then
		echo "  il y a eu un problème de traitement du programme  $prg"
		echo "  si l'arrêt n'est pas volontaire"
		echo "  vérifier que le répertoire /mnt/jpb ne comporte pas des résidus de fichiers"
		echo "  éventuellement faire le ménage dans ce répertoire"
		read g
		exit 0
	fi
echo
echo "suite du programme $0"
echo ; echo

# pour les fichiers temporaires -$num




if ! [[ -e $fich_fstab_conc  ]]	# UBoot_UPart a normalement été créé par recup_fstab
	then
		echo "le fichier  $fich_fstab_conc est introuvable"
		echo "il faut d'abord exécuter $prg" 
		echo "ou mettre à disposition manuellement le fichier $fich_fstab_conc"
		echo ; echo
		exit 0
	else  
		echo "  vérification des uuid correspondants à des systèmes sur boot séparés"
		echo
		echo "###### contenu du fichier $fich_fstab_conc ############################"
		cat $fich_fstab_conc
		echo "#######################################################################"
		echo
		echo "  vérifier visuellement le contenu des lignes comprises entre les ###"
		echo "  la première ligne est une ligne de commentaire"
		echo "  puis il existe deux lignes par couple"
		echo "          une ligne uuid1-uuid2"
		echo "          une ligne uuid2-uuid1"
        echo
		echo "  tapez sur entrée pour continuer"
		read g
	fi

# lecture et mise en mémoire des infos donnée par le fichier $fich_fstab_conc ("UBoot_UPart.txt")
#################################################################################################
max_boot=-1
while read l_boot
do
	[[ -z $l_boot ]] && echo "ligne vide je passe" && continue		# si ligne vide ou commentée
	[[ $l_boot =~ ^[[:blank:]]*# ]] && echo "ligne commentée $l_boot je passe" && continue
	((max_boot++))
	echo $l_boot
	UBoot[$max_boot]=$l_boot # format uuid1-uuid2 à la suite
done < $fich_fstab_conc
#################################################################################################

OK # présentation du programme

code=1
while [[ $code = 1 ]]
do
rep=""
texte_supplementaire=""
if ! [[ -e "$blkid" ]]
	then
		texte_supplementaire="=====> !!!!! Attention ce fichier $blkid n'est pas présent !!!!!!"
	fi

while [[ $rep != [oOyYaAcC] ]]
do
titre="     Utilisation des UUID et LABEL des partitions des disques"
texte="     Choix du fichier de références  LABEL et UUID
	répondez par

			(oOyY)   si vous voulez ré-utiliser le fichier $blkid
                         ce fichier a été créé précédemment par $prg
						(contient les labels utilisés pour mettre à jour le grub
						 seront alors ceux déclarés sur la partition)
                     $texte_supplementaire

			(cC)     permet de choisir un fichier de référence UUID LABEL
						(les labels utilisés pour mettre à jour le grub
						 seront alors ceux déclarés dans ce fichier de référence)

			!!!!!	toutes les partitions doivent être déclarée
                    le champ /dev/sdxx en premier
                    le champ LABEL="xxxxxx" non obligatoire (mais alors
                    le menu de GRUB ne sera pas modifié pour ce dev)
                    le champ UUID="xxxxxx" (OBLIGATOIRE pour un traitement correct)
                    le champ type TYPE="xxxxx" est conseillé
                    une ligne sera donc de la forme
/dev/sdxx LABEL=\"un label correct\" UUID=\"un uuid correct\" TYPE=\"le type correspondant\"

                    ce choix peut servir si vous ne voulez pas labelliser les
                    partitions mais mettre quand même un label dans grub
                    ou bien pour effectuer des essais
                    (ce choix un peu tordu est un peu difficile à comprendre ?)

                    !!!!	en cas de doute utilisez le choix oOyY 	puis Valider

                    O pour réutilisation du fichier $blkid 
                    C pour choisir un fichier de référence UUID LABEL personnel
                    A Arrêter"
rep=`zenity --entry --title "$titre" --text "$texte" --width "800"`

case $rep in
	[oOyY]	) blkid_choisi="$blkid"; echo "utilisation du fichier créé précédemment)" ;;
	[aA]	) echo "arrêt du programme" 		; exit 0				;;
	[cC] 	) echo "choix du fichier des uuid" 	; choix_fichier_blkid 	;;
	*		) echo "utilisez seulement oO yY aA cC S.V.P."				;;
esac
done


# si le fichier de concordance n'existe pas sortie 

if ! [[ -e "$blkid_choisi" ]]
	then
		echo ; echo
		echo " $0 n'a pas trouvé le fichier"
		echo " $blkid_choisi"
		echo " que vous avez choisi comme référence UUID-LABEL"
		echo " Modifier votre choix de fichier"
		echo "    ou bien mettez à disposition ce fichier pour continuer" 
		echo ; echo ; sleep 2
	else
		code=0
	fi

done	# sors de la boucle uniquement si code=0



# récupératon dev label UUID dans des tableaux
unset dev
unset uuid
unset label
unset bdev	# V31 pour boot séparé
unset btype #le type de la partition
unset bmont # point de montage à cause du boot séparé

############## récupération dev label uuid btype dans le fichier choisi ###################
maxuuid=-1
while read ligne
do
#TEST simplification par continue
	[[ -z $ligne ]] && echo "ligne vide je passe" && continue		# correction ligne vide
	((maxuuid++))
	tableau=($ligne) # découper la ligne en champ
	tmp=`sed 's/://g' <<< ${tableau[0]}` # supprime les : donne /dev/sdxx
	[[ -z `grep "^\/dev" <<< $tmp` ]] && echo \
		&& echo "il manque /dev dans la ligne $ligne du fichier de référence UUID-LABEL" \
		&& exit 0
  
	dev[maxuuid]=$tmp			#récupération du dev de la ligne
	label[maxuuid]=""
	uuid[maxuuid]=""
	btype[maxuuid]=""
	
	echo ${tableau[@]}
	
	for champ in ${tableau[@]}
		do
			deb=` echo $champ | cut -c1-5`
			case $deb in
				LABEL)		# en enlevant les guillemets donne U16.04-b7
					label[maxuuid]=`sed 's/"//g' <<< ${champ##*=}`
					;;
				UUID\=)		# en enlevant les guillemets donne c63335c7-b....2be94
					uuid[maxuuid]=`sed 's/"//g' <<< ${champ##*=}`
					;;
				TYPE\=)		# en enlevant les guillemets donne swap ntfs ext4 ....
					btype[maxuuid]=`sed 's/"//g' <<< ${champ##*=}`
			esac
	done

done < $blkid_choisi

##############################################################################
if [[ "$blkid_choisi" != "$blkid" ]]
then
	verifier_presence_dev # vérifie que tous les dev du fichier choisi sont bien déclarés
fi
###############################################################################
# sortie des uuid label pour info
		[[ -e "tmp-u-l.txt" ]] && rm "tmp-u-l.txt"
echo
		p=0
		while [[ $p -le $maxuuid ]]
		do
			aff_dev="${dev[$p]}"		&& [[ -z "$aff_dev"		]]	&& aff_dev="_"
			aff_label="${label[$p]}"	&& [[ -z "$aff_label"	]]	&& aff_label="___"
			aff_uuid="${uuid[$p]}"		&& [[ -z "$aff_uuid"	]]	&& aff_uuid="___"
			aff_btype="${btype[$p]}"	&& [[ -z "$aff_btype"	]]	&& aff_btype="___"

# car si l'un des $ est "" , il y a erreur d'affichage

			printf "%02s %-10s UUID %-36s LABEL: %-20s  TYPE : %-10s\n" \
					$p $aff_dev $aff_uuid $aff_label $aff_btype  | tee -a tmp-u-l.txt
			((p++))											
		done

titre="Affichage des concordances LABEL <=> UUID      Visualiser puis  Valider pour continuer"
zenity --text-info --title "$titre" --filename "tmp-u-l.txt" --height "640" --width "1280" --font "Courier New Bold 10"
code=$?
[[ -e "tmp-u-l.txt" ]] && rm "tmp-u-l.txt" # supprime ce fichier devenu inutile
if [[ $code -ne 0 ]]
	then
		echo $code
		exit 0 #sortie si on ne valide pas
	else
		echo $code
	fi

################ début de traitement du fichier GRUB ###############################

# Quel fichier grub traiter ?
titre="$0               Sélectionnez le fichier GRUB à traiter"
fich_source=`zenity --file-selection --filename="../fichier-grub/*" --title="$titre"`
case $? in	# $? est le code de retour de zenity
	0)	:														;;
	1)	echo "Aucun fichier sélectionné."			; exit 1	;;
	-1)	echo "Une erreur inattendue est survenue."	; exit 1	;;	
	*)	echo "erreur non reconnue"					; exit 1	;;	
esac

# $fich_source est de la forme /media/SH/grub/fichier-grub/grub-2UUID.cfg

# servira à préciser les fichiers grub-OK,grub-sup
precision=$(sed 's/\//-/g' <<< "$fich_source") # remplace les / par des -
# /media/SH/grub/fichier-grub/grub-2UUID.cfg
# precision devient -media-SH-grub-fichier-grub-grub-2UUID.cfg

fich_sauv="$ZZZnum/grub-OK-$num$precision.txt"
fich_sup="$ZZZnum/grub-sup-$num$precision.txt"
fich_transforme="$ZZZnum/grub-mod-$num$precision.txt"
 

#### lecture et traitement du fichier GRUB #######

trier_fichier # création des 3 fichiers de 1 à 10 linux 10 linux à 40 custom 40 custom à la fin 

################# traitement jusqu'à 10_linux #####################
IFS="~"
prem=0
while read ligne
do 
((nb_lignes_lues++))
if  [[ $prem -eq 0 ]]
	then
				modif_ligne1_grub "$ligne" ; ((prem++))
	else
				echo $ligne >> "$fich_sauv"
				((nb_lignes_cons++))
				((nb_lignes_hors_menu++))

fi
done < "$fich_source_0"

################# traitement de 10_linux à 40_custom


while read ligne
do
((nb_lignes_lues++))

if  [[ $prem -eq 0 ]] # pourrait être supprimé depuis V34
	then
				modif_ligne1_grub "$ligne" ; ((prem++))
	else
				# entre les crochets on a tab et espace élargisement après {
	res=`echo "$ligne" | grep "^[	 ]*menuentry.*{[ 	]*$"`
	mem=`echo "$ligne" | grep "^[	 ]*menuentry ['\"]Memory test.*{[ 	]*$"`

	# res est vide s'il n'y a pas menuentry {
	# mem est non vide si on a Memory test -ne pas traiter menuentry 'Memory test

	if [[ -n $mem ]]
	then			# si Memory test on force res à vide
		res=""
	fi

	if  [[ -z $res ]]
		then 											# pas menuentry 
			subm=`echo "$ligne" | grep "^[	 ]*submenu.*{[ 	]*$"`
			if [[ -z $subm ]]
				then 									# pas menuentry pas submenu
					echo "$ligne" >> $fich_sauv			# écriture de cette ligne dans sauv
					((nb_lignes_cons++))				# stat
					((nb_lignes_hors_menu++))			# stat
					echo -e ".\c"						# trace écran
				else 									# contient submenu
					echo -e "S\c"						# trace
					traite_ligne_submenu "$ligne"		# traitement de submenu
			fi
		
		else								# on a menuentry
			lire_menuentry					# mettre en mémoire dans menu[0..n]
			trt_menu2 "${menu[0]}" 			# rem : 1 si /dev/sd /dev/sd
			code_dev_dev=$?
			if [[ $code_dev_dev -eq 1 ]]	# si 1 on supprime
				then						# le bloc menuentry contient /dev /dev
					sort_menu_1	" " "menu supprimé : trop de /dev/sd"	# fich_sup
					((nb_menu_sup++))

				else  						# menuentry ne contient pas /dev/sd /dev/sd
					critere_suppression_2	# analyse des uuid et recherche de label
					code_crit2=$?
					case $code_crit2 in
					0)						# les uuid sont égaux
						transforme_ligne_menuentry "$chaine_search"	# mettre un label dans menu[0]
						sort_menu_0					# écrire le menu dans fich_sauv
						((nb_menu_cons++))			# stat
					;;
					1)						# menu sans modif (ni search ni linux)
						sort_menu_0					# écrire le menu dans fich_sauv
sort_info_transforme "${menu[0]}" "menu conservé (pas de ligne search ou linux)"
						((nb_menu_cons++))			# stat
					;;
					2)						# uuid différents on supprime ce menu
						sort_menu_1	" " "menu supprimé : uuid différents"	# écrire dans fich_sup
						((nb_menu_sup++))				# stat
					;;
					3)						# uuid non trouvé (search et linux existent)
						sort_menu_0					# écrire le menu dans fich_sauv
sort_info_transforme "${menu[0]}" "menu conservé : UUID search ou linux non trouvé dans $blkid_choisi"
						((nb_menu_cons++))			# ce menu étant conservé
						((nb_menu_sans_uuid++))
					;;
					4)						# uuid != mais boot séparé
						transforme_ligne_menuentry "$chaine_linux" # met label dans menu[0]
						sort_menu_0					# écrire le menu dans fich_sauv
						((nb_menu_cons++))	# stat non prévu dans memorise_menuentry
						((nb_menu_boot_cons++))
					;;
					esac

				fi # [[ $code_dev_dev -eq 1 ]]
		fi #[[ -z $res ]]
	fi #[[ $prem -eq 0 ]]
done < "$fich_source_1"



echo $nb_lignes_lues

################# traitement 40_custom à fin #####################
if [[ -e "$fich_source_2" ]] # en cas d'essai sans ligne 40_custom
	then
		while read ligne
		do 
			((nb_lignes_lues++))
			((nb_lignes_cons++))
			((nb_lignes_hors_menu++))
			echo $ligne >> "$fich_sauv"
		done < "$fich_source_2"
	fi
#################################################################
IFS="$OLDIFS"

echo "###################################################################"   | tee -a "$fich_stat"
printf "%-40s %s\n" "fichier traité"              " : "                      | tee -a "$fich_stat"
echo "$fich_source"                                                          | tee -a "$fich_stat"
printf "%-40s %s\n" "le résultat se trouve dans"  " : "                      | tee -a "$fich_stat"
echo "$fich_sauv"                                                            | tee -a "$fich_stat"  
echo                                                                         | tee -a "$fich_stat"
printf "%-39s %s %5d\n" "nombre de lignes lues"      " : " "$nb_lignes_lues" | tee -a "$fich_stat"
printf "%-40s %s %5d\n" "lignes conservées"          " : " "$nb_lignes_cons" | tee -a "$fich_stat"
printf "%-40s %s %5d\n" "lignes supprimées"          " : " "$nb_lignes_sup"  | tee -a "$fich_stat"
if [[ $nb_lignes_sup -gt 0 ]]
	then
printf "%-40s %s\n" "fichier des lignes supprimées"  " : "                   | tee -a "$fich_stat"
echo "$fich_sup"                                                             | tee -a "$fich_stat"
	echo                                                                     | tee -a "$fich_stat"
	fi
printf "%-40s %s %5d\n" "nombre de menus conservés"           " : " "$nb_menu_cons" | tee -a "$fich_stat"
printf "%-40s %s %5d\n" "nombre de menus supprimés"           " : " "$nb_menu_sup" | tee -a "$fich_stat"
printf "%-40s %s %5d\n" "nombre de menus avec boot conservés" " : " "$nb_menu_boot_cons" | tee -a "$fich_stat"
if [[ $nb_menu_sans_uuid -gt 0 ]]
	then
printf "%-40s %s %5d\n" "nombre de menus sans uuid trouvé" " : " "$nb_menu_sans_uuid" | tee -a "$fich_stat"
	fi
echo                                                                                  | tee -a "$fich_stat"
printf "%-40s %s %5d\n" "lignes conservées (hors menu)" " : " "$nb_lignes_hors_menu"  | tee -a "$fich_stat"
printf "%-40s %s %5d\n" "lignes conservées (menu)" " : " "$nb_lignes_menu_cons"       | tee -a "$fich_stat"
echo "###################################################################"            | tee -a "$fich_stat"

echo "après avoir vérifié manuellement le fichier"
echo "$fich_sauv"
echo "en réel vous pourrez remplacer grub.cfg à vos risques et périls"
echo                                                                     | tee -a "$fich_stat"

texte_attention=""
if [[ $fich_source =~ /boot/grub/grub.cfg$ ]]
then
    texte_attention_grub_reel="====> Attention vous avez choisi de traiter un fichier grub réel
       /boot/grub sera remplacé par le fichier résultant ... prenez vos précautions
		personnellement si je traite le fichier réel je réponds N
        pour vérifier le contenu du fichier créé 
        puis j'effectue manuellement la copie"
fi



rep=""
while [[ $rep != [oOyYnN] ]]
do

################ mise à jour du fichier traité  ou non ###########################
titre="    ################       remplacement de GRUB    ###########"
texte="
        Voulez-vous remplacer le fichier choisi
                $fich_source
        par le nouveau fichier généré
               $fich_sauv
	
        par précaution si vous répondez oui le fichier
    $fich_source (fichier original choisi)
        sera sauvegardé dans
    $fich_source-$num

    $fich_source 
	    sera remplacé par le contenu du fichier
    $fich_sauv  (le résultat OK obtenu)

       
    $texte_attention_grub_reel

    répondez par (oOyYnN)"

rep=`zenity --entry --title "$titre" --text "$texte" --width "800"`
case $rep in
	[oOyY] )	# sauvegarde de "grub" , je conserve $num	
        echo "
        vous avez demandé le remplacement du fichier
        OK mais avant je sauvegarde le fichier original
        $fich_source
        dans 
        $fich_source-$num
        (mot de passe administrateur requis)
        sudo cp "$fich_source" "$fich_source-$num""
 			
            sudo cp "$fich_source" "$fich_source-$num"
			code=$?
			if [[ $code != 0 ]]
				then
					echo "il y a eu un problème lors de la sauvegarde du fichier
                         (code erreur : $code)"
					suppression_fichiers_temporaires
                    echo "je sors"
					exit 0
				fi

			#et fich_sauv remplace grub
            echo "
        OK je remplace
        $fich_source
        par
        $fich_sauv
        (mot de passe administrateur requis)
        sudo mv "$fich_sauv" "$fich_source"" 
        sudo mv "$fich_sauv" "$fich_source"
			code=$?
			if [[ $code != 0 ]]
				then
                    echo "il y a eu un problème lors du remplacement du fichier $fich_source
                         (code erreur : $code)"
                    suppression_fichiers_temporaires
                    echo "je sors"    
					exit 0
                else
                    echo
                    echo "fichier $fich_source remplacé"
				fi			

	;;
	[nN]	)	
             echo ; echo "fichier oiginal non remplacé"
             echo " mais le fichier résultant"
             echo " $fich_sauv"
             echo " est à disposition"
	;;
	*	) 	echo "utilisez seulement oOyYnN S.V.P."
	;;
esac
done
suppression_fichiers_temporaires
echo "taper entrée pour terminer"
read g #pour attendre
exit 0

EDIT : 2017-03-28 :  modification de commentaires au début du fichier

Dernière modification par ar barzh paour (Le 22/04/2020, à 15:24)


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#166 Le 23/03/2017, à 19:22

ar barzh paour

Re : [Projet terminé] correction anomalie de grub

EDIT 2020-04-22 : pour la dernière version :voir
le fichier le fichier modif_grub_V46_bis post 178
https://forum.ubuntu-fr.org/viewtopic.p … #p22261874

le fichier recup_fstab_V8 post 179
https://forum.ubuntu-fr.org/viewtopic.p … #p22261876





fichier recup_fstab_V5 la dernière version est en post 173 (V7)

#!/bin/bash

# V1 récupère le contenu des fichiers fstab qui peuvent exister sur la machine
# comment ?
# récupération des dev présents par blkid
# création du fichier blkid-res.txt
# pour les partitions déjà montées (via mount)
# lecture et traitement de <partition>/etc/fstab

# et pour chacune des autres partitions
# montage
# lecture et traitement de <point de montage>/etc/fstab
# démontage

# le traitement consiste à écrire dans le fichier DevSd_UBoot_UPart.txt
# pour chaque partition qui sera reconnue comme ayant un boot séparé
# DevSd="/dev/sdxx" UPart="uuid de la partition avec boot" UBoot="uuid du boot" 

# le traitement consiste à écrire dans le fichier DevSd_Uboot_Upart-date.txt
# pour chaque partition qui sera reconnue comme ayant un boot séparé
# DevSD="/dev/sdxx" UBoot="uuid du boot" UPart="uuid de la partition avec boot"

# V2 création fichier UBoot_UPart contenant les uuid d'un système avec boot séparé
# format uuid1-uuid2 et uuid2-uuid1 servira lors du traitement modif-grub

# V3 remise en forme
# V4 supprime aussi les fichiers inutiles
# les fichiers créés sont
#                   UBoot-Upart.txt         blkid-res.txt
# et dans ZZZnum :  UBoot_Upart-<date>.txt  DevSd_UBoot_UPart-<date>.txt  
  
# V5 pour des raisons d'affichage , les _ des noms de fichiers sont remplacés par des -

function OK {
# à cause de problème d'affichage
#declare ffich_fstab_conc=$(sed "s/[_ ]/*/g" <<< $fich_fstab_conc)
#declare fres_blkid=$(sed "s/[_ ]/*/g" <<< $res_blkid)
#declare ffich_fstab_long=$(sed "s/[_ ]/*/g" <<< $fich_fstab_long)
#declare ffich_recup=$(sed "s/[_ ]/*/g" <<< $fich_recup)
reponse=""
while [[ $reponse != [oOyYnN] ]]
do
titre="programme $0        /!\/!\/!\/!\    Répondez par : (oOyYnN)"
texte="
    
    le but principal de ce sous programme est de créer le fichier
        $fich_fstab_conc
    qui contiendra les uuid des systèmes avec boot séparé

    il met a disposition le fichier
        $res_blkid
    qui contient le résultat de la commande sudo blkid

    il crée aussi (pour info d'analyse) le fichier
        $fich_fstab_long
    qui contient le fichier $fich_recup des partitions présentes

    comment ?
    - récupération des dev existants par sudo blkid

    - pour les partitions déjà montées (via mount)
            lecture et traitement de <partition>/etc/fstab

    - pour chacune des partitions non montées (sauf ntfs , swap)
        montage
            lecture et traitement de <point de montage>$fich_recup
        démontage

            SOUS-PROGRAMME RECUP DE MODIF GRUB
            tapez O puis valider pour continuer
            tapez A puis valider pour arrêter

            O pour continuer / A pour arrêter le programme"
       
reponse=`zenity --entry --title "$titre" --text "$texte" --width "800"`
case $reponse in
	[oOyY]	)	:												;;
	[aA]	)											exit 1	;;
	*		) 	echo "utilisez seulement oOyYnN S.V.P."			;;
esac	
done
}


function rech_uuid_dev { # si $1 est dans dev[] renvoi l'uuid correspondant
for i in ${!dev[@]}
do
	[[ "$1" = ${dev[$i]} ]] && uuid=${uuid[$i]} && break
done
}

function rech_uuid_label { # si $1 est dans label[] renvoi l'uuid correspondant
for i in ${!dev[@]}
do
	[[ "$1" = ${label[$i]} ]] && uuid=${uuid[$i]} && break
done
}


function ecrit_uuid1_uuid2 {  # recoit $1 $2 sous la fore UUID= ou LABEL= ou /dev/sdxx
# écrit uuid1-uuid2 et uuid2-uuid1 dans $fich_fstab_conc
# en remplacant le label ou le /dev/sdxx par l'uuid correspondant
# et en enlevant UUID= et LABEL=
uuid1=""
uuid2=""

echo "fonction ecrit_uuid1_uuid2 $1 $2"

#pour le premier paramètre
debut=`echo "$1" | cut -c1-5`
uuid=""
case "$debut" in
		\/dev\/ )
			rech_uuid_dev "$1" # /dev/sdxx on recherche l'uuid correspondant
			uuid1="$uuid"
		;;
		UUID\= )
			uuid1=`echo "$1" | cut -c6-` 			# si UUID= on prend ce qui se trouve après = 
		;;
		LABEL )
			rech_uuid_label `echo "$1" | cut -c7-`	# si LABEL on prend ce qui se trouve après = 
			uuid1="$uuid"							# et on recherche l'uuid correspondant
		;;
esac

#même chose pour le deuxième paramètre
debut=`echo "$2" | cut -c1-5`
uuid=""
case "$debut" in
		\/dev\/ )
			rech_uuid_dev "$2" # /dev/sdxx on recherche l'uuid correspondant
			uuid2="$uuid"
		;;
		UUID\= )
			uuid2=`echo "$2" | cut -c6-`			# UUID= on prend ce qui se trouve après = 
		;;
		LABEL )
			rech_uuid_label `echo "$2" | cut -c7-`	# LABEL on prend ce qui se trouve après =
			uuid2="$uuid"							# et on recherche l'uuid corespondant
		;;
esac

if [[ -n $uuid1 ]] && [[ -n $uuid2 ]]
then
# on écrit les deux combinaisons possibles , plus simple à traiter ensuite
echo $uuid1-$uuid2		>> $fich_fstab_conc
echo $uuid2-$uuid1		>> $fich_fstab_conc
fi

echo "fin de fonction ecrit_uuid1 uuid2 =1=>$uuid1<=== =2=>$uuid2<==="
}



function ecrit_ligne_court {	# ecrit $1 $2 $3 formatés dans un fichier
								# et si $3 (UBoot) non vide
								# uuid1-uuid2 dans UBoot_UPart

# printf "DevSd=%-18s UPart=%-36s UBoot=%-36s\n" "$1" "$2" "$3" >> $fich_fstab_court

if [[ -n "$3" ]]			# si uboot non vide
	then
		ecrit_uuid1_uuid2 "$2" "$3" # envoie uuid de partition et uuid de boot
	fi
}


function trans_ligne_fstab { # récupère les champs d'une ligne
# champ1 champ2 champn mais on ne s'intérese qu'aux champs 1 et 2

# champ1 : UUID=uuid ou LABEL=label ou le dev [non traités : PARTUUID= PARTLABEL=]
# champ2 : le point de montage

champ1=`echo "$1"|awk -F" " '{printf ("%s",$1)}'`	# bloc spécial ou système de fichiers distant à monter	
champ2=`echo "$1"|awk -F" " '{printf ("%s",$2)}'`	# c'est le point de montage

case "$champ2" in
		\/ )
			dev_part=$champ1	# si champ2 est /     on positionne dev_part sur champ1
		;;
		\/boot )
			dev_boot=$champ1	# si champ2 est /boot on positionne dev_boot sur champ1
		;;
esac
}

# début du programme
echo "début de programme $0 "

if [[ $# -eq 0 ]]
	then
		echo "sans le paramètre répertoire"
		ZZZnum="ZZZnum"
	else
		echo "avec le paramètre répertoire $1"
		ZZZnum="$1" # modif_grub doit envoyer ZZZnum
	fi	

echo "Répertoire : "$ZZZnum

! [[ -e "$ZZZnum" ]] && mkdir "$ZZZnum"
 
#########################################################################################
# variables
                 num=`date +%Y:%m:%d`-`date +%H:%M:%S`
           res_blkid="blkid-res.txt"				# résultat de sudo blkid
     fich_fstab_long="$ZZZnum/DevSd-UBoot-UPart-$num.txt"	# résultant commenté
#   fich_fstab_court="DevSd_UBoot_UPart.txt"		# résultant court	DevSd=...U1...U2
     fich_fstab_conc="UBoot-UPart.txt"				# résultant concaténé UUID1-UUID2
 fich_fstab_conc_num="$ZZZnum/UBoot-UPart-$num.txt"			# sauvegarde,à supprimer manuellement
             rep_mnt=/mnt/jpb-$num					# répertoire pour montages/démontages
          fich_recup=/etc/fstab						# fichier à récupérer dans part.
#########################################################################################


# [[ -e $fich_fstab_court ]] && rm $fich_fstab_court
OK 								# présentation du programme  / sortie ou non

reponse=""
while [[ $reponse != [oOyYnNaAcC] ]]
do
titre="récupération des UUID et LABEL des partitions des disques"
texte="
			Récupération des infos dans les fichiers $fich_recup des partitions
			ce programme travaille avec sudo pour
			récupérer les dev (blkid)
			effectuer des montages/démontages
			(mot de passe d'administration requis)

	répondez par	
			(oOyY) pour lancer la commande sudo blkid ( remise à jour du fichier) 
			(aA)   pour arrêter ce programme

					O pour récupérer les devices via \"sudo blkid\"
					A Arrêter
"
reponse=`zenity --entry --title "$titre" --text "$texte" --width "800"`
case $reponse in
	[oOyY]	) echo "sudo blkid" ; sudo blkid > $res_blkid								;;
	[aA]	) echo "arrêt du programme" 				; exit 1	;;
	*		) echo "$reponse utilisez seulement oOyYaA S.V.P."				;;
esac
done

echo "# $num : couples uuid-boot - uuid-systeme des menuentry en boot séparé" > $fich_fstab_conc

# récupération des dev label et UUID 
unset uuid
unset label
unset bdev		# V31 pour boot séparé
unset bmont 	# pour le point de montage à cause du boot séparé
unset btype 	# le type de la partition


maxuuid=-1
while read ligne 		# lecture et traitement du fichier généré par sudo blkid
do
# c'est le même script que dans modif-grub
# certaine lignes sont inutiles mais je les ai laissées
	[[ -z $ligne ]] && echo "ligne vide je passe" && continue		# correction ligne vide
	((maxuuid++))
	tableau=($ligne) # découper la ligne en champ

	# le dev est le premier champ
	tmp=`sed 's/://g' <<< ${tableau[0]}` # donne /dev/sdxx
	[[ -z `grep "^\/dev" <<< $tmp` ]] && echo \
		&& echo "il manque /dev dans la ligne $ligne du fichier de référence UUID-LABEL" \
		&& exit 1

	# init variables d'indice maxuuid
	   dev[maxuuid]=$tmp		# le dev de la ligne blkid
	  label[maxuuid]=""			# le label de la ligne blkid
	   uuid[maxuuid]=""			# l'uuid de la ligne blkid
	  btype[maxuuid]=""			# le type de la ligne blkid
	mnt_dev[maxuuid]="1"		# modifié par mount : 0 si le dev est monté
	  p_dev[maxuuid]=""			# modifié par mount : point de montage

	# echo ${tableau[@]}			# liste des indices

	# positionnemnt des variables d'indice maxuuid en fonction de la ligne blkid	
	for champ in ${tableau[@]}
		do
			deb=` echo $champ | cut -c1-5`
			case $deb in
				LABEL)		# en enlevant les guillemets donne U16.04-b7
					label[maxuuid]=`sed 's/"//g' <<< ${champ##*=}`
					;;
				UUID\=)		# en enlevant les guillemets donne c63335c7-b....2be94
					uuid[maxuuid]=`sed 's/"//g' <<< ${champ##*=}`
					;;
				TYPE\=)		# en enlevant les guillemets donne swap ntfs ext4 ....
					btype[maxuuid]=`sed 's/"//g' <<< ${champ##*=}`
			esac
		done

done <$res_blkid


#récupération des partitions déjà montées

mount | grep '^\/dev' > tmp.txt
#     1         2   3        4    5    6
#    /dev/sda11 on /media/SH type ext4 (rw,relatime,data=ordered)

	# remarque :
	# awk -F" " '{printf ("%s ",$1)}' tmp.txt 
	# donne
	# tous les dev séparés par une espace grace à "%s "

	# awk -F" " '{printf ("%s ",$3)}' tmp.txt 
	# donne
	# tous les points de montage séparés par une espace grace à "%s "

mdev=(`awk -F" " '{printf ("%s ",$1)}' tmp.txt`)	# les dev montés dans un tableau
mont=(`awk -F" " '{printf ("%s ",$3)}' tmp.txt`)	# les points de montage dans un tableau

rm "tmp.txt"


# positionnement montée ou non de chaque dev
for i in ${!dev[@]}						# pour tous les indices des dev
do
	for j in ${!mdev[@]}				# pour tous les indices des partitions montées
		do
			if [[ "${dev[$i]}" = "${mdev[$j]}" ]]
				then
					mnt_dev[i]="0"			# 0 indique que le dev est montée
					p_dev[i]=${mont[$j]}    # le point de montage du dev
					break
				fi
		done
done


# sortie des uuid label pour info
		[[ -e "tmp_u_l.txt" ]] && rm "tmp_u_l.txt"
echo
		p=0
		while [[ $p -le $maxuuid ]]
		do
			    aff_dev="${dev[$p]}"	 	# jamais vide
			aff_mnt_dev="${mnt_dev[$p]}" 	# vaut 0 (monté)  ou 1 (non monté)
			  aff_p_dev="${p_dev[$p]}"		# (affichage en fonction du précédent)
			# pour les corrections d'affichage 
			 aff_uuid="${uuid[$p]}"		&& [[ -z "$aff_uuid"	 ]]	&& aff_uuid="_"
			aff_label="${label[$p]}"	&& [[ -z "$aff_label"	 ]]	&& aff_label="_"
			aff_btype="${btype[$p]}"	&& [[ -z "$aff_btype"	 ]]	&& aff_btype="_"

			case $aff_mnt_dev in
			0)
				printf "%02s %-10s %-36s LABEL %-20s sur %-20s TYPE : %-10s\n" $p $aff_dev $aff_uuid $aff_label $aff_p_dev $aff_btype  | tee -a tmp_u_l.txt ;;
			1)
				printf "%02s %-10s %-36s LABEL %-20s                          TYPE : %-10s\n" $p $aff_dev $aff_uuid $aff_label  $aff_btype			| tee -a tmp_u_l.txt ;;
		
	esac	

			((p++))											
		done

reponse=""
titre="concordances     dev<=>LABEL<=>UUID<=>point de montage (de blkid)     Visualiser   puis Valider pour continuer"
zenity --text-info --title "$titre" --filename "tmp_u_l.txt" --height "640" --width "1280" --font "Courier New Bold 10"
code=$?
        [[ -e "tmp_u_l.txt" ]] && rm "tmp_u_l.txt" # supprime ce fichier devenu inutile
if [[ $code -eq 0 ]]
then
	echo "OK je continue"
else
	echo ; echo "Annulation demandée" ; echo ; exit 63
fi


##################################################
# pour cette partie il est absolument nécessaire d'avoir une liste des dev corrects
# d'où le sudo blkid effectué plus haut !
##################################################

echo "récupération des fstab de toutes les partitions"			 > $fich_fstab_long
echo 															>> $fich_fstab_long

############################################################
echo "pour les partitions déjà montées :" 						>> $fich_fstab_long
echo ${!dev[@]}

for i in ${!dev[@]} # pour tous les indices du tableau dev

	do
		echo $i ${dev[$i]} ${mnt_dev[$i]}
		[[ ${mnt_dev[$i]} = "1" ]]	&& continue		# non monté suivant !
		[[ ${btype[$i]} = "ntfs" ]]	&& continue 	# ntfs      suivant !
		[[ ${btype[$i]} = "swap" ]]	&& continue 	# swap      suivant !
		# on pourrait en ajouter d'autres

		echo  													>> $fich_fstab_long
		echo ${dev[$i]} "montée sur" ${p_dev[$i]} 				>> $fich_fstab_long

		#pour chaque dev monté on récupére les infos de fstab
		fich=${p_dev[$i]}$fich_recup 
		fich=`sed 's/\/\//\//g' <<< $fich` # supprime les doubles // (à cause de  //etc/fstab)

		echo $fich	#soit /etc/fstab soit /xxx/xxx/etc/fstab
		
		if [[ -e $fich ]]
			then
				echo  											>> $fich_fstab_long
				echo "$fich de ${dev[$i]}"  					>> $fich_fstab_long
				# on ne garde que les lignes non commentées et non vide

				dev_part=""
				dev_boot=""
				while read l_fstab
					do
						tmp=` grep '^[[:blank:]]*\#' <<< $l_fstab`
						#si tmp n est pas vide , elle commence par #
						if [[ -z $tmp ]] && [[ -n $l_fstab ]]
							then 
								echo $l_fstab >> $fich_fstab_long
								trans_ligne_fstab "$l_fstab"
							fi
					done < $fich
		ecrit_ligne_court "${dev[$i]}" "$dev_part" "$dev_boot"
			else
				echo 									>> $fich_fstab_long
				echo "pour ${dev[$i]} (${label[$i]}) /etc/fstab est inexistant"	>> $fich_fstab_long
			fi
	done

echo >> $fich_fstab_long

##############################################################
echo "pour les partitions non montées :" >> $fich_fstab_long


if [[ -e "/mnt" ]]
then
	echo "réperoire /mnt présent"
else
	echo "le répertoire /mnt n'existe pas !!!"
	exit 1
fi


rep_mnt_tmp="/mnt/jpb-$num"
echo "création du répertoire $rep_mnt_tmp pour monter les partitions"

sudo mkdir $rep_mnt_tmp

for i in ${!dev[@]} # pour tous les indices du tableau dev
do
	echo $i ${dev[$i]}

	[[ ${mnt_dev[$i]} = "0" ]]	&& continue		# montée    suivant !
	[[ ${btype[$i]} = "ntfs" ]]	&& continue 	# ntfs      suivant !
	[[ ${btype[$i]} = "swap" ]]	&& continue 	# swap      suivant !

	echo
	echo "traitement de $i ${dev[$i]} (${btype[$i]})"
	echo "montage de       ${dev[$i]} sur $rep_mnt_tmp"
	sudo mount ${dev[$i]} $rep_mnt_tmp
	code=$?
	
	echo "code de retour montage de ${dev[$i]} sur $rep_mnt_tmp : $code"
	if [[ $code = 0 ]]	# si le montage est réussi
		#################### montage réussi ####################
		then
			fich=$rep_mnt_tmp/etc/fstab
			if [[ -e $fich ]]
				then
					echo 							>> $fich_fstab_long
					echo ${dev[$i]} montée sur $rep_mnt_tmp	>> $fich_fstab_long
					dev_part=""
					dev_boot=""					
					while read l_fstab
							do
								tmp=` grep '^[[:blank:]]*\#' <<< $l_fstab`
								# si ne commence pas par # , tmp est vide 
								# et si la ligne n'est pas vide on l'écrit
							if [[ -z $tmp ]] && [[ -n $l_fstab ]]
								then 
									echo $l_fstab 					>> $fich_fstab_long
									trans_ligne_fstab "$l_fstab"
								fi
							done < $fich
		ecrit_ligne_court "${dev[$i]}" "$dev_part" "$dev_boot"
				else
		echo															>> $fich_fstab_long
		echo "pour ${dev[$i]} (${label[$i]}) /etc/fstab est inexistant" >> $fich_fstab_long
				fi
			# puis on le démonte avec boucle sinon le démontage ne se fait pas toujours
			boucle=0
			code=1
			while [[ $code -ne 0 ]]
			do
				sudo umount "$rep_mnt_tmp"
				code=$?
				echo "boucle $boucle  : ${dev[$i]} code de retour de umount $code"
				if [[ $code = 0 ]]
					then
						echo 
						echo "boucle $boucle : ${dev[$i]} démontage effectué (code retour $code)"
						ls -ails $rep_mnt_tmp
					else
						echo
						echo "boucle $boucle : ${dev[$i]} non démonté (code retour $code)"
						sleep 1 # attente en cas de non démontage
						((boucle++))
						if [[ $boucle -ge 10 ]]
							then
								echo "problème de démontage de ${dev[$i]}"
								exit 1
							fi	
					fi
			done # boucle while
		############################ échec de montage ###################
		else
			echo																	>> $fich_fstab_long
			echo "impossible de monter ${dev[$i]}  code echec de montage :$code"	>> $fich_fstab_long
		fi
done # boucle for i dev

echo ; echo
echo "fin de récupération des données de /etc/fstab des partitions présentes sur la machine"
echo ; echo

# sauvegarde de UBoot_UPart pour une utilisation personnelle
cp "$fich_fstab_conc" "$fich_fstab_conc_num"

echo "suppression du répertoire $rep_mnt_tmp en cours"
sudo rmdir $rep_mnt_tmp
code=$?

if [[ $code -ne 0 ]]
	then 
	#rmdir: échec de suppression de '/mnt/jpb-2017:03:11-12:02:43': Périphérique ou ressource occupé
		echo
		ls -ails /mnt/jpb*
		echo "vérifier le contenu du répertoire /mnt/jpb"
		echo "faire le ménage dans ce répertoire"
		exit 1
	fi

echo "suppression réussie"
echo "fin normale du programme $0"

Dernière modification par ar barzh paour (Le 22/04/2020, à 15:25)


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#167 Le 23/03/2017, à 19:24

ar barzh paour

Re : [Projet terminé] correction anomalie de grub

fichier supZZZnum complètement indépendant mais ne traite que le sousrépertoire ZZZnum

#!/bin/bash

# extrait de modif_grub_V41 permet de supprimer les fichiers temporaires de ZZZnum


function confirmation_sortie {
	declare titre="Sortie de $0"	
	declare	ok="Confirmer la sortie"
	declare	texte="Pour Validez la sortie cliquer sur \"$ok\""
	declare	cancel="Abandonner la sortie"

	if zenity --question --title "$titre" --text "$texte" \
              --no-wrap --ok-label "$ok" --cancel-label "$cancel"
		then
			exit 63
		fi
}

function suppression_fichiers_temporaires {
    repertoire_a_vider="./$ZZZnum"
    fich="/tmp/liste_fichier.txt" # contient la liste des fich. du rép. à supprimer
    oklabel="Sortir si EXIT coché  / Supprimer fichiers cochés sinon"
    cancellabel="Re-cocher toutes les cases (sauf grub-OK)"
	texte="
        Des fichiers ont été créés lors de l'exécution du programme
            modif_grub
        ci dessous ces fichiers encore existants dans le répertoire
        "$repertoire_a_vider"

        Pour supprimer des fichiers 
            1- Décocher la case EXIT 
            2- Cochez le case des fichiers que vous voulez supprimer
            3- Cliquer sur $oklabel
               ==> ce menu se relancera en indiquant
                   les fichiers encore existants

        Pour SORTIR de ce menu une seule solution
               Cochez la case EXIT puis cliquez sur \"$oklabel\"

         pour Recocher la case de tous les fichiers (sauf grub-OK) cliquer sur					
             $cancellabel
            "
while :
	do
		# listage des fichiers du répertoire
		ls "$repertoire_a_vider" > "$fich" # ligne à supprimer en réel
		liste_fichier="TRUE EXIT_(Sortir_du_menu)"
		while read ligne
			do                                    # problème zenity ?
				ligne=$(sed "s/ /*/g" <<< $ligne) # remplacer les espaces par *
				case $ligne in
					tmp[012][-_]20*  |     \
					tmp[-_]u[-_]l*      |     \
					tmp.txt       |     \
                    fich[-_]transforme-* | \
                    grub-mod*  |      \
                    stat-20*     |      \
                    DevSd[-_]UBoot* |      \
                    grub-sup-20* |      \
                    UBoot-UPart*         )
					liste_fichier="$liste_fichier TRUE $ligne"
					;;
                    blkid-res.txt |     \
					grub-OK*            )
					liste_fichier="$liste_fichier FALSE $ligne"
					;;
					esac
			done < "$fich"

	#sélection des fichiers à supprimer

	choix=`zenity --list \
	  --title="XXXXXXXXXXXXXXXXXXX : $0" \
	  --text="$texte" \
	  --checklist \
      --cancel-label "$cancellabel" \
      --ok-label "$oklabel" \
	  --height "750" \
	  --width "800" \
	  --column="CONS/SUP" --column="nom du(des) fichier(s) de $repertoire_a_vider" \
	  ${liste_fichier} \
	   	2>/dev/null `	# ne pas effacer cette ligne fin de choix
code=$?
echo "code de zenity $code"
	if [[ $code == 0 ]] # code retour zenity (0=normal,sinon clic/x  , Esc , )
	then
        [[ -n `echo $choix|grep "EXIT"` ]] && exit 0
		if [[ -z $choix ]] # $choix est vide
			then
				echo "Aucun choix effectué"
				continue # on recommence
			else
                echo "le choix est :"
                echo "$choix"
				IFS="|"
				list=($choix)
				echo "le 1er  est ${list[0]}"
				echo "le 2ème est ${list[1]}"
                echo ${list[@]}
				IFS="$OLDIFS"			
                 if zenity --question --title "SUPPRESSION" \
                          --text "Suppression de ${#list[@]} fichiers" \
                          --no-wrap --ok-label "Confirmer Suppression" \
                          --cancel-label "Abandonner la Suppression"
                  then
				  for i in ${list[@]}
				    do
					   i=$(sed "s/*/ /g" <<< $i) #remettre espace à la place des *
				       echo "je supprime $repertoire_a_vider/$i"
					   rm "$repertoire_a_vider/$i"
				    done
		           fi
                
                continue # on recommence
			fi
	else 
		[[ $code == 1 ]] && continue # on a cliqué sur Re-cocher
	fi
    confirmation_sortie
done
}
OLDIFS="$IFS" # ligne ajoutée 26-03-2017
ZZZnum="ZZZnum"
suppression_fichiers_temporaires

EDIT :  2017-03-26 il faut ajouter avant la ligne ZZZnum="ZZZnum" la ligne
OLDIFS="$IFS"

Dernière modification par ar barzh paour (Le 26/03/2017, à 10:47)


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#168 Le 24/03/2017, à 17:41

Babdu89

Re : [Projet terminé] correction anomalie de grub

Bonjour.

Ok, merci, je vais tester çà ce soir à tête reposée.

Édit.

Çà fonctionne très bien.  Bravo à toi!!!.

J'ai testé dans les Os de tests de la clé de tests, à partir de dossiers de tests, pour voir la réaction.
Çà supprime bien les fichiers de travail dans ZZZnum.
J'ai ensuite fais une copie du fichier grub.cfg de l'os par défaut qui démarre ma machine, Hybryde fusion 12.04, basée sur Ubuntu 12.04.5 avec un Grub version 1.98/99 .
Puis j'ai lancé le script sur le fichier original de cet Os.
Çà marche bien.
J'ai un menu Grub avec les label des partitions, pour celles qui en sont pourvues, suivit des noms d'Os que j'avais mis avec la modif de /etc/default/grub.

menuentry 's3-fusion-12-sys : HYBRYDE FUSION 12.04_PART7, avec Linux 3.13.0-68-generic'

s3-fusion12-sys :    ==> le label de la partition.
HYBRYDE FUSION 12.04_PART7   ==> résulte de la modification de /etc/default/gub .

#GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_DISTRIBUTOR=`echo -n HYBRYDE FUSION 12.04_PART7`

blkid;

/dev/sda1: LABEL="XP-MAXTOR" UUID="B664A19764A16ABF" TYPE="ntfs" PARTUUID="00061a6b-01"
/dev/sdb1: LABEL="XP_SATA_1" UUID="E664A19764A16ACF" TYPE="ntfs" PARTUUID="635afe45-01"
/dev/sdb3: LABEL="xub-14-sata1-p3" UUID="c6432e46-4332-4a58-a9a3-5f14cf10cbe6" TYPE="ext4" PTTYPE="dos" PARTUUID="635afe45-03"
/dev/sdb5: LABEL="DONNEES_SATA_1_" UUID="07BCAE8F3189725B" TYPE="ntfs" PARTUUID="635afe45-05"
/dev/sdb6: LABEL="Natty-Wubi" UUID="04CCFBA34F6393FF" TYPE="ntfs" PARTUUID="635afe45-06"
/dev/sdb7: UUID="a88d28f8-c11b-47df-8915-90582136022f" TYPE="swap" PARTUUID="635afe45-07"
/dev/sdb8: LABEL="syst_clone" UUID="cb55ce42-5af5-4390-a732-e0cf9d6ca7cc" TYPE="ext4" PARTUUID="635afe45-08"
/dev/sdb9: LABEL="home_clone" UUID="52ed84e7-fd45-4ae2-9e7e-a77704656cde" TYPE="ext4" PARTUUID="635afe45-09"
/dev/sdb10: LABEL="sata1-ubun-14.10" UUID="385a39f1-1119-4251-af59-25d39d9d0c16" TYPE="ext4" PARTUUID="635afe45-0a"
/dev/sdb11: LABEL="sata1-fus12.04-s" UUID="f6f96e06-3927-427b-b9d6-673d83c5d3fd" TYPE="ext4" PARTUUID="635afe45-0b"
/dev/sdb12: LABEL="sata1-fus12.04-h" UUID="f2738d9d-35f4-4058-9a64-8c664a0797fa" TYPE="ext4" PARTUUID="635afe45-0c"
/dev/sdc1: LABEL="SATA" UUID="5BA987A83CA2C244" TYPE="ntfs" PARTUUID="c371aebc-01"
/dev/sdc5: LABEL="sa-xub-14.04-sys" UUID="8ca70b99-0ee2-4cf8-bcd4-be679cc13874" TYPE="ext4" PARTUUID="c371aebc-05"
/dev/sdc6: LABEL="sa-xub-14.04-hom" UUID="7c32b615-619a-4e6b-a553-2bc23baa0bdd" TYPE="ext4" PARTUUID="c371aebc-06"
/dev/sdc7: UUID="e0f5622f-05b0-4947-af79-df516d7ec146" TYPE="swap" PARTUUID="c371aebc-07"
/dev/sdd1: LABEL="SATA3-COPY-XP" UUID="F664A19764A16AFF" TYPE="ntfs" PARTUUID="b05fd78d-01"
/dev/sdd5: UUID="d3b7af4e-d1ea-4042-be93-6f01923525a7" TYPE="swap" PARTUUID="b05fd78d-05"
/dev/sdd6: LABEL="s3-fusion-12-sys" UUID="8463b60d-4533-46aa-9252-f971f91c6374" TYPE="ext4" PARTUUID="b05fd78d-06"
/dev/sdd7: LABEL="s3-fusion-12-hom" UUID="71f1b39f-4e1c-4c2e-9f1f-eda537f70175" TYPE="ext4" PARTUUID="b05fd78d-07"
/dev/sdd8: LABEL="s3-fusion14.04" UUID="df56cf2c-ed9a-42c8-b75d-241573c83b18" TYPE="ext4" PARTUUID="b05fd78d-08"
/dev/sdd9: LABEL="s3-lub-brd-14.04" UUID="6e521c54-1465-473c-83d1-d21e1eef8d13" TYPE="ext4" PARTUUID="b05fd78d-09"
/dev/sdd10: LABEL="s3-cust-14-k3.13" UUID="2037fb6e-f84e-4780-94be-695130953705" TYPE="ext4" PARTUUID="b05fd78d-0a"
/dev/sdd11: LABEL="s3-cust-14-k3.16" UUID="2705330d-f6d3-42f6-8ed0-7aada9d97f77" TYPE="ext4" PARTUUID="b05fd78d-0b"
/dev/sdd12: LABEL="s3-ubu-mate-14" UUID="79c2ca4d-f901-40b4-a0f5-310df6b2c500" TYPE="ext4" PARTUUID="b05fd78d-0c"
/dev/sdd13: LABEL="s3-ubu-14-64-bit" UUID="c0c9199b-1243-4732-8cdd-9d648aab9bd0" TYPE="ext4" PARTUUID="b05fd78d-0d"
/dev/sdd14: LABEL="s3-ubmate-test" UUID="7a0426e8-d49a-457b-98e5-915933e8cd4e" TYPE="ext4" PARTUUID="b05fd78d-0e"
/dev/sdd15: UUID="C756-871F" TYPE="vfat" PARTUUID="b05fd78d-0f"
/dev/sdd16: LABEL="s3-xubuntu-16.04" UUID="f7c9e82a-63f3-48d0-bf7b-c89523e9567b" TYPE="ext4" PARTUUID="b05fd78d-10"
/dev/sdd17: LABEL="s3-cust-14-k4.02" UUID="114427f0-540d-4c8e-845c-a4bd0194eef8" TYPE="ext4" PARTUUID="b05fd78d-11"
/dev/sdd18: LABEL="s3-ubu-mate16.04" UUID="974023be-3259-48fe-b5d0-83c09ab5c70f" TYPE="ext4" PARTUUID="b05fd78d-12"
/dev/sdd19: LABEL="s3-h-16-test-1" UUID="1889ff79-d79b-4987-b879-884729bc7a50" TYPE="ext4" PARTUUID="b05fd78d-13"
/dev/sdd20: LABEL="s3-hyb-xen-test" UUID="0992a423-57d5-44ba-8c51-96f35aff5a65" TYPE="ext4" PARTUUID="b05fd78d-14"
/dev/sdd21: LABEL="s3-h-16-test3-st" UUID="f6a1f56e-69a3-4e09-bae2-b9188e5bd173" TYPE="ext4" PARTUUID="b05fd78d-15"
/dev/sdd22: LABEL="s3-h-16-test3-ho" UUID="20ce4ce0-3dbb-4d59-91e5-e07e6e382f2d" TYPE="ext4" PARTUUID="b05fd78d-16"
/dev/sdd23: LABEL="s3-copy-xenial" UUID="d6ce05e1-3650-457c-b590-ebfc73873924" TYPE="ext4" PARTUUID="b05fd78d-17"
/dev/sdd24: LABEL="test" UUID="4892c119-02ba-425e-92b5-045d0d566f83" TYPE="ext4" PARTUUID="b05fd78d-18"
/dev/sdd25: UUID="f0ddebdf-f340-446e-89dc-81561b0967fb" TYPE="ext4" PARTUUID="b05fd78d-19"
/dev/sdd26: UUID="a4dece61-6d38-4c4b-919c-5cb446a37e73" TYPE="ext4" PARTUUID="b05fd78d-1a"
/dev/sdd27: LABEL="pour-systemback" UUID="ff750516-de8e-4982-88d1-dc04e751f250" TYPE="ext4" PARTUUID="b05fd78d-1b"
/dev/sdd28: LABEL="systemback-syst" UUID="b674232a-e4b7-4000-8bd5-3d5a53b49a4f" TYPE="ext4" PARTUUID="b05fd78d-1c"
/dev/sdd29: LABEL="systemback-home" UUID="a114d4fb-d5d2-4ffd-837b-d186a8a2ef3d" TYPE="ext4" PARTUUID="b05fd78d-1d"
/dev/sdd30: UUID="63b88532-fe8f-43ec-b30a-c6adb7f78e2e" TYPE="ext4" PARTUUID="b05fd78d-1e"
/dev/sdd31: LABEL="systemback-copy" UUID="7303f934-9558-471c-92ed-6e09b30098db" TYPE="ext4" PARTUUID="b05fd78d-1f"
/dev/sde1: LABEL="hyb-systemback" UUID="1aced9e1-d845-46bb-a6e2-448666be4a21" TYPE="ext4" PARTUUID="00006711-01"
/dev/sde2: UUID="5147bb57-b517-4a46-9344-c690575331e1" TYPE="swap" PARTUUID="00006711-02"
/dev/sde3: LABEL="SB@boot" UUID="13e83c99-8624-4136-a61d-10e67e670ba3" TYPE="ext4" PARTUUID="00006711-03"
/dev/sde4: LABEL="SB@" UUID="2ffbf271-02fa-4d6f-a8e6-dee7a63894e5" TYPE="ext4" PARTUUID="00006711-04"

Le menu grub de cet Os en 12.04.

bernard@bernard-System-Product-Name:~$ grep menuentry /media/bernard/s3-fusion-12-sys/boot/grub/grub.cfg
menuentry 's3-fusion-12-sys : HYBRYDE FUSION 12.04_PART7, avec Linux 3.13.0-68-generic' --class hybryde --class gnu-linux --class gnu --class os {
menuentry 's3-fusion-12-sys : HYBRYDE FUSION 12.04_PART7, with Linux 3.13.0-68-generic (recovery mode)' --class hybryde --class gnu-linux --class gnu --class os {
menuentry 's3-fusion-12-sys : HYBRYDE FUSION 12.04_PART7, avec Linux 3.13.0-62-generic' --class hybryde --class gnu-linux --class gnu --class os {
menuentry 's3-fusion-12-sys : HYBRYDE FUSION 12.04_PART7, with Linux 3.13.0-62-generic (recovery mode)' --class hybryde --class gnu-linux --class gnu --class os {
menuentry "Memory test (memtest86+)" {
menuentry "Memory test (memtest86+, serial console 115200)" {
menuentry "Start SATA1 GRUB4DOS Essayer-Installer des iso Linux lancees en live (on /dev/sda1)" --class windows --class os {
menuentry "sata1-ubun-14.10 : Ubuntu 14.10_PART10 GNU/Linux' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-385a39f1-1119-4251-af59-25d39d9d0c16 (on /dev/sda10)" --class gnu-linux --class gnu --class os {
menuentry "sata1-ubun-14.10 : Ubuntu 14.10_PART10 GNU/Linux, with Linux 3.16.0-24-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-24-generic-advanced-385a39f1-1119-4251-af59-25d39d9d0c16 (on /dev/sda10)" --class gnu-linux --class gnu --class os {
menuentry "sata1-ubun-14.10 : Ubuntu 14.10_PART10 GNU/Linux, with Linux 3.16.0-24-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-24-generic-recovery-385a39f1-1119-4251-af59-25d39d9d0c16 (on /dev/sda10)" --class gnu-linux --class gnu --class os {
menuentry "sata1-ubun-14.10 : Ubuntu 14.10_PART10 GNU/Linux, with Linux 3.16.0-23-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-23-generic-advanced-385a39f1-1119-4251-af59-25d39d9d0c16 (on /dev/sda10)" --class gnu-linux --class gnu --class os {
menuentry "sata1-ubun-14.10 : Ubuntu 14.10_PART10 GNU/Linux, with Linux 3.16.0-23-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-23-generic-recovery-385a39f1-1119-4251-af59-25d39d9d0c16 (on /dev/sda10)" --class gnu-linux --class gnu --class os {
menuentry "sata1-fus12.04-s : HYBRYDE FUSION 12.04_SATA1-PART11, avec Linux 3.5.0-26-generic (on /dev/sda11)" --class gnu-linux --class gnu --class os {
menuentry "sata1-fus12.04-s : HYBRYDE FUSION 12.04_SATA1-PART11, avec Linux 3.5.0-26-generic (mode de dépannage) (on /dev/sda11)" --class gnu-linux --class gnu --class os {
menuentry "sata1-fus12.04-s : HYBRYDE FUSION 12.04_SATA1-PART11, avec Linux 3.2.0-39-generic (on /dev/sda11)" --class gnu-linux --class gnu --class os {
menuentry "sata1-fus12.04-s : HYBRYDE FUSION 12.04_SATA1-PART11, avec Linux 3.2.0-39-generic (mode de dépannage) (on /dev/sda11)" --class gnu-linux --class gnu --class os {
menuentry "sata1-fus12.04-s : HYBRYDE FUSION 12.04_SATA1-PART11, avec Linux 3.2.0-24-generic (on /dev/sda11)" --class gnu-linux --class gnu --class os {
menuentry "sata1-fus12.04-s : HYBRYDE FUSION 12.04_SATA1-PART11, avec Linux 3.2.0-24-generic (mode de dépannage) (on /dev/sda11)" --class gnu-linux --class gnu --class os {
menuentry "xub-14-sata1-p3 : Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-c6432e46-4332-4a58-a9a3-5f14cf10cbe6 (on /dev/sda3)" --class gnu-linux --class gnu --class os {
menuentry "xub-14-sata1-p3 : Ubuntu, with Linux 3.13.0-32-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-32-generic-advanced-c6432e46-4332-4a58-a9a3-5f14cf10cbe6 (on /dev/sda3)" --class gnu-linux --class gnu --class os {
menuentry "xub-14-sata1-p3 : Ubuntu, with Linux 3.13.0-32-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-32-generic-recovery-c6432e46-4332-4a58-a9a3-5f14cf10cbe6 (on /dev/sda3)" --class gnu-linux --class gnu --class os {
menuentry "syst_clone : Ubuntu, avec Linux 2.6.32-41-generic (on /dev/sda8)" --class gnu-linux --class gnu --class os {
menuentry "syst_clone : Ubuntu, avec Linux 2.6.32-41-generic (mode de dépannage) (on /dev/sda8)" --class gnu-linux --class gnu --class os {
menuentry "syst_clone : Ubuntu, avec Linux 2.6.32-21-generic (on /dev/sda8)" --class gnu-linux --class gnu --class os {
menuentry "syst_clone : Ubuntu, avec Linux 2.6.32-21-generic (mode de dépannage) (on /dev/sda8)" --class gnu-linux --class gnu --class os {
menuentry "sa-xub-14.04-sys : PT-Xubuntu-14.04 GNU/Linux' --class pt_xubuntu_14_04 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-8ca70b99-0ee2-4cf8-bcd4-be679cc13874 (on /dev/sdb5)" --class gnu-linux --class gnu --class os {
menuentry "sa-xub-14.04-sys : PT-Xubuntu-14.04 GNU/Linux, avec Linux 3.13.0-112-generic' --class pt_xubuntu_14_04 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-112-generic-advanced-8ca70b99-0ee2-4cf8-bcd4-be679cc13874 (on /dev/sdb5)" --class gnu-linux --class gnu --class os {
menuentry "sa-xub-14.04-sys : PT-Xubuntu-14.04 GNU/Linux, with Linux 3.13.0-112-generic (recovery mode)' --class pt_xubuntu_14_04 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-112-generic-recovery-8ca70b99-0ee2-4cf8-bcd4-be679cc13874 (on /dev/sdb5)" --class gnu-linux --class gnu --class os {
menuentry "sa-xub-14.04-sys : PT-Xubuntu-14.04 GNU/Linux, avec Linux 3.13.0-110-generic' --class pt_xubuntu_14_04 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-110-generic-advanced-8ca70b99-0ee2-4cf8-bcd4-be679cc13874 (on /dev/sdb5)" --class gnu-linux --class gnu --class os {
menuentry "sa-xub-14.04-sys : PT-Xubuntu-14.04 GNU/Linux, with Linux 3.13.0-110-generic (recovery mode)' --class pt_xubuntu_14_04 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-110-generic-recovery-8ca70b99-0ee2-4cf8-bcd4-be679cc13874 (on /dev/sdb5)" --class gnu-linux --class gnu --class os {
menuentry "Microsoft Windows XP Professionnel (on /dev/sdc1)" --class windows --class os {
menuentry "s3-cust-14-k3.13 : HYBRYDE FUSION Custom-rem-14.04-part12 GNU/Linux' --class hybryde --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-2037fb6e-f84e-4780-94be-695130953705 (on /dev/sdc10)" --class gnu-linux --class gnu --class os {
menuentry "s3-cust-14-k3.13 : HYBRYDE FUSION Custom-rem-14.04-part12 GNU/Linux, avec Linux 3.13.0-96-generic' --class hybryde --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-96-generic-advanced-2037fb6e-f84e-4780-94be-695130953705 (on /dev/sdc10)" --class gnu-linux --class gnu --class os {
menuentry "s3-cust-14-k3.13 : HYBRYDE FUSION Custom-rem-14.04-part12 GNU/Linux, with Linux 3.13.0-96-generic (recovery mode)' --class hybryde --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-96-generic-recovery-2037fb6e-f84e-4780-94be-695130953705 (on /dev/sdc10)" --class gnu-linux --class gnu --class os {
menuentry "s3-cust-14-k3.16 : HYBRYDE FUSION 14.04-part14 GNU/Linux' --class hybryde --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-2705330d-f6d3-42f6-8ed0-7aada9d97f77 (on /dev/sdc11)" --class gnu-linux --class gnu --class os {
menuentry "s3-cust-14-k3.16 : HYBRYDE FUSION 14.04-part14 GNU/Linux, avec Linux 3.16.0-53-generic' --class hybryde --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-53-generic-advanced-2705330d-f6d3-42f6-8ed0-7aada9d97f77 (on /dev/sdc11)" --class gnu-linux --class gnu --class os {
menuentry "s3-cust-14-k3.16 : HYBRYDE FUSION 14.04-part14 GNU/Linux, with Linux 3.16.0-53-generic (recovery mode)' --class hybryde --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-53-generic-recovery-2705330d-f6d3-42f6-8ed0-7aada9d97f77 (on /dev/sdc11)" --class gnu-linux --class gnu --class os {
menuentry "s3-cust-14-k3.16 : HYBRYDE FUSION 14.04-part14 GNU/Linux, avec Linux 3.16.0-51-generic' --class hybryde --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-51-generic-advanced-2705330d-f6d3-42f6-8ed0-7aada9d97f77 (on /dev/sdc11)" --class gnu-linux --class gnu --class os {
menuentry "s3-cust-14-k3.16 : HYBRYDE FUSION 14.04-part14 GNU/Linux, with Linux 3.16.0-51-generic (recovery mode)' --class hybryde --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-51-generic-recovery-2705330d-f6d3-42f6-8ed0-7aada9d97f77 (on /dev/sdc11)" --class gnu-linux --class gnu --class os {
menuentry "s3-ubu-mate-14 : PT-UBUNTU-MATE 14.04 GNU/Linux' --class pt_ubuntu_mate --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-79c2ca4d-f901-40b4-a0f5-310df6b2c500 (on /dev/sdc12)" --class gnu-linux --class gnu --class os {
menuentry "s3-ubu-mate-14 : PT-UBUNTU-MATE 14.04 GNU/Linux, avec Linux 4.4.0-47-generic' --class pt_ubuntu_mate --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-47-generic-advanced-79c2ca4d-f901-40b4-a0f5-310df6b2c500 (on /dev/sdc12)" --class gnu-linux --class gnu --class os {
menuentry "s3-ubu-mate-14 : PT-UBUNTU-MATE 14.04 GNU/Linux, with Linux 4.4.0-47-generic (recovery mode)' --class pt_ubuntu_mate --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-47-generic-recovery-79c2ca4d-f901-40b4-a0f5-310df6b2c500 (on /dev/sdc12)" --class gnu-linux --class gnu --class os {
menuentry "s3-ubu-mate-14 : PT-UBUNTU-MATE 14.04 GNU/Linux, avec Linux 4.4.0-45-generic' --class pt_ubuntu_mate --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-45-generic-advanced-79c2ca4d-f901-40b4-a0f5-310df6b2c500 (on /dev/sdc12)" --class gnu-linux --class gnu --class os {
menuentry "s3-ubu-mate-14 : PT-UBUNTU-MATE 14.04 GNU/Linux, with Linux 4.4.0-45-generic (recovery mode)' --class pt_ubuntu_mate --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-45-generic-recovery-79c2ca4d-f901-40b4-a0f5-310df6b2c500 (on /dev/sdc12)" --class gnu-linux --class gnu --class os {
menuentry "s3-ubu-14-64-bit : Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-c0c9199b-1243-4732-8cdd-9d648aab9bd0 (on /dev/sdc13)" --class gnu-linux --class gnu --class os {
menuentry "s3-ubu-14-64-bit : Ubuntu, avec Linux 3.16.0-76-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-76-generic-advanced-c0c9199b-1243-4732-8cdd-9d648aab9bd0 (on /dev/sdc13)" --class gnu-linux --class gnu --class os {
menuentry "s3-ubu-14-64-bit : Ubuntu, with Linux 3.16.0-76-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-76-generic-recovery-c0c9199b-1243-4732-8cdd-9d648aab9bd0 (on /dev/sdc13)" --class gnu-linux --class gnu --class os {
menuentry "s3-ubu-14-64-bit : Ubuntu, avec Linux 3.16.0-49-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-49-generic-advanced-c0c9199b-1243-4732-8cdd-9d648aab9bd0 (on /dev/sdc13)" --class gnu-linux --class gnu --class os {
menuentry "s3-ubu-14-64-bit : Ubuntu, with Linux 3.16.0-49-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-49-generic-recovery-c0c9199b-1243-4732-8cdd-9d648aab9bd0 (on /dev/sdc13)" --class gnu-linux --class gnu --class os {
menuentry "s3-ubmate-test : UBUNTU-MATE 14.04 GNU/Linux' --class ubuntu_mate --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-7a0426e8-d49a-457b-98e5-915933e8cd4e (on /dev/sdc14)" --class gnu-linux --class gnu --class os {
menuentry "s3-ubmate-test : UBUNTU-MATE 14.04 GNU/Linux, avec Linux 3.16.0-53-generic' --class ubuntu_mate --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-53-generic-advanced-7a0426e8-d49a-457b-98e5-915933e8cd4e (on /dev/sdc14)" --class gnu-linux --class gnu --class os {
menuentry "s3-ubmate-test : UBUNTU-MATE 14.04 GNU/Linux, with Linux 3.16.0-53-generic (recovery mode)' --class ubuntu_mate --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-53-generic-recovery-7a0426e8-d49a-457b-98e5-915933e8cd4e (on /dev/sdc14)" --class gnu-linux --class gnu --class os {
menuentry "s3-ubmate-test : UBUNTU-MATE 14.04 GNU/Linux, avec Linux 3.16.0-51-generic' --class ubuntu_mate --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-51-generic-advanced-7a0426e8-d49a-457b-98e5-915933e8cd4e (on /dev/sdc14)" --class gnu-linux --class gnu --class os {
menuentry "s3-ubmate-test : UBUNTU-MATE 14.04 GNU/Linux, with Linux 3.16.0-51-generic (recovery mode)' --class ubuntu_mate --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-51-generic-recovery-7a0426e8-d49a-457b-98e5-915933e8cd4e (on /dev/sdc14)" --class gnu-linux --class gnu --class os {
menuentry "s3-xubuntu-16.04 : PT-Xubuntu-16.04 GNU/Linux' --class pt_xubuntu_16_04 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-f7c9e82a-63f3-48d0-bf7b-c89523e9567b (on /dev/sdc16)" --class gnu-linux --class gnu --class os {
menuentry "s3-xubuntu-16.04 : PT-Xubuntu-16.04 GNU/Linux, avec Linux 4.4.0-66-generic' --class pt_xubuntu_16_04 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-66-generic-advanced-f7c9e82a-63f3-48d0-bf7b-c89523e9567b (on /dev/sdc16)" --class gnu-linux --class gnu --class os {
menuentry "s3-xubuntu-16.04 : PT-Xubuntu-16.04 GNU/Linux, with Linux 4.4.0-66-generic (upstart)' --class pt_xubuntu_16_04 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-66-generic-init-upstart-f7c9e82a-63f3-48d0-bf7b-c89523e9567b (on /dev/sdc16)" --class gnu-linux --class gnu --class os {
menuentry "s3-xubuntu-16.04 : PT-Xubuntu-16.04 GNU/Linux, with Linux 4.4.0-66-generic (recovery mode)' --class pt_xubuntu_16_04 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-66-generic-recovery-f7c9e82a-63f3-48d0-bf7b-c89523e9567b (on /dev/sdc16)" --class gnu-linux --class gnu --class os {
menuentry "s3-xubuntu-16.04 : PT-Xubuntu-16.04 GNU/Linux, avec Linux 4.4.0-64-generic' --class pt_xubuntu_16_04 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-64-generic-advanced-f7c9e82a-63f3-48d0-bf7b-c89523e9567b (on /dev/sdc16)" --class gnu-linux --class gnu --class os {
menuentry "s3-xubuntu-16.04 : PT-Xubuntu-16.04 GNU/Linux, with Linux 4.4.0-64-generic (upstart)' --class pt_xubuntu_16_04 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-64-generic-init-upstart-f7c9e82a-63f3-48d0-bf7b-c89523e9567b (on /dev/sdc16)" --class gnu-linux --class gnu --class os {
menuentry "s3-xubuntu-16.04 : PT-Xubuntu-16.04 GNU/Linux, with Linux 4.4.0-64-generic (recovery mode)' --class pt_xubuntu_16_04 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-64-generic-recovery-f7c9e82a-63f3-48d0-bf7b-c89523e9567b (on /dev/sdc16)" --class gnu-linux --class gnu --class os {
menuentry "s3-cust-14-k4.02 : HYBRYDE FUSION 14.04_kernel-4.2.0xx_part17 GNU/Linux' --class hybryde --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-114427f0-540d-4c8e-845c-a4bd0194eef8 (on /dev/sdc17)" --class gnu-linux --class gnu --class os {
menuentry "s3-cust-14-k4.02 : HYBRYDE FUSION 14.04_kernel-4.2.0xx_part17 GNU/Linux, avec Linux 4.2.0-35-generic' --class hybryde --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.2.0-35-generic-advanced-114427f0-540d-4c8e-845c-a4bd0194eef8 (on /dev/sdc17)" --class gnu-linux --class gnu --class os {
menuentry "s3-cust-14-k4.02 : HYBRYDE FUSION 14.04_kernel-4.2.0xx_part17 GNU/Linux, with Linux 4.2.0-35-generic (recovery mode)' --class hybryde --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.2.0-35-generic-recovery-114427f0-540d-4c8e-845c-a4bd0194eef8 (on /dev/sdc17)" --class gnu-linux --class gnu --class os {
menuentry "s3-cust-14-k4.02 : HYBRYDE FUSION 14.04_kernel-4.2.0xx_part17 GNU/Linux, avec Linux 3.16.0-70-generic' --class hybryde --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-70-generic-advanced-114427f0-540d-4c8e-845c-a4bd0194eef8 (on /dev/sdc17)" --class gnu-linux --class gnu --class os {
menuentry "s3-cust-14-k4.02 : HYBRYDE FUSION 14.04_kernel-4.2.0xx_part17 GNU/Linux, with Linux 3.16.0-70-generic (recovery mode)' --class hybryde --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-70-generic-recovery-114427f0-540d-4c8e-845c-a4bd0194eef8 (on /dev/sdc17)" --class gnu-linux --class gnu --class os {
menuentry "s3-ubu-mate16.04 : PT-UBUNTU-MATE XENIAL GNU/Linux' --class pt_ubuntu_mate --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-974023be-3259-48fe-b5d0-83c09ab5c70f (on /dev/sdc18)" --class gnu-linux --class gnu --class os {
menuentry "s3-ubu-mate16.04 : PT-UBUNTU-MATE XENIAL GNU/Linux, avec Linux 4.4.0-66-generic' --class pt_ubuntu_mate --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-66-generic-advanced-974023be-3259-48fe-b5d0-83c09ab5c70f (on /dev/sdc18)" --class gnu-linux --class gnu --class os {
menuentry "s3-ubu-mate16.04 : PT-UBUNTU-MATE XENIAL GNU/Linux, with Linux 4.4.0-66-generic (recovery mode)' --class pt_ubuntu_mate --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-66-generic-recovery-974023be-3259-48fe-b5d0-83c09ab5c70f (on /dev/sdc18)" --class gnu-linux --class gnu --class os {
menuentry "s3-ubu-mate16.04 : PT-UBUNTU-MATE XENIAL GNU/Linux, avec Linux 4.4.0-64-generic' --class pt_ubuntu_mate --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-64-generic-advanced-974023be-3259-48fe-b5d0-83c09ab5c70f (on /dev/sdc18)" --class gnu-linux --class gnu --class os {
menuentry "s3-ubu-mate16.04 : PT-UBUNTU-MATE XENIAL GNU/Linux, with Linux 4.4.0-64-generic (recovery mode)' --class pt_ubuntu_mate --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-64-generic-recovery-974023be-3259-48fe-b5d0-83c09ab5c70f (on /dev/sdc18)" --class gnu-linux --class gnu --class os {
menuentry "s3-h-16-test-1 : Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-1889ff79-d79b-4987-b879-884729bc7a50 (on /dev/sdc19)" --class gnu-linux --class gnu --class os {
menuentry "s3-h-16-test-1 : Ubuntu, avec Linux 4.4.0-21-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-21-generic-advanced-1889ff79-d79b-4987-b879-884729bc7a50 (on /dev/sdc19)" --class gnu-linux --class gnu --class os {
menuentry "s3-h-16-test-1 : Ubuntu, with Linux 4.4.0-21-generic (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-21-generic-init-upstart-1889ff79-d79b-4987-b879-884729bc7a50 (on /dev/sdc19)" --class gnu-linux --class gnu --class os {
menuentry "s3-h-16-test-1 : Ubuntu, with Linux 4.4.0-21-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-21-generic-recovery-1889ff79-d79b-4987-b879-884729bc7a50 (on /dev/sdc19)" --class gnu-linux --class gnu --class os {
menuentry "s3-h-16-test-1 : Ubuntu, avec Linux 3.2.0-24-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.2.0-24-generic-advanced-1889ff79-d79b-4987-b879-884729bc7a50 (on /dev/sdc19)" --class gnu-linux --class gnu --class os {
menuentry "s3-h-16-test-1 : Ubuntu, with Linux 3.2.0-24-generic (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.2.0-24-generic-init-upstart-1889ff79-d79b-4987-b879-884729bc7a50 (on /dev/sdc19)" --class gnu-linux --class gnu --class os {
menuentry "s3-h-16-test-1 : Ubuntu, with Linux 3.2.0-24-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.2.0-24-generic-recovery-1889ff79-d79b-4987-b879-884729bc7a50 (on /dev/sdc19)" --class gnu-linux --class gnu --class os {
menuentry "s3-hyb-xen-test : Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-0992a423-57d5-44ba-8c51-96f35aff5a65 (on /dev/sdc20)" --class gnu-linux --class gnu --class os {
menuentry "s3-hyb-xen-test : Ubuntu, avec Linux 4.4.0-21-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-21-generic-advanced-0992a423-57d5-44ba-8c51-96f35aff5a65 (on /dev/sdc20)" --class gnu-linux --class gnu --class os {
menuentry "s3-hyb-xen-test : Ubuntu, with Linux 4.4.0-21-generic (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-21-generic-init-upstart-0992a423-57d5-44ba-8c51-96f35aff5a65 (on /dev/sdc20)" --class gnu-linux --class gnu --class os {
menuentry "s3-hyb-xen-test : Ubuntu, with Linux 4.4.0-21-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-21-generic-recovery-0992a423-57d5-44ba-8c51-96f35aff5a65 (on /dev/sdc20)" --class gnu-linux --class gnu --class os {
menuentry "s3-hyb-xen-test : Ubuntu, avec Linux 3.2.0-24-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.2.0-24-generic-advanced-0992a423-57d5-44ba-8c51-96f35aff5a65 (on /dev/sdc20)" --class gnu-linux --class gnu --class os {
menuentry "s3-hyb-xen-test : Ubuntu, with Linux 3.2.0-24-generic (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.2.0-24-generic-init-upstart-0992a423-57d5-44ba-8c51-96f35aff5a65 (on /dev/sdc20)" --class gnu-linux --class gnu --class os {
menuentry "s3-hyb-xen-test : Ubuntu, with Linux 3.2.0-24-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.2.0-24-generic-recovery-0992a423-57d5-44ba-8c51-96f35aff5a65 (on /dev/sdc20)" --class gnu-linux --class gnu --class os {
menuentry "s3-h-16-test3-st : HYBRYDE FUSION 16.04_PART21-test GNU/Linux' --class hybryde --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-f6a1f56e-69a3-4e09-bae2-b9188e5bd173 (on /dev/sdc21)" --class gnu-linux --class gnu --class os {
menuentry "s3-h-16-test3-st : HYBRYDE FUSION 16.04_PART21-test GNU/Linux, avec Linux 4.4.0-21-generic' --class hybryde --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-21-generic-advanced-f6a1f56e-69a3-4e09-bae2-b9188e5bd173 (on /dev/sdc21)" --class gnu-linux --class gnu --class os {
menuentry "s3-h-16-test3-st : HYBRYDE FUSION 16.04_PART21-test GNU/Linux, with Linux 4.4.0-21-generic (upstart)' --class hybryde --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-21-generic-init-upstart-f6a1f56e-69a3-4e09-bae2-b9188e5bd173 (on /dev/sdc21)" --class gnu-linux --class gnu --class os {
menuentry "s3-h-16-test3-st : HYBRYDE FUSION 16.04_PART21-test GNU/Linux, with Linux 4.4.0-21-generic (recovery mode)' --class hybryde --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-21-generic-recovery-f6a1f56e-69a3-4e09-bae2-b9188e5bd173 (on /dev/sdc21)" --class gnu-linux --class gnu --class os {
menuentry "s3-h-16-test3-st : HYBRYDE FUSION 16.04_PART21-test GNU/Linux, avec Linux 3.2.0-24-generic' --class hybryde --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.2.0-24-generic-advanced-f6a1f56e-69a3-4e09-bae2-b9188e5bd173 (on /dev/sdc21)" --class gnu-linux --class gnu --class os {
menuentry "s3-h-16-test3-st : HYBRYDE FUSION 16.04_PART21-test GNU/Linux, with Linux 3.2.0-24-generic (upstart)' --class hybryde --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.2.0-24-generic-init-upstart-f6a1f56e-69a3-4e09-bae2-b9188e5bd173 (on /dev/sdc21)" --class gnu-linux --class gnu --class os {
menuentry "s3-h-16-test3-st : HYBRYDE FUSION 16.04_PART21-test GNU/Linux, with Linux 3.2.0-24-generic (recovery mode)' --class hybryde --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.2.0-24-generic-recovery-f6a1f56e-69a3-4e09-bae2-b9188e5bd173 (on /dev/sdc21)" --class gnu-linux --class gnu --class os {
menuentry "s3-copy-xenial : PT-SATA3 COPY XENIAL-16.04_PART23 GNU/Linux' --class pt_sata3 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-d6ce05e1-3650-457c-b590-ebfc73873924 (on /dev/sdc23)" --class gnu-linux --class gnu --class os {
menuentry "s3-copy-xenial : PT-SATA3 COPY XENIAL-16.04_PART23 GNU/Linux, avec Linux 4.4.0-47-generic' --class pt_sata3 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-47-generic-advanced-d6ce05e1-3650-457c-b590-ebfc73873924 (on /dev/sdc23)" --class gnu-linux --class gnu --class os {
menuentry "s3-copy-xenial : PT-SATA3 COPY XENIAL-16.04_PART23 GNU/Linux, with Linux 4.4.0-47-generic (upstart)' --class pt_sata3 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-47-generic-init-upstart-d6ce05e1-3650-457c-b590-ebfc73873924 (on /dev/sdc23)" --class gnu-linux --class gnu --class os {
menuentry "s3-copy-xenial : PT-SATA3 COPY XENIAL-16.04_PART23 GNU/Linux, with Linux 4.4.0-47-generic (recovery mode)' --class pt_sata3 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-47-generic-recovery-d6ce05e1-3650-457c-b590-ebfc73873924 (on /dev/sdc23)" --class gnu-linux --class gnu --class os {
menuentry "s3-copy-xenial : PT-SATA3 COPY XENIAL-16.04_PART23 GNU/Linux, avec Linux 4.4.0-34-generic' --class pt_sata3 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-34-generic-advanced-d6ce05e1-3650-457c-b590-ebfc73873924 (on /dev/sdc23)" --class gnu-linux --class gnu --class os {
menuentry "s3-copy-xenial : PT-SATA3 COPY XENIAL-16.04_PART23 GNU/Linux, with Linux 4.4.0-34-generic (upstart)' --class pt_sata3 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-34-generic-init-upstart-d6ce05e1-3650-457c-b590-ebfc73873924 (on /dev/sdc23)" --class gnu-linux --class gnu --class os {
menuentry "s3-copy-xenial : PT-SATA3 COPY XENIAL-16.04_PART23 GNU/Linux, with Linux 4.4.0-34-generic (recovery mode)' --class pt_sata3 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-34-generic-recovery-d6ce05e1-3650-457c-b590-ebfc73873924 (on /dev/sdc23)" --class gnu-linux --class gnu --class os {
menuentry "test : Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-4892c119-02ba-425e-92b5-045d0d566f83 (on /dev/sdc24)" --class gnu-linux --class gnu --class os {
menuentry "test : Ubuntu, avec Linux 3.13.0-76-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-76-generic-advanced-4892c119-02ba-425e-92b5-045d0d566f83 (on /dev/sdc24)" --class gnu-linux --class gnu --class os {
menuentry "test : Ubuntu, with Linux 3.13.0-76-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-76-generic-recovery-4892c119-02ba-425e-92b5-045d0d566f83 (on /dev/sdc24)" --class gnu-linux --class gnu --class os {
menuentry "test : Ubuntu, avec Linux 3.13.0-68-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-68-generic-advanced-4892c119-02ba-425e-92b5-045d0d566f83 (on /dev/sdc24)" --class gnu-linux --class gnu --class os {
menuentry "test : Ubuntu, with Linux 3.13.0-68-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-68-generic-recovery-4892c119-02ba-425e-92b5-045d0d566f83 (on /dev/sdc24)" --class gnu-linux --class gnu --class os {
menuentry "PT-TEST-XENIAL-16.04_64 bits_PART26 GNU/Linux' --class pt_test_xenial_16_04_64 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-a4dece61-6d38-4c4b-919c-5cb446a37e73 (on /dev/sdc26)" --class gnu-linux --class gnu --class os {
menuentry "PT-TEST-XENIAL-16.04_64 bits_PART26 GNU/Linux, avec Linux 4.4.0-31-generic' --class pt_test_xenial_16_04_64 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-31-generic-advanced-a4dece61-6d38-4c4b-919c-5cb446a37e73 (on /dev/sdc26)" --class gnu-linux --class gnu --class os {
menuentry "PT-TEST-XENIAL-16.04_64 bits_PART26 GNU/Linux, with Linux 4.4.0-31-generic (upstart)' --class pt_test_xenial_16_04_64 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-31-generic-init-upstart-a4dece61-6d38-4c4b-919c-5cb446a37e73 (on /dev/sdc26)" --class gnu-linux --class gnu --class os {
menuentry "PT-TEST-XENIAL-16.04_64 bits_PART26 GNU/Linux, with Linux 4.4.0-31-generic (recovery mode)' --class pt_test_xenial_16_04_64 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-31-generic-recovery-a4dece61-6d38-4c4b-919c-5cb446a37e73 (on /dev/sdc26)" --class gnu-linux --class gnu --class os {
menuentry "PT-TEST-XENIAL-16.04_64 bits_PART26 GNU/Linux, avec Linux 4.4.0-24-generic' --class pt_test_xenial_16_04_64 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-24-generic-advanced-a4dece61-6d38-4c4b-919c-5cb446a37e73 (on /dev/sdc26)" --class gnu-linux --class gnu --class os {
menuentry "PT-TEST-XENIAL-16.04_64 bits_PART26 GNU/Linux, with Linux 4.4.0-24-generic (upstart)' --class pt_test_xenial_16_04_64 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-24-generic-init-upstart-a4dece61-6d38-4c4b-919c-5cb446a37e73 (on /dev/sdc26)" --class gnu-linux --class gnu --class os {
menuentry "PT-TEST-XENIAL-16.04_64 bits_PART26 GNU/Linux, with Linux 4.4.0-24-generic (recovery mode)' --class pt_test_xenial_16_04_64 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-24-generic-recovery-a4dece61-6d38-4c4b-919c-5cb446a37e73 (on /dev/sdc26)" --class gnu-linux --class gnu --class os {
menuentry "PT-TEST-XENIAL-16.04_64 bits_PART26 GNU/Linux, avec Linux 4.4.0-22-generic' --class pt_test_xenial_16_04_64 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-22-generic-advanced-a4dece61-6d38-4c4b-919c-5cb446a37e73 (on /dev/sdc26)" --class gnu-linux --class gnu --class os {
menuentry "PT-TEST-XENIAL-16.04_64 bits_PART26 GNU/Linux, with Linux 4.4.0-22-generic (upstart)' --class pt_test_xenial_16_04_64 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-22-generic-init-upstart-a4dece61-6d38-4c4b-919c-5cb446a37e73 (on /dev/sdc26)" --class gnu-linux --class gnu --class os {
menuentry "PT-TEST-XENIAL-16.04_64 bits_PART26 GNU/Linux, with Linux 4.4.0-22-generic (recovery mode)' --class pt_test_xenial_16_04_64 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-22-generic-recovery-a4dece61-6d38-4c4b-919c-5cb446a37e73 (on /dev/sdc26)" --class gnu-linux --class gnu --class os {
menuentry "systemback-syst : PT-SATA3 SYSTEMBACK COPY2 XENIAL-16.04_PART28 GNU/Linux' --class pt_sata3 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-b674232a-e4b7-4000-8bd5-3d5a53b49a4f (on /dev/sdc28)" --class gnu-linux --class gnu --class os {
menuentry "systemback-syst : PT-SATA3 SYSTEMBACK COPY2 XENIAL-16.04_PART28 GNU/Linux, avec Linux 4.4.0-45-generic' --class pt_sata3 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-45-generic-advanced-b674232a-e4b7-4000-8bd5-3d5a53b49a4f (on /dev/sdc28)" --class gnu-linux --class gnu --class os {
menuentry "systemback-syst : PT-SATA3 SYSTEMBACK COPY2 XENIAL-16.04_PART28 GNU/Linux, with Linux 4.4.0-45-generic (upstart)' --class pt_sata3 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-45-generic-init-upstart-b674232a-e4b7-4000-8bd5-3d5a53b49a4f (on /dev/sdc28)" --class gnu-linux --class gnu --class os {
menuentry "systemback-syst : PT-SATA3 SYSTEMBACK COPY2 XENIAL-16.04_PART28 GNU/Linux, with Linux 4.4.0-45-generic (recovery mode)' --class pt_sata3 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-45-generic-recovery-b674232a-e4b7-4000-8bd5-3d5a53b49a4f (on /dev/sdc28)" --class gnu-linux --class gnu --class os {
menuentry "systemback-syst : PT-SATA3 SYSTEMBACK COPY2 XENIAL-16.04_PART28 GNU/Linux, avec Linux 4.4.0-34-generic' --class pt_sata3 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-34-generic-advanced-b674232a-e4b7-4000-8bd5-3d5a53b49a4f (on /dev/sdc28)" --class gnu-linux --class gnu --class os {
menuentry "systemback-syst : PT-SATA3 SYSTEMBACK COPY2 XENIAL-16.04_PART28 GNU/Linux, with Linux 4.4.0-34-generic (upstart)' --class pt_sata3 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-34-generic-init-upstart-b674232a-e4b7-4000-8bd5-3d5a53b49a4f (on /dev/sdc28)" --class gnu-linux --class gnu --class os {
menuentry "systemback-syst : PT-SATA3 SYSTEMBACK COPY2 XENIAL-16.04_PART28 GNU/Linux, with Linux 4.4.0-34-generic (recovery mode)' --class pt_sata3 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-34-generic-recovery-b674232a-e4b7-4000-8bd5-3d5a53b49a4f (on /dev/sdc28)" --class gnu-linux --class gnu --class os {
menuentry "UBUNTU-GNOME_16.04.1-AMD64_PART30 GNU/Linux' --class ubuntu_gnome_16_04_1_amd64_part30 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-63b88532-fe8f-43ec-b30a-c6adb7f78e2e (on /dev/sdc30)" --class gnu-linux --class gnu --class os {
menuentry "UBUNTU-GNOME_16.04.1-AMD64_PART30 GNU/Linux, avec Linux 4.4.0-36-generic' --class ubuntu_gnome_16_04_1_amd64_part30 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-36-generic-advanced-63b88532-fe8f-43ec-b30a-c6adb7f78e2e (on /dev/sdc30)" --class gnu-linux --class gnu --class os {
menuentry "UBUNTU-GNOME_16.04.1-AMD64_PART30 GNU/Linux, with Linux 4.4.0-36-generic (recovery mode)' --class ubuntu_gnome_16_04_1_amd64_part30 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-36-generic-recovery-63b88532-fe8f-43ec-b30a-c6adb7f78e2e (on /dev/sdc30)" --class gnu-linux --class gnu --class os {
menuentry "UBUNTU-GNOME_16.04.1-AMD64_PART30 GNU/Linux, avec Linux 4.4.0-34-generic' --class ubuntu_gnome_16_04_1_amd64_part30 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-34-generic-advanced-63b88532-fe8f-43ec-b30a-c6adb7f78e2e (on /dev/sdc30)" --class gnu-linux --class gnu --class os {
menuentry "UBUNTU-GNOME_16.04.1-AMD64_PART30 GNU/Linux, with Linux 4.4.0-34-generic (recovery mode)' --class ubuntu_gnome_16_04_1_amd64_part30 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-34-generic-recovery-63b88532-fe8f-43ec-b30a-c6adb7f78e2e (on /dev/sdc30)" --class gnu-linux --class gnu --class os {
menuentry "UBUNTU-GNOME_16.04.1-AMD64_PART30 GNU/Linux, avec Linux 4.4.0-31-generic' --class ubuntu_gnome_16_04_1_amd64_part30 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-31-generic-advanced-63b88532-fe8f-43ec-b30a-c6adb7f78e2e (on /dev/sdc30)" --class gnu-linux --class gnu --class os {
menuentry "UBUNTU-GNOME_16.04.1-AMD64_PART30 GNU/Linux, with Linux 4.4.0-31-generic (recovery mode)' --class ubuntu_gnome_16_04_1_amd64_part30 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-31-generic-recovery-63b88532-fe8f-43ec-b30a-c6adb7f78e2e (on /dev/sdc30)" --class gnu-linux --class gnu --class os {
menuentry "systemback-copy : UBUNTU-GNOME_16.04.1-AMD64_PART31 GNU/Linux' --class ubuntu_gnome_16_04_1_amd64_part31 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-7303f934-9558-471c-92ed-6e09b30098db (on /dev/sdc31)" --class gnu-linux --class gnu --class os {
menuentry "systemback-copy : UBUNTU-GNOME_16.04.1-AMD64_PART31 GNU/Linux, avec Linux 4.4.0-34-generic' --class ubuntu_gnome_16_04_1_amd64_part31 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-34-generic-advanced-7303f934-9558-471c-92ed-6e09b30098db (on /dev/sdc31)" --class gnu-linux --class gnu --class os {
menuentry "systemback-copy : UBUNTU-GNOME_16.04.1-AMD64_PART31 GNU/Linux, with Linux 4.4.0-34-generic (recovery mode)' --class ubuntu_gnome_16_04_1_amd64_part31 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-34-generic-recovery-7303f934-9558-471c-92ed-6e09b30098db (on /dev/sdc31)" --class gnu-linux --class gnu --class os {
menuentry "systemback-copy : UBUNTU-GNOME_16.04.1-AMD64_PART31 GNU/Linux, avec Linux 4.4.0-31-generic' --class ubuntu_gnome_16_04_1_amd64_part31 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-31-generic-advanced-7303f934-9558-471c-92ed-6e09b30098db (on /dev/sdc31)" --class gnu-linux --class gnu --class os {
menuentry "systemback-copy : UBUNTU-GNOME_16.04.1-AMD64_PART31 GNU/Linux, with Linux 4.4.0-31-generic (recovery mode)' --class ubuntu_gnome_16_04_1_amd64_part31 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-31-generic-recovery-7303f934-9558-471c-92ed-6e09b30098db (on /dev/sdc31)" --class gnu-linux --class gnu --class os {
menuentry "s3-fusion14.04 : PT-HYBRYDE FUSION 14.04_Massy GNU/Linux' --class pt_hybryde --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-df56cf2c-ed9a-42c8-b75d-241573c83b18 (on /dev/sdc8)" --class gnu-linux --class gnu --class os {
menuentry "s3-fusion14.04 : PT-HYBRYDE FUSION 14.04_Massy GNU/Linux, avec Linux 3.13.0-112-generic' --class pt_hybryde --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-112-generic-advanced-df56cf2c-ed9a-42c8-b75d-241573c83b18 (on /dev/sdc8)" --class gnu-linux --class gnu --class os {
menuentry "s3-fusion14.04 : PT-HYBRYDE FUSION 14.04_Massy GNU/Linux, with Linux 3.13.0-112-generic (recovery mode)' --class pt_hybryde --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-112-generic-recovery-df56cf2c-ed9a-42c8-b75d-241573c83b18 (on /dev/sdc8)" --class gnu-linux --class gnu --class os {
menuentry "s3-fusion14.04 : PT-HYBRYDE FUSION 14.04_Massy GNU/Linux, avec Linux 3.13.0-110-generic' --class pt_hybryde --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-110-generic-advanced-df56cf2c-ed9a-42c8-b75d-241573c83b18 (on /dev/sdc8)" --class gnu-linux --class gnu --class os {
menuentry "s3-fusion14.04 : PT-HYBRYDE FUSION 14.04_Massy GNU/Linux, with Linux 3.13.0-110-generic (recovery mode)' --class pt_hybryde --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-110-generic-recovery-df56cf2c-ed9a-42c8-b75d-241573c83b18 (on /dev/sdc8)" --class gnu-linux --class gnu --class os {
menuentry "s3-lub-brd-14.04 : PT-Lubuntu-BRD-14.04 GNU/Linux' --class pt_lubuntu_brd_14_04 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-6e521c54-1465-473c-83d1-d21e1eef8d13 (on /dev/sdc9)" --class gnu-linux --class gnu --class os {
menuentry "s3-lub-brd-14.04 : PT-Lubuntu-BRD-14.04 GNU/Linux, avec Linux 3.13.0-112-generic' --class pt_lubuntu_brd_14_04 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-112-generic-advanced-6e521c54-1465-473c-83d1-d21e1eef8d13 (on /dev/sdc9)" --class gnu-linux --class gnu --class os {
menuentry "s3-lub-brd-14.04 : PT-Lubuntu-BRD-14.04 GNU/Linux, with Linux 3.13.0-112-generic (recovery mode)' --class pt_lubuntu_brd_14_04 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-112-generic-recovery-6e521c54-1465-473c-83d1-d21e1eef8d13 (on /dev/sdc9)" --class gnu-linux --class gnu --class os {
menuentry "Start Maxtor GRUB4DOS Essayer-Installer des iso Linux lancees en live (on /dev/sdd1)" --class windows --class os {
menuentry "hyb-systemback : Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-1aced9e1-d845-46bb-a6e2-448666be4a21 (on /dev/sde1)" --class gnu-linux --class gnu --class os {
menuentry "hyb-systemback : Ubuntu, avec Linux 3.13.0-112-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-112-generic-advanced-1aced9e1-d845-46bb-a6e2-448666be4a21 (on /dev/sde1)" --class gnu-linux --class gnu --class os {
menuentry "hyb-systemback : Ubuntu, with Linux 3.13.0-112-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-112-generic-recovery-1aced9e1-d845-46bb-a6e2-448666be4a21 (on /dev/sde1)" --class gnu-linux --class gnu --class os {
menuentry "hyb-systemback : Ubuntu, avec Linux 3.13.0-110-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-110-generic-advanced-1aced9e1-d845-46bb-a6e2-448666be4a21 (on /dev/sde1)" --class gnu-linux --class gnu --class os {
menuentry "hyb-systemback : Ubuntu, with Linux 3.13.0-110-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-110-generic-recovery-1aced9e1-d845-46bb-a6e2-448666be4a21 (on /dev/sde1)" --class gnu-linux --class gnu --class os {
menuentry "SB@ : Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-2ffbf271-02fa-4d6f-a8e6-dee7a63894e5 (on /dev/sde4)" --class gnu-linux --class gnu --class os {
menuentry "SB@ : Ubuntu, avec Linux 4.4.0-67-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-67-generic-advanced-2ffbf271-02fa-4d6f-a8e6-dee7a63894e5 (on /dev/sde4)" --class gnu-linux --class gnu --class os {
menuentry "SB@ : Ubuntu, with Linux 4.4.0-67-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-67-generic-recovery-2ffbf271-02fa-4d6f-a8e6-dee7a63894e5 (on /dev/sde4)" --class gnu-linux --class gnu --class os {
menuentry "SB@ : Ubuntu, avec Linux 4.4.0-66-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-66-generic-advanced-2ffbf271-02fa-4d6f-a8e6-dee7a63894e5 (on /dev/sde4)" --class gnu-linux --class gnu --class os {
menuentry "SB@ : Ubuntu, with Linux 4.4.0-66-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-66-generic-recovery-2ffbf271-02fa-4d6f-a8e6-dee7a63894e5 (on /dev/sde4)" --class gnu-linux --class gnu --class os {
menuentry "SB@ : Ubuntu, avec Linux 4.4.0-64-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-64-generic-advanced-2ffbf271-02fa-4d6f-a8e6-dee7a63894e5 (on /dev/sde4)" --class gnu-linux --class gnu --class os {
menuentry "SB@ : Ubuntu, with Linux 4.4.0-64-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-64-generic-recovery-2ffbf271-02fa-4d6f-a8e6-dee7a63894e5 (on /dev/sde4)" --class gnu-linux --class gnu --class os {

# ce qui suit, est dans  40_custom

menuentry "systemback-test-04-par-mont-en-plus" {
menuentry "systemback-test-sans-conversion" {
menuentry "Iso Live ubuntu-16.04.1-desktop-i386.iso test encours-stockage iso dans ISO_LINUX Donnees SATA1" {
menuentry "Iso Live ubuntu-16.04.1-desktop-amd64.iso test encours-stockage iso dans ISO_LINUX Donnees SATA1" {
menuentry "Iso Live xubuntu-12.04.4-desktop-amd64.iso test encours-stockage iso dans s3fusion-12-sys sata3" {
menuentry "Iso Live xubuntu-12.04.4-desktop-amd64.iso test encours-stockage iso dans ISO_LINUX Donnees SATA1" {
menuentry "Iso Live xubuntu-12.04.4-desktop-amd64.iso test encours-stockage iso dans racine partition FAT32 sata3 " {
menuentry "clé Usb-live ou CD-ROM"  {
menuentry "Ubuntu-15.04-test Donnees sata1" {
menuentry "Iso Live ubuntu-15.10-desktop-i386.iso test encours-stockage iso dans s3fusion-12-sys" {
menuentry "Iso Live ubuntu-14.04.1-desktop-i386.iso test encours-stockage iso dans s3fusion-12-sys" {
#menuentry "clé Usb-live ou CD-ROM"  {
menuentry "clé Usb-live MULTISYSTEM"  {
menuentry "clés Usb-live cle-tests-windows et copy-cle-test-Win "  {
menuentry "Hybryde Fusion 14.04. donnees sata1" {
menuentry "Hybryde Fusion 14.04. donnees sata1 extract test" {
menuentry "Try Hybryde Fusion Custom V3 without installing-Laërte" {
#menuentry "Hybryde Fusion 14.04." {
menuentry "Slitaz-5.0-rc3" {
menuentry "Bodhi Linux" {
#menuentry "Hybryde Fusion 14.04." {
menuentry "ToutouLinux-436_2015-04-30.iso-sur-Maxtor" {
bernard@bernard-System-Product-Name:~$ 

Je tiens à disposition les fichiers de travail et le retour terminal des tests si besoin est.

Je suis en attente de communication de fichiers grub.cfg de Mint et Manjaro, pour savoir leur contenu...

@+.  Babdu89  .

Dernière modification par Babdu89 (Le 26/03/2017, à 08:49)


J'ai découvert Ubuntu avec la 07.10.... Et alors?!...  Depuis je regarde de temps en temps si Windows marche toujours....

Hors ligne

#169 Le 26/03/2017, à 10:51

ar barzh paour

Re : [Projet terminé] correction anomalie de grub

je ne sais pas si tu as utilisé le fichier supZZnum mais j'y ai fait une correction


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#170 Le 26/03/2017, à 16:45

Babdu89

Re : [Projet terminé] correction anomalie de grub

Bonsoir.

je ne sais pas si tu as utilisé le fichier supZZnum mais j'y ai fait une correction

EDIT :  2017-03-26 il faut ajouter avant la ligne ZZZnum="ZZZnum" la ligne
OLDIFS="$IFS"

J'ai fais mes tests sans cette modification.
Qu'est elle sensée faire?.

Je vais re-tester.

@+.   Babdu89  .


J'ai découvert Ubuntu avec la 07.10.... Et alors?!...  Depuis je regarde de temps en temps si Windows marche toujours....

Hors ligne

#171 Le 27/03/2017, à 11:46

ar barzh paour

Re : [Projet terminé] correction anomalie de grub

supZZZnum est juste un outil qui permet de supprimer les fichiers temporaires du répertoire ZZZnum sans avoir à relancer modif_grub et en fait n'est pas très très utile
(le même outil qui est déjà intégré à modif_grub ne comporte pas cette anomalie)

si tu utilises modif_grub pour mettre à jour les grub de plusieurs OS il peut être intéressant de procéder comme suit :
- lancer modif_grub
les autres fois lancer modif_grub avec l'option --sansfstab ( ce qui évite de relancer recup_fstab qui est assez long )

la première fois sert à récupérer un blkid à jour et les OS avec boot séparé , une fois suffit , les fois suivantes le programme réutilisera ces résultats, enfin à toi de voir si ce n'est pas trop compliqué et il faut bien sur relancer modif_grub à partir du même répertoire pour que le programme puisse retrouver les 2 fichiers blkid-res.txt et UBoot-UPart.txt

Dernière modification par ar barzh paour (Le 28/03/2017, à 04:59)


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#172 Le 07/04/2018, à 19:30

ar barzh paour

Re : [Projet terminé] correction anomalie de grub

NOUVELLE VERSION modif_grub_V44 qui va obligatoiremnt avec recup_fstab_V7
(il faut installer les deux dan un répertoire et lancer modif_grub_V44)
V44 et V7 corrigent un souci avec les labels comportant des espaces
j'ai testé sur ma machine
1-avec les étiquettes de partition comportant des espaces
2-avec un fichier manuel avec des labels comportant des espaces
le code de modif_grub_V44

#!/bin/bash
nom_base=`echo $(basename $0)`
nom_dir=`echo $(dirname $0)`
echo "$nom_base"
echo "$nom_dir"

#########################################################################################
# résumé des actions effectuées
# modif_grub permet
#  - de raccourcir la longueur d'un fichier au format grub 
#       en y supprimant des menus inutiles (menu contenant /dev /dev , uuid différents)
#    le fichier à traiter doit contenir
#                pemière ligne  : un commentaire commençant par #
#                la ligne       : ### BEGIN /etc/grub.d/10_linux ###
#
#                si la ligne    : ### BEGIN /etc/grub.d/40_custom ### apparait
#                seules les lignes entre 10_linux et 40_custom seront traitées
#                si cette ligne n'apparait pas
#                ce sont les lignes de 10_linux à la fin qui seront traitées           
#
#    un menu doit être de la forme 
#          menuentry ' ............ {  ou   menuentry " ..........{
#          des lignes intermédiaires à priori quelconques
#          la ligne terminant le menu ........ }
#
#    aucun caractère [hors blancs] ne doit apparaître après un { ou un }
#
#    un submenu doit être de la forme
#          submenu '................{ ou submenu "................{
#          des lignes quelconques ?
#          de menus au format ci-dessus
#          une ligne de fermeture    ......}    aucun caractères [hors blancs] après }
#          si cette ligne fait partie d'un menu elle sera alors de la forme
#               .........}    }
#       
#  - d'ajouter un label à un menu de grub pour avoir une présentation plus claire
#         pour cela deux solutions : 
#                        - utilisation du label de la partition
#                        - utilisation d'un fichier personnel au format blkid
#         lorsqu'un label est modifié et que l'on retraite le fichier , ce label sera 
# - l'action de remplacement d'un grub réel demande à l'utilisateur des précautions d'usage
#            être capable de revenir en arrière si problème !
#            c'est à dire être capable de remettre le grub d'origine
#########################################################################################
#########################################################################################
# les fichiers créés
#     les fichiers créés par recup_fstab
#         le fichier blkid-res.txt      ( correspondance dev-uuid-label)
#         le fichiers UBoot-UPart.txt   ( cas des OS avec boot séparé)
#     les fichiers créés par recup_fstab dans ZZZnum
#         le fichier DevSd-UBoot-UPart-<date> : contient les fichiers de /etc/fstab
#         le fichier UBoot-UPart-<date>.txt   : copie de  UBoot-UPart-<date>.txt
#
#     les autres fichiers qui sont créés dans ZZZnum par modif_grub
#         le fichier grub-OK-<date>-<....>.txt destiné à remplacer le fichier traité
#            ce fichier n'apparait plus si on a demandé le remplacement du fichier traité
#                 mais dans ce cas le fichier traité est sauvegardé (dans son nom-<date>)
#         les fichiers suivants sont plus ou moins intéressant à analyser
#             fichier grub-sup : contient les menus qui ont été supprimés
#             fichier stat-<date> : contient nombre de menus/lignes conservés/supprimés 
#             fichier grub-mod : contient la 1ére ligne d'un menu qui a été modifié
#                                           ou qui a été conservé pour une raison X
#             les fichiers tmp[012]-<date> (coupures du fichier traité) 
#########################################################################################

# quelques points d'historique

# V44 2018-04-07 correction anomalie labels tronqués s'ils comportent des espaces
#     concerne le $ récupération dev label uuid btype dans le fichier choisi vers ligne 1240
#     fonctionne avec recup_fstab_V7 ( idem modification pour les labels tronqués )
# V43 2018-02-13 fonctionne avec V6
# V41 2017-03-23
#     prend en compte le changement de label par un autre label
#     ne fonctionnera que
#     si on traite un grub modifié par modif_grub à partir de V7 
#     remarque on peut aussi repartir d'un grub tout neuf par update-grub
#     les grub de tous les OS doivent être dans cet état
#     on peut le voir si la ligne du menu entry comporte  : après le label
#     exemple     	menuentry 'U16.04-P10-64b : Ubuntu, avec Linux .......  
#     par contre la ligne suivante avec un nouveau label NOUVEAU
#     	menuentry 'M16.04-P12-64b,Ubuntu  (sur /dev/sda12)' 
#     deviendrait
#     	menuentry 'NOUVEAU : M16.04-P12-64b,Ubuntu  (sur /dev/sda12)'

# V40 qui fonctionne avec recup_fstab_V5
#     les fichiers créés prennent un nom plus long (répertoire complet)
#     les statistiques sont conservées dans ZZZnum/stat-<date>
#     pour des raisons d'affichage , les _ des noms de fichiers créés sont remplacés par des -

# V39 répertoire des fichiers temporaires ZZZnum
#    demande de suppression fichers

# V38 avec recup_fstab_V4
#       ajout de l'option --sansfstab (permet de na pa lancer recup_fstab)
#  ===> la création du fichier de concordance UUID-Part-UUIDBoot ne sera pas faite
#       (hors ce fichier est nécessaire à modif_grub )
#       et le fichier blkid ne sera pas mis à jour automatiquement

# V35 le programme ne traite plus que les lignes comprises entre 
#     ### BEGIN /etc/grub.d/10_linux ###
# et
#     ### BEGIN /etc/grub.d/40_custom ###
#    le fichier à traiter doit commencer par un #
#    la ligne ### BEGIN /etc/grub.d/10_linux ### est obligatoire
#    mais ne doit pas commencer le fichier
#    si la ligne ### BEGIN /etc/grub.d/40_custom ### est absente
#    le programme traitera le fichier de 10_linux jusqu'à la fin

# V34 suppression de certaines fonctions devenue inutiles
#     réorganisation de certaines fonctions

# V33 ajout du sous programme recup_fstab_V2 ( étude système à boot séparé)

# V30 idem V29 sans les commentaires superflus
# si boot séparé on sort !!!!

# V29 2017-03-09
# correction due à l'utilisation de ${#uuid[*]} dans la construction concordance label-uuid
# remplacement de tous les while ${#menu[*]} par for ${!menu[@]}

# V28 2017-03-08
# présentation de concordances UUID-LABEL
# un ligne menuentry et submenu peut comporter des blank après   } 
# une ligne peut se terminer par }  }

#V26 function sort_info_transforme donne des traces

# V25 
# chaine_linux="linux.*\/vmlinu" pour prise en compte de "linux	/@/boot/vmlinuz"

# V8 2017-02-14
# adjonction critere_suppression_2
# suppression des menus qui ont des UUID différents dans search --no-floppy et dans linux /boot/
# conservation des menus qui n'ont pas de lignes search --no-floppy
# conservation des menus qui n'ont pas de lignes linux /boot/vmlinu
# anomalie redoublement label , non modification de la ligne submenu

# V7 2017-02-13
# la ligne de submenu est recherché par submenu ' ou par submenu " au lieu de submenu 'Options ..... 
# l' UUID (et donc le label) est récupéré dans le bloc suivant de menuentry


# V6 2017-02-13
# on récupère l'UUID dans la ligne search --no-floppy --fs-uuid --set=root du bloc

# V5 2017-02-12
# seules les lignes commençant par menuentry et finisant par { seront traitées comme menuentry
#       (le test se fait par ^[tab ]*menuentry.*{$)

# V4 2017-02-10
# il y aura suppression du menu si on trouve  ....../dev/sd...../dev/sd...... AVANT la chaine --class  ,
########################################################################################    




function confirmation_sortie {
	declare titre="Sortie de $0"	
	declare	ok="Confirmer la sortie"
	declare	texte="Pour Validez la sortie cliquer sur \"$ok\""
	declare	cancel="Abandonner la sortie"

	if zenity --question --title "$titre" --text "$texte" \
              --no-wrap --ok-label "$ok" --cancel-label "$cancel"
		then
			exit 63
		fi
}

function suppression_fichiers_temporaires {
    repertoire_a_vider="./$ZZZnum"
    fich="/tmp/liste_fichier.txt" # contient la liste des fich. du rép. à supprimer
    oklabel="Sortir si EXIT coché  / Supprimer fichiers cochés sinon"
    cancellabel="Re-cocher toutes les cases (sauf grub-OK)"
	texte="
        Des fichiers ont été créés lors de l'exécution du programme
            $0
        ci dessous ces fichiers encore existants dans le répertoire
        $repertoire_a_vider

        Pour supprimer un/des fichiers 
            1- Décochez la case EXIT 
            2- Cochez   la case du/des fichier(s) que vous voulez supprimer
            3- Cliquer sur $oklabel
               ==> ce menu se relancera en indiquant
                   les fichiers encore existants dans le répertoire $repertoire_a_vider

        Pour SORTIR de ce menu une seule solution
               Cochez la case EXIT puis cliquez sur \"$oklabel\"

         pour Recocher la case de tous les fichiers (sauf grub-OK) cliquer sur la case					
             $cancellabel
            "
while :
	do
		# listage des fichiers du répertoire
		ls "$repertoire_a_vider" > "$fich" # ligne à supprimer en réel
		liste_fichier="TRUE EXIT_(Sortir_du_menu)"
		while read ligne
			do                                    # problème zenity ?
				ligne=$(sed "s/ /*/g" <<< $ligne) # remplacer les espaces par *
				case $ligne in
					tmp[012][-_]20*  |     \
					tmp[-_]u[-_]l*      |     \
					tmp.txt       |     \
                    fich[-_]transforme-* | \
                    grub-mod*  |      \
                    stat-20*     |      \
                    DevSd[-_]UBoot* |      \
                    grub-sup-20* |      \
                    UBoot-UPart*         )
					liste_fichier="$liste_fichier TRUE $ligne"
					;;
                    blkid-res.txt |     \
					grub-OK*            )
					liste_fichier="$liste_fichier FALSE $ligne"
					;;
					esac
			done < "$fich"

	#sélection des fichiers à supprimer

	choix=`zenity --list \
	  --title="XXXXXXXXXXXXXXXXXXX : $0" \
	  --text="$texte" \
	  --checklist \
      --cancel-label "$cancellabel" \
      --ok-label "$oklabel" \
	  --height "750" \
	  --width "800" \
	  --column="CONS/SUP" --column="nom du(des) fichier(s) de $repertoire_a_vider" \
	  ${liste_fichier} \
	   	2>/dev/null `	# ne pas effacer cette ligne fin de choix
code=$?
echo "code de zenity $code"
	if [[ $code == 0 ]] # code retour zenity (0=normal,sinon clic/x  , Esc , )
	then
        [[ -n `echo $choix|grep "EXIT"` ]] && exit 0
		if [[ -z $choix ]] # $choix est vide
			then
				echo "Aucun choix effectué"
				continue # on recommence
			else
                echo "le choix est :"
                echo "$choix"
				IFS="|"
				list=($choix)
				echo "le 1er  est ${list[0]}"
				echo "le 2ème est ${list[1]}"
                echo ${list[@]}
				IFS="$OLDIFS"			
                 if zenity --question --title "SUPPRESSION" \
                          --text "Suppression de ${#list[@]} fichiers" \
                          --no-wrap --ok-label "Confirmer Suppression" \
                          --cancel-label "Abandonner la Suppression"
                  then
				  for i in ${list[@]}
				    do
					   i=$(sed "s/*/ /g" <<< $i) #remettre espace à la place des *
				       echo "je supprime $repertoire_a_vider/$i"
					   rm "$repertoire_a_vider/$i"
				    done
		           fi
                
                continue # on recommence
			fi
	else 
		[[ $code == 1 ]] && continue # on a cliqué sur Re-cocher
	fi
    confirmation_sortie
done
}

function ne_commence_pas_par_begin {
# le fichier à traiter ne doit pas commencer par ### BEGIN /etc/grub.d/10_linux ###
read ligne < "$fich_source"
if [[ "$ligne" =~ ^"$deb" ]]
	then
		echo ; echo
		echo "désolé"
		echo "si le fichier grub à traiter ( $fich_source )"
		echo "n'a pas le droit de commencer par la ligne"
		echo "$deb"
		echo "rappel :" 
		echo "    1- cette ligne"
		echo "       $deb"
		echo "       DOIT apparaître plus loin dans le fichier"
		echo "            même pour un fichier grub d'essai"
		echo
		echo "    2- le fichier à traiter DOIT commencer par une ligne de commentaire"
		echo "         (car cette première ligne sera modifiée)"
		echo
		echo "    3- en réel le fichier grub commence par #"
		exit 1 # au lieu de return 1
	fi
}

function trier_fichier {
echo ; echo
echo "fichier grub choisi : $fich_source"
deb="### BEGIN /etc/grub.d/10_linux ###"
fin="### BEGIN /etc/grub.d/40_custom ###"

ne_commence_pas_par_begin

# création de 3 fichiers tmp0-<date>.txt tmp1-<date>.txt tmp3-<date>.txt

[[ -e "$fich_source_0" ]] && rm "$fich_source_0" # inutile mais évite message d'erreur rm
[[ -e "$fich_source_1" ]] && rm "$fich_source_1" # inutile mais évite message d'erreur rm
[[ -e "$fich_source_2" ]] && rm "$fich_source_2" # inutile mais évite message d'erreur rm


fich="$fich_source_0"
presence_10_linux=1
IFS="~"
while read ligne
do
	case "$ligne" in
		$deb ) fich="$fich_source_1" ;  presence_10_linux=0		;;
		$fin ) fich="$fich_source_2" 							;;
	esac
	echo "$ligne" >> $fich
done < "$fich_source"
IFS="$OLDIFS"

# après lecture du fichier on a du renconter le ligne 10_linux sinon
if [[ $presence_10_linux -eq 1 ]]
then
	echo "la présence de la ligne $deb est obligatoire"
	echo "le traitement ne commence qu'à partir de cette ligne"	
	echo "ajouter cette ligne au fichier"
	exit 0
fi
	
}


function verifier_presence_dev { # dans le cas d'utilisation d'un blkid personnel
echo
# mettre les dev de "sudo blkid" dans un tableau
dev1=(`awk -F" " '{printf("%s ",$1)}' "$blkid"`)

# mettre les dev du fichier choisi dans un tableau
dev2=(`awk -F" " '{printf("%s ",$1)}' "$blkid_choisi"`)

manque=""
for d1 in ${dev1[@]} # /dev/sdxy: /dev/sdzt: de blkid
do
	res=`grep $d1 <<< ${dev2[@]}`
	[[ -z $res ]] && manque="$manque $d1" # si non trouvé , ajout
done
	if [[ -n $manque ]]
		then 
			echo "dans le fichier $blkid_choisi il manque"
			echo ; echo $manque ; echo
			echo "tous les dev présents sur la machine doivent être déclarés dans ce fichier"
			echo "veuillez éditer ce fichier"
			echo "format habituel dev/sdxx: LABEL=\"xxxx\"  UUID=\"xxxx\""
			echo " la présence de LABEL n'est pas obligatoire" 
			exit 0
		fi
}




function modif_ligne1_grub { # récupère la première ligne et modifie en y mettant la date

res=`echo "$1" | grep "^ *	*#"`



if [[  -n $res ]] # la ligne est bien un commentaire (commence par #)
	then
		trans="#### $num : $fich_source modifié par $0 ####"
		echo $trans			> "$fich_sauv"
		((nb_lignes_cons++))
		((nb_lignes_hors_menu++))
sort_info_transforme "$1" "première ligne modifiée en" "$trans"

	else
		echo "la première ligne du fichier est "
		echo $1
		echo	
		echo "mais il faut que la première ligne du fichier"
		echo "$fich_source"
		echo "commence par un #"
		echo "ajouter cette ligne de commentaire au début de ce fichier"
		echo "arrêt du programme"
		exit 0
	fi #[[ -n $res  ]]

}


function OK {
rep=""
while [[ $rep != [oOyYnN] ]]
do
titre="programme $0"
texte="cette partie de programme supprime des lignes supposées inutiles de grub 
 - paragraphes  contenant ......$rech_dev.....$rech_dev........... AVANT la chaine $rech_class
 - menuentry n'ayant pas des UUID égaux dans la ligne search et la ligne linux
    (à partir de V34 les menuentry sur boot séparé sont conservés)	

 - le programme demande le nom du fichier à traiter .. 
         ==> en réel ce devrait être <partition>/boot/gub/grub.cfg
 - le programme crée un fichier grub-OK-date qui pourra être utilisé pour remplacer le fichier grub
 - le programme utilise aussi le label des partitions ou d'un fichier de référence 
        pour informer plus précisement la ligne menuentry de grub,
        on peut utiliser un fichier de référence uuid label (au format blkid)
 
 - remarque : pour des essais , on peut traiter n'importe quel fichier ayant un format grub
     si le fichier à traiter n'est pas au format grub , il ne fonctionnera pas correctement
     et en réel il serait préférable de lancer ce programme après avoir lancé un update-grub

trois fichiers sont créés :
    grub-OK -<aaaa:mm:dd-hh:mm:ss>.txt        ( le grub reformaté )
    grub-sup-<aaaa:mm:dd-hh:mm:ss>.txt        ( les menuentry qui ont été supprimés )
    grub-mod-<aaaa:mm:dd-hh:mm:ss>.txt        ( les lignes modifiées )

	vous pourrez analyser ces fichiers pour voir ce qui s'est passé
    avant de remplacer le fichier traité (surtout si c'est grub.cfg)
    (en fin de traitement répondez alors non à la demande de remplacement
     et faites le remplacement manuellement)

lors du traitement ..... ( c'est uniquement une info visuelle )
    les  x  qui défilent indiquent des lignes de menu qui seront supprimées
    les  c  qui défilent indiquent les lignes de menu qui seront conservées
    les  .  qui défilent indiquent les autres lignes  (qui seront conservées)
    un   S  indique un début de submenu
    un   M  indique un début de menuentry
    un   m  indique la suite de menuentry 
 
			tapez O puis valider pour continuer
			tapez A puis valider pour arrêter 

			O pour continuer / A pour arrêter le programme  
       "
       
rep=`zenity --entry --title "$titre" --text "$texte" --width "800"`
case $rep in
	[oOyY]	)	:												;;
	[aA]	)											exit 1	;;
	*		) 	echo "utilisez seulement oOyYaA S.V.P."			;;
esac	
done
}


function choix_fichier_blkid { # retourne 0 si fichier blkid choisi
fichier_source=""
titre="$0               Sélectionnez le fichier contenant UUID et LABEL des partitions"
fichier_source=`zenity --file-selection --title="$titre"`
case $? in	#$? est le code de retour de zenity
 	0)	blkid_choisi="$fichier_source"						            ;;
	1)	echo "Aucun fichier UUID-LABEL sélectionné."	; exit 1	;;
	-1)	echo "Une erreur inattendue est survenue." 		; exit 1	;;	
	*)	echo "erreur non reconnue" 						; exit 1	;;	
esac
}


function critere_suppression_2 { # se fait après une initialisation de menu[0 ...n]

##### attention les codes de retour ont changé
# 0 si ligne search et ligne linux et uuid égaux (menu conservé + label dans menu[0])
# 1 si pas de ligne search ou linux              (menu conservé intégralement)
# ligne search et linux trouvées
# 3 aucun UUID trouvé dans fichier UUID-LABEL
# 2 si uuid différents                           (menu supprimé à revoir?)

uuid_search="x"
uuid_linux="y"

ligne_search=""
ligne_linux=""

# recherche dans le tableau menu[1..n] de la ligne search

#TEST

for i in ${!menu[@]}				# pour tous les indices 0..n
do
	[[ $i = 0 ]] && continue		# sauf dans menu[0]
	res=`grep "$chaine_search" <<< "${menu[i]}"` # dans menu[1..n]
	if [[ -n $res ]]
		then
			ligne_search="${menu[i]}"
			break					# 1er menu[n] trouvé est le bon
		fi

	done


if [[ -z "$ligne_search" ]]
then
	return 1 # pas de chaine search => on conservera le menu intégralement
fi

# recherche dans le tableau menu[] de la ligne linux


for i in ${!menu[@]}				# pour tous les indices 0..n
do
	[[ $i = 0 ]] && continue		# sauf dans menu[0]
	tmp=`sed 's/[[:blank:]]//g'	<<< "${menu[i]}"` #suppression des blank de menu
	res=`grep "$chaine_linux"   <<< "${menu[i]}"` # dans menu[1..n]
	if [[ -n $res ]]
		then
			ligne_linux="${menu[i]}"
			break					# 1er menu[n] trouvé est le bon
		fi

	done


if [[ -z "$ligne_linux" ]]
then
	return 1 # pas de chaine linux => menu conservé sans modif
fi

#uuid ligne search présent dans fichier de réf uuid-label ?
# si trouvé positionne uuid_search
n=-1
while [[ $n -lt $maxuuid ]]
	do
	((n++))					# recherche de uuid[0..n]
	if [[ -n ${uuid[$n]} ]] # précaution supplémentaire uuid non vide
	then
		res=`grep ${uuid[$n]} <<< "$ligne_search"`	#  y-a-t-il l'UUID
		if [[ -n $res ]] 
			then
				uuid_search=${uuid[$n]}
				break 				# le premier uuid trouvé dans blkid sera le bon
		fi
	fi 
done 


# uuid ligne linux présent dans fichier de réf uuid-label ?
# si trouvé positionne uuid_linux
n=-1
while [[ $n -lt $maxuuid ]]
	do
	((n++))					# recherche de uuid[0..n]
	if [[ -n ${uuid[$n]} ]] # précaution supplémentaire uuid non vide 
	then
		res=`grep ${uuid[$n]} <<< "$ligne_linux"`	#  y-a-t-il l'UUID
		if [[ -n $res ]] 
			then
				uuid_linux=${uuid[$n]}
				break 				# le premier uuid trouvé dans blkid sera le bon
		fi
	fi 
done


# analyse des résultats

if [[ ${uuid_search}${uuid_linux} = "xy" ]]
then
	return 3 # aucun des uuid n'a été trouvé dans blkid ( peuvent être égaux ou non )
fi 

####################################################################################
# on peut avoir uuid_search  uuid_linux
#               x            1ea0....  : n'existe pas  , existe       : code retour 2
#               a04f...      y         :   existe      , n'existe pas : code retour 2
#               bcde...      fghi....  : uuids existants et différents: code retour 2
#               1234...      1234....  : uuids existants et égaux     : code retour 0
#####################################################################################



# si $uuid_search-$uuid_linux est dans UBoot on renvoie 4
# ce menu correspond à une partition avec boot séparée

for i in ${!UBoot[@]}		# pour tous les indices 0..n
do

	[[ $uuid_search-$uuid_linux = ${UBoot[$i]} ]] && return 4 

done


if [[ "$uuid_search" != "$uuid_linux" ]]
	then
		return 2 #  uuid différents on supprimera ce menu
	else
		return 0 # uuid egaux on conservera ce menu après modif de menu[0]
fi

} # fin function critere_suppression_2


function ajout_label_menuentry { # ajoute un label à menu[0] (search ou linux)
rech_uuid_label_menuentry "$1" 	# retour 0 si label trouvé , pas zéro sinon
code=$?
if [[ $code -eq 0 ]]
  then # on a un label
	  tmp=${menu[0]}	
#	  menu[0]=`sed "s/menuentry '/menuentry '$label_trouve : /" <<< ${menu[0]}`
#	  menu[0]=`sed "s/menuentry \"/menuentry \"$label_trouve : /" <<< ${menu[0]}`
#	  menu[0]=`sed "s/${label_trouve} *:* *${label_trouve}/${label_trouve}/" <<<${menu[0]}`

# 1 remplacement de l'ancien par le nouveau , (s'il n'y a pas d'ancien ,rien n'est changé)
            menu[0]=`sed "s/menuentry '.* : /menuentry '$label_trouve : /" <<< ${menu[0]}`
            menu[0]=`sed "s/menuentry \" .*: /menuentry \"$label_trouve : /" <<< ${menu[0]}`
# 2 ajout du nouveau en tête
            menu[0]=`sed "s/menuentry '/menuentry '$label_trouve : /" <<< ${menu[0]}`
            menu[0]=`sed "s/menuentry \"/menuentry \"$label_trouve : /" <<< ${menu[0]}`
# 3 suppression des doublons
            menu[0]=`sed "s/${label_trouve} *:* *${label_trouve}/${label_trouve}/" <<<${menu[0]}`






	  if [[ $tmp != ${menu[0]} ]]
		then
			sort_info_transforme "$tmp" "	LIGNE transformée en" "${menu[0]}" 
		fi #[[ $tmp != ${menu[0]} ]]
	  fi # [[ $code -eq 0 ]]
}


function memorise_menuentry { # mémorise menuentry de submenu pour écriture ultérieure
	for  p in ${!menu[@]}	# pour tous les indices de menu[]
		do
			((i_s++))
			ligne_sousmenu[i_s]=${menu[$p]} 	# mémorise menu[0 ..n]
			((nb_lignes_menu_cons++))			# stat
		done 
}


function ecrire_lignes_memorisees { # écrit les lignes dans sauv

for p in ${!ligne_sousmenu[@]}	# pour tous les indices de ligne_sousmenu[]
	do
		echo "${ligne_sousmenu[$p]}" >> "$fich_sauv"	# écriture l_s[0..n]
		((nb_lignes_cons++))							# stat
	done
}


function traite_ligne_submenu { # reçoit $1 (ligne submenu '.......{

fin_submenu=1 # sera mise à 0 si un menuentry se termine par }  }
submenu="$1" #mise en mémoire de cette ligne

# j'utilise la mémorisation label_submenu du label d'un menuentry précédent  

if [[ -n $label_submenu ]]
then
# ajout du label et suppression double label
submenu=`sed "s/submenu '/submenu '${label_submenu} : /"   <<< $submenu`
submenu=`sed "s/submenu \"/submenu \"${label_submenu} : /" <<< $submenu`
submenu=`sed "s/${label_submenu} *:* *${label_submenu}/${label_submenu}/" <<<$submenu`
fi

i_s=0
unset ligne_sousmenu

ligne_sousmenu[0]="$submenu"	# mémorisation pour sortie finale
((nb_lignes_hors_menu++))		# ligne considérée comme hors menu

# lire les lignes qui suivent submenu jusquà trouver ligne ......} hors menuentry)

while read ligne
do
((nb_lignes_lues++))
		# si on trouve .... } hors menuentry on est au bout du submenu
		# il faut sauvegarder la ligne submenu , les lignes intermédiaires et menuentry
		# je ne traite pas du cas où on trouverait une ligne menuentry terminée par  } }
		# V28 et suivante ce cas est traité
		# une ligne menuentry terminée par } } provoque la fin du submenu  ($fin_submenu 0)

# on sort de la boucle si on trouve } en fin de ligne hors menuentry

tmp=`sed 's/[[:blank:]]//g' <<<"$ligne"` # supprime les blancs de la ligne

if [[ "$tmp" =~ }$ || "$fin_submenu" = 0 ]]   ### on est en fin de submenu ###
				# pas tout à fait exact
				# si on peut  avoir { ...... } hors menuentry
		then
			((i_s++))
			ligne_sousmenu[i_s]="$ligne"	# mémoriser cette ligne
			((nb_lignes_hors_menu++))		# stat
			echo -e ".\c"
			ecrire_lignes_memorisees		# écriture de ces lignes de submenu
			label_submenu=""
			return							# fin de traitement de submenu
		fi # [[ "$tmp" =~ }$ ]]

# V28 élargissement aux blancs de grep après {
res=`echo "$ligne" | grep "^[	 ]*menuentry.*{[ 	]*$"`
mem=`echo "$ligne" | grep "^[	 ]*menuentry ['\"]Memory test.*{[ 	]*$"`

if [[ -n $mem ]]
then			
	res=""		# si on trouve la chaine Memory pas intéressant on force res à vide
fi

if  [[ -z $res ]]
	then								# ni menuentry ..{ ni memory ...{
		((i_s++))						# 
		ligne_sousmenu[i_s]="$ligne"	# mise en mémoire pour écriture ultérieure
		((nb_lignes_hors_menu++))		# stat
		echo -e ".\c"	
	
	else
		lire_menuentry 					# menu[0..n]  et ((nb_lignes_lues++))
		trt_menu2 "${menu[0]}" 			# 1 si contient dev dev
		code_dev_dev=$?

		if [[ $code_dev_dev -eq 1 ]]	# 1 la ligne contient /dev /dev
			then
				sort_menu_1 " " "menu supprimé : trop de /dev/sd"		# suppression de ce menu
				((nb_menu_sup++))		# stat
			else 						# pas 1 : ne contient pas dev dev
				critere_suppression_2
				code_crit2=$?			# 0 1 2 3 

				case $code_crit2 in
				0)						# les uuid sont égaux modifier menu[0]
					ajout_label_menuentry "$chaine_search"
					memorise_menuentry	# mettre en mémoire ces lignes de menuentry
					((nb_menu_cons++))	# stat non prévu dans memorise_menuentry
				;;
				1)						# pas de search ni de linux on garde sans modif
					memorise_menuentry	# mettre en mémoire ces lignes de menu
sort_info_transforme "${menu[0]}" "menu dans submenu conservé (pas de ligne search ou linux)"
					((nb_menu_cons++))	# stat non prévu dans memorise_menuentry
				;;
				2)						# uuid différents on supprime ce menu
					sort_menu_1 " " "menu supprimé : uuid différents"
					((nb_menu_sup++))	# stat non prévu
				;;
				3)						# uuid non trouvé (search et linux existent)
					memorise_menuentry	# mettre en mémoire ces lignes de menu
sort_info_transforme "${menu[0]}" "menu dans submenu conservé : uuid (search ou linux) non trouvé"
					((nb_menu_cons++))	# stat non prévu
					((nb_menu_sans_uuid++))
				;;
				4)						# uuid != mais boot séparé
					# revoir pour le label
					ajout_label_menuentry "$chaine_linux"
					memorise_menuentry	# mettre en mémoire ces lignes de menuentry
					((nb_menu_cons++))	# stat non prévu dans memorise_menuentry
					((nb_menu_boot_cons++))
					
				;;					
				esac
			fi # [[ $code_dev_dev -eq 1 ]]
	fi # [[ -z $res ]]
done

# si on arrive ici il y a erreur de traitement quelque part
echo
echo " ligne bach $LINENO"
echo " erreur de format ? dans le fichier $fich_source !!!!!!!!!!"
echo " dernière ligne de menu lue :"
echo
echo ${menu[0]}
echo
echo " dernière ligne lue : $nb_lignes_lues"
echo " $ligne"
sleep 100
exit 0 
}


function rech_uuid_label_ligne { # recherche uuid et label  de $1 dans uuid[0..n]
# renvoie 0 uuid trouvé et label trouvé	uuid_trouve=xxx  label_trouve="yyy"
# renvoie 1 uuid trouvé et label vide	uuid_trouve=xxx  label_trouve=""
# renvoie 2 uuid non trouvé				uuid_trouve=""   label_trouve=""	
uuid_trouve=""
label_trouve=""
n=-1
while [[ $n -lt $maxuuid ]]
	do
	((n++))								# uuid suivant
	if [[ -n ${uuid[$n]} ]]				# précaution supplémentaire uuid non vide 
	then
		res=`grep ${uuid[$n]} <<< $1`	#  $1 est une ligne de menu
		if [[ -n $res ]] 
			then
				uuid_trouve=${uuid[$n]}
				if [[ -n ${label[$n]} ]]
				then
					label_trouve=${label[$n]}	# si label non vide positionne label_trouve
					return 0					# uuid trouvé / label non vide trouvé
				else
					return 1					# uuid trouvé / label ""
				fi
		fi
	fi 
done 
return 2										# uuid non trouvé 
}


function rech_uuid_label_menuentry { # recherche uuid et label dans la ligne $1 de menu[1 ..n]

for p in ${!menu[@]}	# pour tous les indices du tableau 0..n
do
	[[ $p = 0 ]] && continue	# mais pas dans menu[0]
	res=`echo ${menu[$p]} | grep "$1"`	
	if [[ -n $res ]]
		then
			rech_uuid_label_ligne ${menu[$p]}		# donne uuid_trouve / label_trouve
			return $?								# 0 uuid égaux 
													# 1 uuid trouvé , label vide
													# 2 pas d'uuid dans search 
		fi
	done
return 3	# pas de search trouvé , (donc pas d'uuid , et donc pas de label) !!!
}




function transforme_ligne_menuentry {	# modifie la première ligne d'un menuentry conservé
# recherche l'UUID dans la ligne search --no-floppy --fs-uuid --set=root
# si trouvé , on récupère le label
# si label vide on ne fait rien
# sinon on rajoute avec : en tête après menuentry ' ou menuentry " 
# 

label_trouve=""
uuid_trouve=""
tmp=${menu[0]}					# servira de test pour sortie si modifié
rech_uuid_label_menuentry "$1"	# positionne le label à la bonne valeur
code=$?							# retour de la fonction

case $code in
	0)		# UUID trouvé : $uuid_trouve LABEL trouvé : $label_trouve

			if [[ $label_submenu = "" ]]	# servira dans traitement d'un submenu éventuel
				then						# on memorise le premier label menuentry trouvé	
					label_submenu="$label_trouve"
				fi	
#			menu[0]=`sed "s/menuentry '/menuentry '$label_trouve : /" <<< ${menu[0]}`
#			menu[0]=`sed "s/menuentry \"/menuentry \"$label_trouve : /" <<< ${menu[0]}`
			#suppression double labels dans cette ligne
#			menu[0]=`sed "s/${label_trouve} *:* *${label_trouve}/${label_trouve}/" <<<${menu[0]}`

# 1 remplacement de l'ancien par le nouveau , (s'il n'y a pas d'ancien ,rien n'est changé)
# 2 ajout du nouveau
# 3 suppression des doublons


# 1 remplacement de l'ancien par le nouveau , (s'il n'y a pas d'ancien ,rien n'est changé)
            menu[0]=`sed "s/menuentry '.* : /menuentry '$label_trouve : /" <<< ${menu[0]}`
            menu[0]=`sed "s/menuentry \" .*: /menuentry \"$label_trouve : /" <<< ${menu[0]}`
# 2 ajout du nouveau en tête
            menu[0]=`sed "s/menuentry '/menuentry '$label_trouve : /" <<< ${menu[0]}`
            menu[0]=`sed "s/menuentry \"/menuentry \"$label_trouve : /" <<< ${menu[0]}`
# 3 suppression des doublons
            menu[0]=`sed "s/${label_trouve} *:* *${label_trouve}/${label_trouve}/" <<<${menu[0]}`









			if [[ $tmp != ${menu[0]} ]]
			then #TEST
				sort_info_transforme "$tmp" "	LIGNE transformée en" "${menu[0]}"
			fi
	;;
	1)		# LABEL vide #TEST
				sort_info_transforme "$tmp" "pas de label pour $uuid_trouve dans $blkid_choisi"
	;;
	2)		#LABEL vide uuid non trouvé #TEST
				sort_info_transforme "$tmp" "uuid de ligne search non trouvé dans $blkid_choisi"
	;;
	3)		# pas de ligne search trouvée dans menuentry v
				sort_info_transforme "$tmp" "ligne search non trouvée"
	;;	
	*) # ???? #TEST
				sort_info_transforme "$tmp" "code inconnu : $code"
	;;
esac

return $code
}


function lire_menuentry { # met dans tableau menu[n] jusqu'à trouvé } seul sur la ligne
unset menu
i=0
menu[0]="$ligne"								# menu[0] est la première ligne
echo -e "M\c"									# trace début de menuentry
while read ligne								# ligne suivante
do
	((i++))
	((nb_lignes_lues++))
	menu[$i]="$ligne"							# mémorisée dans menu [1 .. n]
	echo -e "m\c"								# trace écran
	tmp=`sed 's/[[:blank:]]//g' <<<"$ligne"`	# suppression des blancs pour test

	if [[ "$tmp" =~ }}$ ]]
		then
			fin_submenu=0						# termine par  }   } fin de submenu !!!
		fi

	if [[ "$tmp" =~ }$ ]]   					# la ligne se termine par } ?
		then
			return								# oui fin de menuentry
		fi
			# et si pas de ... } on ira jusqu'en fin de fichier !!!!
			# c'est un critère de format de grub
done
}

function sort_menu_0 {	# écrit menu[0..n] dans le fichier de sauvegarde

for p in ${!menu[@]}						# pour tous les indices
	do
		echo "${menu[$p]}" >> "$fich_sauv"	# écriture menu[0..n]
		((nb_lignes_cons++))				# stat
		((nb_lignes_menu_cons++))			# stat
		echo -e "c\c"						# suivi écran
	done
}


function sort_menu_1 {	# écrit menu[0..n] dans le fichier suppression

#écriture des paramètres reçus dans fich_sup
	echo "#########################"	>> $fich_sup
	for arg in "$@"		# prends $1 $2 ... $n
	do
		echo $arg		>> $fich_sup
		#echo			>> $fich_sup
	done

# écriture du menu dans fichier sup
for p in ${!menu[@]}					# pour tous les indices
do
	echo "${menu[$p]}" >> "$fich_sup"	# écriture menu[0..n]
	((nb_lignes_sup++))					# stat
	echo -e "x\c"						# suivi écran
	done
}



function sort_info_transforme { # écrit les paramètres reçus fich_transforme

	echo "#########################"	>> $fich_transforme
	for arg in "$@"	# ( $1 $2 ... $n )
		do
			echo $arg		>> $fich_transforme
			#echo			>> $fich_transforme
		done
}


function trt_menu2 { # analyse le paramètre $1
	# renvoie 1 si $1 contient plus d'une fois /dev/sd  avant --class (suppresion)
	# renvoie 0 sinon

IFS="$OLDIFS"		# il faut l'espace comme délimiteur
tableau=($1)	# mise en tableau de la ligne
IFS="~"		# peut-être utile pour la suite ?

nbdevsd=0 					# nombre de fois que l'on trouve /dev/sd (avant --class)

for n in ${!tableau[@]} # de 0 1 2 .... x
do
	r_class=`echo ${tableau[$n]} | grep "$rech_class"`	# test présence --class
	if [[  -n $r_class ]] 								# --class ou pas ?
		then
			break				# --class est trouvé, sort de la boucle for
		else
			r_dev=`echo ${tableau[$n]} | grep "$rech_dev"`   #  test présence /dev/sd
			if [[ -n $r_dev ]]
				then
					((nbdevsd++))							# incrémente si on a /dev/sd 
					if [[ $nbdevsd -gt 1 ]]					# si plus d une fois /dev/sd
						then
							return 1 						# on sort en renvoyant 1
						fi #[[ $nbdevsd -gt 1 ]]
				fi #[[ -n $r_dev ]]
		fi #[[  -n $r_class ]]
done

if [[ $nbdevsd -gt 1 ]]	# test nombre
	then
		return 1 # 1 si plus d'une fois /dev/sd
	else
		return 0 # 0 sinon
fi
}



#trt=0;((trt++));echo "début de traitement $trt - $LINENO";read g


# début du programme ##################################################################################
######### variables ################################### 
OLDIFS="$IFS"               # sauvegarde IFS
rech_class="\-\-class"		# jusqu'à trouver la chaine --class dans menuentry
rech_dev="\/dev\/sd"		# la présence de la chaine  /dev/sd dans menuentry

                            # ne pas modifier le nom des fichiers suivants 
blkid="blkid-res.txt"       # (fichier contenant le résultat de sudo blkid)
fich_fstab_conc="UBoot-UPart.txt" # créé par recup-fstab contient les uuid ayant boot séparé

blkid_choisi=""	            # fichier personnel choisi contenant dev-label-uuid
chaine_search="search \-\-no\-floppy \-\-fs\-uuid \-\-set=root"
	 						# (un tiret doit être protégé par \ pour une recherche dans grep)
chaine_linux="linux.*\/vmlinu" 			# + général "linux......./vmlinu"
label_submenu=""						# label valide du menuentry précédent

ZZZnum="ZZZnum"         # le répertoire qui contiendra les fichiers temporaires xxxx-$num
prg="$nom_dir/recup_fstab_V7"	# création de $fich_fstab_conc (UBoot_UPart.txt)
#########################################################
num=`date +%Y:%m:%d`-`date +%H:%M:%S`



# ces 3 variables seront re-précisées en utilisant le nom complet du fichier grub traité
fich_sauv=""        
fich_sup=""
fich_transforme=""

fich_source_0="$ZZZnum/tmp0-$num.txt" # lignes de 1 à 10_linux[
fich_source_1="$ZZZnum/tmp1-$num.txt" # lignes de [10_linux à 40_custom[
fich_source_2="$ZZZnum/tmp2-$num.txt" # lignes de [40_custom à la fin]

##### pour les stat #####################################
fich_stat="$ZZZnum/stat-$num.txt"
nb_menu_cons=0
nb_menu_boot_cons=0
nb_menu_sup=0
nb_menu_sans_uuid=0
nb_lignes_sup=0
nb_lignes_cons=0
nb_lignes_lues=0
nb_lignes_hors_menu=0
nb_lignes_menus_cons=0
#########################################################




! [[ -e "$ZZZnum" ]] && mkdir "$ZZZnum" # pourrait être mis plus loin

#((trt++));echo "début de traitement $trt - $LINENO";read g


#si le programme $prg (recup_fstab_Vx) n'existe pas on sort
# voir pour utiliser getopts
# deux façons de lancer ce programme
# - en terminal  avec ou sans l'option --sansfstab
# - clic sur le fichier (sans l'option --sansfstab) 
case "$1" in
    --sansfstab )
            echo "
            Rappel :
                un fichier à jour au format blkid
                (dev  - uuid  - label éventuel) 
                est nécessaire au bon déroulement du programme

                s'il y a des OS avec boot séparés
                un fichier
                $fich_fstab_conc à jour
                est nécessaire (il est créé par recup_fstab)
                (ce fichier donne l'uuid de la partition de boot
                        associé à l'uuid de la partition système)

                en cas de doute utilisez 

                $0 sans le paramètre --sansfstab
                pour re-créer correctement ce fichier

            Taper sur Entrée pour continuer Ctrl C pour arrêter" 
            read g
             code=0            ;;
	*  )
        ! [[ -e "$prg" ]] && echo "fichier $prg de récup. (fstab et blkid)  manquant" && read g && exit 0
        echo "$0 lance le programme $prg"
        $prg "$ZZZnum"
        code=$?
        ;;
esac 
echo "le code de retour est $code" 

((trt++));echo "début de traitement $trt $LINENO"



if [[ $code -ne 0 ]]
	then
		echo "  il y a eu un problème de traitement du programme  $prg"
		echo "  si l'arrêt n'est pas volontaire"
		echo "  vérifier que le répertoire /mnt/jpb ne comporte pas des résidus de fichiers"
		echo "  éventuellement faire le ménage dans ce répertoire"
		read g
		exit 0
	fi
echo
echo "suite du programme $0"
echo ; echo

# pour les fichiers temporaires -$num




if ! [[ -e $fich_fstab_conc  ]]	# UBoot_UPart a normalement été créé par recup_fstab
	then
		echo "le fichier  $fich_fstab_conc est introuvable"
		echo "il faut d'abord exécuter $prg" 
		echo "ou mettre à disposition manuellement un fichier $fich_fstab_conc"
		echo ; echo
		exit 0
	else  
		echo "  vérification des uuid correspondants à des systèmes sur boot séparés"
		echo "  couples uuid-boot - uuid-systeme des menuentry en boot séparé"
		echo
		echo "###### contenu du fichier $fich_fstab_conc #############################"
		cat $fich_fstab_conc
		echo "#######################################################################"
		echo
		echo "  vérifier visuellement le contenu des lignes comprises entre les ###"
		echo "  il existe deux lignes par couple (ou rien)"
		echo "          une ligne uuid1-uuid2"
		echo "          une ligne uuid2-uuid1"
        echo
		echo "  tapez sur entrée pour continuer"
		read g
	fi

# lecture et mise en mémoire des infos donnée par le fichier $fich_fstab_conc ("UBoot_UPart.txt")
#################################################################################################
max_boot=-1
while read l_boot
do
	[[ -z $l_boot ]] && echo "ligne vide je passe" && continue		# si ligne vide ou commentée
	[[ $l_boot =~ ^[[:blank:]]*# ]] && echo "ligne commentée $l_boot je passe" && continue
	((max_boot++))
	echo $l_boot
	UBoot[$max_boot]=$l_boot # format uuid1-uuid2 à la suite
done < $fich_fstab_conc
#################################################################################################

OK # présentation du programme

code=1
while [[ $code = 1 ]]
do
rep=""
texte_supplementaire=""
if ! [[ -e "$blkid" ]]
	then
		texte_supplementaire="=====> !!!!! Attention ce fichier $blkid n'est pas présent !!!!!!"
	fi

while [[ $rep != [oOyYaAcC] ]]
do
titre="     Utilisation des UUID et LABEL des partitions des disques"
texte="     Choix du fichier de références  LABEL et UUID
	répondez par
			(oOyY)   si vous voulez ré-utiliser le fichier $blkid
                         ce fichier a été créé précédemment par $prg
						(contient les labels utilisés pour mettre à jour le grub
						 seront alors ceux déclarés sur la partition)
                     $texte_supplementaire

			(cC)     permet de choisir un fichier de référence UUID LABEL
						(les labels utilisés pour mettre à jour le grub
						 seront alors ceux déclarés dans ce fichier de référence)

			!!!!!	mais toutes les partitions devront être déclarées
                    le champ /dev/sdxx en premier
                    le champ LABEL="xxxxxx" non obligatoire (mais alors
                                   le menu de GRUB ne sera pas modifié pour ce dev)
                    le champ UUID="xxxxxx" (OBLIGATOIRE pour un traitement correct)
                    le champ type TYPE="xxxxx" est conseillé
                    une ligne sera donc de la forme
/dev/sdxx LABEL=\"un label correct\" UUID=\"un uuid correct\" TYPE=\"le type correspondant\"

                    ce choix peut servir si vous ne voulez pas labelliser les
                    partitions mais mettre quand même un label dans grub
                    ou bien pour effectuer des essais
                    (ce choix un peu tordu est un peu difficile à comprendre ?)

                    !!!!	en cas de doute utilisez le choix oOyY 	puis Valider

                    O pour réutilisation du fichier $blkid 
                    C pour choisir un fichier de référence UUID LABEL personnel
                    A Arrêter"
rep=`zenity --entry --title "$titre" --text "$texte" --width "800"`

case $rep in
	[oOyY]	) blkid_choisi="$blkid"; echo "utilisation du fichier créé précédemment)" ;;
	[aA]	) echo "arrêt du programme" 		; exit 0				;;
	[cC] 	) echo "choix du fichier des uuid" 	; choix_fichier_blkid 	;;
	*		) echo "utilisez seulement oO yY aA cC S.V.P."				;;
esac
done


# si le fichier de concordance n'existe pas sortie 

if ! [[ -e "$blkid_choisi" ]]
	then
		echo ; echo
		echo " $0 n'a pas trouvé le fichier"
		echo " $blkid_choisi"
		echo " que vous avez choisi comme référence UUID-LABEL"
		echo " Modifier votre choix de fichier"
		echo "    ou bien mettez à disposition ce fichier pour continuer" 
		echo ; echo ; sleep 2
	else
		code=0
	fi

done	# sors de la boucle uniquement si code=0



# récupératon dev label UUID dans des tableaux
unset dev
unset uuid
unset label
unset bdev	# à partir de V31 pour boot séparé
unset btype # le type de la partition
unset bmont # point de montage à cause du boot séparé

############## récupération dev label uuid btype dans le fichier choisi ###################
maxuuid=-1
while read ligne
do

	[[ -z $ligne ]] && echo "ligne vide je passe" && continue		# correction ligne vide
	((maxuuid++))
	# d'abord le dev
    DEV=$(awk -F":" '{print $1}' <<< "$ligne") # donne aussitôt /dev/sda1
    # pour les autres , à cause d'espaces possibles (dans le label) 
    if grep "LABEL" <<< $ligne
        then
            LABEL=${ligne#*LABEL=?}
            LABEL=${LABEL%%\"*} #"
        else
            LABEL=""
            echo "pas de LABEL"
        fi
  
    
    if grep UUID <<< $ligne
        then
            UUID=${ligne#*UUID=?}
            UUID=${UUID%%\"*} #"
        else
            UUID=""
            echo "pas d'UUID"
        fi
        
    if grep TYPE <<< $ligne
        then        
            TYPE=${ligne#*TYPE=?}
            TYPE=${TYPE%%\"*} #"
        else
            TYPE=""
            echo "pas de type"
        fi
    
    if grep PARTUUID <<<$ligne
        then            
            PARTUUID=${ligne#*PARTUUID=?}
            PARTUUID=${PARTUUID%%\"*} #"
        else
            PARTUUID=""
            echo "pas de partuuid"
        fi

	[[ -z `grep "^\/dev" <<< $DEV` ]] && echo \
		&& echo "il manque /dev dans la ligne $ligne du fichier de référence UUID-LABEL" \
		&& exit 0
  
	dev[maxuuid]=$DEV			#récupération du dev de la ligne
	label[maxuuid]="$LABEL"
	uuid[maxuuid]="$UUID"
	btype[maxuuid]="$TYPE"

done < $blkid_choisi

##############################################################################
if [[ "$blkid_choisi" != "$blkid" ]]
then
	verifier_presence_dev # vérifie que tous les dev du fichier choisi sont bien déclarés
fi
###############################################################################
# sortie des uuid label pour info
		[[ -e "tmp-u-l.txt" ]] && rm "tmp-u-l.txt"
echo
		p=0
		while [[ $p -le $maxuuid ]]
		do
			aff_dev="${dev[$p]}"		&& [[ -z "$aff_dev"		]]	&& aff_dev="_"
			aff_label="${label[$p]}"	&& [[ -z "$aff_label"	]]	&& aff_label="___"
			aff_uuid="${uuid[$p]}"		&& [[ -z "$aff_uuid"	]]	&& aff_uuid="___"
			aff_btype="${btype[$p]}"	&& [[ -z "$aff_btype"	]]	&& aff_btype="___"

# car si l'un des $ est "" , il y a erreur d'affichage

			printf "%02s %-10s UUID %-36s LABEL: %-20s  TYPE : %-10s\n" \
					"$p" "$aff_dev" "$aff_uuid" "$aff_label" "$aff_btype"  | tee -a tmp-u-l.txt
			((p++))											
		done

titre="Affichage des concordances LABEL <=> UUID      Visualiser puis  Valider pour continuer"
zenity --text-info --title "$titre" --filename "tmp-u-l.txt" --height "640" --width "1280" --font "Courier New Bold 10"
code=$?
[[ -e "tmp-u-l.txt" ]] && rm "tmp-u-l.txt" # supprime ce fichier devenu inutile
if [[ $code -ne 0 ]]
	then
		echo $code
		exit 0 #sortie si on ne valide pas
	else
		echo $code
	fi

################ début de traitement du fichier GRUB ###############################

# Quel fichier grub traiter ?
titre="$0               Sélectionnez le fichier GRUB à traiter"
fich_source=`zenity --file-selection --filename="../fichier-grub/*" --title="$titre"`
case $? in	# $? est le code de retour de zenity
	0)	:														;;
	1)	echo "Aucun fichier sélectionné."			; exit 1	;;
	-1)	echo "Une erreur inattendue est survenue."	; exit 1	;;	
	*)	echo "erreur non reconnue"					; exit 1	;;	
esac

# $fich_source est de la forme /media/SH/grub/fichier-grub/grub-2UUID.cfg

# servira à préciser les fichiers grub-OK,grub-sup
precision=$(sed 's/\//-/g' <<< "$fich_source") # remplace les / par des -
# /media/SH/grub/fichier-grub/grub-2UUID.cfg
# precision devient -media-SH-grub-fichier-grub-grub-2UUID.cfg

fich_sauv="$ZZZnum/grub-OK-$num$precision.txt"
fich_sup="$ZZZnum/grub-sup-$num$precision.txt"
fich_transforme="$ZZZnum/grub-mod-$num$precision.txt"
 

#### lecture et traitement du fichier GRUB #######

trier_fichier # création des 3 fichiers de 1 à 10 linux 10 linux à 40 custom 40 custom à la fin 

################# traitement jusqu'à 10_linux #####################
IFS="~"
prem=0
while read ligne
do 
((nb_lignes_lues++))
if  [[ $prem -eq 0 ]]
	then
				modif_ligne1_grub "$ligne" ; ((prem++))
	else
				echo $ligne >> "$fich_sauv"
				((nb_lignes_cons++))
				((nb_lignes_hors_menu++))

fi
done < "$fich_source_0"

################# traitement de 10_linux à 40_custom


while read ligne
do
((nb_lignes_lues++))

if  [[ $prem -eq 0 ]] # pourrait être supprimé depuis V34
	then
				modif_ligne1_grub "$ligne" ; ((prem++))
	else
				# entre les crochets on a tab et espace élargisement après {
	res=`echo "$ligne" | grep "^[	 ]*menuentry.*{[ 	]*$"`
	mem=`echo "$ligne" | grep "^[	 ]*menuentry ['\"]Memory test.*{[ 	]*$"`

	# res est vide s'il n'y a pas menuentry {
	# mem est non vide si on a Memory test -ne pas traiter menuentry 'Memory test

	if [[ -n $mem ]]
	then			# si Memory test on force res à vide
		res=""
	fi

	if  [[ -z $res ]]
		then 											# pas menuentry 
			subm=`echo "$ligne" | grep "^[	 ]*submenu.*{[ 	]*$"`
			if [[ -z $subm ]]
				then 									# pas menuentry pas submenu
					echo "$ligne" >> $fich_sauv			# écriture de cette ligne dans sauv
					((nb_lignes_cons++))				# stat
					((nb_lignes_hors_menu++))			# stat
					echo -e ".\c"						# trace écran
				else 									# contient submenu
					echo -e "S\c"						# trace
					traite_ligne_submenu "$ligne"		# traitement de submenu
			fi
		
		else								# on a menuentry
			lire_menuentry					# mettre en mémoire dans menu[0..n]
			trt_menu2 "${menu[0]}" 			# rem : 1 si /dev/sd /dev/sd
			code_dev_dev=$?
			if [[ $code_dev_dev -eq 1 ]]	# si 1 on supprime
				then						# le bloc menuentry contient /dev /dev
					sort_menu_1	" " "menu supprimé : trop de /dev/sd"	# fich_sup
					((nb_menu_sup++))

				else  						# menuentry ne contient pas /dev/sd /dev/sd
					critere_suppression_2	# analyse des uuid et recherche de label
					code_crit2=$?
					case $code_crit2 in
					0)						# les uuid sont égaux
						transforme_ligne_menuentry "$chaine_search"	# mettre un label dans menu[0]
						sort_menu_0					# écrire le menu dans fich_sauv
						((nb_menu_cons++))			# stat
					;;
					1)						# menu sans modif (ni search ni linux)
						sort_menu_0					# écrire le menu dans fich_sauv
sort_info_transforme "${menu[0]}" "menu conservé (pas de ligne search ou linux)"
						((nb_menu_cons++))			# stat
					;;
					2)						# uuid différents on supprime ce menu
						sort_menu_1	" " "menu supprimé : uuid différents"	# écrire dans fich_sup
						((nb_menu_sup++))				# stat
					;;
					3)						# uuid non trouvé (search et linux existent)
						sort_menu_0					# écrire le menu dans fich_sauv
sort_info_transforme "${menu[0]}" "menu conservé : UUID search ou linux non trouvé dans $blkid_choisi"
						((nb_menu_cons++))			# ce menu étant conservé
						((nb_menu_sans_uuid++))
					;;
					4)						# uuid != mais boot séparé
						transforme_ligne_menuentry "$chaine_linux" # met label dans menu[0]
						sort_menu_0					# écrire le menu dans fich_sauv
						((nb_menu_cons++))	# stat non prévu dans memorise_menuentry
						((nb_menu_boot_cons++))
					;;
					esac

				fi # [[ $code_dev_dev -eq 1 ]]
		fi #[[ -z $res ]]
	fi #[[ $prem -eq 0 ]]
done < "$fich_source_1"



echo $nb_lignes_lues

################# traitement 40_custom à fin #####################
if [[ -e "$fich_source_2" ]] # en cas d'essai sans ligne 40_custom
	then
		while read ligne
		do 
			((nb_lignes_lues++))
			((nb_lignes_cons++))
			((nb_lignes_hors_menu++))
			echo $ligne >> "$fich_sauv"
		done < "$fich_source_2"
	fi
#################################################################
IFS="$OLDIFS"

echo "###################################################################"   | tee -a "$fich_stat"
printf "%-40s %s\n" "fichier traité"              " : "                      | tee -a "$fich_stat"
echo "$fich_source"                                                          | tee -a "$fich_stat"
printf "%-40s %s\n" "le résultat se trouve dans"  " : "                      | tee -a "$fich_stat"
echo "$fich_sauv"                                                            | tee -a "$fich_stat"  
echo                                                                         | tee -a "$fich_stat"
printf "%-39s %s %5d\n" "nombre de lignes lues"      " : " "$nb_lignes_lues" | tee -a "$fich_stat"
printf "%-40s %s %5d\n" "lignes conservées"          " : " "$nb_lignes_cons" | tee -a "$fich_stat"
printf "%-40s %s %5d\n" "lignes supprimées"          " : " "$nb_lignes_sup"  | tee -a "$fich_stat"
if [[ $nb_lignes_sup -gt 0 ]]
	then
printf "%-40s %s\n" "fichier des lignes supprimées"  " : "                   | tee -a "$fich_stat"
echo "$fich_sup"                                                             | tee -a "$fich_stat"
	echo                                                                     | tee -a "$fich_stat"
	fi
printf "%-40s %s %5d\n" "nombre de menus conservés"           " : " "$nb_menu_cons" | tee -a "$fich_stat"
printf "%-40s %s %5d\n" "nombre de menus supprimés"           " : " "$nb_menu_sup" | tee -a "$fich_stat"
printf "%-40s %s %5d\n" "nombre de menus avec boot conservés" " : " "$nb_menu_boot_cons" | tee -a "$fich_stat"
if [[ $nb_menu_sans_uuid -gt 0 ]]
	then
printf "%-40s %s %5d\n" "nombre de menus sans uuid trouvé" " : " "$nb_menu_sans_uuid" | tee -a "$fich_stat"
	fi
echo                                                                                  | tee -a "$fich_stat"
printf "%-40s %s %5d\n" "lignes conservées (hors menu)" " : " "$nb_lignes_hors_menu"  | tee -a "$fich_stat"
printf "%-40s %s %5d\n" "lignes conservées (menu)" " : " "$nb_lignes_menu_cons"       | tee -a "$fich_stat"
echo "###################################################################"            | tee -a "$fich_stat"

echo "après avoir vérifié manuellement le fichier"
echo "$fich_sauv"
echo "en réel vous pourrez remplacer grub.cfg à vos risques et périls"
echo                                                                     | tee -a "$fich_stat"

texte_attention=""
if [[ $fich_source =~ /boot/grub/grub.cfg$ ]]
then
    texte_attention_grub_reel="====> Attention vous avez choisi de traiter un fichier grub réel
        /boot/grub sera remplacé par le fichier résultant ... prenez vos précautions
         mais je rapelle qu'une sauvegarde du grub original est effectué
         donc récupérable"
fi



rep=""
while [[ $rep != [oOyYnN] ]]
do

################ mise à jour du fichier traité  ou non ###########################
titre="    ################       remplacement de GRUB    ###########"
texte="
        Voulez-vous remplacer le fichier choisi
                $fich_source
        par le nouveau fichier généré
               $fich_sauv
	
                 par précaution si vous répondez oui le fichier
    $fich_source (fichier original choisi)
                 sera sauvegardé dans
    $fich_source-$num
                 puis
    $fich_source 
	             sera remplacé par le contenu du fichier
    $fich_sauv

       
    $texte_attention_grub_reel

    répondez par (oOyYnN)"

rep=`zenity --entry --title "$titre" --text "$texte" --width "800"`
case $rep in
	[oOyY] )	# sauvegarde de "grub" , je conserve $num	
        echo "
        vous avez demandé le remplacement du fichier
        OK mais avant je sauvegarde le fichier original
        $fich_source
        dans 
        $fich_source-$num
        (mot de passe administrateur requis)
        sudo cp "$fich_source" "$fich_source-$num""
 			
            sudo cp "$fich_source" "$fich_source-$num"
			code=$?
			if [[ $code != 0 ]]
				then
					echo "il y a eu un problème lors de la sauvegarde du fichier
                         (code erreur : $code)"
					suppression_fichiers_temporaires
                    echo "je sors"
					exit 0
				fi

			#et fich_sauv remplace grub
            echo "
        OK je remplace
        $fich_source
        par
        $fich_sauv
        (mot de passe administrateur requis)
        sudo mv "$fich_sauv" "$fich_source"" 
        sudo mv "$fich_sauv" "$fich_source"
			code=$?
			if [[ $code != 0 ]]
				then
                    echo "il y a eu un problème lors du remplacement du fichier $fich_source
                         (code erreur : $code)"
                    suppression_fichiers_temporaires
                    echo "je sors"    
					exit 0
                else
                    echo
                    echo "fichier $fich_source remplacé"
				fi			

	;;
	[nN]	)	
             echo ; echo "fichier oiginal non remplacé"
             echo " mais le fichier résultant"
             echo " $fich_sauv"
             echo " est à disposition"
	;;
	*	) 	echo "utilisez seulement oOyYnN S.V.P."
	;;
esac
done
suppression_fichiers_temporaires
echo "taper entrée pour terminer"
read g #pour attendre
exit 0

Dernière modification par ar barzh paour (Le 08/04/2018, à 08:41)


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#173 Le 07/04/2018, à 19:33

ar barzh paour

Re : [Projet terminé] correction anomalie de grub

le code de recup_fstab_V7 ( il faut conserver ce nom)

#!/bin/bash

# V1 récupère le contenu des fichiers fstab qui peuvent exister sur la machine
# comment ?
# récupération des dev présents par blkid
# création du fichier blkid-res.txt
# pour les partitions déjà montées (via mount)
# lecture et traitement de <partition>/etc/fstab

# et pour chacune des autres partitions
# montage
# lecture et traitement de <point de montage>/etc/fstab
# démontage

# le traitement consiste à écrire dans le fichier DevSd_UBoot_UPart.txt
# pour chaque partition qui sera reconnue comme ayant un boot séparé
# DevSd="/dev/sdxx" UPart="uuid de la partition avec boot" UBoot="uuid du boot" 

# le traitement consiste à écrire dans le fichier DevSd_Uboot_Upart-date.txt
# pour chaque partition qui sera reconnue comme ayant un boot séparé
# DevSD="/dev/sdxx" UBoot="uuid du boot" UPart="uuid de la partition avec boot"

# V2 création fichier UBoot_UPart contenant les uuid d'un système avec boot séparé
# format uuid1-uuid2 et uuid2-uuid1 servira lors du traitement modif-grub

# V3 remise en forme
# V4 supprime aussi les fichiers inutiles
# les fichiers créés sont
#                   UBoot-Upart.txt         blkid-res.txt
# et dans ZZZnum :  UBoot_Upart-<date>.txt  DevSd_UBoot_UPart-<date>.txt  
  
# V5 pour des raisons d'affichage , les _ des noms de fichiers sont remplacés par des -
# V6 2018/02 vérifie les doublons label et uuid

function OK {
# à cause de problème d'affichage
#declare ffich_fstab_conc=$(sed "s/[_ ]/*/g" <<< $fich_fstab_conc)
#declare fres_blkid=$(sed "s/[_ ]/*/g" <<< $res_blkid)
#declare ffich_fstab_long=$(sed "s/[_ ]/*/g" <<< $fich_fstab_long)
#declare ffich_recup=$(sed "s/[_ ]/*/g" <<< $fich_recup)
reponse=""
while [[ $reponse != [oOyYnN] ]]
do
titre="programme $0"
texte="
    0- ===> il est préférable pour un résultat plus correct 
       de partir d'un fichier gub.cfg tout neuf
       donc auparavant , lancer un sudo update-grub
       
    1-le but principal de ce sous programme est de créer un fichier
        $fich_fstab_conc
    qui contiendra les uuid des systèmes qui ont un boot séparé

    2-il met a disposition le fichier
        $res_blkid
    qui contient le résultat de la commande sudo blkid

    3-il crée aussi (pour info d'analyse) le fichier
        $fich_fstab_long
    qui contient le fichier $fich_recup des partitions présentes

    comment ?
    - récupération des dev existants par sudo blkid

    - pour les partitions déjà montées (via mount)
            lecture et traitement de <partition>/etc/fstab

    - pour chacune des partitions non montées (sauf ntfs , swap)
        montage
            lecture et traitement de <point de montage>$fich_recup
        démontage

            SOUS-PROGRAMME RECUP DE MODIF GRUB
            tapez O puis valider pour continuer
            tapez A puis valider pour arrêter

            O pour continuer / A pour arrêter le programme"
       
reponse=`zenity --entry --title "$titre" --text "$texte" --width "800"`
case $reponse in
	[oOyY]	)	:												;;
	[aAnN]	)											exit 1	;;
	*		) 	echo "utilisez seulement oOyYaAnN S.V.P."			;;
esac	
done
}



# affiche le fichier des doublons trouvés et demande s'il faut continuer ou non
function continuer {
titre="$1"
texte="
$(cat $fich_double_label_uuid)

    Continuer quand même ? Répondez par : (oOyYnNaA)       "
reponse=""
while [[ $reponse != [oOyYnNaAcC] ]]
do
reponse=`zenity --entry --title "$titre" --text "$texte" --width "800"`
case $reponse in
	[oOyY]	)	:												;;
	[aAnN]	)											exit 65	;;
	*		) 	echo "utilisez seulement oOyYaAnN S.V.P."		;;
esac
done	
}



function rech_uuid_dev { # si $1 est dans dev[] renvoi l'uuid correspondant
for i in ${!dev[@]}
do
	[[ "$1" = ${dev[$i]} ]] && uuid=${uuid[$i]} && break
done
}

function rech_uuid_label { # si $1 est dans label[] renvoi l'uuid correspondant
for i in ${!dev[@]}
do
	[[ "$1" = ${label[$i]} ]] && uuid=${uuid[$i]} && break
done
}


function ecrit_uuid1_uuid2 {  # recoit $1 $2 sous la fore UUID= ou LABEL= ou /dev/sdxx
# écrit uuid1-uuid2 et uuid2-uuid1 dans $fich_fstab_conc
# en remplacant le label ou le /dev/sdxx par l'uuid correspondant
# et en enlevant UUID= et LABEL=
uuid1=""
uuid2=""

echo "fonction ecrit_uuid1_uuid2 $1 $2"

#pour le premier paramètre
debut=`echo "$1" | cut -c1-5`
uuid=""
case "$debut" in
		\/dev\/ )
			rech_uuid_dev "$1" # /dev/sdxx on recherche l'uuid correspondant
			uuid1="$uuid"
		;;
		UUID\= )
			uuid1=`echo "$1" | cut -c6-` 			# si UUID= on prend ce qui se trouve après = 
		;;
		LABEL )
			rech_uuid_label `echo "$1" | cut -c7-`	# si LABEL on prend ce qui se trouve après = 
			uuid1="$uuid"							# et on recherche l'uuid correspondant
		;;
esac

#même chose pour le deuxième paramètre
debut=`echo "$2" | cut -c1-5`
uuid=""
case "$debut" in
		\/dev\/ )
			rech_uuid_dev "$2" # /dev/sdxx on recherche l'uuid correspondant
			uuid2="$uuid"
		;;
		UUID\= )
			uuid2=`echo "$2" | cut -c6-`			# UUID= on prend ce qui se trouve après = 
		;;
		LABEL )
			rech_uuid_label `echo "$2" | cut -c7-`	# LABEL on prend ce qui se trouve après =
			uuid2="$uuid"							# et on recherche l'uuid corespondant
		;;
esac

if [[ -n $uuid1 ]] && [[ -n $uuid2 ]]
then
# on écrit les deux combinaisons possibles , plus simple à traiter ensuite
echo $uuid1-$uuid2		>> $fich_fstab_conc
echo $uuid2-$uuid1		>> $fich_fstab_conc
fi

echo "fin de fonction ecrit_uuid1 uuid2 =1=>$uuid1<=== =2=>$uuid2<==="
}



function ecrit_ligne_court {	# si $3 (UBoot) non vide
								# uuid1-uuid2 dans UBoot_UPart

if [[ -n "$3" ]]			    # si uboot non vide
	then
		ecrit_uuid1_uuid2 "$2" "$3" # envoie uuid de partition et uuid de boot
	fi
}


function trans_ligne_fstab { # récupère les champs d'une ligne
# champ1 champ2 champn mais on ne s'intérese qu'aux champs 1 et 2

# champ1 : UUID=uuid ou LABEL=label ou le dev [non traités : PARTUUID= PARTLABEL=]
# champ2 : le point de montage

champ1=`echo "$1"|awk -F" " '{printf ("%s",$1)}'`	# bloc spécial ou système de fichiers distant à monter	
champ2=`echo "$1"|awk -F" " '{printf ("%s",$2)}'`	# c'est le point de montage

case "$champ2" in
		\/ )
			dev_part=$champ1	# si champ2 est /     on positionne dev_part sur champ1
		;;
		\/boot )
			dev_boot=$champ1	# si champ2 est /boot on positionne dev_boot sur champ1
		;;
esac
}

# début du programme
echo "début de programme $0 "

if [[ $# -eq 0 ]]
	then
		echo "sans le paramètre répertoire"
		ZZZnum="ZZZnum"
	else
		echo "avec le paramètre répertoire $1"
		ZZZnum="$1" # modif_grub doit envoyer ZZZnum
	fi	

echo "Répertoire : "$ZZZnum

! [[ -e "$ZZZnum" ]] && mkdir "$ZZZnum"
 
#########################################################################################
# variables
                 num=`date +%Y:%m:%d`-`date +%H:%M:%S`
           res_blkid="blkid-res.txt"				# résultat de sudo blkid
     fich_fstab_long="$ZZZnum/DevSd-UBoot-UPart-$num.txt"	# résultant commenté
     fich_fstab_conc="UBoot-UPart.txt"				# résultant concaténé UUID1-UUID2
 fich_fstab_conc_num="$ZZZnum/UBoot-UPart-$num.txt"	# sauvegarde,à supprimer manuellement
             rep_mnt=/mnt/jpb-$num					# répertoire pour montages/démontages
          fich_recup=/etc/fstab						# fichier à récupérer dans part.
fich_double_label_uuid="$ZZZnum/doublon.txt"        # contient les label ou uuid truvés plusieurs fois
#########################################################################################


OK 								# présentation du programme  / sortie ou non

reponse=""
while [[ $reponse != [oOyYnNaAcC] ]]
do
titre="récupération des UUID et LABEL des partitions des disques"
texte="
			Récupération des infos dans les fichiers $fich_recup des partitions
			ce programme travaille avec sudo pour
			récupérer les dev (blkid)
			effectuer des montages/démontages
			(mot de passe d'administration requis)

	répondez par	
			(oOyY) pour lancer la commande sudo blkid ( remise à jour du fichier) 
			(aA)   pour arrêter ce programme

					O pour récupérer les devices via \"sudo blkid\"
					A Arrêter
"
reponse=`zenity --entry --title "$titre" --text "$texte" --width "800"`
case $reponse in
	[oOyY]	) echo "sudo blkid" ; sudo blkid > $res_blkid								;;
	[aA]	) echo "arrêt du programme" 				; exit 1	;;
	*		) echo "$reponse utilisez seulement oOyYaA S.V.P."				;;
esac
done



rm "$fich_fstab_conc"
touch "$fich_fstab_conc"
#echo "# $num : couples uuid-boot - uuid-systeme des menuentry en boot séparé" > $fich_fstab_conc

# récupération des dev label et UUID 
unset uuid
unset label
unset bdev		# V31 pour boot séparé
unset bmont 	# pour le point de montage à cause du boot séparé
unset btype 	# le type de la partition


maxuuid=-1
while read ligne 		# lecture et traitement du fichier généré par sudo blkid
do
# c'est le même script que dans modif-grub
# certaine lignes sont inutiles mais je les ai laissées
	[[ -z $ligne ]] && echo "ligne vide je passe" && continue		# correction ligne vide
	
	((maxuuid++))
	# d'abord le dev
    DEV=$(awk -F":" '{print $1}' <<< "$ligne") # donne aussitôt /dev/sda1
    # pour les autres , à cause d'espaces possibles (dans le label) 
    if grep "LABEL" <<< $ligne
        then
            LABEL=${ligne#*LABEL=?}
            echo "LABEL1=" $LABEL
            LABEL=${LABEL%%\"*} #"
            echo "LABEL2=" $LABEL
        else
            LABEL=""
            echo "pas de LABEL"
        fi
  
    
    if grep UUID <<< $ligne
        then
            UUID=${ligne#*UUID=?}
            UUID=${UUID%%\"*} #"
        else
            UUID=""
            echo "pas d'UUID"
        fi
        
    if grep TYPE <<< $ligne
        then        
            TYPE=${ligne#*TYPE=?}
            TYPE=${TYPE%%\"*} #"
        else
            TYPE=""
            echo "pas de type"
        fi
    
    if grep PARTUUID <<<$ligne
        then            
            PARTUUID=${ligne#*PARTUUID=?}
            PARTUUID=${PARTUUID%%\"*} #"
        else
            PARTUUID=""
            echo "pas de partuuid"
        fi

	[[ -z `grep "^\/dev" <<< $DEV` ]] && echo \
		&& echo "il manque /dev dans la ligne $ligne du fichier de référence UUID-LABEL" \
		&& exit 1

	
	# init variables d indice maxuuid
	   dev[maxuuid]=$DEV		# le dev de la ligne blkid
	  label[maxuuid]="$LABEL"			# le label de la ligne blkid
	   uuid[maxuuid]="$UUID"			# l uuid de la ligne blkid
	  btype[maxuuid]="$TYPE"			# le type de la ligne blkid
	mnt_dev[maxuuid]="1"		# modifié par mount : 0 si le dev est monté
	  p_dev[maxuuid]=""			# modifié par mount : point de montage



done <$res_blkid

# artifice pour créer un uuid  en double
# uuid[11]="78684472684430E4"
# artifice pour créer un label en double
# label[8]="U16.04-b10-64b"

# mise à zéro du fichier
rm "$fich_double_label_uuid"
touch "$fich_double_label_uuid"


#vérifier l'unicité des LABEL dans le tableau label
for i in ${!label[@]}
do
	for j in ${!label[@]}
	do
		[[ $i -ne $j ]] && [[ ${label[$i]} = ${label[$j]} ]] && [[ -n ${label[$i]} ]] && echo "${dev[$i]} ${label[$i]} ${uuid[$i]}" >> "$fich_double_label_uuid"
	done
done


#vérifier l'unicité des UUID ( cas de disques ajoutés ) dans le tableau uuid

for i in ${!uuid[@]}
do
	#echo ${uuid[$i]}
	for j in ${!uuid[@]}
	do
		#echo ${uuid[$i]} ${uuid[$j]}
		[[ $i -ne $j ]] && [[ ${uuid[$i]} = ${uuid[$j]} ]]  && [[ -n ${uuid[$i]} ]] && echo "${dev[$i]} ${label[$i]} ${uuid[$i]}" >> "$fich_double_label_uuid"
	done
done


# si le fichier n'est pas vide , avertir et sortir si demande 
[[ -s "$fich_double_label_uuid" ]] && continuer "ATTENTION LABEL et/ou UUID en DOUBLE"


#récupération des partitions déjà montées

mount | grep '^\/dev' > tmp.txt
#     1         2   3        4    5    6
#    /dev/sda11 on /media/SH type ext4 (rw,relatime,data=ordered)

	# remarque :
	# awk -F" " '{printf ("%s ",$1)}' tmp.txt 
	# donne
	# tous les dev séparés par une espace grace à "%s "

	# awk -F" " '{printf ("%s ",$3)}' tmp.txt 
	# donne
	# tous les points de montage séparés par une espace grace à "%s "

mdev=(`awk -F" " '{printf ("%s ",$1)}' tmp.txt`)	# les dev montés dans un tableau
mont=(`awk -F" " '{printf ("%s ",$3)}' tmp.txt`)	# les points de montage dans un tableau

rm "tmp.txt"


# positionnement montée ou non de chaque dev
for i in ${!dev[@]}						# pour tous les indices des dev
do
	for j in ${!mdev[@]}				# pour tous les indices des partitions montées
		do
			if [[ "${dev[$i]}" = "${mdev[$j]}" ]]
				then
					mnt_dev[i]="0"			# 0 indique que le dev est montée
					p_dev[i]=${mont[$j]}    # le point de montage du dev
					break
				fi
		done
done


# sortie des uuid label pour info
		[[ -e "tmp_u_l.txt" ]] && rm "tmp_u_l.txt"
echo
		p=0
		while [[ $p -le $maxuuid ]]
		do
			    aff_dev="${dev[$p]}"	 	# jamais vide
			aff_mnt_dev="${mnt_dev[$p]}" 	# vaut 0 (monté)  ou 1 (non monté)
			  aff_p_dev="${p_dev[$p]}"		# (affichage en fonction du précédent)
			# pour les corrections d'affichage 
			 aff_uuid="${uuid[$p]}"		&& [[ -z "$aff_uuid"	 ]]	&& aff_uuid="_"
			aff_label="${label[$p]}"	&& [[ -z "$aff_label"	 ]]	&& aff_label="_"
			aff_btype="${btype[$p]}"	&& [[ -z "$aff_btype"	 ]]	&& aff_btype="_"

			case $aff_mnt_dev in
			0)
				printf "%02s %-10s %-36s LABEL %-20s sur %-20s TYPE : %-10s\n" "$p" "$aff_dev" "$aff_uuid" "$aff_label" "$aff_p_dev" "$aff_btype"  | tee -a tmp_u_l.txt ;;
			1)
				printf "%02s %-10s %-36s LABEL %-20s                          TYPE : %-10s\n" "$p" "$aff_dev" "$aff_uuid" "$aff_label"  "$aff_btype"			| tee -a tmp_u_l.txt ;;
		
	esac	

			((p++))											
		done

reponse=""
titre="concordances     dev<=>LABEL<=>UUID<=>point de montage (de blkid)     Visualiser   puis Valider pour continuer"
zenity --text-info --title "$titre" --filename "tmp_u_l.txt" --height "640" --width "1280" --font "Courier New Bold 10"
code=$?
        [[ -e "tmp_u_l.txt" ]] && rm "tmp_u_l.txt" # supprime ce fichier devenu inutile
if [[ $code -eq 0 ]]
then
	echo "OK je continue"
else
	echo ; echo "Annulation demandée" ; echo ; exit 63
fi


##################################################
# pour cette partie il est absolument nécessaire d'avoir une liste des dev corrects
# d'où le sudo blkid effectué plus haut !
##################################################

echo "récupération des fstab de toutes les partitions"			 > $fich_fstab_long
echo 															>> $fich_fstab_long

############################################################
echo "pour les partitions déjà montées :" 						>> $fich_fstab_long
echo ${!dev[@]}

for i in ${!dev[@]} # pour tous les indices du tableau dev

	do
		echo $i ${dev[$i]} ${mnt_dev[$i]}
		[[ ${mnt_dev[$i]} = "1" ]]	&& continue		# non monté suivant !
		[[ ${btype[$i]} = "ntfs" ]]	&& continue 	# ntfs      suivant !
		[[ ${btype[$i]} = "swap" ]]	&& continue 	# swap      suivant !
		# on pourrait en ajouter d'autres

		echo  													>> $fich_fstab_long
		echo ${dev[$i]} "montée sur" ${p_dev[$i]} 				>> $fich_fstab_long

		#pour chaque dev monté on récupére les infos de fstab
		fich=${p_dev[$i]}$fich_recup 
		fich=`sed 's/\/\//\//g' <<< $fich` # supprime les doubles // (à cause de  //etc/fstab)

		echo $fich	#soit /etc/fstab soit /xxx/xxx/etc/fstab
		
		if [[ -e $fich ]]
			then
				echo  											>> $fich_fstab_long
				echo "$fich de ${dev[$i]}"  					>> $fich_fstab_long
				# on ne garde que les lignes non commentées et non vide

				dev_part=""
				dev_boot=""
				while read l_fstab
					do
						tmp=` grep '^[[:blank:]]*\#' <<< $l_fstab`
						#si tmp n est pas vide , elle commence par #
						if [[ -z $tmp ]] && [[ -n $l_fstab ]]
							then 
								echo $l_fstab >> $fich_fstab_long
								trans_ligne_fstab "$l_fstab"
							fi
					done < $fich
		ecrit_ligne_court "${dev[$i]}" "$dev_part" "$dev_boot"
			else
				echo 									>> $fich_fstab_long
				echo "pour ${dev[$i]} (${label[$i]}) /etc/fstab est inexistant"	>> $fich_fstab_long
			fi
	done

echo >> $fich_fstab_long

##############################################################
echo "pour les partitions non montées :" >> $fich_fstab_long


if [[ -e "/mnt" ]]
then
	echo "réperoire /mnt présent"
else
	echo "le répertoire /mnt n'existe pas !!!"
	exit 1
fi


rep_mnt_tmp="/mnt/jpb-$num"
echo "création du répertoire $rep_mnt_tmp pour monter les partitions"

sudo mkdir $rep_mnt_tmp

for i in ${!dev[@]} # pour tous les indices du tableau dev
do
	echo $i ${dev[$i]}

	[[ ${mnt_dev[$i]} = "0" ]]	&& continue		# montée    suivant !
	[[ ${btype[$i]} = "ntfs" ]]	&& continue 	# ntfs      suivant !
	[[ ${btype[$i]} = "swap" ]]	&& continue 	# swap      suivant !

	echo
	echo "traitement de $i ${dev[$i]} (${btype[$i]})"
	echo "montage de       ${dev[$i]} sur $rep_mnt_tmp"
	sudo mount ${dev[$i]} $rep_mnt_tmp
	code=$?
	
	echo "code de retour montage de ${dev[$i]} sur $rep_mnt_tmp : $code"
	if [[ $code = 0 ]]	# si le montage est réussi
		#################### montage réussi ####################
		then
			fich=$rep_mnt_tmp/etc/fstab
			if [[ -e $fich ]]
				then
					echo 							>> $fich_fstab_long
					echo ${dev[$i]} montée sur $rep_mnt_tmp	>> $fich_fstab_long
					dev_part=""
					dev_boot=""					
					while read l_fstab
							do
								tmp=` grep '^[[:blank:]]*\#' <<< $l_fstab`
								# si ne commence pas par # , tmp est vide 
								# et si la ligne n'est pas vide on l'écrit
							if [[ -z $tmp ]] && [[ -n $l_fstab ]]
								then 
									echo $l_fstab 					>> $fich_fstab_long
									trans_ligne_fstab "$l_fstab"
								fi
							done < $fich
		ecrit_ligne_court "${dev[$i]}" "$dev_part" "$dev_boot"
				else
		echo															>> $fich_fstab_long
		echo "pour ${dev[$i]} (${label[$i]}) /etc/fstab est inexistant" >> $fich_fstab_long
				fi
			# puis on le démonte avec boucle sinon le démontage ne se fait pas toujours
			boucle=0
			code=1
			while [[ $code -ne 0 ]]
			do
				sudo umount "$rep_mnt_tmp"
				code=$?
				echo "boucle $boucle  : ${dev[$i]} code de retour de umount $code"
				if [[ $code = 0 ]]
					then
						echo 
						echo "boucle $boucle : ${dev[$i]} démontage effectué (code retour $code)"
						ls -ails $rep_mnt_tmp
					else
						echo
						echo "boucle $boucle : ${dev[$i]} non démonté (code retour $code)"
						sleep 1 # attente en cas de non démontage
						((boucle++))
						if [[ $boucle -ge 10 ]]
							then
								echo "problème de démontage de ${dev[$i]}"
								exit 1
							fi	
					fi
			done # boucle while
		############################ échec de montage ###################
		else
			echo																	>> $fich_fstab_long
			echo "impossible de monter ${dev[$i]}  code echec de montage :$code"	>> $fich_fstab_long
		fi
done # boucle for i dev

echo ; echo
echo "fin de récupération des données de /etc/fstab des partitions présentes sur la machine"
echo ; echo

# sauvegarde de UBoot_UPart pour une utilisation personnelle
cp "$fich_fstab_conc" "$fich_fstab_conc_num"

echo "suppression du répertoire $rep_mnt_tmp en cours"
sudo rmdir $rep_mnt_tmp
code=$?

if [[ $code -ne 0 ]]
	then 
	#rmdir: échec de suppression de '/mnt/jpb-2017:03:11-12:02:43': Périphérique ou ressource occupé
		echo
		ls -ails /mnt/jpb*
		echo "vérifier le contenu du répertoire /mnt/jpb"
		echo "faire le ménage dans ce répertoire"
		exit 1
	fi

echo "suppression réussie"
echo "fin normale du programme $0"

PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#174 Le 08/04/2018, à 00:35

Bougron

Re : [Projet terminé] correction anomalie de grub

Bonsoir
C'est vérifié.......
menuentry 'U 16 04 1 : GNU/Linux' --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-299d7644-ae32-43ff-b3db-16987328b52f'

Dernière modification par Bougron (Le 08/04/2018, à 00:36)

Hors ligne

#175 Le 08/04/2018, à 08:48

ar barzh paour

Re : [Projet terminé] correction anomalie de grub

@ bougron
OK merci pour le retour


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne