diff --git a/creationRoutesVM.sh b/creationRoutesVM.sh new file mode 100644 index 0000000..df871fa --- /dev/null +++ b/creationRoutesVM.sh @@ -0,0 +1,226 @@ +#!/bin/bash + +# Script ajout de routes VM + +# A CONFIGURER/VERIFIER : +# - USER_IPAM +# - PASSWORD_IPAM +# - ID_RANGES_V4 +# - ID_RANGES_V6 +# - LOG_PLACE +# - CHEMIN_CACHE + +# Informations d'indentification IPAM +USER_IPAM="" +PASSWORD_IPAM="" + +# ID subnets IPAM V4 et V6 contenants les VMs +ID_RANGES_V4=( "74" "181" ) +ID_RANGES_V6=( "34" ) + +# Booléen si informations trouvées pour V4 ou V6 +BOOL_V4=0 +BOOL_V6=0 + +# Chemin fichier de LOG (et création du répertoire s'il n'existe pas) +LOG_PLACE='/root/vm_id_log/' +if [ ! -d "${LOG_PLACE}" ];then + mkdir -p ${LOG_PLACE} + echo "$(date -Isecond) - INFO : Creation du repertoire de logs vm_id" > ${LOG_PLACE}/$(date -Idate)_vm_id.log +fi + +echo "$(date -Isecond) - INFO : Début de l'exécution du script d'ajout de routes VM" >> ${LOG_PLACE}/$(date -Idate)_vm_id.log + +# Chemin fichier de CACHE (et création du répertoire s'il n'existe pas) +CHEMIN_CACHE='/root/vm_id_cache/' +if [ ! -d "${CHEMIN_CACHE}" ];then + mkdir -p ${CHEMIN_CACHE} + echo "$(date -Isecond) - INFO : Creation du repertoire de cache vm_id" >> ${LOG_PLACE}/$(date -Idate)_vm_id.log +fi + +# Fonction d'aide +usage() { + printf "Usage: ./creationRoutesVM.sh \n" + printf "VM_ID est l'id d'une VM dans PROXMOX, un entier supérieur à zéro\n" + printf "option : \t-h, --help Affiche ce message d’aide\n" +} + +if [ $? != 0 ]; then + echo "$(date -Isecond) - ERREUR : probleme au lancement du script" >> ${LOG_PLACE}/$(date -Idate)_vm_id.log + exit 1 +fi + +# On vérifie la bonne présence d'un paramètre VM_ID +if [ $1 ]; then + if [ $1 = '-h' ] || [ $1 = '--help' ]; then + usage + exit 0 + elif [ $# -lt 1 ]; then + echo "Paramètre VM_ID manquant (--help pour plus d'infos)" + echo "$(date -Isecond) - ERREUR : Paramètre VM_ID manquant (--help pour plus d'infos)" >> ${LOG_PLACE}/$(date -Idate)_vm_id.log + usage + exit 1 + fi +else + echo "Paramètre VM_ID manquant (--help pour plus d'infos)" + echo "$(date -Isecond) - ERREUR : Paramètre VM_ID manquant (--help pour plus d'infos)" >> ${LOG_PLACE}/$(date -Idate)_vm_id.log + usage + exit 1 +fi + +# On vérifie que le paramètre est bien un entier supérieur à zéro +expr $1 + 0 1>/dev/null 2>&1 +statut=$? +if [ $statut -lt 2 ] && [ $1 -gt 0 ]; then + VM_ID=$1 +else + echo "Paramètre VM_ID incorrect, ce doit être un entier supérieur à zéro (--help pour plus d'infos)" + echo "$(date -Isecond) - ERREUR : Paramètre VM_ID incorrect, ce doit être un entier supérieur à zéro (--help pour plus d'infos)" >> ${LOG_PLACE}/$(date -Idate)_vm_id.log + usage + exit 1 +fi + + +# Récupération d'un TOKEN pour utiliser IPAM via l'API +RES_AUTHENT=$(curl -k -X POST --user ${USER_IPAM}:${PASSWORD_IPAM} https://ipam.grifon.fr/api/apiculteur/user/ -sS) +CODE_RETOUR_RES_AUTHENT=$(echo ${RES_AUTHENT} | jq '.code') + +# Si OK, on utilise l'IPAM, sinon on passe par le fichier de cache +if [ ${CODE_RETOUR_RES_AUTHENT} -eq 200 ] ;then + + # Mise du TOKEN dans une variable et retrait des éventuelles guillemets ajoutées lors de la récupération via jq + TOKEN=$(echo ${RES_AUTHENT} | jq '.data.token') + TOKEN=$(echo $TOKEN | sed -e "s/\"//g") + + # On vérifie que le TOKEN n'est pas vide + if [ ! -n "${TOKEN}" ]; then + echo "TOKEN Vide"; + echo "$(date -Isecond) - ERREUR : TOKEN Vide" >> ${LOG_PLACE}/$(date -Idate)_vm_id.log + exit 1 + fi + + # Pour chaque subnet V4 + for ID_RANGE_V4 in ${ID_RANGES_V4[@]}; do + # Si les infos V4 n'ont pas encore été trouvées + if [ $BOOL_V4 -eq 0 ]; then + # Récupération des informations V4 et vérification du code HTTP + INFOS_V4=$(curl -s -k --header "Content-type: application/x-www-form-urlencoded" --header "token: $TOKEN" -X GET https://ipam.grifon.fr/api/apiculteur/subnets/${ID_RANGE_V4}/addresses) + CODE_RETOUR_INFOS_V4=$(echo ${INFOS_V4} | jq '.code') + # Mise à jour du fichier de cache pour ce ID de subnet + echo ${INFOS_V4} > ${CHEMIN_CACHE}/${ID_RANGE_V4} + if [ ${CODE_RETOUR_INFOS_V4} -eq 200 ] ;then + # Recherche des informations correspondants à la VM_ID + VM_IPV4=$(echo ${INFOS_V4} | jq -r ".data[] | select(.custom_vm_id==\"${VM_ID}\") | .ip") + # Si la valeur n'est pas vide et correspond à une IPV4 + if [ -n "${VM_IPV4}" ]; then + # Ajout de la route associée + echo "ip -4 route add ${VM_IPV4}/32 dev tap${VM_ID}i0 (source : IPAM)" + echo "$(date -Isecond) - INFO : ip -4 route add ${VM_IPV4}/32 dev tap${VM_ID}i0 (source : IPAM)" >> ${LOG_PLACE}/$(date -Idate)_vm_id.log + ip -4 route add ${VM_IPV4}/32 dev tap${VM_ID}i0 + BOOL_V4=1 + else + # En cas d'echec, on continue de parcourir les autres RANGES + echo "Valeur vide ou ne correspond pas à une IPV4" + echo "$(date -Isecond) - NOTICE : Valeur vide ou ne correspond pas à une IPV4" >> ${LOG_PLACE}/$(date -Idate)_vm_id.log + fi + else + # En cas d'echec, on continue de parcourir les autres RANGES + echo "Echec de la récupération des infos V4, code HTTP reçu différent de 200 : ${CODE_RETOUR_INFOS_V4}" + echo "$(date -Isecond) - NOTICE : Echec de la récupération des infos V4, code HTTP reçu différent de 200 : ${CODE_RETOUR_INFOS_V4}" >> ${LOG_PLACE}/$(date -Idate)_vm_id.log + fi + fi + done + + # Pour chaque subnet V6 + for ID_RANGE_V6 in ${ID_RANGES_V6[@]}; do + # Si les infos V6 n'ont pas encore été trouvées + if [ $BOOL_V6 -eq 0 ]; then + # Récupération des informations V6 et vérification du code HTTP + INFOS_RANGES_V6=$(curl -s -k --header "Content-type: application/x-www-form-urlencoded" --header "token: $TOKEN" -X GET https://ipam.grifon.fr/api/apiculteur/subnets/${ID_RANGE_V6}/slaves/) + CODE_RETOUR_INFOS_RANGES_V6=$(echo ${INFOS_RANGES_V6} | jq '.code') + # Mise à jour du fichier de cache pour cet ID de subnet + echo ${INFOS_RANGES_V6} > ${CHEMIN_CACHE}/${ID_RANGE_V6} + if [ ${CODE_RETOUR_INFOS_V4} -eq 200 ] ;then + # Recherche des informations correspondants à la VM_ID + VM_IPV6=$(echo ${INFOS_RANGES_V6} | jq -r ".data[] | select(.custom_vm_id==\"${VM_ID}\") | .subnet") + # Si la valeur n'est pas vide et correspond à un range IPV6 + if [ -n "${VM_IPV6}" ]; then + # Ajout de la route associée + echo "ip -6 route add ${VM_IPV6}/48 dev tap${VM_ID}i0 (source : IPAM)" + echo "$(date -Isecond) - INFO : IPAM : ip -6 route add ${VM_IPV6}/48 dev tap${VM_ID}i0" >> ${LOG_PLACE}/$(date -Idate)_vm_id.log + ip -6 route add ${VM_IPV6}/48 dev tap${VM_ID}i0 + BOOL_V6=1 + else + # En cas d'echec, on continue de parcourir les autres RANGES + echo "Valeur vide ou ne correspond pas à un range IPV6" + echo "$(date -Isecond) - NOTICE : Valeur vide ou ne correspond pas à un range IPV6" >> ${LOG_PLACE}/$(date -Idate)_vm_id.log + fi + else + # En cas d'echec, on continue de parcourir les autres RANGES + echo "Echec de la récupération des infos V6, code HTTP reçu différent de 200 : ${CODE_RETOUR_INFOS_V6}" + echo "$(date -Isecond) - NOTICE : Echec de la récupération des infos V6, code HTTP reçu différent de 200 : ${CODE_RETOUR_INFOS_V6}" >> ${LOG_PLACE}/$(date -Idate)_vm_id.log + fi + fi + done +# Sinon, on passe par le fichier de cache +else + # Pour chaque subnet V4 + for ID_RANGE_V4 in ${ID_RANGES_V4[@]}; do + # Si les infos V4 n'ont pas encore été trouvées + if [ $BOOL_V4 -eq 0 ]; then + # Récupération des informations V4 en cache pour cet ID de subnet si le fichier de cache associé existe + if [ -f "${CHEMIN_CACHE}/${ID_RANGE_V4}" ];then + INFOS_V4=$(cat ${CHEMIN_CACHE}/${ID_RANGE_V4}) + # Recherche des informations correspondants à la VM_ID + VM_IPV4=$(echo ${INFOS_V4} | jq -r ".data[] | select(.custom_vm_id==\"${VM_ID}\") | .ip") + # Si la valeur n'est pas vide et correspond à une IPV4 + if [ -n "${VM_IPV4}" ]; then + # Ajout de la route associée + echo "ip -4 route add ${VM_IPV4}/32 dev tap${VM_ID}i0 (source : CACHE)" + echo "$(date -Isecond) - INFO : ip -4 route add ${VM_IPV4}/32 dev tap${VM_ID}i0 (source : CACHE)" >> ${LOG_PLACE}/$(date -Idate)_vm_id.log + ip -4 route add ${VM_IPV4}/32 dev tap${VM_ID}i0 + BOOL_V4=1 + else + # En cas d'echec, on continue de parcourir les autres RANGES + echo "Valeur vide ou ne correspond pas à une IPV4" + echo "$(date -Isecond) - NOTICE : Valeur vide ou ne correspond pas à une IPV4" >> ${LOG_PLACE}/$(date -Idate)_vm_id.log + fi + else + # En cas d'echec, on continue de parcourir les autres RANGES + echo "Echec de la récupération des infos V4, code HTTP reçu différent de 200 : ${CODE_RETOUR_INFOS_V4}" + echo "$(date -Isecond) - NOTICE : Echec de la récupération des infos V4, code HTTP reçu différent de 200 : ${CODE_RETOUR_INFOS_V4}" >> ${LOG_PLACE}/$(date -Idate)_vm_id.log + fi + fi + done + + # Pour chaque subnet V6 + for ID_RANGE_V6 in ${ID_RANGES_V6[@]}; do + # Si les infos V6 n'ont pas encore été trouvées + if [ $BOOL_V6 -eq 0 ]; then + # Récupération des informations V6 en cache pour cet ID de subnet si le fichier de cache associé existe + if [ -f "${CHEMIN_CACHE}/${ID_RANGE_V6}" ];then + INFOS_RANGES_V6=$(cat ${CHEMIN_CACHE}/${ID_RANGE_V6}) + # Recherche des informations correspondants à la VM_ID + VM_IPV6=$(echo ${INFOS_RANGES_V6} | jq -r ".data[] | select(.custom_vm_id==\"${VM_ID}\") | .subnet") + # Si la valeur n'est pas vide et correspond à un range IPV6 + if [ -n "${VM_IPV6}" ]; then + # Ajout de la route associée + echo "ip -6 route add ${VM_IPV6}/48 dev tap${VM_ID}i0 (source : CACHE)" + echo "$(date -Isecond) - INFO : ip -6 route add ${VM_IPV6}/48 dev tap${VM_ID}i0 (source : CACHE)" >> ${LOG_PLACE}/$(date -Idate)_vm_id.log + ip -6 route add ${VM_IPV6}/48 dev tap${VM_ID}i0 + BOOL_V6=1 + else + # En cas d'echec, on continue de parcourir les autres RANGES + echo "Valeur vide ou ne correspond pas à un range IPV6" + echo "$(date -Isecond) - NOTICE : Valeur vide ou ne correspond pas à un range IPV6" >> ${LOG_PLACE}/$(date -Idate)_vm_id.log + fi + else + # En cas d'echec, on continue de parcourir les autres RANGES + echo "Echec de la récupération des infos V6, code HTTP reçu différent de 200 : ${CODE_RETOUR_INFOS_V6}" + echo "$(date -Isecond) - NOTICE : Echec de la récupération des infos V6, code HTTP reçu différent de 200 : ${CODE_RETOUR_INFOS_V6}" >> ${LOG_PLACE}/$(date -Idate)_vm_id.log + fi + fi + done +fi +echo "$(date -Isecond) - INFO : Fin de l'exécution du script d'ajout de routes VM" >> ${LOG_PLACE}/$(date -Idate)_vm_id.log +exit 0