Commit 055618a368540eef495f814acad0b69bb8f09dad

Authored by hmalti
1 parent 5721892d

Ajout hash interfaces

baleine.sh
... ... @@ -35,7 +35,7 @@ case "$1" in
35 35 "bridge")
36 36 bash bridge.sh "${@:2}"
37 37 ;;
38   - "help")
  38 + "help")
39 39 bash help.sh
40 40 ;;
41 41 "test")
... ...
create_container.sh
... ... @@ -13,14 +13,14 @@ while getopts i:c:b:r:a:p: o; do
13 13 done
14 14  
15 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 18 if [ -z "$PATH_MANIFEST/images/$NOM_IMAGE.manifest" ] || [ -z $NOM_IMAGE ]; then
20 19 echo "Image non existante."
21 20 exit
22 21 fi
23 22  
  23 +#Check existence bridge
24 24 if [ ! -z $NOM_BRIDGE ] || [ -z "$PATH_MANIFEST/bridges/$NOM_BRIDGE.manifest" ]; then
25 25 echo "Bridge non existant."
26 26 exit
... ... @@ -29,18 +29,15 @@ fi
29 29 #On veut récupérer le chemin de l'image
30 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 33 if [[ ! -d "$PATH_BALEINE/containers/$NOM_CONTAINER" ]]; then
35 34 mkdir -p $PATH_BALEINE/containers/$NOM_CONTAINER
36 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 42 if [[ ! -d "/mnt/baleine/$NOM_CONTAINER" ]]; then
46 43 mkdir -p /mnt/baleine/$NOM_CONTAINER
... ... @@ -57,17 +54,20 @@ echo "$PROGRAM" >> /mnt/baleine/$NOM_CONTAINER/etc/rc.local
57 54 #On fait le unshare sur l'image passée en paramètre,
58 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 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 69 FILE=$NOM_CONTAINER.manifest
69   -touch $FILE #création du fichier
70   -date=${date}
  70 +date=$(date)
71 71  
72 72 echo "nom_container:$NOM_CONTAINER" >> $FILE #nom de son image
73 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 87  
88 88 #AWK pour récupèrer le nombre d'addresses IPV4 données en arguments
89 89 #(https://unix.stackexchange.com/questions/144217/counting-comma-separated-characters-in-a-row)
90   -
91 90 NOMBRE_INTERFACES="$(echo $ADDRS_IPV4 | awk -F '[,]' '{print NF}')"
92   -
93 91 NOMBRE_BRIDGES="$(echo $BRIDGES | awk -F '[,]' '{print NF}')"
94 92  
95 93 if [ $NOMBRE_INTERFACES -ne $NOMBRE_BRIDGES ]; then
... ... @@ -97,16 +95,35 @@ if [ $NOMBRE_INTERFACES -ne $NOMBRE_BRIDGES ]; then
97 95 exit 1
98 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 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 120 done
104 121  
105   -echo "J'ai fini de créer les interfaces chef"
106 122  
107 123 #Compte le nombre de bridges présents
108 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 127 IFS=","
111 128  
112 129 ARRAY_BRIDGES=()
... ... @@ -121,20 +138,28 @@ for a in $ADDRS_IPV4; do
121 138 done
122 139  
123 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 149 done
137 150  
138 151 for (( i=0 ; i < ${#ARRAY_BRIDGES[*]} ; i++ )); do
139   - ip link set $NOM_CONTAINER$i master ${ARRAY_BRIDGES[i]}
140   -done
141 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 167 \ No newline at end of file
... ...
down_bridge.sh
... ... @@ -9,4 +9,5 @@ if [[ -z &quot;$NOM_BRIDGE&quot; ]]; then
9 9 echo "Il faut donner le nom du bridge Relancez la commande avec les bons arguments."
10 10 exit
11 11 fi
  12 +
12 13 ip link set $NOM_BRIDGE down
13 14 \ No newline at end of file
... ...
exec_container.sh
... ... @@ -5,4 +5,5 @@ while getopts e: o; do
5 5 (e) $NOM_CONTAINER=$OPTARG;;
6 6 esac
7 7 done
  8 +
8 9 unshare -p -f -m -n -u chroot /mnt/baleine/$NOM_CONTAINER /bin/bash
9 10 \ No newline at end of file
... ...
remove_container.sh
... ... @@ -15,3 +15,7 @@ umount /mnt/baleine/$NAME_CONTAINER_TO_REMOVE
15 15 rm -rf /mnt/baleine/$NAME_CONTAINER_TO_REMOVE
16 16 #supprime l'image associé au container (manifest du container)
17 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 22 \ No newline at end of file
... ...
1 1 #bash baleine.sh bridge create mybridge 192.168.42.1
2 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 10 \ No newline at end of file
  11 +cp $PATH_IMAGE/$NOM_IMAGE $PATH_BALEINE/containers/$NOM_CONTAINER/$NOM_IMAGE
11 12 \ No newline at end of file
... ...