3e470988
hmalti
First commit
|
1
|
#!/bin/bash
|
b02be524
hmalti
Correctifs + gest...
|
2
|
set -x
|
5721892d
hmalti
Avancées
|
3
|
|
5cf93464
hmalti
Ajout interfaces ...
|
4
5
6
7
8
9
10
11
|
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;;
|
5cf93464
hmalti
Ajout interfaces ...
|
12
13
|
esac
done
|
3e470988
hmalti
First commit
|
14
|
|
5721892d
hmalti
Avancées
|
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"
|
5721892d
hmalti
Avancées
|
16
|
|
055618a3
hmalti
Ajout hash interf...
|
17
|
#Check existence image
|
5721892d
hmalti
Avancées
|
18
|
if [ -z "$PATH_MANIFEST/images/$NOM_IMAGE.manifest" ] || [ -z $NOM_IMAGE ]; then
|
5cf93464
hmalti
Ajout interfaces ...
|
19
20
21
|
echo "Image non existante."
exit
fi
|
3e470988
hmalti
First commit
|
22
|
|
055618a3
hmalti
Ajout hash interf...
|
23
|
#Check existence bridge
|
5721892d
hmalti
Avancées
|
24
|
if [ ! -z $NOM_BRIDGE ] || [ -z "$PATH_MANIFEST/bridges/$NOM_BRIDGE.manifest" ]; then
|
5cf93464
hmalti
Ajout interfaces ...
|
25
26
27
|
echo "Bridge non existant."
exit
fi
|
3e470988
hmalti
First commit
|
28
29
|
#On veut récupérer le chemin de l'image
|
5721892d
hmalti
Avancées
|
30
|
PATH_IMAGE="$(grep chemin $PATH_MANIFEST/images/$NOM_IMAGE.manifest | cut -d':' -f2)"
|
3e470988
hmalti
First commit
|
31
|
|
055618a3
hmalti
Ajout hash interf...
|
32
|
#On fait une copie dans /var/baleine/images pour mount depuis le conteneur
|
3e470988
hmalti
First commit
|
33
|
if [[ ! -d "$PATH_BALEINE/containers/$NOM_CONTAINER" ]]; then
|
5cf93464
hmalti
Ajout interfaces ...
|
34
|
mkdir -p $PATH_BALEINE/containers/$NOM_CONTAINER
|
3e470988
hmalti
First commit
|
35
36
|
fi
|
055618a3
hmalti
Ajout hash interf...
|
37
|
cp $PATH_IMAGE/$NOM_IMAGE $PATH_BALEINE/containers/$NOM_CONTAINER/$NOM_IMAGE
|
5721892d
hmalti
Avancées
|
38
|
|
3e470988
hmalti
First commit
|
39
|
|
055618a3
hmalti
Ajout hash interf...
|
40
|
#Création du du dossier de montage de l'image du container
|
5721892d
hmalti
Avancées
|
41
42
43
44
|
if [[ ! -d "/mnt/baleine/$NOM_CONTAINER" ]]; then
mkdir -p /mnt/baleine/$NOM_CONTAINER
fi
|
3e470988
hmalti
First commit
|
45
46
|
#on monte le système de fichiers
|
5cf93464
hmalti
Ajout interfaces ...
|
47
|
echo "Montage de l'image"
|
3e470988
hmalti
First commit
|
48
49
|
mount -t ext4 -o loop $PATH_BALEINE/containers/$NOM_CONTAINER/$NOM_IMAGE /mnt/baleine/$NOM_CONTAINER
|
5161dfdb
hmalti
Améliorations scr...
|
50
|
#On renseigne le fichier fstab du conteneur
|
5721892d
hmalti
Avancées
|
51
52
|
echo "proc /proc proc defaults 0 0" >> /mnt/baleine/$NOM_CONTAINER/etc/fstab
echo "$PROGRAM" >> /mnt/baleine/$NOM_CONTAINER/etc/rc.local
|
5161dfdb
hmalti
Améliorations scr...
|
53
|
|
5cf93464
hmalti
Ajout interfaces ...
|
54
|
#On fait le unshare sur l'image passée en paramètre,
|
5721892d
hmalti
Avancées
|
55
|
|
055618a3
hmalti
Ajout hash interf...
|
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" &
|
3e470988
hmalti
First commit
|
57
|
PID=$!
|
3e470988
hmalti
First commit
|
58
|
|
055618a3
hmalti
Ajout hash interf...
|
59
60
|
echo "PID Unshare :$PID"
|
3e470988
hmalti
First commit
|
61
|
FILE=$NOM_CONTAINER.manifest
|
061a7e29
hmalti
Corrections
|
62
|
date=$(date +"%Y-%m-%d-%Hh-%Mm-%Ss")
|
5cf93464
hmalti
Ajout interfaces ...
|
63
|
|
17bfc359
hmalti
Help Image+contai...
|
64
|
echo "nom_container:$NOM_CONTAINER" >> $FILE #nom du conteneur
|
3e470988
hmalti
First commit
|
65
|
echo "nom_image:$NOM_IMAGE" >> $FILE #nom de son image
|
5721892d
hmalti
Avancées
|
66
|
echo "pid:$PID" >> $FILE #Son PID
|
b02be524
hmalti
Correctifs + gest...
|
67
|
echo "nom_bridges:$BRIDGES" >> $FILE #SON BRIDGE
|
5cf93464
hmalti
Ajout interfaces ...
|
68
|
echo "starting_time: $date" >> $FILE #starting time
|
3e470988
hmalti
First commit
|
69
|
|
b1087939
hmalti
Ajout commandes
|
70
|
|
3e470988
hmalti
First commit
|
71
72
73
74
75
|
if [[ ! -d "$PATH_MANIFEST/containers" ]]; then
mkdir -p $PATH_MANIFEST/containers
fi
mv $NOM_CONTAINER.manifest $PATH_MANIFEST/containers/$NOM_CONTAINER.manifest
|
5161dfdb
hmalti
Améliorations scr...
|
76
77
|
|
5cf93464
hmalti
Ajout interfaces ...
|
78
79
80
81
|
#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)
|
5721892d
hmalti
Avancées
|
82
|
NOMBRE_INTERFACES="$(echo $ADDRS_IPV4 | awk -F '[,]' '{print NF}')"
|
5721892d
hmalti
Avancées
|
83
|
NOMBRE_BRIDGES="$(echo $BRIDGES | awk -F '[,]' '{print NF}')"
|
5cf93464
hmalti
Ajout interfaces ...
|
84
|
|
5721892d
hmalti
Avancées
|
85
|
if [ $NOMBRE_INTERFACES -ne $NOMBRE_BRIDGES ]; then
|
5cf93464
hmalti
Ajout interfaces ...
|
86
87
|
echo "Erreur: Il n'y a pas autant de bridges que d'interfaces réseaux"
exit 1
|
5721892d
hmalti
Avancées
|
88
|
fi
|
5cf93464
hmalti
Ajout interfaces ...
|
89
|
|
055618a3
hmalti
Ajout hash interf...
|
90
91
92
93
94
95
96
|
#Creation veth
#Problématique : Sur Linux, impossible d'avoir des interfaces avec des noms de plus de 16 caractères
# Impossible donc de mettre des interfaces du type
#Solution : On hash le nom du container, on le ramène aux trois premiers digits, puis on ajoute l'index
ARRAY_INTERFACES=()
|
b02be524
hmalti
Correctifs + gest...
|
97
|
for ((i = 0 ; i<$NOMBRE_INTERFACES ; i++)); do
|
055618a3
hmalti
Ajout hash interf...
|
98
99
100
|
#Creation d'un hash du nom du container pour créer les interfaces
HASH=$(sha1sum <<< $NOM_CONTAINER)
#On prend les trois premiers caractères du hash, succédé de l'index de l'interface
|
b02be524
hmalti
Correctifs + gest...
|
101
|
INTERFACE_NAME="vif${HASH:0:4}_$i"
|
055618a3
hmalti
Ajout hash interf...
|
102
103
104
105
106
107
108
109
110
111
|
ip link add $INTERFACE_NAME type veth peer name eth$i@$INTERFACE_NAME
#On rajoute l'interface à la liste des interfaces du container
ARRAY_INTERFACES+=($INTERFACE_NAME)
#On redemarre l'interface virtuelle
ip link set dev $INTERFACE_NAME down
ip link set dev $INTERFACE_NAME up
#On place l'une des extrémité de la paire veth dans le namespace du container
ip link set eth$i@$INTERFACE_NAME netns /proc/$PID/ns/net name eth$i
|
5cf93464
hmalti
Ajout interfaces ...
|
112
113
|
done
|
5721892d
hmalti
Avancées
|
114
115
|
#Compte le nombre de bridges présents
NOMBRE_BRIDGES=$(echo $BRIDGES | awk -F '[,]' '{print NF}')
|
5cf93464
hmalti
Ajout interfaces ...
|
116
|
|
055618a3
hmalti
Ajout hash interf...
|
117
|
#On met le séparateur à "," pour délimiter les addresses ip et bridges
|
5cf93464
hmalti
Ajout interfaces ...
|
118
119
120
121
122
123
|
IFS=","
ARRAY_BRIDGES=()
ARRAY_IPV4=()
for b in $BRIDGES; do
|
b02be524
hmalti
Correctifs + gest...
|
124
125
|
echo "Un bridge: $b"
ARRAY_BRIDGES+=($b)
|
5cf93464
hmalti
Ajout interfaces ...
|
126
127
128
|
done
for a in $ADDRS_IPV4; do
|
b02be524
hmalti
Correctifs + gest...
|
129
130
|
echo "Une addr: $a"
ARRAY_IPV4+=($a)
|
5cf93464
hmalti
Ajout interfaces ...
|
131
132
|
done
|
5721892d
hmalti
Avancées
|
133
|
for (( i=0 ; i < ${#ARRAY_IPV4[*]} ; i++ )); do
|
055618a3
hmalti
Ajout hash interf...
|
134
|
nsenter -t $PID -n ip a
|
055618a3
hmalti
Ajout hash interf...
|
135
|
#Attribution de la i-ème adresse ip à l'interface i
|
b02be524
hmalti
Correctifs + gest...
|
136
|
nsenter -t $PID -n ip a add ${ARRAY_IPV4[i]} dev eth$i
|
055618a3
hmalti
Ajout hash interf...
|
137
138
139
|
#On redemarre l'interface i dans le container
nsenter -t $PID -n ip link set dev eth$i down
nsenter -t $PID -n ip link set dev eth$i up
|
5721892d
hmalti
Avancées
|
140
|
done
|
3e470988
hmalti
First commit
|
141
|
|
5721892d
hmalti
Avancées
|
142
|
for (( i=0 ; i < ${#ARRAY_BRIDGES[*]} ; i++ )); do
|
055618a3
hmalti
Ajout hash interf...
|
143
|
#Pour chaque interface, on la relie à son bridge associé
|
b02be524
hmalti
Correctifs + gest...
|
144
|
echo "Nom bridge :${ARRAY_BRIDGES[i]}"
|
055618a3
hmalti
Ajout hash interf...
|
145
146
147
148
149
150
|
ip link set ${ARRAY_INTERFACES[i]} master ${ARRAY_BRIDGES[i]}
done
#Chaine de caractère contenant toutes les interfaces du container, séparées par ","
STRING_INTERFACE=""
|
b02be524
hmalti
Correctifs + gest...
|
151
|
for (( i=0 ; i < ${#ARRAY_INTERFACES[*]} ; i++)); do
|
055618a3
hmalti
Ajout hash interf...
|
152
153
154
155
156
|
STRING_INTERFACE="$STRING_INTERFACE,${ARRAY_INTERFACES[i]}"
#Exemple, à la fin on aura ",vif143,vif560"
done
#On supprime la première virgule exédentaire
|
061a7e29
hmalti
Corrections
|
157
158
|
STRING_INTERFACE=${STRING_INTERFACE:1}
|
b02be524
hmalti
Correctifs + gest...
|
159
|
echo "interfaces:$STRING_INTERFACE" >> $FILE
|