Commit 055618a368540eef495f814acad0b69bb8f09dad

Authored by hmalti
1 parent 5721892d

Ajout hash interfaces

@@ -35,7 +35,7 @@ case "$1" in @@ -35,7 +35,7 @@ case "$1" in
35 "bridge") 35 "bridge")
36 bash bridge.sh "${@:2}" 36 bash bridge.sh "${@:2}"
37 ;; 37 ;;
38 - "help") 38 + "help")
39 bash help.sh 39 bash help.sh
40 ;; 40 ;;
41 "test") 41 "test")
create_container.sh
@@ -13,14 +13,14 @@ while getopts i:c:b:r:a:p: o; do @@ -13,14 +13,14 @@ while getopts i:c:b:r:a:p: o; do
13 done 13 done
14 14
15 echo "Creation du container $NOM_CONTAINER basé sur l'image $NOM_IMAGE lancant le programme $PROGRAM connecté au(x) bridge(s) $BRIDGES avec les adresses $ADDRS_IPV4" 15 echo "Creation du container $NOM_CONTAINER basé sur l'image $NOM_IMAGE lancant le programme $PROGRAM connecté au(x) bridge(s) $BRIDGES avec les adresses $ADDRS_IPV4"
16 -#/usr/local/apache2/bin  
17 16
18 -#Check existence image, bridge 17 +#Check existence image
19 if [ -z "$PATH_MANIFEST/images/$NOM_IMAGE.manifest" ] || [ -z $NOM_IMAGE ]; then 18 if [ -z "$PATH_MANIFEST/images/$NOM_IMAGE.manifest" ] || [ -z $NOM_IMAGE ]; then
20 echo "Image non existante." 19 echo "Image non existante."
21 exit 20 exit
22 fi 21 fi
23 22
  23 +#Check existence bridge
24 if [ ! -z $NOM_BRIDGE ] || [ -z "$PATH_MANIFEST/bridges/$NOM_BRIDGE.manifest" ]; then 24 if [ ! -z $NOM_BRIDGE ] || [ -z "$PATH_MANIFEST/bridges/$NOM_BRIDGE.manifest" ]; then
25 echo "Bridge non existant." 25 echo "Bridge non existant."
26 exit 26 exit
@@ -29,18 +29,15 @@ fi @@ -29,18 +29,15 @@ fi
29 #On veut récupérer le chemin de l'image 29 #On veut récupérer le chemin de l'image
30 PATH_IMAGE="$(grep chemin $PATH_MANIFEST/images/$NOM_IMAGE.manifest | cut -d':' -f2)" 30 PATH_IMAGE="$(grep chemin $PATH_MANIFEST/images/$NOM_IMAGE.manifest | cut -d':' -f2)"
31 31
32 -echo "PATH_IMAGE: $PATH_IMAGE"  
33 -#on fait une copie dans /var/baleine/images pour mount depuis le conteneur 32 +#On fait une copie dans /var/baleine/images pour mount depuis le conteneur
34 if [[ ! -d "$PATH_BALEINE/containers/$NOM_CONTAINER" ]]; then 33 if [[ ! -d "$PATH_BALEINE/containers/$NOM_CONTAINER" ]]; then
35 mkdir -p $PATH_BALEINE/containers/$NOM_CONTAINER 34 mkdir -p $PATH_BALEINE/containers/$NOM_CONTAINER
36 fi 35 fi
37 36
  37 +cp $PATH_IMAGE/$NOM_IMAGE $PATH_BALEINE/containers/$NOM_CONTAINER/$NOM_IMAGE
38 38
39 -#Copie de l'image physique dans le container  
40 -cp -r $PATH_IMAGE/$NOM_IMAGE $PATH_BALEINE/containers/$NOM_CONTAINER/$NOM_IMAGE  
41 39
42 -  
43 -#création du du dossier de montage de l'image du container 40 +#Création du du dossier de montage de l'image du container
44 41
45 if [[ ! -d "/mnt/baleine/$NOM_CONTAINER" ]]; then 42 if [[ ! -d "/mnt/baleine/$NOM_CONTAINER" ]]; then
46 mkdir -p /mnt/baleine/$NOM_CONTAINER 43 mkdir -p /mnt/baleine/$NOM_CONTAINER
@@ -57,17 +54,20 @@ echo "$PROGRAM" >> /mnt/baleine/$NOM_CONTAINER/etc/rc.local @@ -57,17 +54,20 @@ echo "$PROGRAM" >> /mnt/baleine/$NOM_CONTAINER/etc/rc.local
57 #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,
58 #nohup unshare -p -f -m -n -u chroot /mnt/baleine/$NOM_CONTAINER "/bin/bash" -c "mount /proc" & 55 #nohup unshare -p -f -m -n -u chroot /mnt/baleine/$NOM_CONTAINER "/bin/bash" -c "mount /proc" &
59 56
60 - 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" &
61 58
62 PID=$! 59 PID=$!
63 -echo "j'ai finis le unshare-nohup"  
64 60
65 -ps axo ppid,pid | grep "^ *$PID" | sed -e 's/.* //'  
66 -echo $PID 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"
  65 +
  66 +
  67 +#TODO : Gerer les noms des interfaces < x caractères
67 68
68 FILE=$NOM_CONTAINER.manifest 69 FILE=$NOM_CONTAINER.manifest
69 -touch $FILE #création du fichier  
70 -date=${date} 70 +date=$(date)
71 71
72 echo "nom_container:$NOM_CONTAINER" >> $FILE #nom de son image 72 echo "nom_container:$NOM_CONTAINER" >> $FILE #nom de son image
73 echo "nom_image:$NOM_IMAGE" >> $FILE #nom de son image 73 echo "nom_image:$NOM_IMAGE" >> $FILE #nom de son image
@@ -87,9 +87,7 @@ mv $NOM_CONTAINER.manifest $PATH_MANIFEST/containers/$NOM_CONTAINER.manifest @@ -87,9 +87,7 @@ mv $NOM_CONTAINER.manifest $PATH_MANIFEST/containers/$NOM_CONTAINER.manifest
87 87
88 #AWK pour récupèrer le nombre d'addresses IPV4 données en arguments 88 #AWK pour récupèrer le nombre d'addresses IPV4 données en arguments
89 #(https://unix.stackexchange.com/questions/144217/counting-comma-separated-characters-in-a-row) 89 #(https://unix.stackexchange.com/questions/144217/counting-comma-separated-characters-in-a-row)
90 -  
91 NOMBRE_INTERFACES="$(echo $ADDRS_IPV4 | awk -F '[,]' '{print NF}')" 90 NOMBRE_INTERFACES="$(echo $ADDRS_IPV4 | awk -F '[,]' '{print NF}')"
92 -  
93 NOMBRE_BRIDGES="$(echo $BRIDGES | awk -F '[,]' '{print NF}')" 91 NOMBRE_BRIDGES="$(echo $BRIDGES | awk -F '[,]' '{print NF}')"
94 92
95 if [ $NOMBRE_INTERFACES -ne $NOMBRE_BRIDGES ]; then 93 if [ $NOMBRE_INTERFACES -ne $NOMBRE_BRIDGES ]; then
@@ -97,16 +95,35 @@ if [ $NOMBRE_INTERFACES -ne $NOMBRE_BRIDGES ]; then @@ -97,16 +95,35 @@ if [ $NOMBRE_INTERFACES -ne $NOMBRE_BRIDGES ]; then
97 exit 1 95 exit 1
98 fi 96 fi
99 97
  98 +#Creation veth
  99 +#Problématique : Sur Linux, impossible d'avoir des interfaces avec des noms de plus de 16 caractères
  100 +# Impossible donc de mettre des interfaces du type
  101 +#Solution : On hash le nom du container, on le ramène aux trois premiers digits, puis on ajoute l'index
  102 +
  103 +ARRAY_INTERFACES=()
  104 +
100 for i in $(seq 1 $NOMBRE_INTERFACES); do 105 for i in $(seq 1 $NOMBRE_INTERFACES); do
101 - echo "Nom de l'interface : $NOM_CONTAINER$i"  
102 - ip link add $NOM_CONTAINER$i type veth peer name eth$i 106 + #Creation d'un hash du nom du container pour créer les interfaces
  107 + HASH=$(sha1sum <<< $NOM_CONTAINER)
  108 + #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"
  110 + ip link add $INTERFACE_NAME type veth peer name eth$i@$INTERFACE_NAME
  111 + #On rajoute l'interface à la liste des interfaces du container
  112 + ARRAY_INTERFACES+=($INTERFACE_NAME)
  113 +
  114 + #On redemarre l'interface virtuelle
  115 + ip link set dev $INTERFACE_NAME down
  116 + ip link set dev $INTERFACE_NAME up
  117 +
  118 + #On place l'une des extrémité de la paire veth dans le namespace du container
  119 + ip link set eth$i@$INTERFACE_NAME netns /proc/$PID/ns/net name eth$i
103 done 120 done
104 121
105 -echo "J'ai fini de créer les interfaces chef"  
106 122
107 #Compte le nombre de bridges présents 123 #Compte le nombre de bridges présents
108 NOMBRE_BRIDGES=$(echo $BRIDGES | awk -F '[,]' '{print NF}') 124 NOMBRE_BRIDGES=$(echo $BRIDGES | awk -F '[,]' '{print NF}')
109 125
  126 +#On met le séparateur à "," pour délimiter les addresses ip et bridges
110 IFS="," 127 IFS=","
111 128
112 ARRAY_BRIDGES=() 129 ARRAY_BRIDGES=()
@@ -121,20 +138,28 @@ for a in $ADDRS_IPV4; do @@ -121,20 +138,28 @@ for a in $ADDRS_IPV4; do
121 done 138 done
122 139
123 for (( i=0 ; i < ${#ARRAY_IPV4[*]} ; i++ )); do 140 for (( i=0 ; i < ${#ARRAY_IPV4[*]} ; i++ )); do
124 - #Creation de la veth  
125 - #ip link add dev $NOM_CONTAINER$i type veth peer name eth$i@$NOM_CONTAINER$i  
126 - ip link add dev vif1 type veth peer name eth0@vif1  
127 - #Ajout d'une des extrémités de la veth dans le namespace du container  
128 - #ip link set eth$i@$NOM_CONTAINER$i netns proc/$PID/ns/net name eth$i  
129 - ip link set eth0@vif1 netns proc/$PID/ns/net name eth0  
130 - #Attribution de l'adresse ip à l'interface du container  
131 - #ip netns exec proc/$PID/ns/net ip addr add ${ARRAY_IPV4[i]} dev eth$i  
132 - ip netns exec proc/$PID/ns/net ip addr add ${ARRAY_IPV4[i]} dev eth0  
133 - ip netns exec proc/$PID/ns/net ip link set dev eth0 down  
134 - ip netns exec proc/$PID/ns/net ip link set dev eth0 up  
135 - 141 + nsenter -t $PID -n ip a
  142 +
  143 + #Attribution de la i-ème adresse ip à l'interface i
  144 + nsenter -t $PID -n ip add ${ARRAY_IPV4[i]} dev eth$i
  145 +
  146 + #On redemarre l'interface i dans le container
  147 + nsenter -t $PID -n ip link set dev eth$i down
  148 + nsenter -t $PID -n ip link set dev eth$i up
136 done 149 done
137 150
138 for (( i=0 ; i < ${#ARRAY_BRIDGES[*]} ; i++ )); do 151 for (( i=0 ; i < ${#ARRAY_BRIDGES[*]} ; i++ )); do
139 - ip link set $NOM_CONTAINER$i master ${ARRAY_BRIDGES[i]}  
140 -done  
141 \ No newline at end of file 152 \ No newline at end of file
  153 + #Pour chaque interface, on la relie à son bridge associé
  154 + ip link set ${ARRAY_INTERFACES[i]} master ${ARRAY_BRIDGES[i]}
  155 +done
  156 +
  157 +#Chaine de caractère contenant toutes les interfaces du container, séparées par ","
  158 +
  159 +STRING_INTERFACE=""
  160 +for (( i=0 ; i < ${#ARRAY_INTERFACE[*]} ; i++)); do
  161 + STRING_INTERFACE="$STRING_INTERFACE,${ARRAY_INTERFACES[i]}"
  162 + #Exemple, à la fin on aura ",vif143,vif560"
  163 +done
  164 +
  165 +#On supprime la première virgule exédentaire
  166 +STRING_INTERFACE=$(echo $STRING_INTERFACE | sed -e 's/^.//')
142 \ No newline at end of file 167 \ No newline at end of file
@@ -9,4 +9,5 @@ if [[ -z &quot;$NOM_BRIDGE&quot; ]]; then @@ -9,4 +9,5 @@ if [[ -z &quot;$NOM_BRIDGE&quot; ]]; then
9 echo "Il faut donner le nom du bridge Relancez la commande avec les bons arguments." 9 echo "Il faut donner le nom du bridge Relancez la commande avec les bons arguments."
10 exit 10 exit
11 fi 11 fi
  12 +
12 ip link set $NOM_BRIDGE down 13 ip link set $NOM_BRIDGE down
13 \ No newline at end of file 14 \ No newline at end of file
@@ -5,4 +5,5 @@ while getopts e: o; do @@ -5,4 +5,5 @@ while getopts e: o; do
5 (e) $NOM_CONTAINER=$OPTARG;; 5 (e) $NOM_CONTAINER=$OPTARG;;
6 esac 6 esac
7 done 7 done
  8 +
8 unshare -p -f -m -n -u chroot /mnt/baleine/$NOM_CONTAINER /bin/bash 9 unshare -p -f -m -n -u chroot /mnt/baleine/$NOM_CONTAINER /bin/bash
9 \ No newline at end of file 10 \ No newline at end of file
remove_container.sh
@@ -15,3 +15,7 @@ umount /mnt/baleine/$NAME_CONTAINER_TO_REMOVE @@ -15,3 +15,7 @@ umount /mnt/baleine/$NAME_CONTAINER_TO_REMOVE
15 rm -rf /mnt/baleine/$NAME_CONTAINER_TO_REMOVE 15 rm -rf /mnt/baleine/$NAME_CONTAINER_TO_REMOVE
16 #supprime l'image associé au container (manifest du container) 16 #supprime l'image associé au container (manifest du container)
17 rm -rf /var/lib/baleine/containers/$NAME_CONTAINER_TO_REMOVE 17 rm -rf /var/lib/baleine/containers/$NAME_CONTAINER_TO_REMOVE
  18 +
  19 +#TODO : Supprimer interfaces réseaux
  20 +#TODO : Grep manifeste container, récupère les interfaces
  21 +#TODO : Boucle sur les interfaces, les supprime une à une
18 \ No newline at end of file 22 \ No newline at end of file
1 #bash baleine.sh bridge create mybridge 192.168.42.1 1 #bash baleine.sh bridge create mybridge 192.168.42.1
2 #bash baleine.sh container create -i TEST -c mycontainer -b mybridge -a 192.168.42.2 -p /usr/sbin/apache2 2 #bash baleine.sh container create -i TEST -c mycontainer -b mybridge -a 192.168.42.2 -p /usr/sbin/apache2
3 3
4 -A="HELLO"  
5 -B=" WORLD"  
6 4
7 -C="$A$B" 5 +PATH_IMAGE="/var/lib/baleine/images"
  6 +NOM_IMAGE="myimage"
  7 +PATH_BALEINE="/var/lib/baleine"
  8 +NOM_CONTAINER="mycontainer"
8 9
9 -echo $C  
10 \ No newline at end of file 10 \ No newline at end of file
  11 +cp $PATH_IMAGE/$NOM_IMAGE $PATH_BALEINE/containers/$NOM_CONTAINER/$NOM_IMAGE
11 \ No newline at end of file 12 \ No newline at end of file