2019-01-21 10:57:10 +01:00
#!/bin/bash
# Script ajout de routes VM
# A CONFIGURER/VERIFIER :
# - USER_IPAM
# - PASSWORD_IPAM
# - ID_RANGES_V4
# - ID_RANGES_V6
# - LOG_PLACE
# - CHEMIN_CACHE
2019-01-21 11:02:27 +01:00
# IPAM creds
if [ -f creds ] ; then
source creds
else
printf 'Can’ t source "creds": file not found\n'
fi
2019-01-21 11:08:57 +01:00
# check for commands in the path
for bin in curl ipv6calc ip; do
if [ -z $( which ${ bin } 2>/dev/null) ] ; then
MISSING = " ${ MISSING } ${ bin } "
fi
done
if [ ! -z " ${ MISSING } " ] ; then
printf " You’ r missing this: ${ MISSING } \n "
exit 1
fi
2019-01-21 10:57:10 +01:00
# 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 <VM_ID>\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