#!/bin/bash base_chemin_mv="/tmp/ramdisk/qemu-adm" bin_qemu="/usr/bin/qemu-system-x86_64" bin_qemu_img="/usr/bin/qemu-img" die() { echo -e "\033[0;31m${1}\033[0m" 1>&2; exit ${2}; } 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 fi } nouvMV() { local l_option=${1} echo "l_option=${l_option}" # Debogage shift case "${l_option}" in "nom") echo "-name ${1} \\" > ${chemin_mv} ;; "cpu") echo "-cpu ${1} -smp cores=${2},theads=${3},sockets=1 \\" >> ${chemin_mv} ;; "memoire") echo "-m ${1} \\" >> ${chemin_mv} ;; "bios") case "${1}" in "OVMF") cp /usr/share/ovmf/OVMF.fd ${base_chemin_mv}/OVMF.fd echo "-drive if=pflash,format=raw,file=${base_chemin_mv}/OVMF.fd \\" >> ${chemin_mv} ;; esac ;; esac } execCmd() { #verifEnv for ((id_commande=0 ; "${#commandes_a_executer[*]}" - "${id_commande}"; id_commande++)); do ${commandes_a_executer["${id_commande}"]} done echo "########## FICHIER ##########" # Debogage cat ${chemin_mv} # Debogage } confInteractive() { echo "confInteractive" # Debogage } presenceParametre() { echo "presenceParametre" # Debogage local l_nombre_arguments="${1}" 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 if [[ "${l_nombre_parametres}" -eq 0 ]]; then die "L'option ${l_nom_option} n'a pas de paramètre." 5 fi } 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 commandes_a_executer+=("nouvMV nom ${nom_mv}") shift # On retire le nom de la machine virtuelle passé en argument echo 1 "$#" # Debogage while [[ $# -gt 0 ]]; do case "${1}" in "-c") # Cpu (requis) echo "cpu" # Debogage parametre="${2}" echo "cpu parametre=${parametre}" # Debogage presenceParametre "$#" "$1" shift if [[ ${temoin_c} -ne 1 ]]; then # :: cpu_type=$( echo ${1} | awk -F: '{print $1}' ) echo "${cpu_type}" # Debogage if [[ -z "${cpu_type}" ]]; then die "Le type de CPU n'est pas renseigné.\nSyntaxe attendu : ::." 5 fi cpu_nombre_de_coeurs=$( echo ${1} | awk -F: '{print $2}' ) echo "${cpu_nombre_de_coeurs}" # Debogage if [[ -z "${cpu_nombre_de_coeurs}" ]]; then die "Le nombre de cœurs n'est pas renseigné.\nSyntaxe attendu : ::." 5 fi cpu_nombre_de_files_d_execution=$( echo ${1} | awk -F: '{print $3}' ) echo "${cpu_nombre_de_files_d_execution}" # Debogage if [[ -z "${cpu_nombre_de_files_d_execution}" ]]; then die "Le nombre de files d'execution n'est pas renseigné.\nSyntaxe attendu : ::." 5 fi commandes_a_executer+=("nouvMV cpu ${cpu_type} ${cpu_nombre_de_coeurs} ${cpu_nombre_de_files_d_execution}") temoin_c=1 else die "L'option ${1} a déjà été renseignée." 3 fi ;; "-m") # Memoire (requis) echo "memoire" # Debogage parametre="${2}" echo "memoire parametre=${parametre}" # Debogage presenceParametre "$#" "$1" shift if [[ ${temoin_m} -ne 1 ]]; then commandes_a_executer+=( "nouvMV memoire ${1}") temoin_m=1 else die "L'option ${1} a déjà été renseignée." 3 fi ;; "-b") # Bios echo "bios" # Debogage parametre="${2}" echo "bios parametre=${parametre}" # Debogage presenceParametre "$#" "$1" shift if [[ ${temoin_b} -ne 1 ]]; then case ${1} in "ovmf"|"OVMF") if [[ ! $(ls /usr/share/ovmf/OVMF.fd 2>/dev/null) ]]; then die "Le paquet ovmf n'est pas installé." 6 fi commandes_a_executer+=( "nouvMV bios $(echo ${1} | tr '[:lower:]' '[:upper:]')") ;; esac temoin_b=1 else die "L'option ${1} a déjà été renseignée." 3 fi ;; "-d") # Disque echo "disque" # Debogage parametre="${2}" presenceParametre "$#" "$1" echo "disque parametre=${parametre}" # Debogage shift ;; "-i") # Iso echo "iso" # Debogage parametre="${2}" presenceParametre "$#" "$1" echo "iso parametre=${parametre}" # Debogage shift ;; '-r') # Reseau echo "reseau" # Debogage parametre="${2}" presenceParametre "$#" "$1" echo "reseau parametre=${parametre}" # Debogage shift ;; '-p') # Parametres echo "parametres" # Debogage parametre="${2}" presenceParametre "$#" "$1" echo "parametres parametre=${parametre}" # Debogage shift ;; "-s") # Sous-volume BTRFS echo "sous-volume" # Debogage if [[ ${temoin_s} -ne 1 ]]; then #commandes_a_executer+=( "nouvMV ${nom_mv}") temoin_s=1 else die "L'option ${1} a déjà été renseignée." 3 fi ;; "-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 usage "cree" exit 0 ;; *) # Autre usage "cree" ;; esac shift done if [[ ${temoin_c} -ne 1 || ${temoin_m} -ne 1 ]]; then die "Les parametres -c et -m sont obligatoires." 2 fi #verifMVExiste ${nom_mv} && mkdir -p ${base_chemin_mv}/${nom_mv} execCmd } usage() { case ${1} in cree) echo "usage_cree" # Debogage die "" 0 ;; demarre) echo "usage_demarre" # Debogage die "" 0 ;; arret) echo "usage_arret" # Debogage die "" 0 ;; active) echo "usage_active" # Debogage die "" 0 ;; desactive) echo "usage_desactive" # Debogage die "" 0 ;; *) echo "$(tput bold)Utilisation : $(basename ${0}) {-i|-s N} [OPTION]...$(tput sgr0)" 2>&1 echo -e "Permet de sauvegarder les sous-volumes BTRFS d'un serveur monté selon la procédure décrite par ycharbi.fr. Permet également d'effectuer un roulement des archives.\n" echo -e "L'option -i ou -s sont requises pour l'exécution du script. Les deux peuvent êtres utilisées simultanément.\n" echo -e "\n$(tput bold)Options :$(tput sgr0)" echo -e "L'ordre des paramètres n'a pas d'importance.\n" echo -e " -i\t\tExécute un instantané des sous-volumes BTRFS répertoriés dans le fichier texte passé en paramètre (via -f ou la variable \$fichierListeSousVolumes du présent script). Les entrées de cette liste doivent êtres conformes au retour de la commande \"btrfs subvolume list /\" pour être interprétés. Toute entrée invalide est ignorée" echo -e " -s N\t\tSupprime l'instantané le plus ancien de chaque entrée de la liste. Un nombre désignant le seuil maximal d'instantané à conserver doit obligatoirement être passé en paramètre. L'instantané le plus ancien au delà de cette limite sera supprimé. Par sécurité, cette option ne supprime que le plus ancien. Si vous avez beaucoup d'instantanés au dessus de votre seuil, vous devrez répeter l'opération autant de fois que nécessaire" echo -e " -f\t\tPermet de spécifier le fichier listant les sous-volumes à traiter pour gérer les instantanés. Ce fichier doit contenir des entrées correspondants parfaitement avec celles retournées par la commande \"btrfs subvolume list /\" pour être traités. Cette option est facultative. Si elle n'est pas renseignée, le script utilisera le fichier spécifié dans la variable \$fichierListeSousVolumes" echo -e " -h\t\tAffiche cette aide. Si passée avec d'autres options, celles-ci seront ignorées pour n'afficher que l'aide" echo -e "\n$(tput bold)Exemples :$(tput sgr0)" echo -e "Réalisation d'un instantané avec un seuil de 13 archives (l'ancienne numéro 13 sera supprimée) :\n\t${0} -i -s 13 -f /root/cpt_instents/listeSousVolumes.txt\n" echo -e "Peut être raccourci en :\n\t${0} -is 13 -f /root/cpt_instents/listeSousVolumes.txt" echo -e "\nContenu du fichier listeSousVolumes.txt :" echo -e "\tsystèmes/bullseye/@\n\tsystèmes/bullseye/@boot\n\ttmp/toto\n\tvar/lib/machines/web\n\tvar/lib/machines/courriel\n\tvar/lib/machines/routeur\n\tvar/lib/machines/wireguard" echo -e "\nLe sous-volume tmp/toto n'existant pas, cette entrée sera ignorée sans entraver l'exécution du script. Il est également possible de commenter des lignes (en les rendant invalides)." die "" ;; esac } case ${1} in cree) echo "Créer" # Debogage shift # On retire l'argument "cree" if [[ "$#" -eq 0 ]]; then confInteractive creeMV #Ajouter les parametre sous forme de tableau else if [[ "${1}" == "-h" ]]; then usage "cree" fi creeMV $* fi ;; demarre) echo "Démarre" # Debogage shift # On retire l'argument "demarre" if [[ "$#" -eq 0 ]]; then usage "demarre" else if [[ "${1}" == "-h" ]]; then usage "demarre" fi nom_mv="${1}" echo "nom_mv=${nom_mv}" # Debogage shift echo 1 "$#" # Debogage 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 usage "demarre" exit 0 ;; *) #autre usage "demarre" ;; esac shift done fi ;; arret) echo "Arrêt" # Debogage shift # On retire l'argument "arret" if [[ "${1}" == "-h" ]]; then usage "arret" fi nom_mv="${1}" echo "nom_mv=${nom_mv}" ;; active) echo "Active" # Debogage shift # On retire l'argument "active" if [[ "${1}" == "-h" ]]; then usage "active" fi nom_mv="${1}" echo "nom_mv=${nom_mv}" ;; desactive) echo "Désactive" # Debogage shift # On retire l'argument "desactive" if [[ "${1}" == "-h" ]]; then usage "desactive" fi nom_mv="${1}" echo "nom_mv=${nom_mv}" ;; liste) echo "Liste" # Debogage shift # On retire l'argument "liste" ;; *) usage ;; esac