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 @@ |
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 | 44 | \ No newline at end of file | ... | ... |
1 | +++ a/bridge.sh | |
... | ... | @@ -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 | 22 | \ No newline at end of file | ... | ... |
1 | +++ a/container.sh | |
... | ... | @@ -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 | 18 | \ No newline at end of file | ... | ... |
1 | +++ a/create_bridge.sh | |
... | ... | @@ -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 | 26 | \ No newline at end of file | ... | ... |
1 | +++ a/create_container.sh | |
... | ... | @@ -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 | 69 | \ No newline at end of file | ... | ... |
1 | +++ a/create_image.sh | |
... | ... | @@ -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 | 66 | \ No newline at end of file | ... | ... |
1 | +++ a/down_bridge.sh | |
... | ... | @@ -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 | 9 | \ No newline at end of file | ... | ... |
1 | +++ a/help.sh | |
... | ... | @@ -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 | 22 | \ No newline at end of file | ... | ... |
1 | +++ a/image.sh | |
... | ... | @@ -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 | 22 | \ No newline at end of file | ... | ... |
1 | +++ a/remove_bridge.sh | |
... | ... | @@ -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 @@ |
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 | 13 | \ No newline at end of file | ... | ... |
1 | +++ a/up_bridge.sh | |
... | ... | @@ -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 | 9 | \ No newline at end of file | ... | ... |