Commit 3e47098830d35ee71c7d44f97b4bc4a333125695
0 parents
First commit
Showing
15 changed files
with
351 additions
and
0 deletions
Show diff stats
1 | +++ a/baleine.sh | ||
@@ -0,0 +1,43 @@ | @@ -0,0 +1,43 @@ | ||
1 | + | ||
2 | +#!/bin/bash | ||
3 | + | ||
4 | +#Ce code est le point d'entrée de l'application, c'est lui qui est apellé quand on écrit ./balaine container create | ||
5 | + | ||
6 | +#Ici on fait un switch par rapport à la valeur de $1 (le premier argument) selon qu'il vaille container, network ou image on apelle un autre | ||
7 | +#script qui va traiter ces cas, on garde les fichiers courts mais simples | ||
8 | + | ||
9 | + | ||
10 | +export PATH_BALEINE=/var/lib/baleine | ||
11 | +export PATH_MANIFEST=$PATH_BALEINE/manifest | ||
12 | + | ||
13 | +if [ $# -lt 1 ]; then | ||
14 | + printf "Baleine est un outil simple de gestion de conteneur.\n" | ||
15 | + printf "Utilisation: \n \n" | ||
16 | + printf "\t \t baleine <commande> [arguments]\n" | ||
17 | + printf "Les commandes sont :\n \n" | ||
18 | + printf "\t \t %-10s %-10s \n" "container" "Lance ou stoppe un contenneur." | ||
19 | + printf "\t \t %-10s %-10s \n" "network" "Créée ou supprime des interfaces réseau." | ||
20 | + printf "\t \t %-10s %-10s \n \n" "image" "Créer ou supprime des images de contenneurs." | ||
21 | + printf "Utilisez baleine <commande> help pour plus d'informations à propos d'une commande.\n" | ||
22 | +fi | ||
23 | + | ||
24 | +case "$1" in | ||
25 | + "container") | ||
26 | + #Si on a apelé ./baleine.sh container create par exemple, on va apeller le script container.sh qui va traiter les | ||
27 | + #opérations sur les containers, et $@ permet de lui passer tous les arguments qu'on a passé à baleine.sh | ||
28 | + #autrement dit, ./baleine.sh container create apellera le script container.sh avec les arguments $1=container et $2=create | ||
29 | + bash container.sh "$@" | ||
30 | + ;; | ||
31 | + "network") | ||
32 | + bash network.sh "$@" | ||
33 | + ;; | ||
34 | + "image") | ||
35 | + bash image.sh "$@" | ||
36 | + ;; | ||
37 | + "bridge") | ||
38 | + bash bridge.sh "$@" | ||
39 | + ;; | ||
40 | + "help") | ||
41 | + bash help.sh "$@" | ||
42 | + ;; | ||
43 | +esac | ||
0 | \ No newline at end of file | 44 | \ No newline at end of file |
1 | +++ a/bridge.sh | ||
@@ -0,0 +1,21 @@ | @@ -0,0 +1,21 @@ | ||
1 | +#!/bin/bash | ||
2 | + | ||
3 | +case $2 in | ||
4 | + | ||
5 | + "create") | ||
6 | + #Si on veut creer un bridge (qu'on a apellé le script ./balaine.sh bridge create) | ||
7 | + bash create_bridge.sh "$@" | ||
8 | + ;; | ||
9 | + "list") | ||
10 | + #Si on veut lister les bridges (qu'on a apellé le script ./balaine.sh bridge list) | ||
11 | + bash list_bridges.sh "$@" | ||
12 | + ;; | ||
13 | + "remove") | ||
14 | + bash remove_bridge.sh "$@" | ||
15 | + ;; | ||
16 | + "up") | ||
17 | + bash up_bridge.sh "$@" | ||
18 | + ;; | ||
19 | + "down") | ||
20 | + bash down_bridge.sh "$@" | ||
21 | +esac | ||
0 | \ No newline at end of file | 22 | \ No newline at end of file |
1 | +++ a/container.sh | ||
@@ -0,0 +1,17 @@ | @@ -0,0 +1,17 @@ | ||
1 | +#!/bin/bash | ||
2 | + | ||
3 | +case $2 in | ||
4 | + | ||
5 | + "create") | ||
6 | + #Si on veut creer un container (qu'on a apellé le script ./baleine.sh container create) | ||
7 | + bash create_container.sh "$@" | ||
8 | + ;; | ||
9 | + "list") | ||
10 | + #Si on veut lister les containers qui tournent (qu'on a apellé le script ./baleine.sh container list) | ||
11 | + bash list_container.sh "$@" | ||
12 | + ;; | ||
13 | + "stop") | ||
14 | + bash stop_container.sh "$@" | ||
15 | + ;; | ||
16 | + | ||
17 | +esac | ||
0 | \ No newline at end of file | 18 | \ No newline at end of file |
1 | +++ a/create_bridge.sh | ||
@@ -0,0 +1,25 @@ | @@ -0,0 +1,25 @@ | ||
1 | +#!/bin/bash | ||
2 | +NOM_BRIDGE=$3; | ||
3 | +ADDR_IPV4=$4; | ||
4 | +REPERTOIRE=${PWD} | ||
5 | + | ||
6 | + | ||
7 | +#condition sur le nbre d'arguments | ||
8 | +if [[ -z "$NOM_BRIDGE" ]]; then | ||
9 | + echo "Il faut donner le nom du bridge ! Relancez la commande avec les bons arguments." | ||
10 | + exit | ||
11 | +fi | ||
12 | +#création du bridge | ||
13 | +ip link add $NOM_BRIDGE type bridge | ||
14 | +ip a add dev $NOM_BRIDGE $ADDR_IPV4 | ||
15 | +ip link set $NOM_BRIDGE down | ||
16 | +ip link set $NOM_BRIDGE up | ||
17 | + | ||
18 | +touch $NOM_BRIDGE.manifest # On crée un fichier contenant les infos du bridge | ||
19 | +echo "$NOM_BRIDGE" >> $NOM_BRIDGE.manifest #nom du bridge | ||
20 | + | ||
21 | +#condition de bordure pour le dossier Bridges | ||
22 | +if [[ ! -d "$REPERTOIRE/baleine/Bridges" ]]; then | ||
23 | + mkdir -p $REPERTOIRE/baleine/Bridges && mv $NOM_BRIDGE.manifest $REPERTOIRE/baleine/Bridges | ||
24 | +fi | ||
25 | +mv $NOM_BRIDGE.manifest $REPERTOIRE/baleine/Bridges | ||
0 | \ No newline at end of file | 26 | \ No newline at end of file |
1 | +++ a/create_container.sh | ||
@@ -0,0 +1,68 @@ | @@ -0,0 +1,68 @@ | ||
1 | +#!/bin/bash | ||
2 | +set -x | ||
3 | +REPERTOIRE=${PWD} | ||
4 | +NOM_IMAGE=$3; | ||
5 | +#LIM_MEMORY=$4; NOT YET | ||
6 | +NOM_CONTAINER=$4; | ||
7 | +ADDR_IPV4=$5; | ||
8 | +NOM_BRIDGE=$6; | ||
9 | +PROGRAM=$7; | ||
10 | + | ||
11 | + | ||
12 | +#Check existence image, bridge | ||
13 | + | ||
14 | + | ||
15 | +#On veut récupérer le chemin de l'image | ||
16 | +PATH_IMAGE= grep chemin $PATH_MANIFEST/$NOM_IMAGE.manifest | cut -d':' -f2 | ||
17 | + | ||
18 | +#on fait une copie dans /var/BaleineImages pour mount depuis le conteneur | ||
19 | +if [[ ! -d "$PATH_BALEINE/containers/$NOM_CONTAINER" ]]; then | ||
20 | + mkdir -p $PATH_BALEINE/containers/$NOM_CONTAINER #&& cp $PATH_IMAGE $PATH_BALEINE/containers/$NOM_CONTAINER/ | ||
21 | +fi | ||
22 | + | ||
23 | +cp $PATH_IMAGE $PATH_BALEINE/containers/$NOM_CONTAINER/$NOM_IMAGE | ||
24 | + | ||
25 | +#On fait le unshare sur l'image passée en paramètre, | ||
26 | + | ||
27 | +#on monte le système de fichiers | ||
28 | +echo "je vais mount" | ||
29 | +mount -t ext4 -o loop $PATH_BALEINE/containers/$NOM_CONTAINER/$NOM_IMAGE /mnt/baleine/$NOM_CONTAINER | ||
30 | + | ||
31 | +nohup unshare -p -f -m -n -u chroot /mnt/baleine/$NOM_CONTAINER $PROGRAM -c "mount /proc" & | ||
32 | +PID=$! | ||
33 | +echo "j'ai finis le unshare-nohup" | ||
34 | + | ||
35 | +ps axo ppid,pid | grep "^ *$PID" | sed -e 's/.* //' | ||
36 | +echo $PID | ||
37 | + | ||
38 | +# #Enregistrer les infos du conteneur dans un fichier | ||
39 | +# NUMBER=$(cat /dev/urandom | tr -dc '0-9' | fold -w 256 | head -n 1 | sed -e 's/^0*//' | head --bytes 3) | ||
40 | +# if [ "$NUMBER" == "" ]; then | ||
41 | +# NUMBER=0 | ||
42 | +# fi | ||
43 | + | ||
44 | +FILE=$NOM_CONTAINER.manifest | ||
45 | +touch $FILE #création du fichier | ||
46 | +echo "nom_container:$NOM_CONTAINER" >> $FILE #nom de son image | ||
47 | +echo "nom_image:$NOM_IMAGE" >> $FILE #nom de son image | ||
48 | +echo "pid:$PID" >> $FILE #Son PID | ||
49 | +echo "nom_bridge:$NOM_BRIDGE" >> $FILE #SON BRIDGE | ||
50 | + | ||
51 | +if [[ ! -d "$PATH_MANIFEST/containers" ]]; then | ||
52 | + mkdir -p $PATH_MANIFEST/containers | ||
53 | +fi | ||
54 | + | ||
55 | +mv $NOM_CONTAINER.manifest $PATH_MANIFEST/containers/$NOM_CONTAINER.manifest | ||
56 | +#TODO : son interface réseau (bridge) - taille mémoire / limite mémoire | ||
57 | + | ||
58 | +#création de son interface réseau | ||
59 | +#TODO: gerer le cas de plusieurs interfaces sur un meme container | ||
60 | + | ||
61 | +ip link add $NOM_CONTAINER type veth peer name eth0@$NOM_CONTAINER | ||
62 | +ip link set $NOM_CONTAINER master $NOM_BRIDGE | ||
63 | +ip link set $NOM_CONTAINER up | ||
64 | +ip link set eth0@$NOM_CONTAINER netns /proc/$PID/ns/net name eth0 | ||
65 | +ip netns exec /proc/$PID/ns/net ip addr add $ADDR_IPV4 dev eth0 | ||
66 | +#à voir (pour récupérer depuis la commande les n interfaces données et les n bridges ??) | ||
67 | +#grep ipv4 $@ | wc | ||
68 | +#grep ipv4 $@ | cut | ||
0 | \ No newline at end of file | 69 | \ No newline at end of file |
1 | +++ a/create_image.sh | ||
@@ -0,0 +1,65 @@ | @@ -0,0 +1,65 @@ | ||
1 | +#!/bin/bash | ||
2 | +#TOUT MARCHE BIEN ICI | ||
3 | + | ||
4 | +NOM_IMAGE=$3; # L'utilisateur devra spécifier le nom de l'image | ||
5 | +SIZE=$4; #L'utilisateur devra spécifier la taille du disque qu'il souhaite allouer | ||
6 | +REPERTOIRE=$5; #L'utilisateur devra spécifier le chemin ou il mettra l'image | ||
7 | + | ||
8 | +#ici block size vaut 1024 (on alloue par 1 méga) | ||
9 | +# La commande resseblera à : ./baleine.sh image create nom 5120 | ||
10 | + | ||
11 | + | ||
12 | +#condition de bordure pour SIZE | ||
13 | +if [ "$SIZE" -lt 0 ] || [ "$SIZE" -gt 10240 ] || [ -z $SIZE ]; then #vérifie que l'argument size est bien donné, qu'il n'est pas supérieur ou inférieur à 0 / 10240 | ||
14 | + echo "Mauvaise valeur, on met par défaut 10 Giga ! " | ||
15 | + $SIZE=10240 | ||
16 | +fi | ||
17 | + | ||
18 | +mkdir -p /usr/lib/baleine/images | ||
19 | + | ||
20 | +#condition pour le répertoire | ||
21 | +if [[ -z $REPERTOIRE ]]; then #si l'utilisateur oublie de donner le path on utilise celui-ci par défaut | ||
22 | + echo "Il n'y pas eu d'argements donnés pour répertoire, je fais moi même le chemin" | ||
23 | + REPERTOIRE=/var/lib/baleine/images | ||
24 | +fi | ||
25 | + | ||
26 | +#vérification que l'utilisateur donne bien un nom à l'image | ||
27 | +if [[ -z "$NOM_IMAGE" ]]; then | ||
28 | + echo "Il faut donner le nom de l'image ! Relancez la commande avec les bons arguments." | ||
29 | + exit | ||
30 | +fi | ||
31 | +#génération de nombres aléatoires afin de créer à chaque fois un fichier avec un nombre unique (éviter qu'un soit écraser) | ||
32 | +NUMBER=$(cat /dev/urandom | tr -dc '0-9' | fold -w 256 | head -n 1 | sed -e 's/^0*//' | head --bytes 3) | ||
33 | +if [ "$NUMBER" == "" ]; then | ||
34 | + NUMBER=0 | ||
35 | +fi | ||
36 | +echo $REPERTOIRE | ||
37 | +#Crée image | ||
38 | +echo "Je vais commencer à allouer !" | ||
39 | +dd if=/dev/zero of=$REPERTOIRE/$NOM_IMAGE bs=1024k count=$SIZE | ||
40 | +touch $NOM_IMAGE.$NUMBER.manifest | ||
41 | +echo "$NOM_IMAGE" >> $NOM_IMAGE.$NUMBER.manifest #nom de l'image | ||
42 | +echo "$SIZE">> $NOM_IMAGE.$NUMBER.manifest #taille de l'image | ||
43 | +echo "$REPERTOIRE/$NOM_IMAGE">> $NOM_IMAGE.$NUMBER.manifest #son chemin | ||
44 | + | ||
45 | +if [[ ! -d "$REPERTOIRE/baleine/Images" ]]; then | ||
46 | + mkdir -p $REPERTOIRE/baleine/Images && mv $NOM_IMAGE.$NUMBER.manifest $REPERTOIRE/baleine/Images | ||
47 | +fi | ||
48 | +mv $NOM_IMAGE.$NUMBER.manifest $REPERTOIRE/baleine/Images | ||
49 | + | ||
50 | + | ||
51 | + | ||
52 | +#création du système de fichiers au format "ext4" | ||
53 | +mkfs.ext4 $REPERTOIRE/$NOM_IMAGE | ||
54 | + | ||
55 | + | ||
56 | + | ||
57 | +echo "je vais exporter le proxy" | ||
58 | +export http_proxy=http://proxy.polytech-lille.fr:3128 | ||
59 | + | ||
60 | +#Création de l'arborescence Debian avec debootstrap | ||
61 | +echo "Je vais faire le debootstrap" | ||
62 | +debootstrap --include=apache2,vim,nano stable /mnt/$NOM_IMAGE | ||
63 | + | ||
64 | +#On renseigne le fichier fstab du conteneur | ||
65 | +echo "proc /proc proc defaults 0 0" >> /mnt/$NOM_IMAGE/etc/fstab | ||
0 | \ No newline at end of file | 66 | \ No newline at end of file |
1 | +++ a/down_bridge.sh | ||
@@ -0,0 +1,8 @@ | @@ -0,0 +1,8 @@ | ||
1 | +#!/bin/bash | ||
2 | +NOM_BRIDGE=$3; | ||
3 | +#vérification que l'utilisateur donne bien un nom à l'image | ||
4 | +if [[ -z "$NOM_BRIDGE" ]]; then | ||
5 | + echo "Il faut donner le nom du bridge Relancez la commande avec les bons arguments." | ||
6 | + exit | ||
7 | +fi | ||
8 | +ip link set $NOM_BRIDGE down | ||
0 | \ No newline at end of file | 9 | \ No newline at end of file |
1 | +++ a/help.sh | ||
@@ -0,0 +1,21 @@ | @@ -0,0 +1,21 @@ | ||
1 | +#!/bin/bash | ||
2 | + printf "Baleine est un outil simple de gestion de conteneur.\n" | ||
3 | + printf "Utilisation: \n \n" | ||
4 | + printf "\t \t image <commande> [arguments]\n" | ||
5 | + printf "Les commandes sont :\n \n" | ||
6 | + printf "\t \t %-10s %-10s \n" "create <NOM_IMAGE> <TAILLE_IMAGE> <REPERTOIRE_IMAGE>" "Créer une image " | ||
7 | + printf "\t \t %-10s %-10s \n" "list <>" "Liste le manifest de chaque image." | ||
8 | + printf "\t \t %-10s %-10s \n \n" "remove <NOM_IMAGE_A_SUPPRIMER>" "supprime l'image passée en argument " | ||
9 | + | ||
10 | + printf "\t \t bridge <commande> [arguments]\n" | ||
11 | + printf "Les commandes sont :\n \n" | ||
12 | + printf "\t \t %-10s %-10s \n" "create <NOM_IMAGE> <TAILLE_IMAGE> <REPERTOIRE_IMAGE>" "Créer une image avec " | ||
13 | + printf "\t \t %-10s %-10s \n" "list <>" "Liste le manifest de chaque image." | ||
14 | + printf "\t \t %-10s %-10s \n \n" "remove <NOM_IMAGE_A_SUPPRIMER>" "supprime l'image passée en argument " | ||
15 | + | ||
16 | + printf "\t \t container <commande> [arguments]\n" | ||
17 | + printf "Les commandes sont :\n \n" | ||
18 | + printf "\t \t %-10s %-10s \n" "create <NOM_IMAGE> <TAILLE_IMAGE> <REPERTOIRE_IMAGE>" "Créer une image avec " | ||
19 | + printf "\t \t %-10s %-10s \n" "list <>" "Liste le manifest de chaque image." | ||
20 | + printf "\t \t %-10s %-10s \n \n" "remove <NOM_IMAGE_A_SUPPRIMER>" "supprime l'image passée en argument " | ||
21 | + | ||
0 | \ No newline at end of file | 22 | \ No newline at end of file |
1 | +++ a/image.sh | ||
@@ -0,0 +1,21 @@ | @@ -0,0 +1,21 @@ | ||
1 | +#!/bin/bash | ||
2 | + | ||
3 | +case $2 in | ||
4 | + | ||
5 | + "create") | ||
6 | + #Si on veut creer une image (qu'on a apellé le script ./balaine.sh image create) | ||
7 | + bash create_image.sh "$@" | ||
8 | + ;; | ||
9 | + "list") | ||
10 | + #Si on veut lister les images (qu'on a apellé le script ./balaine.sh image list) | ||
11 | + bash list_images.sh "$@" | ||
12 | + ;; | ||
13 | + "import") | ||
14 | + bash import_container.sh "$@" | ||
15 | + ;; | ||
16 | + "export") | ||
17 | + bash export_container.sh "$@" | ||
18 | + ;; | ||
19 | + "remove") | ||
20 | + bash remove_image.sh "$@" | ||
21 | +esac | ||
0 | \ No newline at end of file | 22 | \ No newline at end of file |
1 | +++ a/remove_bridge.sh | ||
@@ -0,0 +1,13 @@ | @@ -0,0 +1,13 @@ | ||
1 | +#!/bin/bash | ||
2 | +NOM_BRIDGE_TO_REMOVE=$3; | ||
3 | +REPERTOIRE=${PWD} | ||
4 | + | ||
5 | +#vérification que l'utilisateur donne bien un nom à l'image | ||
6 | +if [[ -z "$NOM_BRIDGE_TO_REMOVE" ]]; then | ||
7 | + echo "Il faut donner le nom du bridge à supprimer ! Relancez la commande avec les bons arguments." | ||
8 | + exit | ||
9 | +fi | ||
10 | +chmod -R 755 $REPERTOIRE/baleine | ||
11 | +rm $REPERTOIRE/baleine/Bridges/$NOM_BRIDGE_TO_REMOVE.* | ||
12 | +ip link delete $NOM_BRIDGE_TO_REMOVE type bridge | ||
13 | +delbr |
1 | +++ a/remove_image.sh | ||
@@ -0,0 +1,12 @@ | @@ -0,0 +1,12 @@ | ||
1 | +#!/bin/bash | ||
2 | +NOM_IMAGE_TO_REMOVE=$3; | ||
3 | +REPERTOIRE=${PWD} | ||
4 | + | ||
5 | +#vérification que l'utilisateur donne bien un nom à l'image | ||
6 | +if [[ -z "$NOM_IMAGE_TO_REMOVE" ]]; then | ||
7 | + echo "Il faut donner le nom de l'image ! Relancez la commande avec les bons arguments." | ||
8 | + exit | ||
9 | +fi | ||
10 | +chmod -R 755 $REPERTOIRE/baleine | ||
11 | +rm $REPERTOIRE/baleine/Images/$NOM_IMAGE_TO_REMOVE.manifest | ||
12 | +rm $REPERTOIRE/$NOM_IMAGE_TO_REMOVE | ||
0 | \ No newline at end of file | 13 | \ No newline at end of file |
1 | +++ a/up_bridge.sh | ||
@@ -0,0 +1,8 @@ | @@ -0,0 +1,8 @@ | ||
1 | +#!/bin/bash | ||
2 | +NOM_BRIDGE=$3; | ||
3 | +#vérification que l'utilisateur donne bien un nom à l'image | ||
4 | +if [[ -z "$NOM_BRIDGE" ]]; then | ||
5 | + echo "Il faut donner le nom du bridge Relancez la commande avec les bons arguments." | ||
6 | + exit | ||
7 | +fi | ||
8 | +ip link set $NOM_BRIDGE up | ||
0 | \ No newline at end of file | 9 | \ No newline at end of file |