diff --git a/baleine.sh b/baleine.sh new file mode 100755 index 0000000..ae7c639 --- /dev/null +++ b/baleine.sh @@ -0,0 +1,43 @@ + +#!/bin/bash + +#Ce code est le point d'entrée de l'application, c'est lui qui est apellé quand on écrit ./balaine container create + +#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 +#script qui va traiter ces cas, on garde les fichiers courts mais simples + + +export PATH_BALEINE=/var/lib/baleine +export PATH_MANIFEST=$PATH_BALEINE/manifest + +if [ $# -lt 1 ]; then + printf "Baleine est un outil simple de gestion de conteneur.\n" + printf "Utilisation: \n \n" + printf "\t \t baleine [arguments]\n" + printf "Les commandes sont :\n \n" + printf "\t \t %-10s %-10s \n" "container" "Lance ou stoppe un contenneur." + printf "\t \t %-10s %-10s \n" "network" "Créée ou supprime des interfaces réseau." + printf "\t \t %-10s %-10s \n \n" "image" "Créer ou supprime des images de contenneurs." + printf "Utilisez baleine help pour plus d'informations à propos d'une commande.\n" +fi + +case "$1" in + "container") + #Si on a apelé ./baleine.sh container create par exemple, on va apeller le script container.sh qui va traiter les + #opérations sur les containers, et $@ permet de lui passer tous les arguments qu'on a passé à baleine.sh + #autrement dit, ./baleine.sh container create apellera le script container.sh avec les arguments $1=container et $2=create + bash container.sh "$@" + ;; + "network") + bash network.sh "$@" + ;; + "image") + bash image.sh "$@" + ;; + "bridge") + bash bridge.sh "$@" + ;; + "help") + bash help.sh "$@" + ;; +esac \ No newline at end of file diff --git a/bridge.sh b/bridge.sh new file mode 100644 index 0000000..b538a31 --- /dev/null +++ b/bridge.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +case $2 in + + "create") + #Si on veut creer un bridge (qu'on a apellé le script ./balaine.sh bridge create) + bash create_bridge.sh "$@" + ;; + "list") + #Si on veut lister les bridges (qu'on a apellé le script ./balaine.sh bridge list) + bash list_bridges.sh "$@" + ;; + "remove") + bash remove_bridge.sh "$@" + ;; + "up") + bash up_bridge.sh "$@" + ;; + "down") + bash down_bridge.sh "$@" +esac \ No newline at end of file diff --git a/container.sh b/container.sh new file mode 100644 index 0000000..2857eca --- /dev/null +++ b/container.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +case $2 in + + "create") + #Si on veut creer un container (qu'on a apellé le script ./baleine.sh container create) + bash create_container.sh "$@" + ;; + "list") + #Si on veut lister les containers qui tournent (qu'on a apellé le script ./baleine.sh container list) + bash list_container.sh "$@" + ;; + "stop") + bash stop_container.sh "$@" + ;; + +esac \ No newline at end of file diff --git a/create_bridge.sh b/create_bridge.sh new file mode 100644 index 0000000..048ad5d --- /dev/null +++ b/create_bridge.sh @@ -0,0 +1,25 @@ +#!/bin/bash +NOM_BRIDGE=$3; +ADDR_IPV4=$4; +REPERTOIRE=${PWD} + + +#condition sur le nbre d'arguments +if [[ -z "$NOM_BRIDGE" ]]; then + echo "Il faut donner le nom du bridge ! Relancez la commande avec les bons arguments." + exit +fi +#création du bridge +ip link add $NOM_BRIDGE type bridge +ip a add dev $NOM_BRIDGE $ADDR_IPV4 +ip link set $NOM_BRIDGE down +ip link set $NOM_BRIDGE up + +touch $NOM_BRIDGE.manifest # On crée un fichier contenant les infos du bridge +echo "$NOM_BRIDGE" >> $NOM_BRIDGE.manifest #nom du bridge + +#condition de bordure pour le dossier Bridges +if [[ ! -d "$REPERTOIRE/baleine/Bridges" ]]; then + mkdir -p $REPERTOIRE/baleine/Bridges && mv $NOM_BRIDGE.manifest $REPERTOIRE/baleine/Bridges +fi +mv $NOM_BRIDGE.manifest $REPERTOIRE/baleine/Bridges \ No newline at end of file diff --git a/create_container.sh b/create_container.sh new file mode 100644 index 0000000..44b7dd6 --- /dev/null +++ b/create_container.sh @@ -0,0 +1,68 @@ +#!/bin/bash +set -x +REPERTOIRE=${PWD} +NOM_IMAGE=$3; +#LIM_MEMORY=$4; NOT YET +NOM_CONTAINER=$4; +ADDR_IPV4=$5; +NOM_BRIDGE=$6; +PROGRAM=$7; + + +#Check existence image, bridge + + +#On veut récupérer le chemin de l'image +PATH_IMAGE= grep chemin $PATH_MANIFEST/$NOM_IMAGE.manifest | cut -d':' -f2 + +#on fait une copie dans /var/BaleineImages pour mount depuis le conteneur +if [[ ! -d "$PATH_BALEINE/containers/$NOM_CONTAINER" ]]; then + mkdir -p $PATH_BALEINE/containers/$NOM_CONTAINER #&& cp $PATH_IMAGE $PATH_BALEINE/containers/$NOM_CONTAINER/ +fi + +cp $PATH_IMAGE $PATH_BALEINE/containers/$NOM_CONTAINER/$NOM_IMAGE + +#On fait le unshare sur l'image passée en paramètre, + +#on monte le système de fichiers +echo "je vais mount" +mount -t ext4 -o loop $PATH_BALEINE/containers/$NOM_CONTAINER/$NOM_IMAGE /mnt/baleine/$NOM_CONTAINER + +nohup unshare -p -f -m -n -u chroot /mnt/baleine/$NOM_CONTAINER $PROGRAM -c "mount /proc" & +PID=$! +echo "j'ai finis le unshare-nohup" + +ps axo ppid,pid | grep "^ *$PID" | sed -e 's/.* //' +echo $PID + +# #Enregistrer les infos du conteneur dans un fichier +# NUMBER=$(cat /dev/urandom | tr -dc '0-9' | fold -w 256 | head -n 1 | sed -e 's/^0*//' | head --bytes 3) +# if [ "$NUMBER" == "" ]; then +# NUMBER=0 +# fi + +FILE=$NOM_CONTAINER.manifest +touch $FILE #création du fichier +echo "nom_container:$NOM_CONTAINER" >> $FILE #nom de son image +echo "nom_image:$NOM_IMAGE" >> $FILE #nom de son image +echo "pid:$PID" >> $FILE #Son PID +echo "nom_bridge:$NOM_BRIDGE" >> $FILE #SON BRIDGE + +if [[ ! -d "$PATH_MANIFEST/containers" ]]; then + mkdir -p $PATH_MANIFEST/containers +fi + +mv $NOM_CONTAINER.manifest $PATH_MANIFEST/containers/$NOM_CONTAINER.manifest +#TODO : son interface réseau (bridge) - taille mémoire / limite mémoire + +#création de son interface réseau +#TODO: gerer le cas de plusieurs interfaces sur un meme container + +ip link add $NOM_CONTAINER type veth peer name eth0@$NOM_CONTAINER +ip link set $NOM_CONTAINER master $NOM_BRIDGE +ip link set $NOM_CONTAINER up +ip link set eth0@$NOM_CONTAINER netns /proc/$PID/ns/net name eth0 +ip netns exec /proc/$PID/ns/net ip addr add $ADDR_IPV4 dev eth0 +#à voir (pour récupérer depuis la commande les n interfaces données et les n bridges ??) +#grep ipv4 $@ | wc +#grep ipv4 $@ | cut \ No newline at end of file diff --git a/create_image.sh b/create_image.sh new file mode 100644 index 0000000..31fe492 --- /dev/null +++ b/create_image.sh @@ -0,0 +1,65 @@ +#!/bin/bash +#TOUT MARCHE BIEN ICI + +NOM_IMAGE=$3; # L'utilisateur devra spécifier le nom de l'image +SIZE=$4; #L'utilisateur devra spécifier la taille du disque qu'il souhaite allouer +REPERTOIRE=$5; #L'utilisateur devra spécifier le chemin ou il mettra l'image + +#ici block size vaut 1024 (on alloue par 1 méga) +# La commande resseblera à : ./baleine.sh image create nom 5120 + + +#condition de bordure pour SIZE +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 + echo "Mauvaise valeur, on met par défaut 10 Giga ! " + $SIZE=10240 +fi + +mkdir -p /usr/lib/baleine/images + +#condition pour le répertoire +if [[ -z $REPERTOIRE ]]; then #si l'utilisateur oublie de donner le path on utilise celui-ci par défaut + echo "Il n'y pas eu d'argements donnés pour répertoire, je fais moi même le chemin" + REPERTOIRE=/var/lib/baleine/images +fi + +#vérification que l'utilisateur donne bien un nom à l'image +if [[ -z "$NOM_IMAGE" ]]; then + echo "Il faut donner le nom de l'image ! Relancez la commande avec les bons arguments." + exit +fi +#génération de nombres aléatoires afin de créer à chaque fois un fichier avec un nombre unique (éviter qu'un soit écraser) +NUMBER=$(cat /dev/urandom | tr -dc '0-9' | fold -w 256 | head -n 1 | sed -e 's/^0*//' | head --bytes 3) +if [ "$NUMBER" == "" ]; then + NUMBER=0 +fi +echo $REPERTOIRE +#Crée image +echo "Je vais commencer à allouer !" +dd if=/dev/zero of=$REPERTOIRE/$NOM_IMAGE bs=1024k count=$SIZE +touch $NOM_IMAGE.$NUMBER.manifest +echo "$NOM_IMAGE" >> $NOM_IMAGE.$NUMBER.manifest #nom de l'image +echo "$SIZE">> $NOM_IMAGE.$NUMBER.manifest #taille de l'image +echo "$REPERTOIRE/$NOM_IMAGE">> $NOM_IMAGE.$NUMBER.manifest #son chemin + +if [[ ! -d "$REPERTOIRE/baleine/Images" ]]; then + mkdir -p $REPERTOIRE/baleine/Images && mv $NOM_IMAGE.$NUMBER.manifest $REPERTOIRE/baleine/Images +fi +mv $NOM_IMAGE.$NUMBER.manifest $REPERTOIRE/baleine/Images + + + +#création du système de fichiers au format "ext4" +mkfs.ext4 $REPERTOIRE/$NOM_IMAGE + + + +echo "je vais exporter le proxy" +export http_proxy=http://proxy.polytech-lille.fr:3128 + +#Création de l'arborescence Debian avec debootstrap +echo "Je vais faire le debootstrap" +debootstrap --include=apache2,vim,nano stable /mnt/$NOM_IMAGE + +#On renseigne le fichier fstab du conteneur +echo "proc /proc proc defaults 0 0" >> /mnt/$NOM_IMAGE/etc/fstab \ No newline at end of file diff --git a/down_bridge.sh b/down_bridge.sh new file mode 100644 index 0000000..d14f1e1 --- /dev/null +++ b/down_bridge.sh @@ -0,0 +1,8 @@ +#!/bin/bash +NOM_BRIDGE=$3; +#vérification que l'utilisateur donne bien un nom à l'image +if [[ -z "$NOM_BRIDGE" ]]; then + echo "Il faut donner le nom du bridge Relancez la commande avec les bons arguments." + exit +fi +ip link set $NOM_BRIDGE down \ No newline at end of file diff --git a/help.sh b/help.sh new file mode 100644 index 0000000..e94ae49 --- /dev/null +++ b/help.sh @@ -0,0 +1,21 @@ +#!/bin/bash + printf "Baleine est un outil simple de gestion de conteneur.\n" + printf "Utilisation: \n \n" + printf "\t \t image [arguments]\n" + printf "Les commandes sont :\n \n" + printf "\t \t %-10s %-10s \n" "create " "Créer une image " + printf "\t \t %-10s %-10s \n" "list <>" "Liste le manifest de chaque image." + printf "\t \t %-10s %-10s \n \n" "remove " "supprime l'image passée en argument " + + printf "\t \t bridge [arguments]\n" + printf "Les commandes sont :\n \n" + printf "\t \t %-10s %-10s \n" "create " "Créer une image avec " + printf "\t \t %-10s %-10s \n" "list <>" "Liste le manifest de chaque image." + printf "\t \t %-10s %-10s \n \n" "remove " "supprime l'image passée en argument " + + printf "\t \t container [arguments]\n" + printf "Les commandes sont :\n \n" + printf "\t \t %-10s %-10s \n" "create " "Créer une image avec " + printf "\t \t %-10s %-10s \n" "list <>" "Liste le manifest de chaque image." + printf "\t \t %-10s %-10s \n \n" "remove " "supprime l'image passée en argument " + \ No newline at end of file diff --git a/image.sh b/image.sh new file mode 100644 index 0000000..6458af3 --- /dev/null +++ b/image.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +case $2 in + + "create") + #Si on veut creer une image (qu'on a apellé le script ./balaine.sh image create) + bash create_image.sh "$@" + ;; + "list") + #Si on veut lister les images (qu'on a apellé le script ./balaine.sh image list) + bash list_images.sh "$@" + ;; + "import") + bash import_container.sh "$@" + ;; + "export") + bash export_container.sh "$@" + ;; + "remove") + bash remove_image.sh "$@" +esac \ No newline at end of file diff --git a/list_bridges.sh b/list_bridges.sh new file mode 100644 index 0000000..7dc5db8 --- /dev/null +++ b/list_bridges.sh @@ -0,0 +1,9 @@ +#!/bin/bash +cd $PWD/baleine/Bridges + +for eachfile in ./*.manifest +do + echo $eachfile + val=$(cat "$eachfile") + echo $val +done \ No newline at end of file diff --git a/list_container.sh b/list_container.sh new file mode 100644 index 0000000..ebb43f0 --- /dev/null +++ b/list_container.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +cd $PWD/baleine/Containers + +for eachfile in ./*.manifest +do + echo $eachfile + val=$(cat "$eachfile") + echo $val +done diff --git a/list_images.sh b/list_images.sh new file mode 100644 index 0000000..132e45b --- /dev/null +++ b/list_images.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +cd $PWD/baleine/Images + +for eachfile in ./*.manifest +do + echo $eachfile + val=$(cat "$eachfile") + echo $val +done diff --git a/remove_bridge.sh b/remove_bridge.sh new file mode 100644 index 0000000..460fda4 --- /dev/null +++ b/remove_bridge.sh @@ -0,0 +1,13 @@ +#!/bin/bash +NOM_BRIDGE_TO_REMOVE=$3; +REPERTOIRE=${PWD} + +#vérification que l'utilisateur donne bien un nom à l'image +if [[ -z "$NOM_BRIDGE_TO_REMOVE" ]]; then + echo "Il faut donner le nom du bridge à supprimer ! Relancez la commande avec les bons arguments." + exit +fi +chmod -R 755 $REPERTOIRE/baleine +rm $REPERTOIRE/baleine/Bridges/$NOM_BRIDGE_TO_REMOVE.* +ip link delete $NOM_BRIDGE_TO_REMOVE type bridge +delbr diff --git a/remove_image.sh b/remove_image.sh new file mode 100644 index 0000000..eaad778 --- /dev/null +++ b/remove_image.sh @@ -0,0 +1,12 @@ +#!/bin/bash +NOM_IMAGE_TO_REMOVE=$3; +REPERTOIRE=${PWD} + +#vérification que l'utilisateur donne bien un nom à l'image +if [[ -z "$NOM_IMAGE_TO_REMOVE" ]]; then + echo "Il faut donner le nom de l'image ! Relancez la commande avec les bons arguments." + exit +fi +chmod -R 755 $REPERTOIRE/baleine +rm $REPERTOIRE/baleine/Images/$NOM_IMAGE_TO_REMOVE.manifest +rm $REPERTOIRE/$NOM_IMAGE_TO_REMOVE \ No newline at end of file diff --git a/up_bridge.sh b/up_bridge.sh new file mode 100644 index 0000000..66dcc61 --- /dev/null +++ b/up_bridge.sh @@ -0,0 +1,8 @@ +#!/bin/bash +NOM_BRIDGE=$3; +#vérification que l'utilisateur donne bien un nom à l'image +if [[ -z "$NOM_BRIDGE" ]]; then + echo "Il faut donner le nom du bridge Relancez la commande avec les bons arguments." + exit +fi +ip link set $NOM_BRIDGE up \ No newline at end of file -- libgit2 0.21.2