Commit b02be5245f09c95a2efbcb1f1b7857cf0ad83225

Authored by hmalti
1 parent 17bfc359

Correctifs + gestion suppression interfaces

réseaux
create_container.sh
1 #!/bin/bash 1 #!/bin/bash
  2 +set -x
2 3
3 -set -x  
4 while getopts i:c:b:r:a:p: o; do 4 while getopts i:c:b:r:a:p: o; do
5 case $o in 5 case $o in
6 (i) NOM_IMAGE=$OPTARG;; 6 (i) NOM_IMAGE=$OPTARG;;
@@ -52,27 +52,19 @@ echo "proc /proc proc defaults 0 0" >> /mnt/baleine/$NOM_CONTAINER/etc/fstab @@ -52,27 +52,19 @@ echo "proc /proc proc defaults 0 0" >> /mnt/baleine/$NOM_CONTAINER/etc/fstab
52 echo "$PROGRAM" >> /mnt/baleine/$NOM_CONTAINER/etc/rc.local 52 echo "$PROGRAM" >> /mnt/baleine/$NOM_CONTAINER/etc/rc.local
53 53
54 #On fait le unshare sur l'image passée en paramètre, 54 #On fait le unshare sur l'image passée en paramètre,
55 -#nohup unshare -p -f -m -n -u chroot /mnt/baleine/$NOM_CONTAINER "/bin/bash" -c "mount /proc" &  
56 55
57 nohup unshare -p -f -m -n -u chroot /mnt/baleine/$NOM_CONTAINER /bin/sh -c "mount /proc ; $PROGRAM ; while true ; do sleep 10 ; done" & 56 nohup unshare -p -f -m -n -u chroot /mnt/baleine/$NOM_CONTAINER /bin/sh -c "mount /proc ; $PROGRAM ; while true ; do sleep 10 ; done" &
58 -  
59 PID=$! 57 PID=$!
60 58
61 -#Récupère tous les processus fils du unshare (donc ici le programme qu'on lance)  
62 -#ps axo ppid,pid | grep "^ *$PID" | sed -e 's/.* //'  
63 -  
64 echo "PID Unshare :$PID" 59 echo "PID Unshare :$PID"
65 60
66 -  
67 -#TODO : Gerer les noms des interfaces < x caractères  
68 -  
69 FILE=$NOM_CONTAINER.manifest 61 FILE=$NOM_CONTAINER.manifest
70 date=$(date) 62 date=$(date)
71 63
72 echo "nom_container:$NOM_CONTAINER" >> $FILE #nom du conteneur 64 echo "nom_container:$NOM_CONTAINER" >> $FILE #nom du conteneur
73 echo "nom_image:$NOM_IMAGE" >> $FILE #nom de son image 65 echo "nom_image:$NOM_IMAGE" >> $FILE #nom de son image
74 echo "pid:$PID" >> $FILE #Son PID 66 echo "pid:$PID" >> $FILE #Son PID
75 -echo "nom_bridge:$NOM_BRIDGE" >> $FILE #SON BRIDGE 67 +echo "nom_bridges:$BRIDGES" >> $FILE #SON BRIDGE
76 echo "starting_time: $date" >> $FILE #starting time 68 echo "starting_time: $date" >> $FILE #starting time
77 69
78 70
@@ -102,11 +94,11 @@ fi @@ -102,11 +94,11 @@ fi
102 94
103 ARRAY_INTERFACES=() 95 ARRAY_INTERFACES=()
104 96
105 -for i in $(seq 1 $NOMBRE_INTERFACES); do 97 +for ((i = 0 ; i<$NOMBRE_INTERFACES ; i++)); do
106 #Creation d'un hash du nom du container pour créer les interfaces 98 #Creation d'un hash du nom du container pour créer les interfaces
107 HASH=$(sha1sum <<< $NOM_CONTAINER) 99 HASH=$(sha1sum <<< $NOM_CONTAINER)
108 #On prend les trois premiers caractères du hash, succédé de l'index de l'interface 100 #On prend les trois premiers caractères du hash, succédé de l'index de l'interface
109 - INTERFACE_NAME="vif${HASH:0:3}_$i" 101 + INTERFACE_NAME="vif${HASH:0:4}_$i"
110 ip link add $INTERFACE_NAME type veth peer name eth$i@$INTERFACE_NAME 102 ip link add $INTERFACE_NAME type veth peer name eth$i@$INTERFACE_NAME
111 #On rajoute l'interface à la liste des interfaces du container 103 #On rajoute l'interface à la liste des interfaces du container
112 ARRAY_INTERFACES+=($INTERFACE_NAME) 104 ARRAY_INTERFACES+=($INTERFACE_NAME)
@@ -119,7 +111,6 @@ for i in $(seq 1 $NOMBRE_INTERFACES); do @@ -119,7 +111,6 @@ for i in $(seq 1 $NOMBRE_INTERFACES); do
119 ip link set eth$i@$INTERFACE_NAME netns /proc/$PID/ns/net name eth$i 111 ip link set eth$i@$INTERFACE_NAME netns /proc/$PID/ns/net name eth$i
120 done 112 done
121 113
122 -  
123 #Compte le nombre de bridges présents 114 #Compte le nombre de bridges présents
124 NOMBRE_BRIDGES=$(echo $BRIDGES | awk -F '[,]' '{print NF}') 115 NOMBRE_BRIDGES=$(echo $BRIDGES | awk -F '[,]' '{print NF}')
125 116
@@ -130,19 +121,19 @@ ARRAY_BRIDGES=() @@ -130,19 +121,19 @@ ARRAY_BRIDGES=()
130 ARRAY_IPV4=() 121 ARRAY_IPV4=()
131 122
132 for b in $BRIDGES; do 123 for b in $BRIDGES; do
133 - ARRAY_BRIDGES+=(b) 124 + echo "Un bridge: $b"
  125 + ARRAY_BRIDGES+=($b)
134 done 126 done
135 127
136 for a in $ADDRS_IPV4; do 128 for a in $ADDRS_IPV4; do
137 - ARRAY_IPV4+=(a) 129 + echo "Une addr: $a"
  130 + ARRAY_IPV4+=($a)
138 done 131 done
139 132
140 for (( i=0 ; i < ${#ARRAY_IPV4[*]} ; i++ )); do 133 for (( i=0 ; i < ${#ARRAY_IPV4[*]} ; i++ )); do
141 nsenter -t $PID -n ip a 134 nsenter -t $PID -n ip a
142 -  
143 #Attribution de la i-ème adresse ip à l'interface i 135 #Attribution de la i-ème adresse ip à l'interface i
144 - nsenter -t $PID -n ip add ${ARRAY_IPV4[i]} dev eth$i  
145 - 136 + nsenter -t $PID -n ip a add ${ARRAY_IPV4[i]} dev eth$i
146 #On redemarre l'interface i dans le container 137 #On redemarre l'interface i dans le container
147 nsenter -t $PID -n ip link set dev eth$i down 138 nsenter -t $PID -n ip link set dev eth$i down
148 nsenter -t $PID -n ip link set dev eth$i up 139 nsenter -t $PID -n ip link set dev eth$i up
@@ -150,16 +141,18 @@ done @@ -150,16 +141,18 @@ done
150 141
151 for (( i=0 ; i < ${#ARRAY_BRIDGES[*]} ; i++ )); do 142 for (( i=0 ; i < ${#ARRAY_BRIDGES[*]} ; i++ )); do
152 #Pour chaque interface, on la relie à son bridge associé 143 #Pour chaque interface, on la relie à son bridge associé
  144 + echo "Nom bridge :${ARRAY_BRIDGES[i]}"
153 ip link set ${ARRAY_INTERFACES[i]} master ${ARRAY_BRIDGES[i]} 145 ip link set ${ARRAY_INTERFACES[i]} master ${ARRAY_BRIDGES[i]}
154 done 146 done
155 147
156 #Chaine de caractère contenant toutes les interfaces du container, séparées par "," 148 #Chaine de caractère contenant toutes les interfaces du container, séparées par ","
157 149
158 STRING_INTERFACE="" 150 STRING_INTERFACE=""
159 -for (( i=0 ; i < ${#ARRAY_INTERFACE[*]} ; i++)); do 151 +for (( i=0 ; i < ${#ARRAY_INTERFACES[*]} ; i++)); do
160 STRING_INTERFACE="$STRING_INTERFACE,${ARRAY_INTERFACES[i]}" 152 STRING_INTERFACE="$STRING_INTERFACE,${ARRAY_INTERFACES[i]}"
161 #Exemple, à la fin on aura ",vif143,vif560" 153 #Exemple, à la fin on aura ",vif143,vif560"
162 done 154 done
163 155
164 #On supprime la première virgule exédentaire 156 #On supprime la première virgule exédentaire
165 -STRING_INTERFACE=$(echo $STRING_INTERFACE | sed -e 's/^.//')  
166 \ No newline at end of file 157 \ No newline at end of file
  158 +STRING_INTERFACE=$(echo $STRING_INTERFACE | sed -e 's/^.//')
  159 +echo "interfaces:$STRING_INTERFACE" >> $FILE
167 \ No newline at end of file 160 \ No newline at end of file
@@ -15,7 +15,8 @@ if [ &quot;$SIZE&quot; == &quot;&quot; ] || [ &quot;$SIZE&quot; -lt 0 ] || [ &quot;$SIZE&quot; -gt 10240 ]; then @@ -15,7 +15,8 @@ if [ &quot;$SIZE&quot; == &quot;&quot; ] || [ &quot;$SIZE&quot; -lt 0 ] || [ &quot;$SIZE&quot; -gt 10240 ]; then
15 SIZE=10240 15 SIZE=10240
16 fi 16 fi
17 17
18 -echo "Le size est de $SIZE" 18 +echo "Création d'une image de taille $SIZE"
  19 +
19 mkdir -p $PATH_BALEINE/images 20 mkdir -p $PATH_BALEINE/images
20 21
21 if [[ -z $REPERTOIRE ]]; then 22 if [[ -z $REPERTOIRE ]]; then
1 #!/bin/bash 1 #!/bin/bash
2 for eachfile in $PATH_MANIFEST/bridges/*.manifest 2 for eachfile in $PATH_MANIFEST/bridges/*.manifest
3 do 3 do
  4 + #Test si des fichiers sont présents
  5 + test -f "$eachfile" || continue
4 NOM_BRIDGE=$(grep nom_bridge $eachfile | cut -d ':' -f2) 6 NOM_BRIDGE=$(grep nom_bridge $eachfile | cut -d ':' -f2)
5 echo "----------------------" 7 echo "----------------------"
6 brctl show $NOM_BRIDGE 8 brctl show $NOM_BRIDGE
1 #!/bin/bash 1 #!/bin/bash
2 2
3 -cd $PATH_MANIFEST/containers  
4 -  
5 -for eachfile in ./*.manifest 3 +for eachfile in $PATH_MANIFEST/containers/*.manifest
6 do 4 do
7 - echo $eachfile  
8 - val=$(cat "$eachfile")  
9 - echo $val 5 + #Test si des fichiers sont présents
  6 + test -f "$eachfile" || continue
  7 + NOM_CONTAINER=$(grep nom_container $eachfile | cut -d ':' -f2)
  8 + NOM_IMAGE=$(grep nom_image $eachfile | cut -d ':' -f2)
  9 + PID=$(grep pid $eachfile | cut -d ':' -f2)
  10 + TIME=$(grep starting_time $eachfile | cut -d':' -f2)
  11 + echo "----------------------"
  12 + echo "Nom container $NOM_CONTAINER"
  13 + echo "Nom image: $NOM_IMAGE"
  14 + echo "PID: $PID"
  15 + echo "Startint time: $TIME"
  16 + echo "----------------------"
10 done 17 done
@@ -2,6 +2,8 @@ @@ -2,6 +2,8 @@
2 2
3 for eachfile in $PATH_MANIFEST/images/*.manifest 3 for eachfile in $PATH_MANIFEST/images/*.manifest
4 do 4 do
  5 + #Test si des fichiers sont présents
  6 + test -f "$eachfile" || continue
5 NOM_IMAGE=$(grep nom_image $eachfile | cut -d ':' -f2) 7 NOM_IMAGE=$(grep nom_image $eachfile | cut -d ':' -f2)
6 TAILLE=$(grep taille $eachfile | cut -d ':' -f2) 8 TAILLE=$(grep taille $eachfile | cut -d ':' -f2)
7 CHEMIN=$(grep chemin $eachfile | cut -d ':' -f2) 9 CHEMIN=$(grep chemin $eachfile | cut -d ':' -f2)
1 #!/bin/bash 1 #!/bin/bash
2 -NAME_BRIDGE_TO_REMOVE=$1;  
3 while getopts b: o; do 2 while getopts b: o; do
4 case $o in 3 case $o in
5 (b) NAME_BRIDGE_TO_REMOVE=$OPTARG;; 4 (b) NAME_BRIDGE_TO_REMOVE=$OPTARG;;
remove_container.sh
1 #!/bin/bash 1 #!/bin/bash
  2 +set -x
2 while getopts c: o; do 3 while getopts c: o; do
3 case $o in 4 case $o in
4 (c) NAME_CONTAINER_TO_REMOVE=$OPTARG;; 5 (c) NAME_CONTAINER_TO_REMOVE=$OPTARG;;
@@ -6,19 +7,32 @@ while getopts c: o; do @@ -6,19 +7,32 @@ while getopts c: o; do
6 done 7 done
7 #vérification que l'utilisateur donne bien un nom à l'CONTAINER 8 #vérification que l'utilisateur donne bien un nom à l'CONTAINER
8 if [[ -z "$NAME_CONTAINER_TO_REMOVE" ]]; then 9 if [[ -z "$NAME_CONTAINER_TO_REMOVE" ]]; then
9 - echo "Il faut donner le NAME du conteneur! Relancez la commande avec les bons arguments." 10 + echo "Il faut donner le nom du conteneur! Relancez la commande avec les bons arguments."
10 exit 11 exit
11 fi 12 fi
12 -rm -rf $PATH_MANIFEST/containers/$NAME_CONTAINER_TO_REMOVE.manifest  
13 -rm -rf $PATH_BALEINE/containers/$NAME_CONTAINER_TO_REMOVE  
14 13
15 -#umount /mnt/container 14 +PID=$(grep "pid" $PATH_MANIFEST/containers/$NAME_CONTAINER_TO_REMOVE.manifest | cut -d":" -f2)
  15 +
  16 +echo "Kill du container"
  17 +kill $PID
  18 +
  19 +echo "Démontage de /mnt/baleine/$NAME_CONTAINER_TO_REMOVE"
16 umount /mnt/baleine/$NAME_CONTAINER_TO_REMOVE 20 umount /mnt/baleine/$NAME_CONTAINER_TO_REMOVE
17 -#supprime mnt/container  
18 -rm -rf /mnt/baleine/$NAME_CONTAINER_TO_REMOVE  
19 -#supprime l'image associé au container (manifest du container)  
20 -rm -rf /var/lib/baleine/containers/$NAME_CONTAINER_TO_REMOVE  
21 -  
22 -#TODO : Supprimer interfaces réseaux  
23 -#TODO : Grep manifeste container, récupère les interfaces  
24 -#TODO : Boucle sur les interfaces, les supprime une à une  
25 \ No newline at end of file 21 \ No newline at end of file
  22 +
  23 +echo "Suppression de /mnt/baleine/$NAME_CONTAINER_TO_REMOVE"
  24 +
  25 +echo "Suppression de $PATH_BALEINE/containers/$NAME_CONTAINER_TO_REMOVE"
  26 +rm -rf $PATH_BALEINE/containers/$NAME_CONTAINER_TO_REMOVE
  27 +
  28 +INTERFACES=$(grep "interfaces" $PATH_MANIFEST/containers/$NAME_CONTAINER_TO_REMOVE.manifest | cut -d":" -f2)
  29 +
  30 +echo "Suppression des interfaces réseau :"
  31 +IFS=","
  32 +#On supprime les interfaces réseaux associées à ce container
  33 +for interface in $INTERFACES; do
  34 + echo "Suppression de $interface"
  35 + ip link del $interface
  36 +done
  37 +
  38 +echo "Suppression du manifeste du container"
  39 +rm -rf $PATH_MANIFEST/containers/$NAME_CONTAINER_TO_REMOVE.manifest
26 \ No newline at end of file 40 \ No newline at end of file
restart_container.sh
@@ -5,9 +5,11 @@ while getopts c:i: o; do @@ -5,9 +5,11 @@ while getopts c:i: o; do
5 (i) NOM_IMAGE=$OPTARG;; 5 (i) NOM_IMAGE=$OPTARG;;
6 esac 6 esac
7 done 7 done
8 -mount -t ext4 -o loop $PATH_BALEINE/containers/$NOM_CONTAINER/$NOM_IMAGE /mnt/baleine/$NOM_CONTAINER  
9 8
10 -nohup unshare -p -f -m -n -u chroot /mnt/baleine/$NOM_CONTAINER $PROGRAM -c "mount /proc" & 9 +mount -t ext4 -o loop $PATH_BALEINE/containers/$NOM_CONTAINER/$NOM_IMAGE /mnt/baleine/$NOM_CONTAINER
  10 +nohup unshare -p -f -m -n -u chroot /mnt/baleine/$NOM_CONTAINER /bin/sh -c "mount /proc ; $PROGRAM ; while true ; do sleep 10 ; done" &
11 PID=$! 11 PID=$!
12 12
13 -ps axo ppid,pid | grep "^ *$PID" | sed -e 's/.* //' 13 +
  14 +#TODO: *Rajouter les interfaces réseau au container
  15 +# *
14 \ No newline at end of file 16 \ No newline at end of file
1 #!/bin/bash 1 #!/bin/bash
2 -  
3 while getopts c: o; do 2 while getopts c: o; do
4 case $o in 3 case $o in
5 - (c) NOM_CONTAINER=$OPTARG;; 4 + (c) NAME_CONTAINER_TO_REMOVE=$OPTARG;;
6 esac 5 esac
7 done 6 done
  7 +#vérification que l'utilisateur donne bien un nom à l'CONTAINER
  8 +if [[ -z "$NAME_CONTAINER_TO_REMOVE" ]]; then
  9 + echo "Il faut donner le nom du conteneur! Relancez la commande avec les bons arguments."
  10 + exit 1
  11 +fi
  12 +
  13 +PID=$(grep "PID" $PATH_MANIFEST/containers/$NAME_CONTAINER_TO_REMOVE.manifest | cut -d":" -f2)
  14 +
  15 +echo "Kill du container"
8 kill $PID 16 kill $PID
9 -umount /mnt/baleine/$NOM_CONTAINER  
10 \ No newline at end of file 17 \ No newline at end of file
  18 +
  19 +rm -rf $PATH_MANIFEST/containers/$NAME_CONTAINER_TO_REMOVE.manifest
  20 +rm -rf $PATH_BALEINE/containers/$NAME_CONTAINER_TO_REMOVE
  21 +
  22 +echo "Démontage de /mnt/baleine/$NAME_CONTAINER_TO_REMOVE"
  23 +umount /mnt/baleine/$NAME_CONTAINER_TO_REMOVE
  24 +#supprime mnt/container
  25 +
  26 +echo "Suppression de /mnt/baleine/$NAME_CONTAINER_TO_REMOVE"
  27 +#supprime l'image associé au container (manifest du container)
11 \ No newline at end of file 28 \ No newline at end of file