diff --git a/ifup.sh b/ifup.sh index d83f1d7..3c46b87 100755 --- a/ifup.sh +++ b/ifup.sh @@ -1,5 +1,4 @@ #!/bin/bash - # Script d'initialisation des interfaces réseau d'un conteneur Systemd-nspawn if [[ -n "${1}" ]]; then @@ -9,8 +8,9 @@ else 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. +# Fonction exécuté en deuxième. Permet la génération de commandes pour la création d'interfaces réseau +genCmdIntRzo(){ + # Création d'une interface non étiqueté (access) 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" ) @@ -22,17 +22,32 @@ generCmdIntRzo(){ pont_init=0 vlan_init=0 interface_init=0 + + # Création d'une interface étiqueté (trunk) + elif [[ "${pont_init}" -eq 1 && "${ieee8021q_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" ) + for ((id_label_vlan=0 ; "${nb_params_label}" - "${id_label_vlan}" ; id_label_vlan++)); do + commandes_a_executer+=( "bridge vlan add dev ${interface}_h vid ${label_vlan[${id_label_vlan}]} tagged master" ) + done + + # Réinitialisation des variables témoins + pont_init=0 + ieee8021q_init=0 + interface_init=0 fi } +# Fonction exécuté en premier. Récupère les paramètres du fichier de configuration du conteneur 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/.*=//") + for ((id_param_fichier=0 ; "${nb_params}" - "${id_param_fichier}" ; id_param_fichier++)); do + nom_param=$(echo "${params_int[${id_param_fichier}]}" | sed "s/=.*//" | sed "s/#//") + val_param=$(echo "${params_int[${id_param_fichier}]}" | sed "s/.*=//") # Récupération des données d'après le fichier de configuration if [ "${nom_param}" == "PONT" ]; then @@ -56,9 +71,26 @@ recupParams(){ 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}" == "8021Q" ]; then + declare -a label_vlan=( $(echo ${val_param} | sed 's/,/\n/g') ) + nb_params_label="${#label_vlan[*]}" + + for ((id_label_vlan=0 ; "${nb_params_label}" - "${id_label_vlan}" ; id_label_vlan++)); do + if [[ "${label_vlan[${id_label_vlan}]}" =~ ^-?[0-9]+$ && "${label_vlan[${id_label_vlan}]}" -ge 1 && "${label_vlan[${id_label_vlan}]}" -le 4094 && $(echo -n "${label_vlan[${id_label_vlan}]}" | cut -c 1) -ne 0 ]]; then + if [[ "${pont_init}" -eq 1 ]]; then + ieee8021q_init=1 + else + echo "Erreur: le paramètre \"#pont=votrePont\" est manquant." + exit 1 + fi + else + echo "Erreur: le tronc 802.1Q comporte un identifiant de VLAN (\"${val_param}\") qui 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 + done elif [ "${nom_param}" == "Interface" ]; then if [[ ! $(ip link show "${val_param}" 2> /dev/null) ]]; then - if [[ "${vlan_init}" -eq 1 ]]; then + if [[ "${vlan_init}" -eq 1 || "${ieee8021q_init}" -eq 1 ]]; then interface="${val_param}" interface_init=1 else @@ -70,23 +102,24 @@ recupParams(){ 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)." + echo "Erreur: le paramètre numéro $((${id_param_fichier}+1)) (\"${params_int[${id_param_fichier}]}\") 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 + genCmdIntRzo done } +# Fonction d'éxécution des commandes préparées dans la fonction genCmdIntRzo() execCmdIntRzo(){ - for ((i=0 ; "${#commandes_a_executer[*]}" - "${i}"; i++)); do - ${commandes_a_executer["${i}"]} + for ((id_commande_rzo=0 ; "${#commandes_a_executer[*]}" - "${id_commande_rzo}"; id_commande_rzo++)); do + ${commandes_a_executer["${id_commande_rzo}"]} done } +# Fonction d'exécution du script de création d'interfaces réseau pour le conteneur en cours principale(){ - # Fonction d'exécution du script de création d'interfaces réseau pour le conteneur en cours. recupParams execCmdIntRzo }