#!/bin/bash # Script d'initialisation des interfaces réseau d'un conteneur Systemd-nspawn if [[ -n "${1}" ]]; then nom_conteneur="${1}" else echo "Erreur: aucun nom de conteneur renseigné." exit 1 fi generCmdIntRzo(){ # Fonction exécuté en deuxième. Permet la génération de commandes pour la création d'interfaces réseau. if [[ "${pont_init}" -eq 1 && "${vlan_init}" -eq 1 && "${interface_init}" -eq 1 ]]; then commandes_a_executer+=( "ip link add ${interface} type veth peer name ${interface}_h" ) commandes_a_executer+=( "ip link set ${interface}_h up" ) commandes_a_executer+=( "ip link set ${interface}_h master ${pont}" ) commandes_a_executer+=( "bridge vlan del dev ${interface}_h vid 1 PVID untagged master" ) commandes_a_executer+=( "bridge vlan add dev ${interface}_h vid ${vlan} pvid untagged master" ) # Réinitialisation des variables témoins pont_init=0 vlan_init=0 interface_init=0 fi } recupParams(){ # Fonction exécuté en premier. Récuppère les paramètres du fichier de configuration du conteneur declare -a params_int=( $(grep -B 2 "^Interface" /etc/systemd/nspawn/"${nom_conteneur}".nspawn | sed "/^--/d") ) nb_params="${#params_int[*]}" for ((i=0 ; "${nb_params}" - "${i}" ; i++)); do nom_param=$(echo "${params_int[${i}]}" | sed "s/=.*//" | sed "s/#//") val_param=$(echo "${params_int[${i}]}" | sed "s/.*=//") # Récupération des données d'après le fichier de configuration if [ "${nom_param}" == "PONT" ]; then if [[ $(ip link show "${val_param}" 2> /dev/null) ]]; then pont="${val_param}" pont_init=1 else echo "Erreur: le pont ${val_param} n'existe pas. Arrêt immédiat du script \"${0}\" sans aucune modification du système." exit 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 echo "Erreur: le paramètre \"#pont=votrePont\" est manquant." exit 1 fi else echo "Erreur: le VLAN \"${val_param}\" n'est pas un entier compris entre 1 et 4094. Arrêt immédiat du script \"${0}\" sans aucune modification du système." exit 1 fi elif [ "${nom_param}" == "Interface" ]; then if [[ ! $(ip link show "${val_param}" 2> /dev/null) ]]; then if [[ "${vlan_init}" -eq 1 ]]; then interface="${val_param}" interface_init=1 else echo "Erreur: le paramètre \"#vlan=votreVLAN\" est manquant." exit 1 fi else echo "Erreur: l'interface ${val_param} est déjà existante. Arrêt immédiat du script \"${0}\" sans aucune modification du système." exit 1 fi else echo "Erreur: le paramètre numéro $((${i}+1)) (\"${params_int[${i}]}\") dans le fichier de configuration est mal formé (faute de frappe)." exit 1 fi # Génération des commandes de création des interfaces réseau du conteneur generCmdIntRzo done } execCmdIntRzo(){ for ((i=0 ; "${#commandes_a_executer[*]}" - "${i}"; i++)); do ${commandes_a_executer["${i}"]} done } principale(){ # Fonction d'exécution du script de création d'interfaces réseau pour le conteneur en cours. recupParams execCmdIntRzo } principale