|
|
@@ -1,8 +1,16 @@
|
|
|
|
#!/bin/bash
|
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#set -x
|
|
|
|
|
|
|
|
|
|
|
|
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"
|
|
|
|
|
|
|
|
bin_ip="/usr/bin/ip"
|
|
|
|
|
|
|
|
bin_bridge="/usr/sbin/bridge"
|
|
|
|
|
|
|
|
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()
|
|
|
|
die()
|
|
|
|
{
|
|
|
|
{
|
|
|
@@ -11,11 +19,35 @@ 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
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
initEnv()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
echo "initEnv" # Debogage
|
|
|
|
|
|
|
|
local l_option=${1}
|
|
|
|
|
|
|
|
echo "l_option=${l_option}" # Debogage
|
|
|
|
|
|
|
|
shift
|
|
|
|
|
|
|
|
case "${l_option}" in
|
|
|
|
|
|
|
|
"sousvolume")
|
|
|
|
|
|
|
|
echo "initEnv - sousvolume" # Debogage
|
|
|
|
|
|
|
|
case "${1}" in
|
|
|
|
|
|
|
|
"btrfs"|"BTRFS")
|
|
|
|
|
|
|
|
echo "initEnv - sousvolume - BTRFS" # Debogage
|
|
|
|
|
|
|
|
btrfs subvolume create ${base_chemin_mv}
|
|
|
|
|
|
|
|
if [[ $? -gt 0 ]]; then
|
|
|
|
|
|
|
|
die "La création du sous-volume dans le système de fichier cible n'est pas possible." 7
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
"repMV")
|
|
|
|
|
|
|
|
mkdir -p ${base_chemin_mv}
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
nouvMV()
|
|
|
|
nouvMV()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
local l_option=${1}
|
|
|
|
local l_option=${1}
|
|
|
@@ -26,7 +58,7 @@ nouvMV()
|
|
|
|
echo "-name ${1} \\" > ${chemin_mv}
|
|
|
|
echo "-name ${1} \\" > ${chemin_mv}
|
|
|
|
;;
|
|
|
|
;;
|
|
|
|
"cpu")
|
|
|
|
"cpu")
|
|
|
|
echo "-cpu ${1} -smp cores=${2},theads=${3},sockets=1 \\" >> ${chemin_mv}
|
|
|
|
echo "-cpu ${1} -smp cores=${2},threads=${3},sockets=1 \\" >> ${chemin_mv}
|
|
|
|
;;
|
|
|
|
;;
|
|
|
|
"memoire")
|
|
|
|
"memoire")
|
|
|
|
echo "-m ${1} \\" >> ${chemin_mv}
|
|
|
|
echo "-m ${1} \\" >> ${chemin_mv}
|
|
|
@@ -40,15 +72,72 @@ nouvMV()
|
|
|
|
esac
|
|
|
|
esac
|
|
|
|
;;
|
|
|
|
;;
|
|
|
|
"disque")
|
|
|
|
"disque")
|
|
|
|
echo "${2}"
|
|
|
|
echo "${2}" # Debogage
|
|
|
|
if [[ ! -z ${2} ]]; then
|
|
|
|
if [[ ! -z "${2}" && "${2}" =~ ^(raw|qcow2)$ ]]; then
|
|
|
|
if [[ ! -f ${bin_qemu_img} ]]; then
|
|
|
|
if [[ ! -f ${bin_qemu_img} ]]; then
|
|
|
|
die "Le paquet qemu-utils n'est pas installé." 6
|
|
|
|
die "Le paquet qemu-utils n'est pas installé." 6
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
echo "Création du disque..." # Debogage
|
|
|
|
echo "Création du disque..." # Debogage
|
|
|
|
qemu-img create -f ${2} ${1} ${3}
|
|
|
|
qemu-img create -f ${2} ${1} ${3}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
die "Le format du disque doit être raw ou qcow2." 5
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
echo "-drive file=${1},if=virtio \\" >> ${chemin_mv}
|
|
|
|
if [[ "${4}" =~ ^(virtio|ide)$ ]]; then
|
|
|
|
|
|
|
|
echo "-drive file=${1},if=${4} \\" >> ${chemin_mv}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
die "Le type du disque doit être virtio ou ide." 5
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
"iso")
|
|
|
|
|
|
|
|
echo "-cdrom ${1} \\" >> ${chemin_mv}
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
"reseau")
|
|
|
|
|
|
|
|
if [[ "${1}" != "faux" ]]; then
|
|
|
|
|
|
|
|
if [[ "${5}" != "faux" ]]; then
|
|
|
|
|
|
|
|
echo "#PONT=${5}" >> ${chemin_mv}
|
|
|
|
|
|
|
|
if [[ "${6}" == "n" ]]; then
|
|
|
|
|
|
|
|
echo "#VLAN=0" >> ${chemin_mv}
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
case "${7}" in
|
|
|
|
|
|
|
|
"a")
|
|
|
|
|
|
|
|
echo "#VLAN=${8}" >> ${chemin_mv}
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
"t")
|
|
|
|
|
|
|
|
echo "#8021Q=${8}" >> ${chemin_mv}
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
if [[ "${4}" != "faux" ]]; then
|
|
|
|
|
|
|
|
echo "#INTERFACE=${2}" >> ${chemin_mv}
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
echo "-device ${3},netdev=${2} -netdev tap,id=${2},ifname=${2},script=no,downscript=no \\" >> ${chemin_mv}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
echo "-net none \\" >> ${chemin_mv}
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
"kvm")
|
|
|
|
|
|
|
|
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")
|
|
|
|
|
|
|
|
echo "$@ \\" >> ${chemin_mv}
|
|
|
|
;;
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
}
|
|
|
@@ -56,11 +145,10 @@ nouvMV()
|
|
|
|
execCmd()
|
|
|
|
execCmd()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
#verifEnv
|
|
|
|
#verifEnv
|
|
|
|
for ((id_commande=0 ; "${#commandes_a_executer[*]}" - "${id_commande}"; id_commande++)); do
|
|
|
|
liste_executions=("$@")
|
|
|
|
${commandes_a_executer["${id_commande}"]}
|
|
|
|
for ((id_commande=0 ; "${#liste_executions[*]}" - "${id_commande}"; id_commande++)); do
|
|
|
|
|
|
|
|
${liste_executions["${id_commande}"]}
|
|
|
|
done
|
|
|
|
done
|
|
|
|
echo "########## FICHIER ##########" # Debogage
|
|
|
|
|
|
|
|
cat ${chemin_mv} # Debogage
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
confInteractive()
|
|
|
|
confInteractive()
|
|
|
@@ -74,20 +162,14 @@ presenceParametre()
|
|
|
|
local l_nombre_arguments="${1}"
|
|
|
|
local l_nombre_arguments="${1}"
|
|
|
|
local l_nom_option="${2}"
|
|
|
|
local l_nom_option="${2}"
|
|
|
|
local l_nombre_parametres=${l_nombre_arguments}-1 # On soustrait l'option du nombre d'arguments resultant le nombre de parametres
|
|
|
|
local l_nombre_parametres=${l_nombre_arguments}-1 # On soustrait l'option du nombre d'arguments resultant le nombre de parametres
|
|
|
|
if [[ "${l_nombre_parametres}" -eq 0 ]]; then
|
|
|
|
if [[ "${l_nombre_parametres}" -eq 0 || "${3:0:1}" == "-" ]]; then
|
|
|
|
die "L'option ${l_nom_option} n'a pas de paramètre." 5
|
|
|
|
die "L'option ${l_nom_option} n'a pas de paramètre." 5
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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
|
|
|
@@ -97,7 +179,7 @@ creeMV()
|
|
|
|
echo "cpu" # Debogage
|
|
|
|
echo "cpu" # Debogage
|
|
|
|
parametre="${2}"
|
|
|
|
parametre="${2}"
|
|
|
|
echo "cpu parametre=${parametre}" # Debogage
|
|
|
|
echo "cpu parametre=${parametre}" # Debogage
|
|
|
|
presenceParametre "$#" "$1"
|
|
|
|
presenceParametre "$#" "${1}" "${parametre}"
|
|
|
|
shift
|
|
|
|
shift
|
|
|
|
if [[ ${temoin_c} -ne 1 ]]; then
|
|
|
|
if [[ ${temoin_c} -ne 1 ]]; then
|
|
|
|
# <type CPU>:<nombres cœurs CPU>:<nombre files d'execution>
|
|
|
|
# <type CPU>:<nombres cœurs CPU>:<nombre files d'execution>
|
|
|
@@ -130,7 +212,7 @@ creeMV()
|
|
|
|
echo "memoire" # Debogage
|
|
|
|
echo "memoire" # Debogage
|
|
|
|
parametre="${2}"
|
|
|
|
parametre="${2}"
|
|
|
|
echo "memoire parametre=${parametre}" # Debogage
|
|
|
|
echo "memoire parametre=${parametre}" # Debogage
|
|
|
|
presenceParametre "$#" "$1"
|
|
|
|
presenceParametre "$#" "${1}" "${parametre}"
|
|
|
|
shift
|
|
|
|
shift
|
|
|
|
if [[ ${temoin_m} -ne 1 ]]; then
|
|
|
|
if [[ ${temoin_m} -ne 1 ]]; then
|
|
|
|
commandes_a_executer+=( "nouvMV memoire ${1}")
|
|
|
|
commandes_a_executer+=( "nouvMV memoire ${1}")
|
|
|
@@ -143,7 +225,7 @@ creeMV()
|
|
|
|
echo "bios" # Debogage
|
|
|
|
echo "bios" # Debogage
|
|
|
|
parametre="${2}"
|
|
|
|
parametre="${2}"
|
|
|
|
echo "bios parametre=${parametre}" # Debogage
|
|
|
|
echo "bios parametre=${parametre}" # Debogage
|
|
|
|
presenceParametre "$#" "$1"
|
|
|
|
presenceParametre "$#" "${1}" "${parametre}"
|
|
|
|
shift
|
|
|
|
shift
|
|
|
|
if [[ ${temoin_b} -ne 1 ]]; then
|
|
|
|
if [[ ${temoin_b} -ne 1 ]]; then
|
|
|
|
case ${1} in
|
|
|
|
case ${1} in
|
|
|
@@ -162,81 +244,294 @@ creeMV()
|
|
|
|
"-d") # Disque
|
|
|
|
"-d") # Disque
|
|
|
|
echo "disque" # Debogage
|
|
|
|
echo "disque" # Debogage
|
|
|
|
parametre="${2}"
|
|
|
|
parametre="${2}"
|
|
|
|
presenceParametre "$#" "$1"
|
|
|
|
presenceParametre "$#" "${1}" "${parametre}"
|
|
|
|
echo "disque parametre=${parametre}" # Debogage
|
|
|
|
echo "disque parametre=${parametre}" # Debogage
|
|
|
|
shift
|
|
|
|
shift
|
|
|
|
|
|
|
|
|
|
|
|
# <chemin disque>|(<chemin disque>|<nom disque>):(raw|qcow2):<capacité>)
|
|
|
|
# <chemin disque>|(<chemin disque>|<nom disque>):(raw|qcow2):<capacité>:(virtio|ide))
|
|
|
|
|
|
|
|
|
|
|
|
disque_nom=$( echo ${1} | awk -F: '{print $1}' )
|
|
|
|
disque_nom=$( echo ${1} | awk -F: '{print $1}' )
|
|
|
|
echo "disque_nom=${disque_nom}" # Debogage
|
|
|
|
echo "disque_nom=${disque_nom}" # Debogage
|
|
|
|
|
|
|
|
|
|
|
|
if [[ -z "${disque_nom}" ]]; then
|
|
|
|
if [[ -z "${disque_nom}" ]]; then
|
|
|
|
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é>:(virtio|ide))." 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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
disque_format=$( echo ${1} | awk -F: '{print $2}' )
|
|
|
|
disque_format=$( echo ${1} | awk -F: '{print $2}' )
|
|
|
|
echo "disque_format=${disque_format}" # Debogage
|
|
|
|
echo "disque_format=${disque_format}" # Debogage
|
|
|
|
if [[ -z "${disque_format}" && "$(dirname ${1})" == "." ]]; then
|
|
|
|
if [[ -z "${disque_format}" && "$(dirname ${1})" == "." ]]; then
|
|
|
|
die "Le format du disque n'est pas renseigné.\nSyntaxe attendue : <chemin disque>|(<chemin disque>|<nom disque>):(raw|qcow2):<capacité>)." 5
|
|
|
|
die "Le format du disque n'est pas renseigné.\nSyntaxe attendue : <chemin disque>|(<chemin disque>|<nom disque>):(raw|qcow2):<capacité>:(virtio|ide))." 5
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
disque_capacite=$( echo ${1} | awk -F: '{print $3}' )
|
|
|
|
disque_capacite=$( echo ${1} | awk -F: '{print $3}' )
|
|
|
|
echo "disque_capacite=${disque_capacite}" # Debogage
|
|
|
|
echo "disque_capacite=${disque_capacite}" # Debogage
|
|
|
|
if [[ -z "${disque_capacite}" && "$(dirname ${1})" == "." ]]; then
|
|
|
|
if [[ -z "${disque_capacite}" && "$(dirname ${1})" == "." ]]; then
|
|
|
|
die "La capacité du disque n'est pas renseigné.\nSyntaxe attendue : <chemin disque>|(<chemin disque>|<nom disque>):(raw|qcow2):<capacité>)." 5
|
|
|
|
die "La capacité du disque n'est pas renseigné.\nSyntaxe attendue : <chemin disque>|(<chemin disque>|<nom disque>):(raw|qcow2):<capacité>:(virtio|ide))." 5
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
disque_type=$( echo ${1} | awk -F: '{print $4}' )
|
|
|
|
|
|
|
|
echo "disque_type=${disque_type}" # Debogage
|
|
|
|
|
|
|
|
if [[ -z "${disque_type}" && "$(dirname ${1})" == "." ]]; then
|
|
|
|
|
|
|
|
die "Le type du disque n'est pas renseigné.\nSyntaxe attendue : <chemin disque>|(<chemin disque>|<nom disque>):(raw|qcow2):<capacité>:(virtio|ide))." 5
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
commandes_a_executer+=( "nouvMV disque ${disque_nom} ${disque_format} ${disque_capacite}")
|
|
|
|
commandes_a_executer+=( "nouvMV disque ${disque_nom} ${disque_format} ${disque_capacite} ${disque_type}")
|
|
|
|
;;
|
|
|
|
;;
|
|
|
|
"-i") # Iso
|
|
|
|
"-i") # Iso
|
|
|
|
echo "iso" # Debogage
|
|
|
|
echo "iso" # Debogage
|
|
|
|
parametre="${2}"
|
|
|
|
parametre="${2}"
|
|
|
|
presenceParametre "$#" "$1"
|
|
|
|
presenceParametre "$#" "${1}" "${parametre}"
|
|
|
|
echo "iso parametre=${parametre}" # Debogage
|
|
|
|
echo "iso parametre=${parametre}" # Debogage
|
|
|
|
shift
|
|
|
|
shift
|
|
|
|
|
|
|
|
commandes_a_executer+=( "nouvMV iso ${1}")
|
|
|
|
;;
|
|
|
|
;;
|
|
|
|
'-r') # Reseau
|
|
|
|
'-r') # Reseau
|
|
|
|
echo "reseau" # Debogage
|
|
|
|
echo "reseau" # Debogage
|
|
|
|
parametre="${2}"
|
|
|
|
parametre="${2}"
|
|
|
|
presenceParametre "$#" "$1"
|
|
|
|
presenceParametre "$#" "${1}" "${parametre}"
|
|
|
|
echo "reseau parametre=${parametre}" # Debogage
|
|
|
|
echo "reseau parametre=${parametre}" # Debogage
|
|
|
|
shift
|
|
|
|
shift
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Aucune interface réseau (désactive le réseau par défaut de Qemu si non spécifié par l'utilisateur) :
|
|
|
|
|
|
|
|
# n
|
|
|
|
|
|
|
|
# Interface réseau simple :
|
|
|
|
|
|
|
|
## (n|o:<nom interface>:(virtio|e1000):<activation pont>)
|
|
|
|
|
|
|
|
# (n|o:<nom interface>:(virtio|e1000):n)
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
# Interface réseau dans un pont
|
|
|
|
|
|
|
|
## (n|o:<nom interface>:(virtio|e1000):o:<nom pont>:<activation 8021q>)
|
|
|
|
|
|
|
|
# (n|o:<nom interface>:(virtio|e1000):o:<nom pont>:n)
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
# Interface réseau dans un pont avec gestion des VLAN
|
|
|
|
|
|
|
|
# (n|o:<nom interface>:(virtio|e1000):o:<nom pont>:o:(t:<VIDs>|a:<VID>))
|
|
|
|
|
|
|
|
# (n|o:<nom interface>:(virtio|e1000):(n|o:<nom pont>:(n|o:(t:<VIDs>|a:<VID>))))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Initialisation des variables
|
|
|
|
|
|
|
|
reseau_nom_interface="faux"
|
|
|
|
|
|
|
|
reseau_type="faux"
|
|
|
|
|
|
|
|
reseau_activ_pont="faux"
|
|
|
|
|
|
|
|
reseau_nom_pont="faux"
|
|
|
|
|
|
|
|
reseau_activ_8021q="faux"
|
|
|
|
|
|
|
|
reseau_mode_8021q="faux"
|
|
|
|
|
|
|
|
reseau_vid="faux"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
reseau_activ_interface=$( echo ${1} | awk -F: '{print $1}' )
|
|
|
|
|
|
|
|
if [[ -z "${reseau_activ_interface}" ]]; then
|
|
|
|
|
|
|
|
die "L'activation du réseau n'est pas renseigné.\nSpécifiez (n|N) pour désactiver le réseau sur la machine virtuelle ou (o|O) pour créer une interface réseau.\nVoici les deux syntaxes minimales posisbles : \n\tSans réseau :\n\t\tn\n\tAvec réseau :\n\t\to:<nom interface>:(virtio|e1000):n." 5
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
case ${reseau_activ_interface} in
|
|
|
|
|
|
|
|
"n"|"N")
|
|
|
|
|
|
|
|
reseau_activ_interface="faux"
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
"o"|"O")
|
|
|
|
|
|
|
|
reseau_nom_interface=$( echo ${1} | awk -F: '{print $2}' )
|
|
|
|
|
|
|
|
if [[ -z "${reseau_nom_interface}" ]]; then
|
|
|
|
|
|
|
|
die "L'interface réseau n'est pas renseigné.\nSyntaxe minimale attendue : o:<nom interface>:(virtio|e1000):n." 5
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
reseau_type=$( echo ${1} | awk -F: '{print $3}' )
|
|
|
|
|
|
|
|
if [[ -z "${reseau_type}" ]]; then
|
|
|
|
|
|
|
|
die "Le type d'interface réseau n'est pas renseigné.\nSyntaxe minimale attendue : o:<nom interface>:(virtio|e1000):n." 5
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
case ${reseau_type} in
|
|
|
|
|
|
|
|
"virtio")
|
|
|
|
|
|
|
|
reseau_type="virtio-net-pci"
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
"e1000")
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
*)
|
|
|
|
|
|
|
|
die "Le type d'interface réseau n'a pas une valeur connue.\nSyntaxe minimale attendue : o:<nom interface>:(virtio|e1000):n." 5
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
reseau_activ_pont=$( echo ${1} | awk -F: '{print $4}' )
|
|
|
|
|
|
|
|
echo "reseau_activ_pont=${reseau_activ_pont}" # Debogage
|
|
|
|
|
|
|
|
if [[ -z "${reseau_activ_pont}" ]]; then
|
|
|
|
|
|
|
|
die "L'activation du pont n'est pas renseigné.\nVoici les deux syntaxes minimale posisbles : \n\tSans pont :\n\t\to:<nom interface>:(virtio|e1000):n\n\tAvec pont :\n\t\to:<nom interface>:(virtio|e1000):o:<nom pont>:n" 5
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
case ${reseau_activ_pont} in
|
|
|
|
|
|
|
|
"n"|"N")
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
"o"|"O")
|
|
|
|
|
|
|
|
reseau_nom_pont=$( echo ${1} | awk -F: '{print $5}' )
|
|
|
|
|
|
|
|
if [[ -z "${reseau_nom_pont}" ]]; then
|
|
|
|
|
|
|
|
die "Le nom du pont réseau n'est pas renseigné.\nSyntaxe minimale attendue : o:<nom interface>:(virtio|e1000):o:<nom pont>:n" 5
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
reseau_activ_8021q=$( echo ${1} | awk -F: '{print $6}' )
|
|
|
|
|
|
|
|
if [[ -z "${reseau_activ_8021q}" ]]; then
|
|
|
|
|
|
|
|
die "L'activation du VLAN n'est pas renseigné.\nVoici les deux syntaxes minimales posisbles :\n\tSans VLAN :\n\t\to:<nom interface>:(virtio|e1000):o:<nom pont>:n\n\tAvec VLAN :\n\t\to:<nom interface>:(virtio|e1000):o:<nom pont>:o:(t:<VIDs>|a:<VID>)" 5
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
case ${reseau_activ_8021q} in
|
|
|
|
|
|
|
|
"n"|"N")
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
"o"|"O")
|
|
|
|
|
|
|
|
reseau_mode_8021q=$( echo ${1} | awk -F: '{print $7}' )
|
|
|
|
|
|
|
|
if [[ -z "${reseau_mode_8021q}" ]]; then
|
|
|
|
|
|
|
|
die "Le mode du 802.1Q n'est pas renseigné.\nSyntaxe attendue : o:<nom interface>:(virtio|e1000):o:<nom pont>:o:(t:<VIDs>|a:<VID>)" 5
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
case ${reseau_mode_8021q} in
|
|
|
|
|
|
|
|
"t"|"T")
|
|
|
|
|
|
|
|
reseau_vid=$( echo ${1} | awk -F: '{print $8}' )
|
|
|
|
|
|
|
|
echo "reseau_vid=${reseau_vid}" # Debogage
|
|
|
|
|
|
|
|
if [[ -z "${reseau_vid}" ]]; then
|
|
|
|
|
|
|
|
die "Les identifiants de VLAN ne sont pas renseignés.\nSyntaxe attendue : o:<nom interface>:(virtio|e1000):o:<nom pont>:o:(t:<VIDs>|a:<VID>).\nExemple pour un accès via trunk aux VLAN 10 et 20 :\n\t qemu-adm [...] -r tap0:virtio:o:br0:o:t:10,20" 5
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
for vid in $(echo $reseau_vid | sed 's/,/ /g'); do
|
|
|
|
|
|
|
|
echo "vid=${vid}" # Debogage
|
|
|
|
|
|
|
|
if [[ !(${vid} -ge 1 && ${vid} -le 4096) ]]; then
|
|
|
|
|
|
|
|
die "${vid} n'est pas une valeur correcte. L'attendu est un ou plusieurs chiffres comprise entre 1 et 4096 séparé par une virgule.\nExemple pour un accès via trunk aux VLAN 10 et 20 :\n\t qemu-adm [...] -r tap0:virtio:o:br0:o:t:10,20"
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
done
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
"a"|"A")
|
|
|
|
|
|
|
|
reseau_vid=$( echo ${1} | awk -F: '{print $8}' )
|
|
|
|
|
|
|
|
if [[ -z "${reseau_vid}" ]]; then
|
|
|
|
|
|
|
|
die "L'identifiant de VLAN n'est pas renseignés.\nSyntaxe attendue : o:<nom interface>:(virtio|e1000):o:<nom pont>:o:(t:<VIDs>|a:<VID>).\nExemple pour un accès au VLAN 10 :\n\t qemu-adm [...] -r tap0:virtio:o:br0:o:a:10" 5
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [[ ! "${reseau_vid}" =~ ^[0-9]+$ ]]; then
|
|
|
|
|
|
|
|
die "${reseau_vid} n'est pas une valeur correcte. L'attendu est un chiffre compris entre 1 et 4096.\nExemple pour un accès au VLAN 10 :\n\t qemu-adm [...] -r tap0:virtio:o:br0:o:a:10"
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [[ !(${reseau_vid} -ge 1 && ${reseau_vid} -le 4096) ]]; then
|
|
|
|
|
|
|
|
die "${reseau_vid} n'est pas une valeur correcte. L'attendu est un chiffre compris entre 1 et 4096.\nExemple pour un accès au VLAN 10 :\n\t qemu-adm [...] -r tap0:virtio:o:br0:o:a:10"
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
*)
|
|
|
|
|
|
|
|
die "${reseau_mode_8021q} n'est pas une valeur connue.\nSyntaxe attendue : o:<nom interface>:(virtio|e1000):o:<nom pont>:o:(t:<VIDs>|a:<VID>)\n"
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
*)
|
|
|
|
|
|
|
|
die "${reseau_activ_8021q} n'est pas une valeur connue.\nVoici les deux syntaxes minimales posisbles : \n\tSans VLAN :\n\t\to:<nom interface>:(virtio|e1000):o:<nom pont>:n\n\tAvec VLAN :\n\t\to:<nom interface>:(virtio|e1000):o:<nom pont>:o:(t:<VIDs>|a:<VID>)" 5
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*)
|
|
|
|
|
|
|
|
die "${reseau_activ_pont} n'est pas une valeur connue.\nVoici les deux syntaxes minimales posisbles : \n\tSans pont :\n\t\to:<nom interface>:(virtio|e1000):n\n\tAvec pont :\n\t\to:<nom interface>:(virtio|e1000):o:<nom pont>:n" 5
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
*)
|
|
|
|
|
|
|
|
die "${reseau_activ_interface} n'est pas une valeur connue.\nSpécifiez (n|N) pour désactiver le réseau sur la machine virtuelle ou (o|O) pour créer une interface réseau.\nVoici les deux syntaxes minimales posisbles : \n\tSans réseau :\n\t\tn\n\tAvec réseau :\n\t\to:<nom interface>:(virtio|e1000):n" 5
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
commandes_a_executer+=( "nouvMV reseau ${reseau_activ_interface} ${reseau_nom_interface} ${reseau_type} ${reseau_activ_pont} ${reseau_nom_pont} ${reseau_activ_8021q} ${reseau_mode_8021q} ${reseau_vid}")
|
|
|
|
|
|
|
|
echo "nouvMV reseau ${reseau_activ_interface} ${reseau_nom_interface} ${reseau_type} ${reseau_activ_pont} ${reseau_nom_pont} ${reseau_activ_8021q} ${reseau_mode_8021q} ${reseau_vid}" # Debogage
|
|
|
|
;;
|
|
|
|
;;
|
|
|
|
'-p') # Parametres
|
|
|
|
# "-p") # VFIO PCI
|
|
|
|
echo "parametres" # Debogage
|
|
|
|
# echo "pci" # Debogage
|
|
|
|
parametre="${2}"
|
|
|
|
# # -device vfio-pci,host=0b:10.0,id=hostdev0,bus=pci.0,addr=0xa
|
|
|
|
presenceParametre "$#" "$1"
|
|
|
|
# shift
|
|
|
|
echo "parametres parametre=${parametre}" # Debogage
|
|
|
|
# ;;
|
|
|
|
shift
|
|
|
|
"-S") # Sous-volume
|
|
|
|
;;
|
|
|
|
|
|
|
|
"-s") # Sous-volume BTRFS
|
|
|
|
|
|
|
|
echo "sous-volume" # Debogage
|
|
|
|
echo "sous-volume" # Debogage
|
|
|
|
|
|
|
|
parametre="${2}"
|
|
|
|
|
|
|
|
echo "sous-volume parametre=${parametre}" # Debogage
|
|
|
|
|
|
|
|
presenceParametre "$#" "${1}" "${parametre}"
|
|
|
|
|
|
|
|
shift
|
|
|
|
|
|
|
|
if [[ ${temoin_S} -ne 1 ]]; then
|
|
|
|
|
|
|
|
case ${1} in
|
|
|
|
|
|
|
|
"btrfs"|"BTRFS")
|
|
|
|
|
|
|
|
if [[ ! $(command -v btrfs) ]]; then
|
|
|
|
|
|
|
|
die "Le paquet btrfs-progs n'est pas installé." 6
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
commandes_init_a_executer+=( "initEnv sousvolume ${1}" )
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
temoin_S=1
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
die "L'option ${1} a déjà été renseignée." 3
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
"-k") # KVM
|
|
|
|
|
|
|
|
echo "KVM" # Debogage
|
|
|
|
|
|
|
|
if [[ ${temoin_k} -ne 1 ]]; then
|
|
|
|
|
|
|
|
commandes_a_executer+=( "nouvMV kvm")
|
|
|
|
|
|
|
|
temoin_k=1
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
die "L'option ${1} a déjà été renseignée." 3
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
"-s") # Séries
|
|
|
|
|
|
|
|
echo "Séries" # Debogage
|
|
|
|
if [[ ${temoin_s} -ne 1 ]]; then
|
|
|
|
if [[ ${temoin_s} -ne 1 ]]; then
|
|
|
|
#commandes_a_executer+=( "nouvMV ${nom_mv}")
|
|
|
|
commandes_a_executer+=( "nouvMV series")
|
|
|
|
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
|
|
|
|
;;
|
|
|
|
;;
|
|
|
|
"-f") # Force
|
|
|
|
"-a") # Affichage
|
|
|
|
# Permet d'eviter la demande de confirmation de création
|
|
|
|
echo "Affichage" # Debogage
|
|
|
|
echo "force" # Debogage
|
|
|
|
presenceParametre "$#" "${1}" "${parametre}"
|
|
|
|
if [[ ${temoin_f} -ne 1 ]]; then
|
|
|
|
shift
|
|
|
|
#commandes_a_executer+=( "nouvMV ${nom_mv}")
|
|
|
|
|
|
|
|
temoin_s=f
|
|
|
|
# (gtk|(spice:(<adresse ecoute>|<chemin socket>):(<tcp port ecoute>|unix)[:<mot de passe>]))
|
|
|
|
else
|
|
|
|
|
|
|
|
die "L'option ${1} a déjà été renseignée." 3
|
|
|
|
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
|
|
|
|
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
|
|
|
|
|
|
|
|
# # Permet d'eviter la demande de confirmation de création
|
|
|
|
|
|
|
|
# echo "force" # Debogage
|
|
|
|
|
|
|
|
# if [[ ${temoin_f} -ne 1 ]]; then
|
|
|
|
|
|
|
|
# #commandes_a_executer+=( "nouvMV ${nom_mv}")
|
|
|
|
|
|
|
|
# temoin_s=f
|
|
|
|
|
|
|
|
# else
|
|
|
|
|
|
|
|
# die "L'option ${1} a déjà été renseignée." 3
|
|
|
|
|
|
|
|
# fi
|
|
|
|
|
|
|
|
# ;;
|
|
|
|
'-h') # Aide
|
|
|
|
'-h') # Aide
|
|
|
|
usage "cree"
|
|
|
|
usage "cree"
|
|
|
|
exit 0
|
|
|
|
exit 0
|
|
|
|
;;
|
|
|
|
;;
|
|
|
|
|
|
|
|
'--') # Autre parametres (champ libre)
|
|
|
|
|
|
|
|
echo "parametres" # Debogage
|
|
|
|
|
|
|
|
presenceParametre "$#" "${1}" "${parametre}"
|
|
|
|
|
|
|
|
shift
|
|
|
|
|
|
|
|
parametres="$@"
|
|
|
|
|
|
|
|
echo "parametres=${parametres}" # Debogage
|
|
|
|
|
|
|
|
commandes_a_executer+=( "nouvMV parametres $parametres")
|
|
|
|
|
|
|
|
shift $#
|
|
|
|
|
|
|
|
;;
|
|
|
|
*) # Autre
|
|
|
|
*) # Autre
|
|
|
|
usage "cree"
|
|
|
|
usage "cree"
|
|
|
|
;;
|
|
|
|
;;
|
|
|
@@ -246,9 +541,167 @@ creeMV()
|
|
|
|
if [[ ${temoin_c} -ne 1 || ${temoin_m} -ne 1 ]]; then
|
|
|
|
if [[ ${temoin_c} -ne 1 || ${temoin_m} -ne 1 ]]; then
|
|
|
|
die "Les parametres -c et -m sont obligatoires." 2
|
|
|
|
die "Les parametres -c et -m sont obligatoires." 2
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
#verifMVExiste ${nom_mv} &&
|
|
|
|
#verifMVExiste ${nom_mv}
|
|
|
|
mkdir -p ${base_chemin_mv}/${nom_mv}
|
|
|
|
commandes_init_a_executer+=( "initEnv repMV" )
|
|
|
|
execCmd
|
|
|
|
execCmd "${commandes_init_a_executer[@]}"
|
|
|
|
|
|
|
|
execCmd "${commandes_a_executer[@]}"
|
|
|
|
|
|
|
|
echo "########## FICHIER ##########" # Debogage
|
|
|
|
|
|
|
|
cat ${chemin_mv} # Debogage
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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+=( "${bin_ip} tuntap add ${interface} mode tap" )
|
|
|
|
|
|
|
|
commandes_a_executer_on+=( "${bin_ip} link set ${interface} up" )
|
|
|
|
|
|
|
|
commandes_a_executer_on+=( "${bin_ip} link set ${interface} master ${pont}" )
|
|
|
|
|
|
|
|
# Commandes à exectuer à l'arrêt
|
|
|
|
|
|
|
|
commandes_a_executer_off+=( "${bin_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)
|
|
|
|
|
|
|
|
elif [[ "${pont_init}" -eq 1 && "${vlan_init}" -eq 1 && "${interface_init}" -eq 1 ]]; then
|
|
|
|
|
|
|
|
# Commandes à executer au demarrage
|
|
|
|
|
|
|
|
commandes_a_executer_on+=( "${bin_ip} tuntap add ${interface} mode tap" )
|
|
|
|
|
|
|
|
commandes_a_executer_on+=( "${bin_ip} link set ${interface} up" )
|
|
|
|
|
|
|
|
commandes_a_executer_on+=( "${bin_ip} link set ${interface} master ${pont}" )
|
|
|
|
|
|
|
|
commandes_a_executer_on+=( "${bin_bridge} vlan del dev ${interface} vid 1 PVID untagged master" )
|
|
|
|
|
|
|
|
commandes_a_executer_on+=( "${bin_bridge} vlan add dev ${interface} vid ${vlan} pvid untagged master" )
|
|
|
|
|
|
|
|
# Commandes à exectuer à l'arrêt
|
|
|
|
|
|
|
|
commandes_a_executer_off+=( "${bin_ip} link del ${interface}" )
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Réinitialisation des variables témoins
|
|
|
|
|
|
|
|
pont_init=0
|
|
|
|
|
|
|
|
vlan_init=0
|
|
|
|
|
|
|
|
interface_init=0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Création d'une interface étiqueté (trunk)
|
|
|
|
|
|
|
|
elif [[ "${pont_init}" -eq 1 && "${ieee8021q_init}" -eq 1 && "${interface_init}" -eq 1 ]]; then
|
|
|
|
|
|
|
|
commandes_a_executer_on+=( "${bin_ip} tuntap add ${interface} mode tap" )
|
|
|
|
|
|
|
|
commandes_a_executer_on+=( "${bin_ip} link set ${interface} up" )
|
|
|
|
|
|
|
|
commandes_a_executer_on+=( "${bin_ip} link set ${interface} master ${pont}" )
|
|
|
|
|
|
|
|
commandes_a_executer_on+=( "${bin_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
|
|
|
|
|
|
|
|
commandes_a_executer_on+=( "${bin_bridge} vlan add dev ${interface} vid ${label_vlan[${id_label_vlan}]} tagged master" )
|
|
|
|
|
|
|
|
done
|
|
|
|
|
|
|
|
# Commandes à exectuer à l'arrêt
|
|
|
|
|
|
|
|
commandes_a_executer_off+=( "${bin_ip} link del ${interface}" )
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Réinitialisation des variables témoins
|
|
|
|
|
|
|
|
pont_init=0
|
|
|
|
|
|
|
|
ieee8021q_init=0
|
|
|
|
|
|
|
|
interface_init=0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 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[*]}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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/.*=//")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Récupération des données d'après le fichier de configuration
|
|
|
|
|
|
|
|
if [ "${nom_param}" == "PONT" ]; then
|
|
|
|
|
|
|
|
if [[ ${verif_params} == "vrai" ]]; then
|
|
|
|
|
|
|
|
if [[ $(${bin_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
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
die "Le paramètre \"#PONT=votrePont\" est manquant dans le fichier ${chemin_mv}." 9
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
elif [[ "${val_param}" -eq 0 ]]; then
|
|
|
|
|
|
|
|
vlan_init=2
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
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') )
|
|
|
|
|
|
|
|
nb_params_label="${#label_vlan[*]}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for ((id_label_vlan=0 ; "${nb_params_label}" - "${id_label_vlan}" ; id_label_vlan++)); do
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
die "Le paramètre \"#PONT=votrePont\" est manquant dans le fichier ${chemin_mv}." 9
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
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 [[ ${verif_params} == "vrai" ]]; then
|
|
|
|
|
|
|
|
if [[ ! $(${bin_ip} link show "${val_param}" 2> /dev/null) ]]; then
|
|
|
|
|
|
|
|
if [[ "${vlan_init}" -eq 1 || "${vlan_init}" -eq 2 || "${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
|
|
|
|
|
|
|
|
die "L'interface ${val_param} est déjà existante." 8
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
interface="${val_param}"
|
|
|
|
|
|
|
|
interface_init=1
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Génération des commandes de création des interfaces réseau du conteneur
|
|
|
|
|
|
|
|
genCmdIntRzo
|
|
|
|
|
|
|
|
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()
|
|
|
@@ -297,6 +750,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
|
|
|
@@ -321,31 +804,42 @@ case ${1} in
|
|
|
|
if [[ "${1}" == "-h" ]]; then
|
|
|
|
if [[ "${1}" == "-h" ]]; then
|
|
|
|
usage "demarre"
|
|
|
|
usage "demarre"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
nom_mv="${1}"
|
|
|
|
localiserMV ${1}
|
|
|
|
echo "nom_mv=${nom_mv}" # Debogage
|
|
|
|
|
|
|
|
shift
|
|
|
|
shift
|
|
|
|
echo 1 "$#" # Debogage
|
|
|
|
echo 1 "$#" # Debogage
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
|
|
if [[ $# -eq 0 ]]; then
|
|
|
|
case "${1}" in
|
|
|
|
echo "Demarrage de la MV..." # Debogage
|
|
|
|
'-d') #demon
|
|
|
|
recupParams vrai
|
|
|
|
echo "demon" # Debogage
|
|
|
|
execCmd "${commandes_a_executer_on[@]}"
|
|
|
|
if [[ ${temoin_d} -ne 1 ]]; then
|
|
|
|
commande_qemu=$(grep -Ev '^#|^$' ${chemin_mv} | tr -d '\n' | tr -d '\\')
|
|
|
|
#commandes_a_executer+=( "nouvMV ${nom_mv}")
|
|
|
|
echo "${bin_qemu} ${commande_qemu}" # Debogage
|
|
|
|
temoin_d=1
|
|
|
|
${bin_qemu} ${commande_qemu}
|
|
|
|
else
|
|
|
|
execCmd "${commandes_a_executer_off[@]}"
|
|
|
|
die "L'option ${1} a déjà été renseignée." 3
|
|
|
|
else
|
|
|
|
fi
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
|
|
;;
|
|
|
|
case "${1}" in
|
|
|
|
'-h') #aide
|
|
|
|
'-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"
|
|
|
|
usage "demarre"
|
|
|
|
exit 0
|
|
|
|
;;
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
*) #autre
|
|
|
|
shift
|
|
|
|
usage "demarre"
|
|
|
|
done
|
|
|
|
;;
|
|
|
|
execCmd "${commandes_a_executer_demon[@]}"
|
|
|
|
esac
|
|
|
|
fi
|
|
|
|
shift
|
|
|
|
|
|
|
|
done
|
|
|
|
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
|
@@ -355,8 +849,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)
|
|
|
|