Compare commits

6 Commits

Author SHA1 Message Date
Nicolas MORIN 9b1030bf45 Ajout de la gestion des interfaces réseaux dans un pont simple
+ Ajout des options séries et affichage
2024-02-09 17:23:42 +01:00
Nicolas MORIN 7c91541a83 Changement de lettre pour l'option sous-volume 2024-02-09 10:50:52 +01:00
Nicolas MORIN 896c471be7 Désactivation de l'option -p 2024-02-09 10:38:30 +01:00
Nicolas MORIN 36887b20c5 Ajout de variables globales
+ Discrimination du nom de la MV du nom du fichier de la MV
+ Création de la fonction localiserMV
+ Suppression de lignes de débogage
+ Ajout de conditions de vérification du réseau dans la fonction recupParams
+ Reformulation de certains messages d'erreur
+ Création de la fonction genService
+ Création de la fonction demarreService
+ Évacuation d'un bloc de code pour le paramètre démarre en l'absence d'option
+ Écriture de la fonctionnalité d'arrêt
2024-02-08 19:33:43 +01:00
Nicolas MORIN b509404d36 Ajout des codes d'erreurs 8 et 9 2024-02-08 19:23:42 +01:00
Nicolas MORIN 93a9f028f0 Modification du nom des variables pour spécifier si les commandes passées
sont pour le démarrage ou l'arrêt de la machine virtuelle.
2024-02-08 15:42:07 +01:00
2 changed files with 254 additions and 108 deletions
+2
View File
@@ -22,6 +22,8 @@ Image générée avec l'[exention](https://github.com/ACTom/files_mindmap) `Mind
|5 |le paramètre d'une option est manquant | |5 |le paramètre d'une option est manquant |
|6 |dépendance manquante | |6 |dépendance manquante |
|7 |initialisation de l'environement impossible | |7 |initialisation de l'environement impossible |
|8 |erreur d'initialisation du réseau |
|9 |erreur de formatage du fichier de configuration |
## Dévelopement ## Dévelopement
+221 -77
View File
@@ -5,7 +5,10 @@
base_chemin_mv="/tmp/ramdisk/qemu-adm" base_chemin_mv="/tmp/ramdisk/qemu-adm"
bin_qemu="/usr/bin/qemu-system-x86_64" bin_qemu="/usr/bin/qemu-system-x86_64"
bin_qemu_img="/usr/bin/qemu-img" bin_qemu_img="/usr/bin/qemu-img"
chemin_services_demons="/usr/local/etc/systemd/system"
chemin_services_production="/etc/systemd/system"
nom_script=$(basename $0) nom_script=$(basename $0)
nom_complet_script="$(dirname $0)/${nom_script}"
die() die()
{ {
@@ -14,8 +17,8 @@ die()
verifMVExiste() verifMVExiste()
{ {
if [ -e "${base_chemin_mv}/${nom_mv}" ]; then if [ -e "${base_chemin_mv}/${nom_fichier_mv}" ]; then
die "Le répertoire de la machine virtuelle ${base_chemin_mv}/${nom_mv} existe déjà." 4 die "Le répertoire de la machine virtuelle ${base_chemin_mv}/${nom_fichier_mv} existe déjà." 4
fi fi
} }
@@ -38,7 +41,7 @@ initEnv()
esac esac
;; ;;
"repMV") "repMV")
mkdir -p ${base_chemin_mv}/${nom_mv} mkdir -p ${base_chemin_mv}
;; ;;
esac esac
} }
@@ -81,8 +84,11 @@ nouvMV()
echo "-cdrom ${1} \\" >> ${chemin_mv} echo "-cdrom ${1} \\" >> ${chemin_mv}
;; ;;
"reseau") "reseau")
if [[ "${4}" != "false" ]]; then if [[ "${4}" != "faux" ]]; then
echo "#PONT=${4}" >> ${chemin_mv} echo "#PONT=${4}" >> ${chemin_mv}
if [[ "${5}" == "n" ]]; then
echo "#VLAN=0" >> ${chemin_mv}
fi
fi fi
case "${6}" in case "${6}" in
"a") "a")
@@ -92,13 +98,33 @@ nouvMV()
echo "#8021Q=${7}" >> ${chemin_mv} echo "#8021Q=${7}" >> ${chemin_mv}
;; ;;
esac esac
if [[ "${4}" != "faux" ]]; then
echo "#INTERFACE=${1}" >> ${chemin_mv} echo "#INTERFACE=${1}" >> ${chemin_mv}
fi
echo "-device ${2},netdev=${1} -netdev tap,id=${1},ifname=${1},script=no,downscript=no \\" >> ${chemin_mv} echo "-device ${2},netdev=${1} -netdev tap,id=${1},ifname=${1},script=no,downscript=no \\" >> ${chemin_mv}
;; ;;
"kvm") "kvm")
echo "-enable-kvm \\" >> ${chemin_mv} echo "-enable-kvm \\" >> ${chemin_mv}
;; ;;
"series")
echo "-serial mon:stdio \\" >> ${chemin_mv}
;;
"spice")
if [[ "${3}" != "faux" ]]; then
echo "-object secret,id=spice-mdp,data=${4} -spice addr=${1},port=${2},password-secret=spice-mdp \\" >> ${chemin_mv}
else
echo "-spice addr=${1},port=${2},disable-ticketing=on \\" >> ${chemin_mv}
fi
;;
"gtk")
echo "-vga virtio -display sdl,gl=on \\" >> ${chemin_mv}
;;
"ecran")
if [[ ${1} == "faux" ]]; then
echo "-display none \\" >> ${chemin_mv}
fi
;;
"parametres") "parametres")
echo "$@ \\" >> ${chemin_mv} echo "$@ \\" >> ${chemin_mv}
;; ;;
@@ -132,13 +158,7 @@ presenceParametre()
creeMV() creeMV()
{ {
nom_mv="$(basename ${1})" localiserMV ${1}
if [[ "$(dirname ${1})" != "." ]];then
base_chemin_mv="$(dirname ${1})"
fi
chemin_mv="${base_chemin_mv}/${nom_mv}/qemu-${nom_mv}.mv"
echo "nom_mv=${nom_mv}" # Debogage
echo "base_chemin_mv=${base_chemin_mv}" # Debogage
commandes_a_executer+=("nouvMV nom ${nom_mv}") commandes_a_executer+=("nouvMV nom ${nom_mv}")
shift # On retire le nom de la machine virtuelle passé en argument shift # On retire le nom de la machine virtuelle passé en argument
echo 1 "$#" # Debogage echo 1 "$#" # Debogage
@@ -225,7 +245,7 @@ creeMV()
die "Le disque n'est pas renseigné.\nSyntaxe attendue : <chemin disque>|(<chemin disque>|<nom disque>):(raw|qcow2):<capacité>)." 5 die "Le disque n'est pas renseigné.\nSyntaxe attendue : <chemin disque>|(<chemin disque>|<nom disque>):(raw|qcow2):<capacité>)." 5
fi fi
if [[ "$(dirname ${1})" == "." ]];then if [[ "$(dirname ${1})" == "." ]];then
disque_nom="${base_chemin_mv}/${nom_mv}/${disque_nom}" disque_nom="${base_chemin_mv}/${disque_nom}"
fi fi
@@ -272,13 +292,13 @@ creeMV()
# <nom interface>:(virtio|e1000):(n|o:<nom pont>:(n|o:(t:<VIDs>|a:<VID>))) # <nom interface>:(virtio|e1000):(n|o:<nom pont>:(n|o:(t:<VIDs>|a:<VID>)))
# Initialisation des variables # Initialisation des variables
reseau_nom_interface=false reseau_nom_interface="faux"
reseau_type=false reseau_type="faux"
reseau_activ_pont=false reseau_activ_pont="faux"
reseau_nom_pont=false reseau_nom_pont="faux"
reseau_activ_8021q=false reseau_activ_8021q="faux"
reseau_mode_8021q=false reseau_mode_8021q="faux"
reseau_vid=false reseau_vid="faux"
reseau_nom_interface=$( echo ${1} | awk -F: '{print $1}' ) reseau_nom_interface=$( echo ${1} | awk -F: '{print $1}' )
if [[ -z "${reseau_nom_interface}" ]]; then if [[ -z "${reseau_nom_interface}" ]]; then
@@ -371,18 +391,18 @@ creeMV()
commandes_a_executer+=( "nouvMV reseau ${reseau_nom_interface} ${reseau_type} ${reseau_activ_pont} ${reseau_nom_pont} ${reseau_activ_8021q} ${reseau_mode_8021q} ${reseau_vid}") commandes_a_executer+=( "nouvMV reseau ${reseau_nom_interface} ${reseau_type} ${reseau_activ_pont} ${reseau_nom_pont} ${reseau_activ_8021q} ${reseau_mode_8021q} ${reseau_vid}")
echo "nouvMV reseau ${reseau_nom_interface} ${reseau_type} ${reseau_activ_pont} ${reseau_nom_pont} ${reseau_activ_8021q} ${reseau_mode_8021q} ${reseau_vid}" # Debogage echo "nouvMV reseau ${reseau_nom_interface} ${reseau_type} ${reseau_activ_pont} ${reseau_nom_pont} ${reseau_activ_8021q} ${reseau_mode_8021q} ${reseau_vid}" # Debogage
;; ;;
"-p") # VFIO PCI # "-p") # VFIO PCI
echo "pci" # Debogage # echo "pci" # Debogage
# -device vfio-pci,host=0b:10.0,id=hostdev0,bus=pci.0,addr=0xa # # -device vfio-pci,host=0b:10.0,id=hostdev0,bus=pci.0,addr=0xa
shift # shift
;; # ;;
"-s") # Sous-volume "-S") # Sous-volume
echo "sous-volume" # Debogage echo "sous-volume" # Debogage
parametre="${2}" parametre="${2}"
echo "sous-volume parametre=${parametre}" # Debogage echo "sous-volume parametre=${parametre}" # Debogage
presenceParametre "$#" "$1" presenceParametre "$#" "$1"
shift shift
if [[ ${temoin_s} -ne 1 ]]; then if [[ ${temoin_S} -ne 1 ]]; then
case ${1} in case ${1} in
"btrfs"|"BTRFS") "btrfs"|"BTRFS")
if [[ ! $(command -v btrfs) ]]; then if [[ ! $(command -v btrfs) ]]; then
@@ -391,19 +411,71 @@ creeMV()
commandes_init_a_executer+=( "initEnv sousvolume ${1}" ) commandes_init_a_executer+=( "initEnv sousvolume ${1}" )
;; ;;
esac esac
temoin_s=1 temoin_S=1
else else
die "L'option ${1} a déjà été renseignée." 3 die "L'option ${1} a déjà été renseignée." 3
fi fi
;; ;;
"-k") # KVM "-k") # KVM
echo "KVM" echo "KVM" # Debogage
if [[ ${temoin_k} -ne 1 ]]; then if [[ ${temoin_k} -ne 1 ]]; then
commandes_a_executer+=( "nouvMV kvm") commandes_a_executer+=( "nouvMV kvm")
temoin_k=1 temoin_k=1
else else
die "L'option ${1} a déjà été renseignée." 3 die "L'option ${1} a déjà été renseignée." 3
fi fi
;;
"-s") # Séries
echo "Séries" # Debogage
if [[ ${temoin_s} -ne 1 ]]; then
commandes_a_executer+=( "nouvMV series")
temoin_s=1
else
die "L'option ${1} a déjà été renseignée." 3
fi
;;
"-a") # Affichage
echo "Affichage" # Debogage
presenceParametre "$#" "$1"
shift
# (gtk|(spice:(<adresse ecoute>|<chemin socket>):(<tcp port ecoute>|unix)[:<mot de passe>]))
affichage_protocole=$( echo ${1} | awk -F: '{print $1}' )
if [[ -z "${affichage_protocole}" ]]; then
die "Le protocole de gestion de l'affichage n'est pas renseigné.\nSyntaxe attendue : (gtk|(spice:(<adresse ecoute>|<chemin socket>):(<tcp port ecoute>|unix)[:<mot de passe>]))." 5
fi
case ${affichage_protocole} in
"spice"|"SPICE")
affichage_spice_adresse_unix=$( echo ${1} | awk -F: '{print $2}' )
if [[ -z "${affichage_spice_adresse_unix}" ]]; then
die "L'adresse IPv4 ou le chemin unix n'est pas renseigné.\nSyntaxe attendue : (gtk|(spice:(<adresse ecoute>|<chemin socket>):(<tcp port ecoute>|unix)[:<mot de passe>]))." 5
fi
affichage_spice_port_unix=$( echo ${1} | awk -F: '{print $3}' )
if [[ -z "${affichage_spice_port_unix}" ]]; then
die "Le port ou le mot clé unix n'est pas renseigné.\nSyntaxe attendue : (gtk|(spice:(<adresse ecoute>|<chemin socket>):(<tcp port ecoute>|unix)[:<mot de passe>]))." 5
fi
affichage_spice_activ_mot_de_passe="vrai"
affichage_spice_mot_de_passe=$( echo ${1} | awk -F: '{print $4}' )
if [[ -z "${affichage_spice_mot_de_passe}" ]]; then
affichage_spice_activ_mot_de_passe="faux"
fi
commandes_a_executer+=( "nouvMV spice ${affichage_spice_adresse_unix} ${affichage_spice_port_unix} ${affichage_spice_activ_mot_de_passe} ${affichage_spice_mot_de_passe}")
;;
"gtk"|"GTK")
commandes_a_executer+=( "nouvMV gtk")
;;
"aucun"|"AUCUN")
commandes_a_executer+=( "nouvMV ecran faux")
;;
*)
die "${affichage_protocole} n'est pas une valeur connue.\nSyntaxe attendue : (gtk|((vnc|spice):<adresse ecoute>:<port ecoute>))." 5
;;
esac
;; ;;
# "-f") # Force # "-f") # Force
# # Permet d'eviter la demande de confirmation de création # # Permet d'eviter la demande de confirmation de création
@@ -446,13 +518,30 @@ creeMV()
} }
genCmdIntRzo(){ genCmdIntRzo(){
# Création d'une interface simple
if [[ "${pont_init}" -eq 1 && "${vlan_init}" -eq 2 && "${interface_init}" -eq 1 ]]; then
# Commandes à executer au demarrage
commandes_a_executer_on+=( "ip tuntap add ${interface} mode tap" )
commandes_a_executer_on+=( "ip link set ${interface} up" )
commandes_a_executer_on+=( "ip link set ${interface} master ${pont}" )
# Commandes à exectuer à l'arrêt
commandes_a_executer_off+=( "ip link del ${interface}" )
# Réinitialisation des variables témoins
pont_init=0
vlan_init=0
interface_init=0
# Création d'une interface non étiqueté (access) # Création d'une interface non étiqueté (access)
if [[ "${pont_init}" -eq 1 && "${vlan_init}" -eq 1 && "${interface_init}" -eq 1 ]]; then elif [[ "${pont_init}" -eq 1 && "${vlan_init}" -eq 1 && "${interface_init}" -eq 1 ]]; then
commandes_a_executer+=( "ip tuntap add ${interface} mode tap" ) # Commandes à executer au demarrage
commandes_a_executer+=( "ip link set ${interface} up" ) commandes_a_executer_on+=( "ip tuntap add ${interface} mode tap" )
commandes_a_executer+=( "ip link set ${interface} master ${pont}" ) commandes_a_executer_on+=( "ip link set ${interface} up" )
commandes_a_executer+=( "bridge vlan del dev ${interface} vid 1 PVID untagged master" ) commandes_a_executer_on+=( "ip link set ${interface} master ${pont}" )
commandes_a_executer+=( "bridge vlan add dev ${interface} vid ${vlan} pvid untagged master" ) commandes_a_executer_on+=( "bridge vlan del dev ${interface} vid 1 PVID untagged master" )
commandes_a_executer_on+=( "bridge vlan add dev ${interface} vid ${vlan} pvid untagged master" )
# Commandes à exectuer à l'arrêt
commandes_a_executer_off+=( "ip link del ${interface}" )
# Réinitialisation des variables témoins # Réinitialisation des variables témoins
pont_init=0 pont_init=0
@@ -461,13 +550,15 @@ genCmdIntRzo(){
# Création d'une interface étiqueté (trunk) # Création d'une interface étiqueté (trunk)
elif [[ "${pont_init}" -eq 1 && "${ieee8021q_init}" -eq 1 && "${interface_init}" -eq 1 ]]; then elif [[ "${pont_init}" -eq 1 && "${ieee8021q_init}" -eq 1 && "${interface_init}" -eq 1 ]]; then
commandes_a_executer+=( "ip tuntap add ${interface} mode tap" ) commandes_a_executer_on+=( "ip tuntap add ${interface} mode tap" )
commandes_a_executer+=( "ip link set ${interface} up" ) commandes_a_executer_on+=( "ip link set ${interface} up" )
commandes_a_executer+=( "ip link set ${interface} master ${pont}" ) commandes_a_executer_on+=( "ip link set ${interface} master ${pont}" )
commandes_a_executer+=( "bridge vlan del dev ${interface} vid 1 PVID untagged master" ) commandes_a_executer_on+=( "bridge vlan del dev ${interface} vid 1 PVID untagged master" )
for ((id_label_vlan=0 ; "${nb_params_label}" - "${id_label_vlan}" ; id_label_vlan++)); do for ((id_label_vlan=0 ; "${nb_params_label}" - "${id_label_vlan}" ; id_label_vlan++)); do
commandes_a_executer+=( "bridge vlan add dev ${interface} vid ${label_vlan[${id_label_vlan}]} tagged master" ) commandes_a_executer_on+=( "bridge vlan add dev ${interface} vid ${label_vlan[${id_label_vlan}]} tagged master" )
done done
# Commandes à exectuer à l'arrêt
commandes_a_executer_off+=( "ip link del ${interface}" )
# Réinitialisation des variables témoins # Réinitialisation des variables témoins
pont_init=0 pont_init=0
@@ -475,45 +566,43 @@ genCmdIntRzo(){
interface_init=0 interface_init=0
fi fi
echo "commandes_a_executer=${commandes_a_executer[@]}" # Debogage
} }
# Fonction exécuté en premier. Récupère les paramètres du fichier de configuration du conteneur # Fonction exécuté en premier. Récupère les paramètres du fichier de configuration du conteneur
recupParams(){ recupParams(){
verif_params=${1}
declare -a params_int=( $(grep -B 3 "^-device" ${chemin_mv}) ) declare -a params_int=( $(grep -B 3 "^-device" ${chemin_mv}) )
nb_params="${#params_int[*]}" nb_params="${#params_int[*]}"
echo "nb_params=${nb_params}" # Debogage
for ((id_param_fichier=0 ; "${nb_params}" - "${id_param_fichier}" ; id_param_fichier++)); do for ((id_param_fichier=0 ; "${nb_params}" - "${id_param_fichier}" ; id_param_fichier++)); do
nom_param=$(echo "${params_int[${id_param_fichier}]}" | grep -v '#.*-device' | sed "s/=.*//" | sed "s/#//") nom_param=$(echo "${params_int[${id_param_fichier}]}" | grep -v '#.*-device' | sed "s/=.*//" | sed "s/#//")
val_param=$(echo "${params_int[${id_param_fichier}]}" | sed "s/.*=//") val_param=$(echo "${params_int[${id_param_fichier}]}" | sed "s/.*=//")
echo "nom_param=${nom_param}" # Debogage
echo "val_param=${val_param}" # Debogage
# Récupération des données d'après le fichier de configuration # Récupération des données d'après le fichier de configuration
if [ "${nom_param}" == "PONT" ]; then if [ "${nom_param}" == "PONT" ]; then
echo "ip link show ${val_param}" # Debogage if [[ ${verif_params} == "vrai" ]]; then
if [[ $(ip link show "${val_param}" 2> /dev/null) ]]; then if [[ $(ip link show "${val_param}" 2> /dev/null) ]]; then
pont="${val_param}" pont="${val_param}"
pont_init=1 pont_init=1
echo "pont_init=1" # Debogage
else else
echo "Erreur: le pont ${val_param} n'existe pas. Arrêt immédiat du script \"${0}\" sans aucune modification du système." die "Le pont ${val_param} n'existe pas." 8
exit 1 fi
else
pont="${val_param}"
pont_init=1
fi fi
elif [ "${nom_param}" == "VLAN" ]; then elif [ "${nom_param}" == "VLAN" ]; then
if [[ "${val_param}" =~ ^-?[0-9]+$ && "${val_param}" -ge 1 && "${val_param}" -le 4094 && $(echo -n "${val_param}" | cut -c 1) -ne 0 ]]; then if [[ "${val_param}" =~ ^-?[0-9]+$ && "${val_param}" -ge 1 && "${val_param}" -le 4094 && $(echo -n "${val_param}" | cut -c 1) -ne 0 ]]; then
if [[ "${pont_init}" -eq 1 ]]; then if [[ "${pont_init}" -eq 1 ]]; then
vlan="${val_param}" vlan="${val_param}"
vlan_init=1 vlan_init=1
echo "vlan_init=1" # Debogage
else else
echo "Erreur: le paramètre \"#PONT=votrePont\" est manquant." die "Le paramètre \"#PONT=votrePont\" est manquant dans le fichier ${chemin_mv}." 9
exit 1
fi fi
elif [[ "${val_param}" -eq 0 ]]; then
vlan_init=2
else else
echo "Erreur: le VLAN \"${val_param}\" n'est pas un entier compris entre 1 et 4094. Arrêt immédiat du script \"${0}\" sans aucune modification du système." die "Le VLAN \"${val_param}\" n'est pas un entier compris entre 1 et 4094. Veuillez verifier le fichier ${chemin_mv}." 9
exit 1
fi fi
elif [ "${nom_param}" == "8021Q" ]; then elif [ "${nom_param}" == "8021Q" ]; then
declare -a label_vlan=( $(echo ${val_param} | sed 's/,/\n/g') ) declare -a label_vlan=( $(echo ${val_param} | sed 's/,/\n/g') )
@@ -523,25 +612,21 @@ recupParams(){
if [[ "${label_vlan[${id_label_vlan}]}" =~ ^-?[0-9]+$ && "${label_vlan[${id_label_vlan}]}" -ge 1 && "${label_vlan[${id_label_vlan}]}" -le 4094 && $(echo -n "${label_vlan[${id_label_vlan}]}" | cut -c 1) -ne 0 ]]; then if [[ "${label_vlan[${id_label_vlan}]}" =~ ^-?[0-9]+$ && "${label_vlan[${id_label_vlan}]}" -ge 1 && "${label_vlan[${id_label_vlan}]}" -le 4094 && $(echo -n "${label_vlan[${id_label_vlan}]}" | cut -c 1) -ne 0 ]]; then
if [[ "${pont_init}" -eq 1 ]]; then if [[ "${pont_init}" -eq 1 ]]; then
ieee8021q_init=1 ieee8021q_init=1
echo "ieee8021q_init=1" # Debogage
else else
echo "Erreur: le paramètre \"#PONT=votrePont\" est manquant." die "Le paramètre \"#PONT=votrePont\" est manquant dans le fichier ${chemin_mv}." 9
exit 1
fi fi
else else
echo "Erreur: le tronc 802.1Q comporte un identifiant de VLAN (\"${val_param}\") qui n'est pas un entier compris entre 1 et 4094. Arrêt immédiat du script \"${0}\" sans aucune modification du système." die "Le tronc 802.1Q comporte un identifiant de VLAN (\"${val_param}\") qui n'est pas un entier compris entre 1 et 4094. Veuillez verifier le fichier ${chemin_mv}." 9
exit 1
fi fi
done done
elif [ "${nom_param}" == "INTERFACE" ]; then elif [ "${nom_param}" == "INTERFACE" ]; then
if [[ ${verif_params} == "vrai" ]]; then
if [[ ! $(ip link show "${val_param}" 2> /dev/null) ]]; then if [[ ! $(ip link show "${val_param}" 2> /dev/null) ]]; then
if [[ "${vlan_init}" -eq 1 || "${ieee8021q_init}" -eq 1 ]]; then if [[ "${vlan_init}" -eq 1 || "${vlan_init}" -eq 2 || "${ieee8021q_init}" -eq 1 ]]; then
interface="${val_param}" interface="${val_param}"
interface_init=1 interface_init=1
echo "interface_init=1" # Debogage
else else
echo "Erreur: le paramètre \"#VLAN=votreVLAN\" est manquant." die "Le paramètre \"#VLAN=votreVLAN\" est manquant dans le fichier ${chemin_mv}." 9
exit 1
fi fi
elif [[ $(ls /run/network/ | sed -e "s/ifstate//g" -e "s/^.//" -e "/^$/d" -e "/^lo$/d" | grep "${val_param}" 2> /dev/null) ]]; then elif [[ $(ls /run/network/ | sed -e "s/ifstate//g" -e "s/^.//" -e "/^$/d" -e "/^lo$/d" | grep "${val_param}" 2> /dev/null) ]]; then
pont_init=0 pont_init=0
@@ -549,8 +634,11 @@ recupParams(){
ieee8021q_init=0 ieee8021q_init=0
interface_init=0 interface_init=0
else else
echo "Erreur: l'interface ${val_param} est déjà existante. Arrêt immédiat du script \"${0}\" sans aucune modification du système." die "L'interface ${val_param} est déjà existante." 8
exit 1 fi
else
interface="${val_param}"
interface_init=1
fi fi
fi fi
@@ -559,6 +647,31 @@ recupParams(){
done done
} }
genService(){
echo "genService" # Debogage
mkdir -p ${chemin_services_demons}
echo "chemin_mv=${chemin_mv}" # Debogage
nom_du_service="qemu-${nom_mv}-$(echo -n ${chemin_mv} | sha512sum | cut -c 1-10).service"
cat << _EOF_ > ${chemin_services_demons}/${nom_du_service}
[Unit]
Description=Service pour la machine vituelle ${chemin_mv}
After=syslog.target
After=network.target
[Service]
RestartSec=2s
Type=simple
ExecStart=${nom_complet_script} demarre ${chemin_mv}
[Install]
WantedBy=multi-user.target
_EOF_
echo "Le service ${chemin_services_demons}/${nom_du_service} a été crée"
ln -sf ${chemin_services_demons}/${nom_du_service} ${chemin_services_production}/${nom_du_service}
echo "Un lien synbolique vers ${chemin_services_production}/${nom_du_service} a été crée"
echo -e "Si vous voulez exécuter votre machine au démarrage du système, veuillez utiliser la commande suivante :\n\t\033[01;30msystemctl enable ${nom_du_service}\033[00m"
}
usage() usage()
{ {
case ${1} in case ${1} in
@@ -605,6 +718,36 @@ usage()
esac esac
} }
localiserMV() {
nom_mv="$(basename ${1})"
if [[ "$(dirname ${1})" != "." ]];then
base_chemin_mv="$(dirname ${1})"
nom_fichier_mv="${nom_mv}"
else
base_chemin_mv+="/${nom_mv}"
nom_fichier_mv="qemu-${nom_mv}.mv"
fi
chemin_mv="${base_chemin_mv}/${nom_fichier_mv}"
echo "chemin_mv=${chemin_mv}" # Debogage
echo "nom_mv=${nom_mv}" # Debogage
echo "base_chemin_mv=${base_chemin_mv}" # Debogage
echo "nom_fichier_mv=${nom_fichier_mv}" # Debogage
}
demarreService() {
systemctl daemon-reload
systemctl start ${nom_du_service}
echo "Verification en cours..."
sleep 2
systemctl is-active --quiet ${nom_du_service}
if [[ $? -eq 0 ]]; then
echo -e "\033[01;32mLa machine virtuelle ${nom_mv} est bien démarrée.\033[00m"
else
echo -e "\033[01;31mLa machine virtuelle ${nom_mv} n'a pas démarrée.\033[00m"
journalctl --no-pager --lines=10 --output=cat -eu ${nom_du_service}
fi
}
case ${1} in case ${1} in
cree) cree)
echo "Créer" # Debogage echo "Créer" # Debogage
@@ -629,30 +772,25 @@ case ${1} in
if [[ "${1}" == "-h" ]]; then if [[ "${1}" == "-h" ]]; then
usage "demarre" usage "demarre"
fi fi
nom_mv="$(basename ${1})" localiserMV ${1}
if [[ "$(dirname ${1})" != "." ]];then
base_chemin_mv="$(dirname ${1})"
fi
chemin_mv="${base_chemin_mv}/${nom_mv}/qemu-${nom_mv}.mv"
echo "chemin_mv=${chemin_mv}" # Debogage
echo "nom_mv=${nom_mv}" # Debogage
echo "base_chemin_mv=${base_chemin_mv}" # Debogage
shift shift
echo 1 "$#" # Debogage echo 1 "$#" # Debogage
if [[ $# -eq 0 ]]; then if [[ $# -eq 0 ]]; then
echo "Demarrage de la MV..." # Debogage echo "Demarrage de la MV..." # Debogage
#recupParams recupParams vrai
#execCmd "${commandes_a_executer[@]}" execCmd "${commandes_a_executer_on[@]}"
commande_qemu=$(grep -Ev '^#|^$' ${chemin_mv} | tr -d '\n' | tr -d '\\') commande_qemu=$(grep -Ev '^#|^$' ${chemin_mv} | tr -d '\n' | tr -d '\\')
echo "${bin_qemu} ${commande_qemu}" # Debogage echo "${bin_qemu} ${commande_qemu}" # Debogage
${bin_qemu} ${commande_qemu} ${bin_qemu} ${commande_qemu}
fi execCmd "${commandes_a_executer_off[@]}"
else
while [[ $# -gt 0 ]]; do while [[ $# -gt 0 ]]; do
case "${1}" in case "${1}" in
'-d') #demon '-d') #demon
echo "demon" # Debogage echo "demon" # Debogage
if [[ ${temoin_d} -ne 1 ]]; then if [[ ${temoin_d} -ne 1 ]]; then
#commandes_a_executer+=( "nouvMV ${nom_mv}") commandes_a_executer_demon+=( "genService" )
commandes_a_executer_demon+=( "demarreService")
temoin_d=1 temoin_d=1
else else
die "L'option ${1} a déjà été renseignée." 3 die "L'option ${1} a déjà été renseignée." 3
@@ -668,6 +806,8 @@ case ${1} in
esac esac
shift shift
done done
execCmd "${commandes_a_executer_demon[@]}"
fi
fi fi
;; ;;
@@ -677,8 +817,12 @@ case ${1} in
if [[ "${1}" == "-h" ]]; then if [[ "${1}" == "-h" ]]; then
usage "arret" usage "arret"
fi fi
nom_mv="${1}" localiserMV ${1}
echo "nom_mv=${nom_mv}" shift
nom_du_service="qemu-${nom_mv}-$(echo -n ${chemin_mv} | sha512sum | cut -c 1-10).service"
systemctl stop ${nom_du_service}
recupParams faux
execCmd "${commandes_a_executer_off[@]}"
;; ;;
active) active)