diff --git a/demo_lxc_build.sh b/demo_lxc_build.sh index ae2ec41..54bf94c 100755 --- a/demo_lxc_build.sh +++ b/demo_lxc_build.sh @@ -1,10 +1,9 @@ #!/bin/bash # Créer les conteneurs Yunohost et les configure -# !!! Ce script est conçu pour être exécuté par l'user root. # Récupère le dossier du script -if [ "${0:0:1}" == "/" ]; then script_dir="$(dirname "$0")"; else script_dir="$PWD/$(dirname "$0" | cut -d '.' -f2)"; fi +if [ "${0:0:1}" == "/" ]; then script_dir="$(dirname "$0")"; else script_dir="$(echo $PWD/$(dirname "$0" | cut -d '.' -f2) | sed 's@/$@@')"; fi LOG=Build_lxc.log LOG_BUILD_LXC="$script_dir/$LOG" @@ -23,14 +22,12 @@ MAIL_ADDR=demo@yunohost.org USER_DEMO=demo PASSWORD_DEMO=demo -# Check root -# CHECK_ROOT=$EUID -# if [ -z "$CHECK_ROOT" ];then CHECK_ROOT=0;fi -# if [ $CHECK_ROOT -eq 0 ] -# then # $EUID est vide sur une exécution avec sudo. Et vaut 0 pour root -# echo "Le script ne doit pas être exécuté avec les droits root" -# exit 1 -# fi +# Check user +if [ "$USER" != "$(cat "$script_dir/setup_user")" ] && test -e "$script_dir/setup_user"; then + echo -e "\e[91mCe script doit être exécuté avec l'utilisateur $(cat "$script_dir/setup_user")" + echo -en "\e[0m" + exit 0 +fi echo "> Création d'une machine debian jessie minimaliste" | tee -a "$LOG_BUILD_LXC" sudo lxc-create -n $LXC_NAME1 -t debian -- -r jessie >> "$LOG_BUILD_LXC" 2>&1 @@ -96,6 +93,53 @@ ssh $ARG_SSH $LXC_NAME1 "sudo yunohost user create --firstname \"$USER_DEMO_CLEA echo -e "\n> Vérification de l'état de Yunohost" | tee -a "$LOG_BUILD_LXC" ssh $ARG_SSH $LXC_NAME1 "sudo yunohost -v" | tee -a "$LOG_BUILD_LXC" 2>&1 +# ******** +echo ">> Modification de Yunohost pour la demo" | tee -a "$LOG_BUILD_LXC" + +# App officielles +echo -e "> Installation des applications officielles" | tee -a "$LOG_BUILD_LXC" +echo -e "Installation de baikal" | tee -a "$LOG_BUILD_LXC" +ssh $ARG_SSH $LXC_NAME1 "sudo yunohost app install baikal -a \"domain=$DOMAIN&path=/baikal&password=$PASSWORD_DEMO\"" | tee -a "$LOG_BUILD_LXC" +echo -e "Installation d'agendav" | tee -a "$LOG_BUILD_LXC" +ssh $ARG_SSH $LXC_NAME1 "sudo yunohost app install agendav -a \"domain=$DOMAIN&path=/agendav&language=en\"" | tee -a "$LOG_BUILD_LXC" +echo -e "Installation de dokuwiki" | tee -a "$LOG_BUILD_LXC" +ssh $ARG_SSH $LXC_NAME1 "sudo yunohost app install dokuwiki -a \"domain=$DOMAIN&path=/dokuwiki&admin=$USER_DEMO&is_public=Yes\"" | tee -a "$LOG_BUILD_LXC" +echo -e "Installation de hextris" | tee -a "$LOG_BUILD_LXC" +ssh $ARG_SSH $LXC_NAME1 "sudo yunohost app install hextris -a \"domain=$DOMAIN&path=/hextris&is_public=Yes\"" | tee -a "$LOG_BUILD_LXC" +echo -e "Installation de jappix" | tee -a "$LOG_BUILD_LXC" +ssh $ARG_SSH $LXC_NAME1 "sudo yunohost app install jappix -a \"domain=$DOMAIN&path=/jappix&name=YunoJappix&language=en\"" | tee -a "$LOG_BUILD_LXC" +echo -e "Installation de jirafeau" | tee -a "$LOG_BUILD_LXC" +ssh $ARG_SSH $LXC_NAME1 "sudo yunohost app install jirafeau -a \"domain=$DOMAIN&path=/jirafeau&admin_user=$USER_DEMO&upload_password=$PASSWORD_DEMO&is_public=Yes\"" | tee -a "$LOG_BUILD_LXC" +echo -e "Installation de kanboard" | tee -a "$LOG_BUILD_LXC" +ssh $ARG_SSH $LXC_NAME1 "sudo yunohost app install kanboard -a \"domain=$DOMAIN&path=/kanboard&admin=$USER_DEMO&is_public=Yes\"" | tee -a "$LOG_BUILD_LXC" +echo -e "Installation de opensondage" | tee -a "$LOG_BUILD_LXC" +ssh $ARG_SSH $LXC_NAME1 "sudo yunohost app install opensondage -a \"domain=$DOMAIN&path=/date&admin=$USER_DEMO&language=en_GB&is_public=1\"" | tee -a "$LOG_BUILD_LXC" +echo -e "Installation de owncloud" | tee -a "$LOG_BUILD_LXC" +ssh $ARG_SSH $LXC_NAME1 "sudo yunohost app install owncloud -a \"domain=$DOMAIN&path=/owncloud&admin=$USER_DEMO&user_home=0\"" | tee -a "$LOG_BUILD_LXC" +echo -e "Installation de phpmyadmin" | tee -a "$LOG_BUILD_LXC" +ssh $ARG_SSH $LXC_NAME1 "sudo yunohost app install phpmyadmin -a \"domain=$DOMAIN&path=/phpmyadmin&admin=$USER_DEMO\"" | tee -a "$LOG_BUILD_LXC" +echo -e "Installation de roundcube" | tee -a "$LOG_BUILD_LXC" +ssh $ARG_SSH $LXC_NAME1 "sudo yunohost app install roundcube -a \"domain=$DOMAIN&path=/webmail&with_carddav=0\"" | tee -a "$LOG_BUILD_LXC" +echo -e "Installation de searx" | tee -a "$LOG_BUILD_LXC" +ssh $ARG_SSH $LXC_NAME1 "sudo yunohost app install searx -a \"domain=$DOMAIN&path=/searx&is_public=Yes\"" | tee -a "$LOG_BUILD_LXC" +echo -e "Installation de shellinabox" | tee -a "$LOG_BUILD_LXC" +ssh $ARG_SSH $LXC_NAME1 "sudo yunohost app install shellinabox -a \"domain=$DOMAIN&path=/ssh\"" | tee -a "$LOG_BUILD_LXC" +sudo rm "/var/lib/lxc/$LXC_NAME1/rootfs/etc/nginx/conf.d/$DOMAIN.d/shellinabox.conf" # Supprime le fichier de conf nginx de shellinabox pour empêcher d'y accéder. +ssh $ARG_SSH $LXC_NAME1 "sudo yunohost app setting shellinabox path -d && sudo yunohost app ssowatconf" | tee -a "$LOG_BUILD_LXC" +echo -e "Installation de strut" | tee -a "$LOG_BUILD_LXC" +ssh $ARG_SSH $LXC_NAME1 "sudo yunohost app install strut -a \"domain=$DOMAIN&path=/strut&public_site=Yes\"" | tee -a "$LOG_BUILD_LXC" +echo -e "Installation de transmission" | tee -a "$LOG_BUILD_LXC" +ssh $ARG_SSH $LXC_NAME1 "sudo yunohost app install transmission -a \"domain=$DOMAIN&path=/torrent\"" | tee -a "$LOG_BUILD_LXC" +echo -e "Installation de ttrss" | tee -a "$LOG_BUILD_LXC" +ssh $ARG_SSH $LXC_NAME1 "sudo yunohost app install ttrss -a \"domain=$DOMAIN&path=/ttrss\"" | tee -a "$LOG_BUILD_LXC" +echo -e "Installation de wallabag" | tee -a "$LOG_BUILD_LXC" +ssh $ARG_SSH $LXC_NAME1 "sudo yunohost app install wallabag -a \"domain=$DOMAIN&path=/wallabag\"" | tee -a "$LOG_BUILD_LXC" +echo -e "Installation de wordpress" | tee -a "$LOG_BUILD_LXC" +ssh $ARG_SSH $LXC_NAME1 "sudo yunohost app install wordpress -a \"domain=$DOMAIN&path=/blog&admin=$USER_DEMO&language=en_EN&multisite=No&is_public=Yes\"" | tee -a "$LOG_BUILD_LXC" +echo -e "Installation de zerobin" | tee -a "$LOG_BUILD_LXC" +ssh $ARG_SSH $LXC_NAME1 "sudo yunohost app install zerobin -a \"domain=$DOMAIN&path=/zerobin&is_public=Yes\"" | tee -a "$LOG_BUILD_LXC" + +# ******** echo "> Arrêt de la machine virtualisée" | tee -a "$LOG_BUILD_LXC" sudo lxc-stop -n $LXC_NAME1 >> "$LOG_BUILD_LXC" 2>&1 @@ -128,12 +172,33 @@ EOF echo "> Et du cron d'upgrade" echo | sudo tee /etc/cron.d/demo_upgrade < /dev/null # Vérifie les mises à jour des conteneurs de demo, lorsqu'ils ne sont pas utilisés, à partir de 3h2minutes chaque nuit. Attention à rester sur un multiple du temps de switch. -2 3 * * * root $script_dir/demo_switch.sh >> "$script_dir/demo_upgrade.log" 2>&1 +2 3 * * * root $script_dir/demo_upgrade.sh >> "$script_dir/demo_upgrade.log" 2>&1 EOF echo "> Démarrage de la démo" "$script_dir/demo_start.sh" +# echo "> Mise en place du service" +echo | sudo tee /etc/systemd/system/lxc_demo.service < /dev/null +[Unit] +Description=Start and stop script for lxc demo container +Requires=network.target +After=network.target + +[Service] +Type=forking +ExecStart=$script_dir/demo_start.sh +ExecStop=$script_dir/demo_stop.sh +ExecReload=$script_dir/demo_start.sh + +[Install] +WantedBy=multi-user.target +EOF + +# Démarrage automatique du service +sudo systemctl enable lxc_demo.service +sudo service lxc_demo start + # Après le démarrage du premier conteneur, fait un snapshot du deuxième. echo "> Création d'un snapshot pour le 2e conteneur" | tee -a "$LOG_BUILD_LXC" sudo lxc-snapshot -n $LXC_NAME2 >> "$LOG_BUILD_LXC" 2>&1 diff --git a/demo_lxc_build_init.sh b/demo_lxc_build_init.sh index 70457c3..289bf89 100755 --- a/demo_lxc_build_init.sh +++ b/demo_lxc_build_init.sh @@ -1,10 +1,9 @@ #!/bin/bash # Installe LXC et les paramètres réseaux avant de procéder au build. -# !!! Ce script est conçu pour être exécuté par l'user root. # Récupère le dossier du script -if [ "${0:0:1}" == "/" ]; then script_dir="$(dirname "$0")"; else script_dir="$PWD/$(dirname "$0" | cut -d '.' -f2)"; fi +if [ "${0:0:1}" == "/" ]; then script_dir="$(dirname "$0")"; else script_dir="$(echo $PWD/$(dirname "$0" | cut -d '.' -f2) | sed 's@/$@@')"; fi LOG=$(cat "$script_dir/demo_lxc_build.sh" | grep LOG= | cut -d '=' -f2) LOG_BUILD_LXC="$script_dir/$LOG" @@ -15,14 +14,8 @@ IP_LXC1=$(cat "$script_dir/demo_lxc_build.sh" | grep IP_LXC1= | cut -d '=' -f2) IP_LXC2=$(cat "$script_dir/demo_lxc_build.sh" | grep IP_LXC2= | cut -d '=' -f2) MAIL_ADDR=$(cat "$script_dir/demo_lxc_build.sh" | grep MAIL_ADDR= | cut -d '=' -f2) -# Check root -# CHECK_ROOT=$EUID -# if [ -z "$CHECK_ROOT" ];then CHECK_ROOT=0;fi -# if [ $CHECK_ROOT -eq 0 ] -# then # $EUID est vide sur une exécution avec sudo. Et vaut 0 pour root -# echo "Le script ne doit pas être exécuté avec les droits root" -# exit 1 -# fi +# Check user +echo $USER > "$script_dir/setup_user" read -p "Indiquer le nom de domaine du serveur de demo: " DOMAIN echo "$DOMAIN" > "$script_dir/domain.ini" @@ -76,6 +69,7 @@ echo "> Mise en place du reverse proxy et du load balancing" | tee -a "$LOG_BUIL echo | sudo tee /etc/nginx/conf.d/$DOMAIN.conf <> "$LOG_BUILD_LXC" 2>&1 upstream $DOMAIN { server $IP_LXC1:80 ; + server $IP_LXC1:443 ; server $IP_LXC2:443 ; } @@ -134,7 +128,7 @@ cd ~ git clone https://github.com/letsencrypt/letsencrypt cd letsencrypt/ # Installe les dépendances de let's encrypt -./letsencrypt-auto --help +sudo ./letsencrypt-auto --help sudo mkdir /etc/letsencrypt # Créer le fichier de config @@ -166,10 +160,14 @@ EOF mkdir -p /tmp/letsencrypt-auto # Créer le certificat -./letsencrypt-auto certonly --config /etc/letsencrypt/conf.ini -d $DOMAIN +sudo ./letsencrypt-auto certonly --config /etc/letsencrypt/conf.ini -d $DOMAIN # Route l'upstream sur le port 443. Le port 80 servait uniquement à let's encrypt sudo sed -i "s/server $IP_LXC1:80 ;/server $IP_LXC1:443 ;/" /etc/nginx/conf.d/$DOMAIN.conf +# Décommente les lignes du certificat +sudo sed -i "s/#\tssl_certificate/\tssl_certificate/g" /etc/nginx/conf.d/$DOMAIN.conf +sudo service nginx reload + # Mise en place du cron de renouvellement. wget https://raw.githubusercontent.com/YunoHost-Apps/letsencrypt_ynh/master/sources/certificateRenewer @@ -177,7 +175,7 @@ sed -i "s/DOMAIN_NAME/$DOMAIN/" certificateRenewer sed -i "s/ADMIN_EMAIL/$MAIL_ADDR/" certificateRenewer sudo mv certificateRenewer /etc/cron.weekly/ -echo "\nLe serveur est prêt à déployer les conteneurs de demo." +echo "Le serveur est prêt à déployer les conteneurs de demo." echo "Exécutez le script demo_lxc_build.sh pour créer les conteneurs et mettre en place la demo." # Déploie les conteneurs de demo # "$script_dir/demo_lxc_build.sh" diff --git a/demo_lxc_destroy.sh b/demo_lxc_destroy.sh index 3e04fae..81dd190 100755 --- a/demo_lxc_destroy.sh +++ b/demo_lxc_destroy.sh @@ -2,24 +2,21 @@ # Détruit les conteneurs lxc de demo. # Permet de repartir sur des bases saines avec le script demo_lxc_build.sh -# !!! Ce script est conçu pour être exécuté par l'user root. # Récupère le dossier du script -if [ "${0:0:1}" == "/" ]; then script_dir="$(dirname "$0")"; else script_dir="$PWD/$(dirname "$0" | cut -d '.' -f2)"; fi +if [ "${0:0:1}" == "/" ]; then script_dir="$(dirname "$0")"; else script_dir="$(echo $PWD/$(dirname "$0" | cut -d '.' -f2) | sed 's@/$@@')"; fi LXC_NAME1=$(cat "$script_dir/demo_lxc_build.sh" | grep LXC_NAME1= | cut -d '=' -f2) LXC_NAME2=$(cat "$script_dir/demo_lxc_build.sh" | grep LXC_NAME2= | cut -d '=' -f2) IP_LXC1=$(cat "$script_dir/demo_lxc_build.sh" | grep IP_LXC1= | cut -d '=' -f2) IP_LXC2=$(cat "$script_dir/demo_lxc_build.sh" | grep IP_LXC2= | cut -d '=' -f2) -# Check root -# CHECK_ROOT=$EUID -# if [ -z "$CHECK_ROOT" ];then CHECK_ROOT=0;fi -# if [ $CHECK_ROOT -eq 0 ] -# then # $EUID est vide sur une exécution avec sudo. Et vaut 0 pour root -# echo "Le script ne doit pas être exécuté avec les droits root" -# exit 1 -# fi +# Check user +if [ "$USER" != "$(cat "$script_dir/setup_user")" ]; then + echo -e "\e[91mCe script doit être exécuté avec l'utilisateur $(cat "$script_dir/sub_scripts/setup_user")" + echo -en "\e[0m" + exit 0 +fi "$script_dir/demo_stop.sh" @@ -38,3 +35,7 @@ sudo rm /etc/cron.d/demo_upgrade echo "> Suppression des clés ECDSA dans known_hosts" ssh-keygen -f "$HOME/.ssh/known_hosts" -R $IP_LXC1 ssh-keygen -f "$HOME/.ssh/known_hosts" -R $IP_LXC2 + +echo "> Suppression du service" +sudo systemctl disable lutim.service +sudo rm -f /etc/systemd/system/lxc_demo.service diff --git a/demo_lxc_remove.sh b/demo_lxc_remove.sh index 37cf24d..d67bd1b 100755 --- a/demo_lxc_remove.sh +++ b/demo_lxc_remove.sh @@ -2,22 +2,19 @@ # Purge l'ensemble de la config lxc pour les conteneurs de demo. # Il sera nécessaire de lancer le script demo_lxc_build_init.sh pour réinstaller l'ensemble le cas échéant. -# !!! Ce script est conçu pour être exécuté par l'user root. # Récupère le dossier du script -if [ "${0:0:1}" == "/" ]; then script_dir="$(dirname "$0")"; else script_dir="$PWD/$(dirname "$0" | cut -d '.' -f2)"; fi +if [ "${0:0:1}" == "/" ]; then script_dir="$(dirname "$0")"; else script_dir="$(echo $PWD/$(dirname "$0" | cut -d '.' -f2) | sed 's@/$@@')"; fi LXC_NAME1=$(cat "$script_dir/demo_lxc_build.sh" | grep LXC_NAME1= | cut -d '=' -f2) DOMAIN=$(cat "$script_dir/domain.ini") -# Check root -# CHECK_ROOT=$EUID -# if [ -z "$CHECK_ROOT" ];then CHECK_ROOT=0;fi -# if [ $CHECK_ROOT -eq 0 ] -# then # $EUID est vide sur une exécution avec sudo. Et vaut 0 pour root -# echo "Le script ne doit pas être exécuté avec les droits root" -# exit 1 -# fi +# Check user +if [ "$USER" != "$(cat "$script_dir/setup_user")" ]; then + echo -e "\e[91mCe script doit être exécuté avec l'utilisateur $(cat "$script_dir/sub_scripts/setup_user")" + echo -en "\e[0m" + exit 0 +fi "$script_dir/demo_lxc_destroy.sh" diff --git a/demo_start.sh b/demo_start.sh index f10baf5..1874f04 100755 --- a/demo_start.sh +++ b/demo_start.sh @@ -1,10 +1,9 @@ #!/bin/bash # Démarre le premier conteneur de demo et active la config réseau dédiée. -# !!! Ce script est conçu pour être exécuté par l'user root. # Récupère le dossier du script -if [ "${0:0:1}" == "/" ]; then script_dir="$(dirname "$0")"; else script_dir="$PWD/$(dirname "$0" | cut -d '.' -f2)"; fi +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/demo_lxc_build.sh" | grep PLAGE_IP= | cut -d '=' -f2) LXC_NAME=$(cat "$script_dir/demo_lxc_build.sh" | grep LXC_NAME1= | cut -d '=' -f2) @@ -30,7 +29,7 @@ fi # Démarrage de la machine echo "> Démarrage de la machine" -sudo lxc-start -n $LXC_NAME -d +sudo lxc-start -n $LXC_NAME -o "$script_dir/demo_boot.log" -d sleep 3 # Vérifie que la machine a démarré diff --git a/demo_stop.sh b/demo_stop.sh index 8338bfe..6408ad1 100755 --- a/demo_stop.sh +++ b/demo_stop.sh @@ -1,16 +1,29 @@ #!/bin/bash # Stoppe les conteneurs de demo et arrête la config réseau dédiée. -# !!! Ce script est conçu pour être exécuté par l'user root. # Récupère le dossier du script -if [ "${0:0:1}" == "/" ]; then script_dir="$(dirname "$0")"; else script_dir="$PWD/$(dirname "$0" | cut -d '.' -f2)"; fi +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/demo_lxc_build.sh" | grep PLAGE_IP= | cut -d '=' -f2) LXC_NAME1=$(cat "$script_dir/demo_lxc_build.sh" | grep LXC_NAME1= | cut -d '=' -f2) LXC_NAME2=$(cat "$script_dir/demo_lxc_build.sh" | grep LXC_NAME2= | cut -d '=' -f2) -echo "> Arrêt de la machine virtualisée" +if [ "$#" -eq 1 ] && [ "$1" == "-f" ] +then + echo "> Suppression des lock et arrêt forcé des conteneurs." + sudo rm -f /var/lib/lxc/$LXC_NAME1.lock_fileS + sudo rm -f /var/lib/lxc/$LXC_NAME2.lock_fileS + sudo rm -f /var/lib/lxc/$LXC_NAME1.lock_fileU + sudo rm -f /var/lib/lxc/$LXC_NAME2.lock_fileU +else + echo "> Attend la libération des lock sur les conteneurs." + while test -e /var/lib/lxc/$LXC_NAME1.lock_file* || test -e /var/lib/lxc/$LXC_NAME2.lock_file*; do + sleep 5 # Attend que les conteneur soit libérés par les script upgrade ou switch, le cas échéant. + done +fi + +echo "> Arrêt des conteneurs" if [ $(sudo lxc-info --name $LXC_NAME1 | grep -c "STOPPED") -eq 0 ]; then echo "Arrêt du conteneur $LXC_NAME1" sudo lxc-stop -n $LXC_NAME1 @@ -36,8 +49,4 @@ if sudo ifquery lxc_demo --state > /dev/null; then sudo ifdown --force lxc_demo fi -echo "Suppression des lock." -sudo rm /var/lib/lxc/$LXC_NAME1/lock_file -sudo rm /var/lib/lxc/$LXC_NAME2/lock_file - sudo lxc-ls -f diff --git a/demo_switch.sh b/demo_switch.sh index 4fc5cef..c69179b 100755 --- a/demo_switch.sh +++ b/demo_switch.sh @@ -4,12 +4,20 @@ # Ce script n'a vocation qu'a être dans un cron # Récupère le dossier du script -if [ "${0:0:1}" == "/" ]; then script_dir="$(dirname "$0")"; else script_dir="$PWD/$(dirname "$0" | cut -d '.' -f2)"; fi +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/demo_lxc_build.sh" | grep PLAGE_IP= | cut -d '=' -f2) LXC_NAME1=$(cat "$script_dir/demo_lxc_build.sh" | grep LXC_NAME1= | cut -d '=' -f2) LXC_NAME2=$(cat "$script_dir/demo_lxc_build.sh" | grep LXC_NAME2= | cut -d '=' -f2) MAIL_ADDR=$(cat "$script_dir/demo_lxc_build.sh" | grep MAIL_ADDR= | cut -d '=' -f2) +DOMAIN=$(cat "$script_dir/domain.ini") + +log_line=$(wc -l "$script_dir/demo_switch.log" | cut -d ' ' -f 1) # Repère la fin du log actuel. Pour récupérer les lignes ajoutées sur cette exécution. +log_line=$(( $log_line + 1 )) # Ignore la première ligne, reprise de l'ancien log. + +while test -e /var/lib/lxc/$LXC_NAME1.lock_file* || test -e /var/lib/lxc/$LXC_NAME2.lock_file*; do + sleep 5 # Attend que le conteneur soit libéré par les script upgrade ou switch, le cas échéant. +done # Vérifie l'état des machines. if [ "$(sudo lxc-info --name $LXC_NAME1 | grep -c "RUNNING")" -eq "1" ] @@ -22,25 +30,21 @@ else # Sinon, on suppose que c'est la machine 2 qui est en cours. # Si aucune machine ne tourne, la première démarrera. fi -while sudo test -e /var/lib/lxc/$LXC_B/lock_file; do - sleep 5 # Attend que le conteneur soit libéré par le script upgrade, le cas échéant. -done - # Démarre le conteneur B et arrête le conteneur A. sudo lxc-start -n $LXC_B -o "$script_dir/demo_switch.log" -d > /dev/null # Démarre l'autre machine sleep 10 # Attend 10 seconde pour s'assurer du démarrage de la machine. if [ "$(sudo lxc-info --name $LXC_B | grep -c "STOPPED")" -eq "1" ] then # Le conteneur n'a pas réussi à démarrer. On averti un responsable par mail... - mail -a "Content-Type: text/plain; charset=UTF-8" -s "Demo Yunohost" $MAIL_ADDR <<< "Échec du démarrage du conteneur $LXC_B sur le serveur de demo!" + echo -e "Échec du démarrage du conteneur $LXC_B sur le serveur de demo $DOMAIN! \n\nExtrait du log:\n$(tail -n +$log_line "$script_dir/demo_switch.log")" | mail -a "Content-Type: text/plain; charset=UTF-8" -s "Demo Yunohost" $MAIL_ADDR exit 1 else # Bascule sur le conteneur B avec le load balancing de nginx... # Automatique par nginx lorsque la machine A sera éteinte. # Arrêt du conteneur A. Il est remplacé par le B - sudo touch /var/lib/lxc/$LXC_A/lock_file # Met en place un fichier pour indiquer que la machine n'est pas encore dispo. + sudo touch /var/lib/lxc/$LXC_A.lock_fileS # Met en place un fichier pour indiquer que la machine n'est pas encore dispo. sudo lxc-stop -n $LXC_A # Restaure le snapshot de la machine A avant sa prochaine exécution sudo lxc-snapshot -r snap0 -n $LXC_A - sudo rm /var/lib/lxc/$LXC_A/lock_file # Libère le lock + sudo rm /var/lib/lxc/$LXC_A.lock_fileS # Libère le lock fi diff --git a/demo_upgrade.sh b/demo_upgrade.sh index e9c8afe..342f75c 100755 --- a/demo_upgrade.sh +++ b/demo_upgrade.sh @@ -4,7 +4,9 @@ # Ce script n'a vocation qu'a être dans un cron # Récupère le dossier du script -if [ "${0:0:1}" == "/" ]; then script_dir="$(dirname "$0")"; else script_dir="$PWD/$(dirname "$0" | cut -d '.' -f2)"; fi +if [ "${0:0:1}" == "/" ]; then script_dir="$(dirname "$0")"; else script_dir="$(echo $PWD/$(dirname "$0" | cut -d '.' -f2) | sed 's@/$@@')"; fi + +echo "$(date) U. boot upgrade" >> "$script_dir/debug.log" LXC_NAME1=$(cat "$script_dir/demo_lxc_build.sh" | grep LXC_NAME1= | cut -d '=' -f2) LXC_NAME2=$(cat "$script_dir/demo_lxc_build.sh" | grep LXC_NAME2= | cut -d '=' -f2) @@ -13,10 +15,14 @@ IP_LXC2=$(cat "$script_dir/demo_lxc_build.sh" | grep IP_LXC2= | cut -d '=' -f2) PLAGE_IP=$(cat "$script_dir/demo_lxc_build.sh" | grep PLAGE_IP= | cut -d '=' -f2) TIME_TO_SWITCH=$(cat "$script_dir/demo_lxc_build.sh" | grep TIME_TO_SWITCH= | cut -d '=' -f2) MAIL_ADDR=$(cat "$script_dir/demo_lxc_build.sh" | grep MAIL_ADDR= | cut -d '=' -f2) +DOMAIN=$(cat "$script_dir/domain.ini") IP_UPGRADE=$PLAGE_IP.150 LOOP=0 +log_line=$(wc -l "$script_dir/demo_upgrade.log" | cut -d ' ' -f 1) # Repère la fin du log actuel. Pour récupérer les lignes ajoutées sur cette exécution. +log_line=$(( $log_line + 1 )) # Ignore la première ligne, reprise de l'ancien log. + UPGRADE_DEMO_CONTAINER () { # Démarrage, upgrade et snapshot MACHINE=$1 IP_MACHINE=$2 @@ -25,11 +31,11 @@ UPGRADE_DEMO_CONTAINER () { # Démarrage, upgrade et snapshot TIME_OUT=$(($TIME_TO_SWITCH * 60 + 300)) sudo lxc-wait -n $MACHINE -s 'STOPPED' -t $TIME_OUT - while sudo test -e /var/lib/lxc/$MACHINE/lock_file; do + while test -e /var/lib/lxc/$MACHINE.lock_fileS; do sleep 5 # Attend que le conteneur soit libéré par le script switch. done - sudo touch /var/lib/lxc/$MACHINE/lock_file # Met en place un fichier pour indiquer que la machine est indisponible pendant l'upgrade + sudo touch /var/lib/lxc/$MACHINE.lock_fileU # Met en place un fichier pour indiquer que la machine est indisponible pendant l'upgrade # Restaure le snapshot sudo lxc-snapshot -r snap0 -n $MACHINE @@ -38,7 +44,7 @@ UPGRADE_DEMO_CONTAINER () { # Démarrage, upgrade et snapshot sudo sed -i "s@address $IP_MACHINE@address $IP_UPGRADE@" /var/lib/lxc/$MACHINE/rootfs/etc/network/interfaces # Démarre le conteneur - sudo lxc-start -n $MACHINE -d > /dev/null + sudo lxc-start -n $MACHINE -o "$script_dir/demo_boot.log" -d > /dev/null sleep 10 # Update @@ -49,9 +55,9 @@ UPGRADE_DEMO_CONTAINER () { # Démarrage, upgrade et snapshot update_apt=1 fi # Upgrade - sudo lxc-attach -n $MACHINE -- apt-get dist-upgrade + sudo lxc-attach -n $MACHINE -- apt-get dist-upgrade -y # Clean - sudo lxc-attach -n $MACHINE -- apt-get autoremove + sudo lxc-attach -n $MACHINE -- apt-get autoremove -y sudo lxc-attach -n $MACHINE -- apt-get autoclean # Exécution des scripts de upgrade.d @@ -65,8 +71,9 @@ UPGRADE_DEMO_CONTAINER () { # Démarrage, upgrade et snapshot if [ "$?" -ne 0 ]; then # Si le script a échoué, le snapshot est annulé. echo "Échec du script $LIGNE" mv -f "$script_dir/upgrade.d/$LIGNE" "$script_dir/upgrade.d/$LIGNE.fail" - mail -a "Content-Type: text/plain; charset=UTF-8" -s "Demo Yunohost" $MAIL_ADDR <<< "Échec d'exécution du script d'upgrade $LIGNE sur le conteneur $MACHINE sur le serveur de demo!\nLe script a été renommé en .fail, il ne sera plus exécuté tant que le préfixe ne sera pas retiré." + echo -e "Échec d'exécution du script d'upgrade $LIGNE sur le conteneur $MACHINE sur le serveur de demo $DOMAIN!\nLe script a été renommé en .fail, il ne sera plus exécuté tant que le préfixe ne sera pas retiré.\n\nExtrait du log:\n$(tail -n +$log_line "$script_dir/demo_upgrade.log")" | mail -a "Content-Type: text/plain; charset=UTF-8" -s "Demo Yunohost" $MAIL_ADDR update_apt=0 + fi fi done @@ -95,7 +102,7 @@ UPGRADE_DEMO_CONTAINER () { # Démarrage, upgrade et snapshot done fi fi - sudo rm /var/lib/lxc/$MACHINE/lock_file # Libère le lock, la machine est à nouveau disponible + sudo rm /var/lib/lxc/$MACHINE.lock_fileU # Libère le lock, la machine est à nouveau disponible } UPGRADE_DEMO_CONTAINER $LXC_NAME1 $IP_LXC1 diff --git a/upgrade.d/exemple b/upgrade.d/exemple old mode 100644 new mode 100755