Bonjour tout le monde ! (si il reste quelqu'un...
)
Je me suis enfin occupé du script en python ! Il a pour l'instant un certain nombre de défaut, notamment l’absence d'interface graphique (c'est super long à coder ces trucs ! :mad: )
Sinon à part ça le fonctionnement est assez simple : je vous affiche le résultat d'un GRUBEnhancer.py -h :
J'ai de plus créé un autre script (en bash celui-là, mais je vais probablement le transcrire en python) qui va chercher dans l'iso le fichier loopback.cfg pour le copier à côté de l'iso. Pas de fichier d'aide (c'est en partie pour ça que je veux le transcrire en python), donc la syntaxe est :
Bien sûr les deux scripts nécessitent les droits root...
Pour pouvoir s'en servir il faut mettre dans un même dossier :
Le fichier GRUBEnhancer.py
Enfin le script LoopbackCreator.sh qui est plus modeste :
Voilà !
N'hésitez pas si vous avez des questions ou trouvez des bugs !

Je me suis enfin occupé du script en python ! Il a pour l'instant un certain nombre de défaut, notamment l’absence d'interface graphique (c'est super long à coder ces trucs ! :mad: )
Sinon à part ça le fonctionnement est assez simple : je vous affiche le résultat d'un GRUBEnhancer.py -h :
usage: GRUB Enhancer [-h] -i FILE -l FILE [--grub-rep DIRECTORY]
Modifie les fichiers de configuration de GRUB afin de démarrer l'ordi sur une
image iso.
optional arguments:
-h, --help show this help message and exit
-i FILE, --iso FILE L'image iso destinée à être bootée
-l FILE, --loop FILE Le fichier loopback qui y est associé
--grub-rep DIRECTORY Un éventuel répertoire alternatif pour GRUB.
Default=/boot/grub/
Je pense que c'est clair... :lol:J'ai de plus créé un autre script (en bash celui-là, mais je vais probablement le transcrire en python) qui va chercher dans l'iso le fichier loopback.cfg pour le copier à côté de l'iso. Pas de fichier d'aide (c'est en partie pour ça que je veux le transcrire en python), donc la syntaxe est :
LoopbackCreator.sh fichier.iso
Seul problème, il ne rajoute pas les instructions pour l'interface en français, je rajoute ça dès que j'ai un peu de temps.Bien sûr les deux scripts nécessitent les droits root...

Pour pouvoir s'en servir il faut mettre dans un même dossier :
Le fichier GRUBEnhancer.py
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import sys
import os
from os.path import join, basename
import argparse
import subprocess
def check_grub_config(rep):
"""Vérifie la configuration par défaut de GRUB"""
content = open("grub.cfg", 'r').read()
grub_config = open(join(rep, "grub.cfg"), 'r').read()
if content not in grub_config:
open(join(rep, "grub.cfg"), 'a').write(content)
def write_function(rep):
"""Écrit le fichier de fonctions de boot"""
content = open("fonctions_iso.cfg", 'r').read()
try:
os.mkdir(join(rep, "greffons"))
except: pass
open(join(rep, "greffons/fonctions_iso.cfg"), 'w').write(content)
def modify_custom(rep, iso, loop):
"""Modifie le fichier contenant les entrées du menu"""
incipit = "source ${prefix}/greffons/fonctions_iso.cfg\n"
# Ici on tente d'ouvrir le fichier custom.cfg pour y écrire l'incipit
# Si on n'y arrive pas, il n'existe pas : on le crée,
# Sinon on vérifie que l'incipit n'est pas déjà présent et on le rajoute le cas échéant.
try:
custom = open(join(rep, 'custom.cfg'), 'r').read()
except IOError:
open(join(rep, 'custom.cfg'), 'w').write(incipit)
else:
if incipit in custom: pass
else:
content = incipit + custom
open(join(rep, 'custom.cfg'), 'w').write(content)
# Le chemin d'accès à l'iso à partir de / n'est pas forcément le même
# que celui à partir de la racine de la partition.
iso = find_path(iso)
loop = find_path(loop)
iso_name = basename(iso)
config = '\tsubmenu "'+ iso_name + '" {iso_boot "' + iso + '" "' + loop + '"}\n'
open(join(rep, 'custom.cfg'), 'a').write(config)
def find_path(path):
"""Retrouve le chemin d'accès d'un fichier à partir de la racine de sa partition"""
# On utilise le programme df pour retrouver le point de montage de la partition
subprocess.call(["bash", "-c", "df " + path + " > partition"])
resultat = open("partition", "r").read()
partition = resultat.split()[-1]
os.remove("partition")
# On ne supprime que la première occurence de la partition (des fois que l'utilisateur
# toto se soit amusé à créer un dossier home/toto et à mettre ses isos dedans...
path = path.replace(partition, "", 1)
return path
### Programme principal ###
parser = argparse.ArgumentParser(description='''Modifie les fichiers de configuration de GRUB afin de démarrer l'ordi sur une image iso.''', prog='GRUB Enhancer')
parser.add_argument('-i', '--iso', required=True, metavar='FILE', help="L'image iso destinée à être bootée")
parser.add_argument('-l', '--loop', required=True, metavar='FILE', help="Le fichier loopback qui y est associé")
parser.add_argument('--grub-rep', metavar='DIRECTORY', dest='rep', default='/boot/grub/', help="Un éventuel répertoire alternatif pour GRUB. Default=/boot/grub/")
args = parser.parse_args()
print("Vérification de la configuration de GRUB...")
check_grub_config(args.rep)
print("Écriture des fonctions nécessaire aux démarrage sur une image iso...")
write_function(args.rep)
print("Modification du fichier de menu...")
modify_custom(args.rep, args.iso, args.loop)
ainsi que les deux fichier grub.cfg et fonctions_iso.cfg contenant respectivement :### BEGIN /etc/grub.d/41_custom ###
if [ -f $prefix/custom.cfg ]; then
source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###
et #######################################################################################################################
# Avertissement présenté à l'utilisateur si le fichier iso est introuvable, ou n'a pas été donné en paramètre de la commande iso_boot
# Iso file missing
function no_iso_file {
if [ -n "${1}" ] ; then
echo L\'image à partir de laquelle il faut amorcer le PC, ${1}, ne se trouve sur aucun des supports actuellement raccordés à l\'ordinateur.
else
echo Aucune image iso n\'a été attachée au libellé ${chosen} que vous venez de choisir.
fi
}
#######################################################################################################################
# Avertissement présenté à l'utilisateur si le fichier de configuration est introuvable
# Grub configuration file missing
function no_cfg_file {
echo Le fichier de configuration, ${1}, ne se trouve sur aucun des supports actuellement raccordés à l\'ordinateur.
}
#######################################################################################################################
function iso_boot {
#
# Cette procédure crée un periphérique virtuel qui donne accès aux répertoires et fichiers contenu dans le fichier iso
# et cherche le fichier contenant le menu correspondant à l'image iso considérée et l'introduit dans le menu Grub
# paramètre ${1} : le nom du fichier iso, chemin d'accès compris, dans la partition où il se trouve, en commençant par /
# paramètre ${2}, facultatif : idem pour le fichier contenant les entrées de menu pour l'image iso considérée
# quand il est omis, il s'agit du fichier /boot/grub/loopback.cfg de l'image iso
set image_iso=
set iso_path="${1}"
# recherche du fichier iso
if [ -n "${1}" ]; then
# si le fichier ${1} de nom /..../nom existe, alors cela signifie qu'il est sur la partition ${root}
if [ -e "${1}" ]; then set image_iso=${root}; else search --file --set=image_iso --no-floppy "${1}"; fi
fi
if [ -z "${image_iso}" ]; then no_iso_file "${1}"; sleep -v 10; fi
# création du périphérique virtuel qui donne accès au fichier iso
# creation of the virtual device holding the iso file and paths initialisation
loopback iso (${image_iso})${1}
set root=iso
set loopcfg=
# recherche et introduction du menu spécifique à l'image iso considérée
if [ -z "${2}" ]; then set sourcefile=/boot/grub/loopback.cfg; else set sourcefile="${2}"; fi
# si le fichier se trouve sur le périphérique $root, il n'est pas utile de le chercher
if [ -e "${sourcefile}" ]; then set loopcfg=${root} ; else search --file --set=loopcfg --no-floppy "${sourcefile}" ; fi
if [ -z "${loopcfg}" ]; then no_cfg_file "${sourcefile}"; sleep -v 10; else source "(${loopcfg})${sourcefile}"; fi
}
function amorce_iso {
########################################################################################
#
# amorçage par le script shell iso_boot.sh
#
#######################################################################################
# pour éviter le bouclage sur la procédure
if ${amorceiso}; then
set amorceiso=false
save_env amorceiso
if ! keystatus --ctrl; then
if ! keystatus --shift; then
set image_iso=
set iso_path="${1}"
set iso_file="${1}"
if [ -e "${1}" ]; then set image_iso="${root}"; else search --file --set=image_iso --no-floppy "${1}"; fi
loopback iso (${image_iso})${1}
set root=iso
if [ -e "${2}" ]; then set loopcfg=${root} ; else search --file --set=loopcfg --no-floppy "${2}" ; fi
export iso_path
export iso_file
export root
configfile "(${loopcfg})${2}"
fi
fi
fi
}
Ces trois fichier doivent être impérativement dans le même dossier, le script GRUBEnhancer.py ne fonctionnera pas sinon, puisqu'il y lit le contenu qui doit être utilisé pour modifier GRUB !Enfin le script LoopbackCreator.sh qui est plus modeste :
#!/bin/bash
# Vérification des droits root
if [ $EUID -ne 0 ];
then
echo "Ce script nécessite les droits administrateur."
exit
fi
# Vérification de la présence d'une iso existante
if [ $# -eq 1 ];
then
if [ -f $1 ];
then
iso=$1
else
echo "$1 : Ce fichier n'existe pas."
exit
fi
else
echo "Il faut préciser un fichier iso !"
exit
fi
# On monte l'iso dans un emplacement temporaire pour aller voir le contenu
echo "Montage de l'iso..."
mkdir /tmp/iso
mount $1 /tmp/iso > /dev/null 2>&1
# On copie le fichier loopback dans le dossier de l'iso
echo "Récupération du fichier loopback..."
if [ -e /tmp/iso/boot/grub/loopback.cfg ];
then
cp /tmp/iso/boot/grub/loopback.cfg ${iso%.*}.loopback.cfg
else
cp /tmp/iso/isolinux/live.cfg ${iso%.*}.live.cfg
echo -e "\033[31mAttention ce fichier est un fichier pour Isolinux ! Il convient de le traduire avant de l'utiliser.\033[0m"
fi
# On supprime les fichiers temporaires
echo "Supression des fichiers temporaires..."
umount /tmp/iso
rmdir /tmp/iso
Ce script récupère, s'il ne trouve pas le fichier loopback.cfg, le fichier live.cfg, qui semble être l'équivalent pour Isolinux. Dès qu'on aura trouvé comment booter des isos créées avec isolinux ce sera probablement ce fichier qu'on devra utiliser.Voilà !
N'hésitez pas si vous avez des questions ou trouvez des bugs !