Commit 3e47098830d35ee71c7d44f97b4bc4a333125695

Authored by hmalti
0 parents

First commit

baleine.sh 0 → 100755
  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
... ...
bridge.sh 0 → 100644
  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
... ...
container.sh 0 → 100644
  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
... ...
create_bridge.sh 0 → 100644
  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
... ...
create_container.sh 0 → 100644
  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
... ...
create_image.sh 0 → 100644
  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
... ...
down_bridge.sh 0 → 100644
  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
... ...
help.sh 0 → 100644
  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
... ...
image.sh 0 → 100644
  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
... ...
list_bridges.sh 0 → 100644
  1 +++ a/list_bridges.sh
... ... @@ -0,0 +1,9 @@
  1 +#!/bin/bash
  2 +cd $PWD/baleine/Bridges
  3 +
  4 +for eachfile in ./*.manifest
  5 +do
  6 + echo $eachfile
  7 + val=$(cat "$eachfile")
  8 + echo $val
  9 +done
0 10 \ No newline at end of file
... ...
list_container.sh 0 → 100644
  1 +++ a/list_container.sh
... ... @@ -0,0 +1,10 @@
  1 +#!/bin/bash
  2 +
  3 +cd $PWD/baleine/Containers
  4 +
  5 +for eachfile in ./*.manifest
  6 +do
  7 + echo $eachfile
  8 + val=$(cat "$eachfile")
  9 + echo $val
  10 +done
... ...
list_images.sh 0 → 100644
  1 +++ a/list_images.sh
... ... @@ -0,0 +1,10 @@
  1 +#!/bin/bash
  2 +
  3 +cd $PWD/baleine/Images
  4 +
  5 +for eachfile in ./*.manifest
  6 +do
  7 + echo $eachfile
  8 + val=$(cat "$eachfile")
  9 + echo $val
  10 +done
... ...
remove_bridge.sh 0 → 100644
  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
... ...
remove_image.sh 0 → 100644
  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
... ...
up_bridge.sh 0 → 100644
  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
... ...