From 6b8f3a075d6c9f9f275786a6309acb294931a8be Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Sat, 5 Nov 2016 00:18:12 +0100 Subject: [PATCH] Finalisation de lxc_check.sh --- README.md | 14 +++-- package_check.sh | 2 +- sub_scripts/lxc_build.sh | 1 + sub_scripts/lxc_check.sh | 122 ++++++++++++++++++------------------ sub_scripts/lxc_launcher.sh | 2 +- sub_scripts/start.sh | 44 ------------- 6 files changed, 71 insertions(+), 114 deletions(-) mode change 100644 => 100755 sub_scripts/lxc_check.sh delete mode 100755 sub_scripts/start.sh diff --git a/README.md b/README.md index 22b3abe..72e2430 100644 --- a/README.md +++ b/README.md @@ -118,9 +118,9 @@ Si un test est absent de la liste, il sera ignoré. Cela revient à le noter à --- Le script `package_check.sh` accepte 5 arguments en plus du package à tester. - `--bash-mode`: Rend le script autonome. Aucune intervention de l'utilisateur ne sera nécessaire. - La valeur de auto_remove est ignorée. (Incompatible avec --build-lxc) + La valeur de auto_remove est ignorée. - `--no-lxc`: N'utilise pas la virtualisation en conteneur LXC. Les tests seront effectué directement sur la machine hôte. -- `--build-lxc`: Installe LXC et créer le conteneur debian Yunohost si nécessaire. (Incompatible avec --bash-mode) +- `--build-lxc`: Installe LXC et créer le conteneur debian Yunohost si nécessaire. - `--force-install-ok`: Force la réussite des installations, même si elles échouent. Permet d'effectuer les tests qui suivent même si l'installation a échouée. - `--help`: Affiche l'aide du script @@ -132,12 +132,13 @@ L'usage de LXC apporte une meilleure stabilité au processus de test, un test de Il faut prévoir également un espace suffisant sur l'hôte, au minimum 4Go pour le conteneur, son snapshot et sa copie de sauvegarde. -L'usage de LXC est facilité par 3 scripts, permettant de gérer la création, la mise à jour et la suppression. +L'usage de LXC est facilité par 4 scripts, permettant de gérer la création, la mise à jour, la suppression et la réparation du conteneur. - `lxc_build.sh`: lxc_build installe LXC et ses dépendances, puis créer le conteneur debian. Il ajoute ensuite le support réseau, installe Yunohost et le configure. Et enfin configure un accès ssh. L'accès ssh par défaut est `ssh -t pchecker_lxc` - `lxc_upgrade.sh`: Effectue la mise à jour du conteneur à l'aide d'apt-get et recréer le snapshot. - `lxc_remove.sh`: Supprime le conteneur LXC, son snapshot et sa sauvegarde. Désinstalle LXC et déconfigure le réseau associé. +- `lxc_check.sh`: Vérifie le conteneur LXC et tente de le réparer si nécessaire. --- --- @@ -257,9 +258,9 @@ If a test is not in the list, it will be ignored. It's similar to marked at 0. --- The `package_check.sh` script accept 5 arguments in addition of package to be checked. - `--bash-mode`: The script will work without user intervention. - auto_remove value is ignored (Not compatible with --build-lxc) + auto_remove value is ignored - `--no-lxc`: Not use virtualization with LXC container. All tests will perform directly on the hosts machine. -- `--build-lxc`: Install LXC and create the Debian Yunohost container if necessary. (Not compatible with --bash-mode) +- `--build-lxc`: Install LXC and create the Debian Yunohost container if necessary. - `--force-install-ok`: Force success of installation, even if they fail. Allow to perform following tests even if installation fail. - `--help`: Display help. @@ -271,9 +272,10 @@ Using LXC provides better stability to test process, a failed remove test doesn' There must also be enough space on the host, at least 4GB for the container, its snapshot and backup. -Using LXC is simplified by 3 scripts, allowing to manage the creation, updating and deleting. +Using LXC is simplified by 4 scripts, allowing to manage the creation, updating, deleting and repairing of container. - `lxc_build.sh`: lxc_build install LXC and its dependencies, then create a Debian container. It add network support, install Yunohost and configure it. And then configure ssh. The default ssh access is `ssh -t pchecker_lxc` - `lxc_upgrade.sh`: Perform a upgrade of the container with apt-get and recreate the snapshot. - `lxc_remove.sh`: Delete the LXC container, its snapshot and backup. Uninstall LXC and deconfigures the associated network. +- `lxc_check.sh`: Check the LXC container and try to fix it if necessary. diff --git a/package_check.sh b/package_check.sh index 59169b2..ef96918 100755 --- a/package_check.sh +++ b/package_check.sh @@ -3,7 +3,7 @@ # Arguments du script # --bash-mode Mode bash, le script est autonome. Il ignore la valeur de $auto_remove # --no-lxc N'utilise pas la virtualisation en conteneur lxc. La virtualisation est utilisée par défaut si disponible. -# --build-lxc Installe lxc et créer la machine si nécessaire. Incompatible avec --bash-mode en raison de la connexion ssh à valider lors du build. +# --build-lxc Installe lxc et créer la machine si nécessaire. # --force-install-ok Force la réussite des installations, même si elles échouent. Permet d'effectuer les tests qui suivent même si l'installation a échouée. # --help Affiche l'aide du script diff --git a/sub_scripts/lxc_build.sh b/sub_scripts/lxc_build.sh index 0faf28c..ecdde86 100755 --- a/sub_scripts/lxc_build.sh +++ b/sub_scripts/lxc_build.sh @@ -90,6 +90,7 @@ User pchecker IdentityFile $HOME/.ssh/$LXC_NAME EOF +ssh-keyscan -H $PLAGE_IP.2 >> ~/.ssh/known_hosts ssh $ARG_SSH $LXC_NAME "exit 0" # Initie une premier connexion SSH pour valider la clé. if [ "$?" -ne 0 ]; then # Si l'utilisateur tarde trop, la connexion sera refusée... ??? ssh $ARG_SSH $LXC_NAME "exit 0" # Initie une premier connexion SSH pour valider la clé. diff --git a/sub_scripts/lxc_check.sh b/sub_scripts/lxc_check.sh old mode 100644 new mode 100755 index ded1e2e..bef3052 --- a/sub_scripts/lxc_check.sh +++ b/sub_scripts/lxc_check.sh @@ -3,13 +3,6 @@ # Test différents aspect du conteneur pour chercher d'éventuelles erreurs. # Et tente de réparer si possible... -# !!! ATTENTION, CE SCRIPT DOIT ENCORE ÊTRE TESTÉ SUR LES POINTS SUIVANTS: -# ip forwarding pas activé -# configuration réseau LXC du conteneur incorrecte -# fichier network/interfaces du conteneur introuvable -# fichier network/interfaces du conteneur présent.\nMais il va être réécrit par précaution -# Yunohost semble mal installé - # Récupère le dossier du script if [ "${0:0:1}" == "/" ]; then script_dir="$(dirname "$0")"; else script_dir="$(echo $PWD/$(dirname "$0" | cut -d '.' -f2) | sed 's@/$@@')"; fi @@ -115,6 +108,63 @@ RESTORE_CONTAINER () { fi } +LXC_NETWORK_CONFIG () { + lxc_network=0 + if ! sudo cat /var/lib/lxc/$LXC_NAME/config | grep -q "^lxc.network.type = veth"; then + lxc_network=1 # Si la ligne de la config réseau est absente, c'est une erreur. + if sudo cat /var/lib/lxc/$LXC_NAME/config | grep -q ".*lxc.network.type"; then # Si la ligne est incorrecte, elle est corrigée. + sudo sed -i "s/.*lxc.network.type.*/lxc.network.type = veth/g" /var/lib/lxc/$LXC_NAME/config + else # Sinon elle est ajoutée. + echo "lxc.network.type = veth" | sudo tee -a /var/lib/lxc/$LXC_NAME/config + fi + fi + if ! sudo cat /var/lib/lxc/$LXC_NAME/config | grep -q "^lxc.network.flags = up"; then + lxc_network=1 + if sudo cat /var/lib/lxc/$LXC_NAME/config | grep -q ".*lxc.network.flags"; then + sudo sed -i "s/.*lxc.network.flags.*/lxc.network.flags = up/g" /var/lib/lxc/$LXC_NAME/config + else + echo "lxc.network.flags = up" | sudo tee -a /var/lib/lxc/$LXC_NAME/config + fi + fi + if ! sudo cat /var/lib/lxc/$LXC_NAME/config | grep -q "^lxc.network.link = lxc-pchecker"; then + lxc_network=1 + if sudo cat /var/lib/lxc/$LXC_NAME/config | grep -q ".*lxc.network.link"; then + sudo sed -i "s/.*lxc.network.link.*/lxc.network.link = lxc-pchecker/g" /var/lib/lxc/$LXC_NAME/config + else + echo "lxc.network.link = lxc-pchecker" | sudo tee -a /var/lib/lxc/$LXC_NAME/config + fi + fi + if ! sudo cat /var/lib/lxc/$LXC_NAME/config | grep -q "^lxc.network.name = eth0"; then + lxc_network=1 + if sudo cat /var/lib/lxc/$LXC_NAME/config | grep -q ".*lxc.network.name"; then + sudo sed -i "s/.*lxc.network.name.*/lxc.network.name = eth0/g" /var/lib/lxc/$LXC_NAME/config + else + echo "lxc.network.name = eth0" | sudo tee -a /var/lib/lxc/$LXC_NAME/config + fi + fi + if ! sudo cat /var/lib/lxc/$LXC_NAME/config | grep -q "^lxc.network.veth.pair = $LXC_NAME"; then + lxc_network=1 + if sudo cat /var/lib/lxc/$LXC_NAME/config | grep -q ".*lxc.network.veth.pair"; then + sudo sed -i "s/.*lxc.network.veth.pair.*/lxc.network.veth.pair = $LXC_NAME/g" /var/lib/lxc/$LXC_NAME/config + else + echo "lxc.network.veth.pair = $LXC_NAME" | sudo tee -a /var/lib/lxc/$LXC_NAME/config + fi + fi + if ! sudo cat /var/lib/lxc/$LXC_NAME/config | grep -q "^lxc.network.hwaddr = 00:FF:AA:00:00:01"; then + lxc_network=1 + if sudo cat /var/lib/lxc/$LXC_NAME/config | grep -q ".*lxc.network.hwaddr"; then + sudo sed -i "s/.*lxc.network.hwaddr.*/lxc.network.hwaddr = 00:FF:AA:00:00:01/g" /var/lib/lxc/$LXC_NAME/config + else + echo "lxc.network.hwaddr = 00:FF:AA:00:00:01" | sudo tee -a /var/lib/lxc/$LXC_NAME/config + fi + fi + if [ "$lxc_network" -eq 1 ]; then + echo -e "\e[91mLa configuration réseau LXC du conteneur est incorrecte et a été corrigée.\e[0m" + else + echo -e "\e[92mLa configuration réseau LXC du conteneur est correcte.\e[0m" + fi +} + STOP_CONTAINER STOP_NETWORK check_repair=0 @@ -204,6 +254,7 @@ STOP_NETWORK ### Test du démarrage du conteneur. echo -e "\e[1m\n> Test le démarrage du conteneur:\e[0m" START_NETWORK +LXC_NETWORK_CONFIG CHECK_CONTAINER START_STATUS=$? if [ "$START_STATUS" -eq 1 ]; then @@ -286,60 +337,7 @@ do then # Vérifie la config réseau LXC du conteneur lxc_net_check=3 - lxc_network=0 - if ! sudo cat /var/lib/lxc/$LXC_NAME/config | grep -q "lxc.network.type = veth"; then - lxc_network=1 # Si la ligne de la config réseau est absente, c'est une erreur. - if sudo cat /var/lib/lxc/$LXC_NAME/config | grep -q "lxc.network.type"; then # Si la ligne est incorrecte, elle est corrigée. - sudo sed -i "s/lxc.network.type.*/lxc.network.type = veth/g" /var/lib/lxc/$LXC_NAME/config - else # Sinon elle est ajoutée. - echo "lxc.network.type = veth" | sudo tee -a /var/lib/lxc/$LXC_NAME/config - fi - fi - if ! sudo cat /var/lib/lxc/$LXC_NAME/config | grep -q "lxc.network.flags = up"; then - lxc_network=1 - if sudo cat /var/lib/lxc/$LXC_NAME/config | grep -q "lxc.network.flags"; then - sudo sed -i "s/lxc.network.flags.*/lxc.network.flags = up/g" /var/lib/lxc/$LXC_NAME/config - else - echo "lxc.network.flags = up" | sudo tee -a /var/lib/lxc/$LXC_NAME/config - fi - fi - if ! sudo cat /var/lib/lxc/$LXC_NAME/config | grep -q "lxc.network.link = lxc-pchecker"; then - lxc_network=1 - if sudo cat /var/lib/lxc/$LXC_NAME/config | grep -q "lxc.network.link"; then - sudo sed -i "s/lxc.network.link.*/lxc.network.link = lxc-pchecker/g" /var/lib/lxc/$LXC_NAME/config - else - echo "lxc.network.link = lxc-pchecker" | sudo tee -a /var/lib/lxc/$LXC_NAME/config - fi - fi - if ! sudo cat /var/lib/lxc/$LXC_NAME/config | grep -q "lxc.network.name = eth0"; then - lxc_network=1 - if sudo cat /var/lib/lxc/$LXC_NAME/config | grep -q "lxc.network.name"; then - sudo sed -i "s/lxc.network.name.*/lxc.network.name = eth0/g" /var/lib/lxc/$LXC_NAME/config - else - echo "lxc.network.name = eth0" | sudo tee -a /var/lib/lxc/$LXC_NAME/config - fi - fi - if ! sudo cat /var/lib/lxc/$LXC_NAME/config | grep -q "lxc.network.veth.pair = $LXC_NAME"; then - lxc_network=1 - if sudo cat /var/lib/lxc/$LXC_NAME/config | grep -q "lxc.network.veth.pair"; then - sudo sed -i "s/lxc.network.veth.pair.*/lxc.network.veth.pair = $LXC_NAME/g" /var/lib/lxc/$LXC_NAME/config - else - echo "lxc.network.veth.pair = $LXC_NAME" | sudo tee -a /var/lib/lxc/$LXC_NAME/config - fi - fi - if ! sudo cat /var/lib/lxc/$LXC_NAME/config | grep -q "lxc.network.hwaddr = 00:FF:AA:00:00:01"; then - lxc_network=1 - if sudo cat /var/lib/lxc/$LXC_NAME/config | grep -q "lxc.network.hwaddr"; then - sudo sed -i "s/lxc.network.hwaddr.*/lxc.network.hwaddr = 00:FF:AA:00:00:01/g" /var/lib/lxc/$LXC_NAME/config - else - echo "lxc.network.hwaddr = 00:FF:AA:00:00:01" | sudo tee -a /var/lib/lxc/$LXC_NAME/config - fi - fi - if [ "$lxc_network" -eq 1 ]; then - echo -e "\e[91mLa configuration réseau LXC du conteneur est incorrecte et a été corrigée.\e[0m" - else - echo -e "\e[92mLa configuration réseau LXC du conteneur est correcte.\e[0m" - fi + LXC_NETWORK_CONFIG fi if [ "$lxc_net_check" -eq 3 ] then @@ -398,7 +396,7 @@ else User pchecker IdentityFile $HOME/.ssh/$LXC_NAME EOF - ssh-keyscan -H 10.1.4.2 >> ~/.ssh/known_hosts # Récupère la clé publique pour l'ajouter au known_hosts + ssh-keyscan -H 10.1.4.2 >> ~/.ssh/known_hosts # Récupère la clé publique pour l'ajouter au known_hosts ssh $ARG_SSH $LXC_NAME -v "exit 0" > /dev/null # Test à nouveau la connexion ssh if [ "$?" -eq 0 ]; then echo -e "\e[92mLa connexion ssh est retablie.\e[0m" diff --git a/sub_scripts/lxc_launcher.sh b/sub_scripts/lxc_launcher.sh index 1e0c8f2..a46e926 100755 --- a/sub_scripts/lxc_launcher.sh +++ b/sub_scripts/lxc_launcher.sh @@ -35,7 +35,7 @@ LXC_START () { done sudo lxc-ls -f | grep $LXC_NAME | sed 's/- NO//' if [ $(sudo lxc-info --name $LXC_NAME | grep -c "STOPPED") -ne 0 ]; then - ECHO_FORMAT "Le conteneur n'a pas démarré correctement...\n" "lred" "bold" + ECHO_FORMAT "Le conteneur n'a pas démarré correctement...\nSi le problème persiste, utilisez le script lxc_check.sh pour vérifier et réparer le conteneur." "lred" "bold" return 1 fi scp -rq "$APP_CHECK" "$LXC_NAME": >> "$RESULT" 2>&1 diff --git a/sub_scripts/start.sh b/sub_scripts/start.sh deleted file mode 100755 index c388683..0000000 --- a/sub_scripts/start.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash - -# Teste différents aspect du conteneur pour chercher d'éventuelles erreurs. -# Et tente de réparer si possible... - -# Récupère le dossier du script -if [ "${0:0:1}" == "/" ]; then script_dir="$(dirname "$0")"; else script_dir="$(echo $PWD/$(dirname "$0" | cut -d '.' -f2) | sed 's@/$@@')"; fi - -PLAGE_IP=$(cat "$script_dir/lxc_build.sh" | grep PLAGE_IP= | cut -d '"' -f2) -ARG_SSH="-t" -LXC_NAME=$(cat "$script_dir/lxc_build.sh" | grep LXC_NAME= | cut -d '=' -f2) - -STOP_CONTAINER () { - echo "Arrêt du conteneur $LXC_NAME" - sudo lxc-stop -n $LXC_NAME -} - -START_NETWORK () { - echo "Initialisation du réseau pour le conteneur." - sudo ifup lxc-pchecker --interfaces=/etc/network/interfaces.d/lxc-pchecker - # Activation des règles iptables - sudo iptables -A FORWARD -i lxc-pchecker -o eth0 -j ACCEPT - sudo iptables -A FORWARD -i eth0 -o lxc-pchecker -j ACCEPT - sudo iptables -t nat -A POSTROUTING -s $PLAGE_IP.0/24 -j MASQUERADE -} - -STOP_NETWORK () { - echo "Arrêt du réseau pour le conteneur." - sudo iptables -D FORWARD -i lxc-pchecker -o eth0 -j ACCEPT > /dev/null 2>&1 - sudo iptables -D FORWARD -i eth0 -o lxc-pchecker -j ACCEPT > /dev/null 2>&1 - sudo iptables -t nat -D POSTROUTING -s $PLAGE_IP.0/24 -j MASQUERADE > /dev/null 2>&1 - sudo ifdown --force lxc-pchecker > /dev/null 2>&1 -} - -START_CONTAINER () { - sudo lxc-start -n $LXC_NAME -d > /dev/null 2>&1 # Démarre le conteneur - sudo lxc-wait -n $LXC_NAME -s 'RUNNING' -t 60 # Attend pendant 60s maximum que le conteneur démarre -} - -STOP_CONTAINER -STOP_NETWORK - -START_NETWORK -START_CONTAINER