From 36887b20c5a8b650a161fcaf96b6223b9c414677 Mon Sep 17 00:00:00 2001 From: Nicolas MORIN Date: Thu, 8 Feb 2024 19:33:43 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20de=20variables=20globales=20+=20Discrim?= =?UTF-8?q?ination=20du=20nom=20de=20la=20MV=20du=20nom=20du=20fichier=20d?= =?UTF-8?q?e=20la=20MV=20+=20Cr=C3=A9ation=20de=20la=20fonction=20localise?= =?UTF-8?q?rMV=20+=20Suppression=20de=20lignes=20de=20d=C3=A9bogage=20+=20?= =?UTF-8?q?Ajout=20de=20conditions=20de=20v=C3=A9rification=20du=20r=C3=A9?= =?UTF-8?q?seau=20dans=20la=20fonction=20recupParams=20+=20Reformulation?= =?UTF-8?q?=20de=20certains=20messages=20d'erreur=20+=20Cr=C3=A9ation=20de?= =?UTF-8?q?=20la=20fonction=20genService=20+=20Cr=C3=A9ation=20de=20la=20f?= =?UTF-8?q?onction=20demarreService=20+=20=C3=89vacuation=20d'un=20bloc=20?= =?UTF-8?q?de=20code=20pour=20le=20param=C3=A8tre=20d=C3=A9marre=20en=20l'?= =?UTF-8?q?absence=20d'option=20+=20=C3=89criture=20de=20la=20fonctionnali?= =?UTF-8?q?t=C3=A9=20d'arr=C3=AAt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- qemu-adm | 201 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 124 insertions(+), 77 deletions(-) diff --git a/qemu-adm b/qemu-adm index 4eb879d..66487d2 100755 --- a/qemu-adm +++ b/qemu-adm @@ -5,7 +5,10 @@ base_chemin_mv="/tmp/ramdisk/qemu-adm" bin_qemu="/usr/bin/qemu-system-x86_64" 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_complet_script="$(dirname $0)/${nom_script}" die() { @@ -14,8 +17,8 @@ die() verifMVExiste() { - if [ -e "${base_chemin_mv}/${nom_mv}" ]; then - die "Le répertoire de la machine virtuelle ${base_chemin_mv}/${nom_mv} existe déjà." 4 + if [ -e "${base_chemin_mv}/${nom_fichier_mv}" ]; then + die "Le répertoire de la machine virtuelle ${base_chemin_mv}/${nom_fichier_mv} existe déjà." 4 fi } @@ -38,7 +41,7 @@ initEnv() esac ;; "repMV") - mkdir -p ${base_chemin_mv}/${nom_mv} + mkdir -p ${base_chemin_mv} ;; esac } @@ -132,13 +135,7 @@ presenceParametre() creeMV() { - nom_mv="$(basename ${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 + localiserMV ${1} commandes_a_executer+=("nouvMV nom ${nom_mv}") shift # On retire le nom de la machine virtuelle passé en argument echo 1 "$#" # Debogage @@ -225,7 +222,7 @@ creeMV() die "Le disque n'est pas renseigné.\nSyntaxe attendue : |(|):(raw|qcow2):)." 5 fi if [[ "$(dirname ${1})" == "." ]];then - disque_nom="${base_chemin_mv}/${nom_mv}/${disque_nom}" + disque_nom="${base_chemin_mv}/${disque_nom}" fi @@ -480,45 +477,41 @@ genCmdIntRzo(){ interface_init=0 fi - echo "commandes_a_executer_on=${commandes_a_executer_on[@]}" # Debogage } # Fonction exécuté en premier. Récupère les paramètres du fichier de configuration du conteneur recupParams(){ + verif_params=${1} declare -a params_int=( $(grep -B 3 "^-device" ${chemin_mv}) ) nb_params="${#params_int[*]}" - echo "nb_params=${nb_params}" # Debogage 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/#//") 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 if [ "${nom_param}" == "PONT" ]; then - echo "ip link show ${val_param}" # Debogage - if [[ $(ip link show "${val_param}" 2> /dev/null) ]]; then + if [[ ${verif_params} == "vrai" ]]; then + if [[ $(ip link show "${val_param}" 2> /dev/null) ]]; then + pont="${val_param}" + pont_init=1 + else + die "Le pont ${val_param} n'existe pas." 8 + fi + else pont="${val_param}" pont_init=1 - echo "pont_init=1" # Debogage - else - echo "Erreur: le pont ${val_param} n'existe pas. Arrêt immédiat du script \"${0}\" sans aucune modification du système." - exit 1 fi 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 [[ "${pont_init}" -eq 1 ]]; then vlan="${val_param}" vlan_init=1 - echo "vlan_init=1" # Debogage else - echo "Erreur: le paramètre \"#PONT=votrePont\" est manquant." - exit 1 + die "Le paramètre \"#PONT=votrePont\" est manquant dans le fichier ${chemin_mv}." 9 fi 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." - exit 1 + die "Le VLAN \"${val_param}\" n'est pas un entier compris entre 1 et 4094. Veuillez verifier le fichier ${chemin_mv}." 9 fi elif [ "${nom_param}" == "8021Q" ]; then declare -a label_vlan=( $(echo ${val_param} | sed 's/,/\n/g') ) @@ -528,34 +521,33 @@ 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 [[ "${pont_init}" -eq 1 ]]; then ieee8021q_init=1 - echo "ieee8021q_init=1" # Debogage else - echo "Erreur: le paramètre \"#PONT=votrePont\" est manquant." - exit 1 + die "Le paramètre \"#PONT=votrePont\" est manquant dans le fichier ${chemin_mv}." 9 fi 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." - exit 1 + 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 fi done elif [ "${nom_param}" == "INTERFACE" ]; then - if [[ ! $(ip link show "${val_param}" 2> /dev/null) ]]; then - if [[ "${vlan_init}" -eq 1 || "${ieee8021q_init}" -eq 1 ]]; then - interface="${val_param}" - interface_init=1 - echo "interface_init=1" # Debogage + if [[ ${verif_params} == "vrai" ]]; then + if [[ ! $(ip link show "${val_param}" 2> /dev/null) ]]; then + if [[ "${vlan_init}" -eq 1 || "${ieee8021q_init}" -eq 1 ]]; then + interface="${val_param}" + interface_init=1 + else + die "Le paramètre \"#VLAN=votreVLAN\" est manquant dans le fichier ${chemin_mv}." 9 + fi + 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 + vlan_init=0 + ieee8021q_init=0 + interface_init=0 else - echo "Erreur: le paramètre \"#VLAN=votreVLAN\" est manquant." - exit 1 + die "L'interface ${val_param} est déjà existante." 8 fi - 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 - vlan_init=0 - ieee8021q_init=0 - interface_init=0 else - echo "Erreur: l'interface ${val_param} est déjà existante. Arrêt immédiat du script \"${0}\" sans aucune modification du système." - exit 1 + interface="${val_param}" + interface_init=1 fi fi @@ -564,6 +556,31 @@ recupParams(){ 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() { case ${1} in @@ -610,6 +627,36 @@ usage() 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 cree) echo "Créer" # Debogage @@ -634,46 +681,42 @@ case ${1} in if [[ "${1}" == "-h" ]]; then usage "demarre" fi - nom_mv="$(basename ${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 + localiserMV ${1} shift echo 1 "$#" # Debogage if [[ $# -eq 0 ]]; then echo "Demarrage de la MV..." # Debogage - recupParams + recupParams vrai execCmd "${commandes_a_executer_on[@]}" commande_qemu=$(grep -Ev '^#|^$' ${chemin_mv} | tr -d '\n' | tr -d '\\') echo "${bin_qemu} ${commande_qemu}" # Debogage ${bin_qemu} ${commande_qemu} execCmd "${commandes_a_executer_off[@]}" - fi - while [[ $# -gt 0 ]]; do - case "${1}" in - '-d') #demon - echo "demon" # Debogage - if [[ ${temoin_d} -ne 1 ]]; then - #commandes_a_executer+=( "nouvMV ${nom_mv}") - temoin_d=1 - else - die "L'option ${1} a déjà été renseignée." 3 - fi - ;; - '-h') #aide + else + while [[ $# -gt 0 ]]; do + case "${1}" in + '-d') #demon + echo "demon" # Debogage + if [[ ${temoin_d} -ne 1 ]]; then + commandes_a_executer_demon+=( "genService" ) + commandes_a_executer_demon+=( "demarreService") + temoin_d=1 + else + die "L'option ${1} a déjà été renseignée." 3 + fi + ;; + '-h') #aide + usage "demarre" + exit 0 + ;; + *) #autre usage "demarre" - exit 0 - ;; - *) #autre - usage "demarre" - ;; - esac - shift - done + ;; + esac + shift + done + execCmd "${commandes_a_executer_demon[@]}" + fi fi ;; @@ -683,8 +726,12 @@ case ${1} in if [[ "${1}" == "-h" ]]; then usage "arret" fi - nom_mv="${1}" - echo "nom_mv=${nom_mv}" + localiserMV ${1} + 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)