yunohost_demo/demo_upgrade.sh

114 lines
4.9 KiB
Bash
Raw Normal View History

2016-08-12 17:35:14 +02:00
#!/bin/bash
2016-08-13 01:08:44 +02:00
# Script d'upgrade des 2 conteneurs de demo.
# Ce script n'a vocation qu'a être dans un cron
2016-08-12 17:35:14 +02:00
# Récupère le dossier du script
2016-09-18 19:23:54 +02:00
if [ "${0:0:1}" == "/" ]; then script_dir="$(dirname "$0")"; else script_dir="$(echo $PWD/$(dirname "$0" | cut -d '.' -f2) | sed 's@/$@@')"; fi
2016-08-13 01:08:44 +02:00
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)
2016-08-13 22:05:38 +02:00
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)
PLAGE_IP=$(cat "$script_dir/demo_lxc_build.sh" | grep PLAGE_IP= | cut -d '=' -f2)
2016-08-13 01:08:44 +02:00
TIME_TO_SWITCH=$(cat "$script_dir/demo_lxc_build.sh" | grep TIME_TO_SWITCH= | cut -d '=' -f2)
2016-09-07 23:31:11 +02:00
MAIL_ADDR=$(cat "$script_dir/demo_lxc_build.sh" | grep MAIL_ADDR= | cut -d '=' -f2)
2016-09-18 19:23:54 +02:00
DOMAIN=$(cat "$script_dir/domain.ini")
2016-08-12 17:35:14 +02:00
2016-08-13 22:05:38 +02:00
IP_UPGRADE=$PLAGE_IP.150
2016-08-18 12:08:01 +02:00
LOOP=0
2016-08-13 22:05:38 +02:00
2016-09-18 19:23:54 +02:00
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.
2016-08-12 17:35:14 +02:00
UPGRADE_DEMO_CONTAINER () { # Démarrage, upgrade et snapshot
MACHINE=$1
2016-08-13 22:05:38 +02:00
IP_MACHINE=$2
2016-08-12 17:35:14 +02:00
# Attend que la machine soit éteinte.
2016-08-13 22:05:38 +02:00
# Timeout à $TIME_TO_SWITCH +5 minutes, en seconde
TIME_OUT=$(($TIME_TO_SWITCH * 60 + 300))
2016-08-12 18:07:01 +02:00
sudo lxc-wait -n $MACHINE -s 'STOPPED' -t $TIME_OUT
2016-08-12 17:35:14 +02:00
2016-09-18 19:23:54 +02:00
while test -e /var/lib/lxc/$MACHINE.lock_fileS; do
2016-09-08 13:40:03 +02:00
sleep 5 # Attend que le conteneur soit libéré par le script switch.
2016-08-13 22:05:38 +02:00
done
2016-09-18 19:23:54 +02:00
sudo touch /var/lib/lxc/$MACHINE.lock_fileU # Met en place un fichier pour indiquer que la machine est indisponible pendant l'upgrade
2016-09-08 13:40:03 +02:00
2016-08-12 17:35:14 +02:00
# Restaure le snapshot
2016-08-13 22:05:38 +02:00
sudo lxc-snapshot -r snap0 -n $MACHINE
# Change l'ip du conteneur le temps de l'upgrade. Pour empêcher HAProxy de basculer sur le conteneur.
sudo sed -i "s@address $IP_MACHINE@address $IP_UPGRADE@" /var/lib/lxc/$MACHINE/rootfs/etc/network/interfaces
2016-08-12 17:35:14 +02:00
# Démarre le conteneur
2016-09-18 19:23:54 +02:00
sudo lxc-start -n $MACHINE -o "$script_dir/demo_boot.log" -d > /dev/null
2016-08-12 17:35:14 +02:00
sleep 10
# Update
2016-08-13 22:05:38 +02:00
update_apt=0
2016-08-12 17:35:14 +02:00
sudo lxc-attach -n $MACHINE -- apt-get update
2016-10-14 00:56:22 +02:00
sudo lxc-attach -n $MACHINE -- apt-get dist-upgrade --dry-run | grep -q "^Inst " > /dev/null # Vérifie si il y aura des mises à jour.
2016-08-12 17:35:14 +02:00
if [ "$?" -eq 0 ]; then
2016-10-14 00:56:22 +02:00
date
update_apt=1
# Upgrade
sudo lxc-attach -n $MACHINE -- apt-get dist-upgrade -y
# Clean
sudo lxc-attach -n $MACHINE -- apt-get autoremove -y
sudo lxc-attach -n $MACHINE -- apt-get autoclean
2016-08-12 17:35:14 +02:00
fi
2016-08-18 12:08:01 +02:00
# Exécution des scripts de upgrade.d
LOOP=$((LOOP + 1))
2016-10-14 00:56:22 +02:00
while read LIGNE
2016-08-18 12:08:01 +02:00
do
if [ ! "$LIGNE" == "exemple" ] && [ ! "$LIGNE" == "old_scripts" ] && ! echo "$LIGNE" | grep -q ".fail$" # Le fichier exemple, le dossier old_scripts et les scripts fail sont ignorés
then
2016-10-14 00:56:22 +02:00
date
2016-08-18 12:08:01 +02:00
# Exécute chaque script trouvé dans upgrade.d
2016-10-14 00:56:22 +02:00
echo "Exécution du script $LIGNE sur le conteneur $MACHINE"
2016-08-18 12:08:01 +02:00
/bin/bash "$script_dir/upgrade.d/$LIGNE" $MACHINE
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"
2016-09-18 19:23:54 +02:00
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
2016-08-18 12:08:01 +02:00
update_apt=0
2016-10-14 00:56:22 +02:00
else
echo "Le script $LIGNE a été exécuté sans erreur"
update_apt=1
2016-09-18 19:23:54 +02:00
fi
2016-08-18 12:08:01 +02:00
fi
2016-10-14 00:56:22 +02:00
done <<< "$(ls -1 "$script_dir/upgrade.d")"
2016-08-18 12:08:01 +02:00
2016-08-12 17:35:14 +02:00
# Arrêt de la machine virtualisée
sudo lxc-stop -n $MACHINE
2016-08-13 22:05:38 +02:00
# Restaure l'ip d'origine du conteneur.
sudo sed -i "s@address $IP_UPGRADE@address $IP_MACHINE@" /var/lib/lxc/$MACHINE/rootfs/etc/network/interfaces
if [ "$update_apt" -eq "1" ]
2016-08-12 17:35:14 +02:00
then
# Archivage du snapshot
sudo tar -cz --acls --xattrs -f /var/lib/lxcsnaps/$MACHINE/snap0.tar.gz /var/lib/lxcsnaps/$MACHINE/snap0
# Remplacement du snapshot
sudo lxc-snapshot -n $MACHINE -d snap0
sudo lxc-snapshot -n $MACHINE
if [ "$LOOP" -eq 2 ]
then # Après l'upgrade du 2e conteneur, déplace les scripts dans le dossier des anciens scripts si ils ont été exécutés avec succès.
ls -1 "$script_dir/upgrade.d" | while read LIGNE
do
if [ ! "$LIGNE" == "exemple" ] && [ ! "$LIGNE" == "old_scripts" ] && ! echo "$LIGNE" | grep -q ".fail$" # Le fichier exemple, le dossier old_scripts et les scripts fail sont ignorés
then
mv -f "$script_dir/upgrade.d/$LIGNE" "$script_dir/upgrade.d/old_scripts/$LIGNE"
fi
done
fi
2016-08-12 17:35:14 +02:00
fi
2016-09-18 19:23:54 +02:00
sudo rm /var/lib/lxc/$MACHINE.lock_fileU # Libère le lock, la machine est à nouveau disponible
2016-08-12 17:35:14 +02:00
}
2016-08-13 22:05:38 +02:00
UPGRADE_DEMO_CONTAINER $LXC_NAME1 $IP_LXC1
UPGRADE_DEMO_CONTAINER $LXC_NAME2 $IP_LXC2