#!/bin/bash #================================================= # Demo helpers #================================================= # Start an LXC container in demo mode # # usage: ynh_lxc_start_as_demo --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_start_as_demo() { # 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_stop_as_demo --name=name # | arg: -n, --name= - name of the LXC # # Requires YunoHost version *.*.* or higher. ynh_lxc_stop_as_demo() { # 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_upgrade_demo --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_upgrade_demo() { # 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_load_snapshot --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 tar -cz --acls --xattrs -f /var/lib/lxd/snapshots/$name/snap0.tar.gz /var/lib/lxd/snapshots/$name/snap0 # Remplacement du snapshot ynh_lxc_create_snapshot --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" }