yunohost_demo/ynh_lxd_demo

231 lines
8.1 KiB
Text
Raw Permalink Normal View History

2022-11-05 20:15:50 +01:00
#!/bin/bash
#=================================================
# DEMO HELPERS
#=================================================
# Start an LXC container in demo mode
#
# usage: ynh_lxc_demo_start --name=name --ip=ip
# | arg: -n, --name= - name of the LXC
# | arg: -n, --ip= - demo ip of the lxc
#
# Requires YunoHost version *.*.* or higher.
ynh_lxc_demo_start () {
# Declare an array to define the options of this helper.
local legacy_args=ni
local -A args_array=([n]=name= [i]=ip=)
local name
local ip
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
ynh_lxc_stop --name="$name"
lxc config device set $name eth1 ipv4.address $ip
_ynh_lxc_start_and_wait --name="$name"
}
# Stop an LXC container in demo mode
#
# usage: ynh_lxc_demo_stop --name=name
# | arg: -n, --name= - name of the LXC
#
# Requires YunoHost version *.*.* or higher.
ynh_lxc_demo_stop () {
# Declare an array to define the options of this helper.
local legacy_args=n
local -A args_array=([n]=name=)
local name
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
ynh_lxc_stop --name="$name"
lxc config device unset $name eth1 ipv4.address
}
# Upgrading demo container
#
# usage: ynh_lxc_demo_upgrade --name=name --time_to_switch=time_to_switch
# | arg: -n, --name= - name of the LXC
# | arg: -t, --time_to_switch= - time to switch
#
# Requires YunoHost version *.*.* or higher.
ynh_lxc_demo_upgrade () {
# Declare an array to define the options of this helper.
local legacy_args=nt
local -A args_array=([n]=name= [t]=time_to_switch=)
local name
local time_to_switch
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
ynh_print_info --message="Upgrading $name"
# Attend que la machine soit éteinte.
# Timeout à $time_to_switch +5 minutes, en seconde
TIME_OUT=$(($time_to_switch * 60 + 300))
wait_period=0
while ! ynh_lxc_is_stopped --name=$name
do
wait_period=$(($wait_period+10))
if [ $wait_period -gt $TIME_OUT ];then
break
else
sleep 5
fi
done
while test -e /var/lib/lxd/$name.lock_fileS; do
sleep 5 # Attend que le conteneur soit libéré par le script switch.
done
touch /var/lib/lxd/$name.lock_fileU # Met en place un fichier pour indiquer que la machine est indisponible pendant l'upgrade
# Supprime les éventuels swap présents.
/sbin/swapoff /var/lib/lxd/$name/rootfs/swap_*
# Restaure le snapshot
ynh_lxc_snapshot_load --name=$name --snapname=snap0
# Démarre le conteneur
date >> "$final_path/demo_boot.log"
# Update
update_apt=0
ynh_lxc_run_inside --name="$name" --command="apt-get update"
ynh_lxc_run_inside --name="$name" --command="apt-get dist-upgrade --dry-run | grep -q "^Inst " > /dev/null" # Vérifie si il y aura des mises à jour.
if [ "$?" -eq 0 ]; then
date
update_apt=1
# Upgrade
ynh_lxc_run_inside --name="$name" --command="apt-get dist-upgrade --option Dpkg::Options::=--force-confold -yy"
# Clean
ynh_lxc_run_inside --name="$name" --command="apt-get autoremove -y"
ynh_lxc_run_inside --name="$name" --command="apt-get autoclean"
fi
ynh_lxc_run_inside --name="$name" --command="yunohost tools update"
ynh_lxc_run_inside --name="$name" --command="yunohost tools upgrade system"
# Exécution des scripts de upgrade.d
LOOP=$((LOOP + 1))
while read LIGNE
do
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
then
date
# Exécute chaque script trouvé dans upgrade.d
ynh_print_info --message="Exécution du script $LIGNE sur le conteneur $name"
/bin/bash "$final_path/upgrade.d/$LIGNE" $name
if [ "$?" -ne 0 ]; then # Si le script a échoué, le snapshot est annulé.
ynh_print_info --message="Échec du script $LIGNE"
mv -f "$final_path/upgrade.d/$LIGNE" "$final_path/upgrade.d/$LIGNE.fail"
ynh_print_info --message="Échec d'exécution du script d'upgrade $LIGNE sur le conteneur $name 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
else
ynh_print_info --message="Le script $LIGNE a été exécuté sans erreur"
update_apt=1
fi
fi
done <<< "$(ls -1 "$final_path/upgrade.d")"
# 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
ynh_print_info --message="Exécution du script $LIGNE sur le conteneur $name"
/bin/bash "$final_path/upgrade.d/Constant_upgrade/$LIGNE" $name
if [ "$?" -ne 0 ]; then
ynh_print_info --message="Échec du script $LIGNE"
ynh_print_info --message="Échec d'exécution du script d'upgrade $LIGNE sur le conteneur $name sur le serveur de demo $DOMAIN!\n"
else
ynh_print_info --message="Le script $LIGNE a été exécuté sans erreur"
fi
fi
done <<< "$(ls -1 "$final_path/upgrade.d/Constant_upgrade")"
# Upgrade des apps
ynh_lxc_run_inside --name="$name" --command="yunohost tools update"
ynh_lxc_run_inside --name="$name" --command="systemctl restart nginx"
ynh_lxc_run_inside --name="$name" --command="yunohost tools upgrade apps"
ynh_lxc_run_inside --name="$name" --command="systemctl restart nginx"
# Arrêt de la machine virtualisée
ynh_lxc_stop --name=$name
if [ "$update_apt" -eq "1" ]
then
# Archivage du snapshot
ynh_exec_warn_less tar -cz --acls --xattrs -f /var/lib/lxd/snapshots/$name/snap0.tar.gz /var/lib/lxd/snapshots/$name/snap0
# Remplacement du snapshot
ynh_lxc_snapshot_create --name=$name --snapname=snap0
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 "$final_path/upgrade.d" | while read LIGNE
do
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
then
mv -f "$final_path/upgrade.d/$LIGNE" "$final_path/upgrade.d/old_scripts/$LIGNE"
fi
done
fi
fi
ynh_secure_remove --file="/var/lib/lxd/$name.lock_fileU" # Libère le lock, la machine est à nouveau disponible
ynh_print_info --message="Finished upgrading $name"
}
# Restore an LXC container from snap0 snapshot
#
# usage: ynh_lxc_demo_restore_from_snapshot --name=name
# | arg: -n, --name= - name of the LXC
#
# Requires YunoHost version *.*.* or higher.
ynh_lxc_demo_restore_from_snapshot () {
# Declare an array to define the options of this helper.
local legacy_args=n
local -A args_array=([n]=name=)
local name
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
ynh_print_info --message="Restoring LXC container $name from snapshot"
ynh_lxc_snapshot_load --name=$name --snapname=snap0
if ynh_lxc_check_container_start --name=$name
then
ynh_print_info --message="LXC container $name is working."
return 0
else
ynh_print_info --message="LXC container $name is broken."
return 1
fi
}
# Restore an LXC container from an archive
#
# usage: ynh_lxc_demo_restore_from_archive --name=name
# | arg: -n, --name= - name of the LXC
#
# Requires YunoHost version *.*.* or higher.
ynh_lxc_demo_restore_from_archive () {
# Declare an array to define the options of this helper.
local legacy_args=n
local -A args_array=([n]=name=)
local name
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
if ! test -e "/var/lib/lxd/snapshots/$name/snap1.tar.gz"; then
ynh_print_info --message="No snapshot archive for LXC container $name"
return 1
fi
ynh_print_info --message="Restoring snapshot archive for LXC container $name"
ynh_print_info --message="Deleting snapshot"
ynh_lxc_snapshot_delete --name=$name --snapname=snap0
ynh_print_info --message="Untar archive"
tar -x --acls --xattrs -f /var/lib/lxd/snapshots/$name/snap0.tar.gz -C /
ynh_lxc_demo_restore_from_snapshot --name=$name
return $?
}