From 0d9ba4deef36e26b1ab44d8d231de5d5b41d5db5 Mon Sep 17 00:00:00 2001 From: alarig Date: Sun, 29 Sep 2019 22:17:30 +0200 Subject: [PATCH] Manage the routing of additional prefixes on VMs --- creationRoutesVM.sh | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/creationRoutesVM.sh b/creationRoutesVM.sh index 21b2d66..fb6bfe8 100755 --- a/creationRoutesVM.sh +++ b/creationRoutesVM.sh @@ -85,7 +85,8 @@ 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 "VM_ID est l’id d’une VM dans PROXMOX, un entier supérieur à" + printf "zéro\n" printf "option : \t-h, --help Affiche ce message d’aide\n" } @@ -138,7 +139,8 @@ else FEED_CACHE=1 fi -# Mise du TOKEN dans une variable et retrait des éventuelles guillemets ajoutées lors de la récupération via jq +# Mise du TOKEN dans une variable et retrait des éventuelles guillemets ajoutées +# lors de la récupération via jq if [ ${FEED_CACHE} = 1 ]; then write_log DEBUG 'Getting token' TOKEN=$(echo ${RES_AUTHENT} | jq -r '.data.token') @@ -191,13 +193,15 @@ MAC=$(grep 'vmbr1$' /etc/pve/nodes/*/qemu-server/${VM_ID}.conf | \ # Pour chaque subnet V4 for ID_RANGE_V4 in ${ID_RANGES_V4}; do - # Récupération des informations V4 en cache pour cet ID de subnet si le fichier de cache associé existe + # 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 write_log FATAL "File not found: ${CHEMIN_CACHE}/${ID_RANGE_V4}" exit 1 fi VM_IPV4=$(jq -r ".data[] | select(.custom_vm_id==\"${VM_ID}\") | .ip" ${CHEMIN_CACHE}/${ID_RANGE_V4}) + ADD_IPV4=$(jq -r ".data[] | select(.custom_vm_id==\"${VM_ID}\") | .custom_add_range" ${CHEMIN_CACHE}/${ID_RANGE_V4}) # Wait for the migration to finish sleep 5 @@ -218,11 +222,17 @@ for ID_RANGE_V4 in ${ID_RANGES_V4}; do # En cas d'echec, on continue de parcourir les autres RANGES write_log WARN 'Empty value or doen’t correspond to an IPv4' fi + + if [ -n "${ADD_IPV4}" ]; then + # Don’t know why bird needs “onlink” to learn the route… + ip route add ${ADD_IPV4} via ${VM_IPV4} dev ${IFACE} onlink + fi done # Pour chaque subnet V6 for ID_RANGE_V6 in ${ID_RANGES_V6}; do - # Récupération des informations V6 en cache pour cet ID de subnet si le fichier de cache associé existe + # 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 write_log FATAL "File not found: ${CHEMIN_CACHE}/${ID_RANGE_V4}" exit 1 @@ -231,6 +241,7 @@ for ID_RANGE_V6 in ${ID_RANGES_V6}; do # Recherche des informations correspondants à la VM_ID VM_IPV6=$(jq -r ".data[] | select(.custom_vm_id==\"${VM_ID}\") | .subnet" ${CHEMIN_CACHE}/${ID_RANGE_V6}) VM_NH=$(jq -r ".data[] | select(.custom_vm_id==\"${VM_ID}\") | .\"Next-hop\"" ${CHEMIN_CACHE}/${ID_RANGE_V6}) + ADD_IPV6=$(jq -r ".data[] | select(.custom_vm_id==\"${VM_ID}\") | .custom_add_range" ${CHEMIN_CACHE}/${ID_RANGE_V6}) # Si la valeur n'est pas vide et correspond à un range IPV6 if [ -n "${VM_IPV6}" ]; then if [ ${VM_NH} = 'null' ]; then @@ -266,6 +277,10 @@ for ID_RANGE_V6 in ${ID_RANGES_V6}; do # En cas d'echec, on continue de parcourir les autres RANGES echo "Valeur vide ou ne correspond pas à un range IPV6" fi + + if [ -n "${ADD_IPV6}" ]; then + ip -6 route add ${ADD_IPV6} via ${VM_NH} dev ${IFACE} + fi done write_log INFO 'Script ended'