From 5cf93464da34450be5127f03d01e3b6bcd167ae6 Mon Sep 17 00:00:00 2001 From: hmalti Date: Sat, 20 Apr 2019 18:27:08 +0200 Subject: [PATCH] Ajout interfaces réseaux --- create_container.sh | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------------- test.sh | 26 ++++++++++++++++++-------- 2 files changed, 83 insertions(+), 41 deletions(-) diff --git a/create_container.sh b/create_container.sh index e3636de..89e6a2b 100644 --- a/create_container.sh +++ b/create_container.sh @@ -1,37 +1,49 @@ #!/bin/bash set -x -REPERTOIRE=${PWD} -NOM_IMAGE=$3; -#LIM_MEMORY=$4; NOT YET -NOM_CONTAINER=$4; -ADDR_IPV4=$5; -NOM_BRIDGE=$6; -PROGRAM=$7; - +while getopts i:c:b:r:a:p: o; do + case $o in + (i) NOM_IMAGE=$OPTARG;; + (c) NOM_CONTAINER=$OPTARG;; + (b) BRIDGES=$OPTARG;; + (r) REPERTOIRE=$OPTARG;; + (a) ADDRS_IPV4=$OPTARG;; + (p) PROGRAM=$OPTARG;; + + esac +done #Check existence image, bridge +if [[ -z "$PATH_MANIFEST/images/$NOM_IMAGE.manifest" ]] || [ -z $NOM_IMAGE ]]; then + echo "Image non existante." + exit +fi +if [[ ! -z $NOM_BRIDGE ]] [[ -z "$PATH_MANIFEST/bridges/$NOM_BRIDGE.manifest" ]]; then + echo "Bridge non existant." + exit +fi #On veut récupérer le chemin de l'image -PATH_IMAGE= grep chemin $PATH_MANIFEST/images/$NOM_IMAGE.manifest | cut -d':' -f2 +PATH_IMAGE= ${grep chemin $PATH_MANIFEST/images/$NOM_IMAGE.manifest | cut -d':' -f2} -#on fait une copie dans /var/BaleineImages pour mount depuis le conteneur +#on fait une copie dans /var/baleine/images pour mount depuis le conteneur if [[ ! -d "$PATH_BALEINE/containers/$NOM_CONTAINER" ]]; then - mkdir -p $PATH_BALEINE/containers/$NOM_CONTAINER #&& cp $PATH_IMAGE $PATH_BALEINE/containers/$NOM_CONTAINER/ + mkdir -p $PATH_BALEINE/containers/$NOM_CONTAINER fi cp $PATH_IMAGE $PATH_BALEINE/containers/$NOM_CONTAINER/$NOM_IMAGE -#On fait le unshare sur l'image passée en paramètre, + #on monte le système de fichiers -echo "je vais mount" +echo "Montage de l'image" mount -t ext4 -o loop $PATH_BALEINE/containers/$NOM_CONTAINER/$NOM_IMAGE /mnt/baleine/$NOM_CONTAINER #On renseigne le fichier fstab du conteneur echo "proc /proc proc defaults 0 0" >> /mnt/$NOM_IMAGE/etc/fstab echo "$PROGRAM" >> /mnt/$NOM_IMAGE/etc/rc.local +#On fait le unshare sur l'image passée en paramètre, nohup unshare -p -f -m -n -u chroot /mnt/baleine/$NOM_CONTAINER $PROGRAM -c "mount /proc" & PID=$! echo "j'ai finis le unshare-nohup" @@ -39,27 +51,16 @@ echo "j'ai finis le unshare-nohup" ps axo ppid,pid | grep "^ *$PID" | sed -e 's/.* //' echo $PID -# #Enregistrer les infos du conteneur dans un fichier -# NUMBER=$(cat /dev/urandom | tr -dc '0-9' | fold -w 256 | head -n 1 | sed -e 's/^0*//' | head --bytes 3) -# if [ "$NUMBER" == "" ]; then -# NUMBER=0 -# fi - FILE=$NOM_CONTAINER.manifest touch $FILE #création du fichier +date=${date} + echo "nom_container:$NOM_CONTAINER" >> $FILE #nom de son image echo "nom_image:$NOM_IMAGE" >> $FILE #nom de son image echo "pid:$PID" >> $FILE #Son PID echo "nom_bridge:$NOM_BRIDGE" >> $FILE #SON BRIDGE +echo "starting_time: $date" >> $FILE #starting time -#temps d'exécution du container ? -# start_time=`date +%s` -# -# end_time=`date +%s` -# echo execution time was `expr $end_time - $start_time` s. -# ou -#start_time=`date +%s` -# && echo run time is $(expr `date +%s` - $start_time) s if [[ ! -d "$PATH_MANIFEST/containers" ]]; then mkdir -p $PATH_MANIFEST/containers @@ -68,16 +69,47 @@ fi mv $NOM_CONTAINER.manifest $PATH_MANIFEST/containers/$NOM_CONTAINER.manifest -#TODO : son interface réseau (bridge) - taille mémoire / limite mémoire +#TODO : taille mémoire / limite mémoire + +#AWK pour récupèrer le nombre d'addresses IPV4 données en arguments +#(https://unix.stackexchange.com/questions/144217/counting-comma-separated-characters-in-a-row) + +NOMBRE_INTERFACES=echo $ADDRS_IPV4 | awk -F '[,]' '{print NF}' + +NOMBRE_BRIDGES=echo $BRIDGES | awk -F '[,]' '{print NF}' + +if [ NOMBRE_INTERFACES -ne NOMBRE_BRIDGES ]; do + echo "Erreur: Il n'y a pas autant de bridges que d'interfaces réseaux" + exit 1 +done + +for i in $(seq 1 $NOMBRE_INTERFACES); do + ip link add $NOM_CONTAINER_$i type veth peer name eth$i +done + +echo "J'ai fini de créer les interfaces chef" +NOMBRE_BRIDGES=echo $BRIDGES | awk -F '[,]' '{print NF}' + +IFS="," + +ARRAY_BRIDGES=() +ARRAY_IPV4=() + +for b in $BRIDGES; do + ARRAY_BRIDGES+=(b) +done + +for a in $ADDRS_IPV4; do + ARRAY_IPV4+=(a) +done + +for (( i=0 ; i < ${#ARRAY_BRIDGES[*]} ; i++ )); do + ip link set $NOM_CONTAINER_$i master ${ARRAY_BRIDGES[i]} +done #création de son interface réseau -#TODO: gerer le cas de plusieurs interfaces sur un meme container -ip link add $NOM_CONTAINER type veth peer name eth0@$NOM_CONTAINER ip link set $NOM_CONTAINER master $NOM_BRIDGE ip link set $NOM_CONTAINER up ip link set eth0@$NOM_CONTAINER netns /proc/$PID/ns/net name eth0 ip netns exec /proc/$PID/ns/net ip addr add $ADDR_IPV4 dev eth0 -#à voir (pour récupérer depuis la commande les n interfaces données et les n bridges ??) -#grep ipv4 $@ | wc -#grep ipv4 $@ | cut \ No newline at end of file diff --git a/test.sh b/test.sh index cb44550..e6c21de 100644 --- a/test.sh +++ b/test.sh @@ -1,12 +1,22 @@ #!/bin/bash -echo $@ -while getopts i:proxy: o "$@"; do - case $o in - (i) IMAGE=$OPTARG;; - (proxy) PROXY=$OPTARG;; - esac +BRIDGES="pont,petitpont" +ADDRS_IPV4="lala,lulu" + +ARRAY_BRIDGES=() +ARRAY_IPV4=() + +IFS=',' +for b in $BRIDGES; do + ARRAY_BRIDGES+=($b) done -echo "Le proxy est $PROXY" -echo "L'image est $IMAGE" +for a in $ADDRS_IPV4; do + ARRAY_IPV4+=($a) +done + + +for ((i = 0, j = 0 ; i < ${#ARRAY_BRIDGES[*]} && j < ${#ARRAY_BRIDGES[*]} ; i++, j++ )); do + echo "i= ${ARRAY_BRIDGES[i]}" + echo "j= ${ARRAY_IPV4[j]}" +done \ No newline at end of file -- libgit2 0.21.2