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.
2022-10-09 02:51:53 +02:00
date >> " $script_dir /demo_upgrade.log "
2016-09-18 19:23:54 +02:00
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
2022-10-09 02:51:53 +02:00
echo " Upgrading $MACHINE "
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
2020-06-24 11:27:11 +02:00
# Supprime les éventuels swap présents.
/sbin/swapoff /var/lib/lxc/$MACHINE /rootfs/swap_*
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
2018-08-26 13:40:41 +02:00
# Active le bridge réseau
if ! sudo ifquery lxc_demo --state > /dev/null
then
sudo ifup lxc_demo --interfaces= /etc/network/interfaces.d/lxc_demo
fi
# Configure le parefeu
if ! sudo iptables -D FORWARD -i lxc_demo -o eth0 -j ACCEPT 2> /dev/null
then
sudo iptables -A FORWARD -i lxc_demo -o eth0 -j ACCEPT
fi
if ! sudo iptables -C FORWARD -i eth0 -o lxc_demo -j ACCEPT 2> /dev/null
then
sudo iptables -A FORWARD -i eth0 -o lxc_demo -j ACCEPT
fi
if ! sudo iptables -t nat -C POSTROUTING -s $PLAGE_IP .0/24 -j MASQUERADE 2> /dev/null
then
sudo iptables -t nat -A POSTROUTING -s $PLAGE_IP .0/24 -j MASQUERADE
fi
2016-08-12 17:35:14 +02:00
# Démarre le conteneur
2016-11-25 16:56:40 +01:00
date >> " $script_dir /demo_boot.log "
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
2018-08-26 13:40:41 +02:00
sudo lxc-attach -n $MACHINE -- apt-get dist-upgrade --option Dpkg::Options::= --force-confold -yy
2016-10-14 00:56:22 +02:00
# 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
2020-12-10 11:58:40 +01:00
sudo lxc-attach -n $MACHINE -- yunohost tools update
2022-10-09 02:51:53 +02:00
sudo lxc-attach -n $MACHINE -- yunohost tools upgrade system
2016-08-12 17:35:14 +02:00
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
2017-06-05 16:30:42 +02:00
if [ ! " $LIGNE " = = "exemple" ] && [ ! " $LIGNE " = = "old_scripts" ] && [ ! " $LIGNE " = = "Constant_upgrade" ] && ! echo " $LIGNE " | grep -q " .fail $" # Le fichier exemple, le dossier old_scripts et les scripts fail sont ignorés
2016-08-18 12:08:01 +02:00
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
2017-06-05 16:30:42 +02:00
# Exécution des scripts de upgrade.d/Constant_upgrade
while read LIGNE
do
if [ " $update_apt " -eq "1" ]
then
date
# Exécute chaque script trouvé dans upgrade.d/Constant_upgrade
echo " Exécution du script $LIGNE sur le conteneur $MACHINE "
/bin/bash " $script_dir /upgrade.d/Constant_upgrade/ $LIGNE " $MACHINE
if [ " $? " -ne 0 ] ; then
echo " Échec du script $LIGNE "
echo -e " Échec d'exécution du script d'upgrade $LIGNE sur le conteneur $MACHINE sur le serveur de demo $DOMAIN !\n "
else
echo " Le script $LIGNE a été exécuté sans erreur "
fi
fi
done <<< " $( ls -1 " $script_dir /upgrade.d/Constant_upgrade " ) "
2017-07-01 22:25:04 +02:00
# Upgrade des apps
2020-12-10 11:58:40 +01:00
sudo lxc-attach -n $MACHINE -- yunohost tools update
sudo lxc-attach -n $MACHINE -- systemctl restart nginx
2022-10-09 02:18:18 +02:00
sudo lxc-attach -n $MACHINE -- yunohost tools upgrade apps
2020-12-10 11:58:40 +01:00
sudo lxc-attach -n $MACHINE -- systemctl restart nginx
2017-07-01 22:25:04 +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
2016-08-18 12:38:19 +02:00
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
2017-07-01 22:25:04 +02:00
if [ ! " $LIGNE " = = "exemple" ] && [ ! " $LIGNE " = = "old_scripts" ] && [ ! " $LIGNE " = = "Constant_upgrade" ] && ! echo " $LIGNE " | grep -q " .fail $" # Le fichier exemple, le dossier old_scripts et les scripts fail sont ignorés
2016-08-18 12:38:19 +02:00
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
2022-10-09 02:51:53 +02:00
echo " Finished upgrading $MACHINE "
2016-08-12 17:35:14 +02:00
}
2016-11-24 13:49:11 +01:00
echo ""
date
2016-08-13 22:05:38 +02:00
UPGRADE_DEMO_CONTAINER $LXC_NAME1 $IP_LXC1
UPGRADE_DEMO_CONTAINER $LXC_NAME2 $IP_LXC2