From a878cd35150a36d76e5fdcae6ce058f35eb712f4 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Sun, 30 Sep 2018 20:01:19 +0200 Subject: [PATCH] Panel-config + actions fully tested --- actions.json | 11 ++++ config_panel.json | 11 ++++ scripts/_common.sh | 22 +++++++- scripts/actions/clean_backups | 2 +- scripts/actions/force_backup | 2 +- scripts/actions/reset_default_config | 82 ++++++++++++++++++++++++++++ scripts/config | 74 ++++++++++++++----------- scripts/install | 7 +++ scripts/upgrade | 79 ++++++++++++++++++++------- 9 files changed, 236 insertions(+), 54 deletions(-) create mode 100755 scripts/actions/reset_default_config diff --git a/actions.json b/actions.json index 9a36a54..991a94d 100644 --- a/actions.json +++ b/actions.json @@ -19,4 +19,15 @@ "en": "Remove all previous backup files made by Archivist.", "fr": "Supprime tout les précédents backups créés par Archivist." } +}, +{ + "id": "reset_default_config", + "name": "Reset the config file and restore a default one.", + "command": "/bin/bash scripts/actions/reset_default_config \"Backup_list.conf\"", + "user": "root", + "accepted_return_codes": [0], + "description": { + "en": "Reset the config file Backup_list.conf.", + "fr": "Réinitialise le fichier de configuration Backup_list.conf." + } }] diff --git a/config_panel.json b/config_panel.json index 40f9869..24f1076 100644 --- a/config_panel.json +++ b/config_panel.json @@ -53,6 +53,17 @@ "type": "number", "default": 500 }] + }, + { + "name": "Overwriting config files", + "id": "overwrite_files", + "options": [{ + "name": "Overwrite the cron file during the upgrade ?", + "help": "If the file is overwritten, a backup will be created.", + "id": "overwrite_cron", + "type": "bool", + "default": true + }] }] } ] diff --git a/scripts/_common.sh b/scripts/_common.sh index 21234d0..8d58e36 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -30,6 +30,24 @@ IS_PACKAGE_CHECK () { return $(env | grep -c container=lxc) } +#================================================= +# BOOLEAN CONVERTER +#================================================= + +bool_to_01 () { + local var="$1" + [ "$var" = "true" ] && var=1 + [ "$var" = "false" ] && var=0 + echo "$var" +} + +bool_to_true_false () { + local var="$1" + [ "$var" = "1" ] && var=true + [ "$var" = "0" ] && var=false + echo "$var" +} + #================================================= # EXPERIMENTAL HELPERS #================================================= @@ -517,7 +535,7 @@ EOF ynh_store_file_checksum "$finalfail2banjailconf" ynh_store_file_checksum "$finalfail2banfilterconf" - systemctl reload fail2ban + systemctl restart fail2ban local fail2ban_error="$(journalctl -u fail2ban | tail -n50 | grep "WARNING.*$app.*")" if [ -n "$fail2ban_error" ] then @@ -532,7 +550,7 @@ EOF ynh_remove_fail2ban_config () { ynh_secure_remove "/etc/fail2ban/jail.d/$app.conf" ynh_secure_remove "/etc/fail2ban/filter.d/$app.conf" - systemctl reload fail2ban + systemctl restart fail2ban } #================================================= diff --git a/scripts/actions/clean_backups b/scripts/actions/clean_backups index 5ccd2ed..fad0cf0 100755 --- a/scripts/actions/clean_backups +++ b/scripts/actions/clean_backups @@ -13,7 +13,7 @@ source /usr/share/yunohost/helpers # RETRIEVE ARGUMENTS #================================================= -app=$YNH_APP_ID +app=${YNH_APP_INSTANCE_NAME:-$YNH_APP_ID} final_path=$(ynh_app_setting_get $app final_path) diff --git a/scripts/actions/force_backup b/scripts/actions/force_backup index e1cbd0d..9351c1d 100755 --- a/scripts/actions/force_backup +++ b/scripts/actions/force_backup @@ -13,7 +13,7 @@ source /usr/share/yunohost/helpers # RETRIEVE ARGUMENTS #================================================= -app=$YNH_APP_ID +app=${YNH_APP_INSTANCE_NAME:-$YNH_APP_ID} final_path=$(ynh_app_setting_get $app final_path) diff --git a/scripts/actions/reset_default_config b/scripts/actions/reset_default_config new file mode 100755 index 0000000..b0abbdf --- /dev/null +++ b/scripts/actions/reset_default_config @@ -0,0 +1,82 @@ +#!/bin/bash + +#================================================= +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source scripts/_common.sh +source /usr/share/yunohost/helpers + +#================================================= +# RETRIEVE ARGUMENTS +#================================================= + +app=${YNH_APP_INSTANCE_NAME:-$YNH_APP_ID} +final_path=$(ynh_app_setting_get $app final_path) +encrypt=$(ynh_app_setting_get $app encrypt) +core_backup=$(ynh_app_setting_get $app core_backup) +apps_backup=$(ynh_app_setting_get $app apps_backup) + +#================================================= +# SORT OUT THE CONFIG FILE TO HANDLE +#================================================= + +file="$1" + +if [ "$file" = "Backup_list.conf" ]; then + config_file="$final_path/Backup_list.conf" +fi + +#================================================= +# SPECIFIC ACTION +#================================================= +# RESET THE CONFIG FILE +#================================================= + +# Verify the checksum and backup the file if it's different +ynh_backup_if_checksum_is_different "$config_file" + +if [ "$file" = "Backup_list.conf" ] +then + # Get the default file and overwrite the current config + cp "$final_path/Backup_list.conf.default" "$config_file" + + # Recreate the default config + backup_dir="/home/yunohost.app/${app}/backup" + enc_backup_dir="/home/yunohost.app/${app}/encrypted_backup" + ynh_replace_string "^backup_dir=.*" "backup_dir=$backup_dir" "$config_file" + ynh_replace_string "^enc_backup_dir=.*" "enc_backup_dir=$enc_backup_dir" "$config_file" + + if [ $encrypt -eq 1 ] + then + encrypt=true + passkey="$final_path/passkey" + else + encrypt=false + passkey=na + fi + ynh_replace_string "^encrypt=.*" "encrypt=$encrypt" "$config_file" + ynh_replace_string "^cryptpass=.*" "cryptpass=$passkey" "$config_file" + + if [ $core_backup -eq 1 ] + then + core_backup=true + else + core_backup=false + fi + ynh_replace_string "^ynh_core_backup=.*" "ynh_core_backup=$core_backup" "$config_file" + + if [ $apps_backup -eq 1 ] + then + # Add all current applications to the backup + while read backup_app + do + ynh_replace_string "^ynh_app_backup=$" "ynh_app_backup=$backup_app\n&" "$config_file" + done <<< "$(yunohost app list -i | grep id: | sed 's/.*id: //')" + fi +fi + +# Calculate and store the config file checksum into the app settings +ynh_store_file_checksum "$config_file" diff --git a/scripts/config b/scripts/config index 7d30164..5a56e39 100644 --- a/scripts/config +++ b/scripts/config @@ -13,7 +13,7 @@ source /usr/share/yunohost/helpers # RETRIEVE ARGUMENTS #================================================= -app=$YNH_APP_ID +app=${YNH_APP_INSTANCE_NAME:-$YNH_APP_ID} final_path=$(ynh_app_setting_get $app final_path) @@ -36,36 +36,41 @@ get_config_value() { # LOAD VALUES #================================================= - # Load the real value from the app config or elsewhere. - # Then get the value from the form. - # If the form has a value for a variable, take the value from the form, - # Otherwise, keep the value from the app config. +# Load the real value from the app config or elsewhere. +# Then get the value from the form. +# If the form has a value for a variable, take the value from the form, +# Otherwise, keep the value from the app config. - # Encryption - old_encrypt="$(get_config_value encrypt)" - encrypt="${YNH_CONFIG_MAIN_ENCRYPTION_ENCRYPT:-$old_encrypt}" - # Encryption password - ynh_print_OFF - old_encrypt_password="$(cat $passkey)" - encrypt_password="${YNH_CONFIG_MAIN_ENCRYPTION_ENCRYPTION_PWD:-$old_encrypt_password}" - ynh_print_ON - # ynh_core_backup - old_ynh_core_backup="$(get_config_value ynh_core_backup)" - ynh_core_backup="${YNH_CONFIG_MAIN_BACKUP_TYPES_CORE_BACKUP:-$old_ynh_core_backup}" - # ynh_app_backup - if [ -n "$(get_config_value ynh_app_backup)" ] - then - old_ynh_app_backup="true" - else - old_ynh_app_backup="false" - fi - ynh_app_backup="${YNH_CONFIG_MAIN_BACKUP_TYPES_APPS_BACKUP:-$old_ynh_app_backup}" - # Frequency - old_frequency="$(grep "^frequency: " "/etc/yunohost/apps/$app/settings.yml" | cut -d' ' -f2)" - frequency="${YNH_CONFIG_MAIN_BACKUP_OPTIONS_FREQUENCY:-$old_frequency}" - # Max size - old_max_size="$(get_config_value max_size)" - max_size="${YNH_CONFIG_MAIN_BACKUP_OPTIONS_MAX_SIZE:-$old_max_size}" +# Encryption +old_encrypt="$(get_config_value encrypt)" +encrypt="${YNH_CONFIG_MAIN_ENCRYPTION_ENCRYPT:-$old_encrypt}" +# Encryption password +ynh_print_OFF +old_encrypt_password="$(cat $passkey)" +encrypt_password="${YNH_CONFIG_MAIN_ENCRYPTION_ENCRYPTION_PWD:-$old_encrypt_password}" +ynh_print_ON +# ynh_core_backup +old_ynh_core_backup="$(get_config_value ynh_core_backup)" +ynh_core_backup="${YNH_CONFIG_MAIN_BACKUP_TYPES_CORE_BACKUP:-$old_ynh_core_backup}" +# ynh_app_backup +if [ -n "$(get_config_value ynh_app_backup)" ] +then + old_ynh_app_backup="true" +else + old_ynh_app_backup="false" +fi +ynh_app_backup="${YNH_CONFIG_MAIN_BACKUP_TYPES_APPS_BACKUP:-$old_ynh_app_backup}" +# Frequency +old_frequency="$(grep "^frequency: " "/etc/yunohost/apps/$app/settings.yml" | cut -d' ' -f2)" +frequency="${YNH_CONFIG_MAIN_BACKUP_OPTIONS_FREQUENCY:-$old_frequency}" +# Max size +old_max_size="$(get_config_value max_size)" +max_size="${YNH_CONFIG_MAIN_BACKUP_OPTIONS_MAX_SIZE:-$old_max_size}" + +# Overwrite cron file +old_overwrite_cron="$(ynh_app_setting_get $app overwrite_cron)" +old_overwrite_cron=$(bool_to_true_false $old_overwrite_cron) +overwrite_cron="${YNH_CONFIG_MAIN_OVERWRITE_FILES_OVERWRITE_CRON:-$old_overwrite_cron}" #================================================= # SHOW_CONFIG FUNCTION FOR 'SHOW' COMMAND @@ -82,6 +87,8 @@ show_config() { echo "YNH_CONFIG_MAIN_BACKUP_OPTIONS_FREQUENCY=$frequency" echo "YNH_CONFIG_MAIN_BACKUP_OPTIONS_MAX_SIZE=$max_size" + + echo "YNH_CONFIG_MAIN_OVERWRITE_FILES_OVERWRITE_CRON=$overwrite_cron" } #================================================= @@ -117,7 +124,8 @@ apply_config() { ynh_print_info "Add a backup for the app $backup_app." >&2 ynh_replace_string "^ynh_app_backup=$" "ynh_app_backup=$backup_app\n&" "$config_file" done <<< "$(yunohost app list -i | grep id: | sed 's/.*id: //')" - else + elif [ "$ynh_app_backup" = "false" ] && [ "$old_ynh_app_backup" = "true" ] + then # Remove all app currently backup # By deleting all line starting by 'ynh_app_backup=' and having something after '=' sed -i "/^ynh_app_backup=.\+$/d" "$config_file" @@ -145,6 +153,10 @@ apply_config() { # Change max_size in the config file ynh_replace_string "^max_size=.*" "max_size=$max_size" "$config_file" + + # Set overwrite_cron + overwrite_cron=$(bool_to_01 $overwrite_cron) + ynh_app_setting_set $app overwrite_cron "$overwrite_cron" } #================================================= diff --git a/scripts/install b/scripts/install index 715939e..669f493 100755 --- a/scripts/install +++ b/scripts/install @@ -46,6 +46,10 @@ fi #================================================= ynh_app_setting_set $app frequency "$frequency" +ynh_app_setting_set $app encrypt "$encrypt" +ynh_app_setting_set $app core_backup "$core_backup" +ynh_app_setting_set $app apps_backup "$apps_backup" +ynh_app_setting_set $app overwrite_cron "1" #================================================= # STANDARD MODIFICATIONS @@ -118,6 +122,9 @@ then done <<< "$(yunohost app list -i | grep id: | sed 's/.*id: //')" fi +# Calculate and store the config file checksum into the app settings +ynh_store_file_checksum "$config_file" + #================================================= # STRETCH COMPATIBILITY #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 522e911..5f2cb06 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -24,6 +24,10 @@ app=$YNH_APP_INSTANCE_NAME final_path=$(ynh_app_setting_get $app final_path) frequency="$(ynh_app_setting_get $app frequency)" +encrypt=$(ynh_app_setting_get $app encrypt) +core_backup=$(ynh_app_setting_get $app core_backup) +apps_backup=$(ynh_app_setting_get $app apps_backup) +overwrite_cron=$(ynh_app_setting_get $app overwrite_cron) #================================================= # CHECK VERSION @@ -31,6 +35,39 @@ frequency="$(ynh_app_setting_get $app frequency)" upgrade_type=$(ynh_check_app_version_changed) +#================================================= +# ENSURE DOWNWARD COMPATIBILITY +#================================================= + +# If encrypt doesn't exist, create it +if [ -z "$encrypt" ]; then + encrypt="$(grep "^encrypt=" "$final_path/Backup_list.conf" | cut -d= -f2)" + if [ "$encrypt" = true ]; then + encrypt=1 + else + encrypt=0 + fi + ynh_app_setting_set $app encrypt $encrypt +fi + +# If core_backup doesn't exist, create it +if [ -z "$core_backup" ]; then + core_backup="$(grep "^ynh_core_backup=" "$final_path/Backup_list.conf" | cut -d= -f2)" + ynh_app_setting_set $app core_backup $core_backup +fi + +# If apps_backup doesn't exist, create it +if [ -z "$apps_backup" ]; then + apps_backup="$(grep --count --max-count=1 "^ynh_app_backup=" "$final_path/Backup_list.conf")" + ynh_app_setting_set $app apps_backup $apps_backup +fi + +# If overwrite_cron doesn't exist, create it +if [ -z "$overwrite_cron" ]; then + overwrite_cron=1 + ynh_app_setting_set $app overwrite_cron $overwrite_cron +fi + #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= @@ -72,27 +109,31 @@ fi # UPDATE THE CRON FILE #================================================= -# Verify the checksum and backup the file if it's different -ynh_backup_if_checksum_is_different "/etc/cron.d/$app" +# Overwrite the cron file only if it's allowed +if [ $overwrite_cron -eq 1 ] +then + # Verify the checksum and backup the file if it's different + ynh_backup_if_checksum_is_different "/etc/cron.d/$app" -cp ../conf/cron /etc/cron.d/$app -ynh_replace_string "__FINALPATH__" "$final_path" /etc/cron.d/$app -ynh_replace_string "__APP__" "$app" /etc/cron.d/$app -if [ "$frequency" = "Daily" ]; then - cron_freq="0 2 * * *" -elif [ "$frequency" = "Each 3 days" ]; then - cron_freq="0 2 */3 * *" -elif [ "$frequency" = "Weekly" ]; then - cron_freq="0 2 * * 0" -elif [ "$frequency" = "Biweekly" ]; then - cron_freq="0 2 * * 0/2" -else # Monthly - cron_freq="0 2 1 * *" + cp ../conf/cron /etc/cron.d/$app + ynh_replace_string "__FINALPATH__" "$final_path" /etc/cron.d/$app + ynh_replace_string "__APP__" "$app" /etc/cron.d/$app + if [ "$frequency" = "Daily" ]; then + cron_freq="0 2 * * *" + elif [ "$frequency" = "Each 3 days" ]; then + cron_freq="0 2 */3 * *" + elif [ "$frequency" = "Weekly" ]; then + cron_freq="0 2 * * 0" + elif [ "$frequency" = "Biweekly" ]; then + cron_freq="0 2 * * 0/2" + else # Monthly + cron_freq="0 2 1 * *" + fi + ynh_replace_string "__FREQUENCY__" "$cron_freq" /etc/cron.d/$app + + # Recalculate and store the config file checksum into the app settings + ynh_store_file_checksum "/etc/cron.d/$app" fi -ynh_replace_string "__FREQUENCY__" "$cron_freq" /etc/cron.d/$app - -# Recalculate and store the config file checksum into the app settings -ynh_store_file_checksum "/etc/cron.d/$app" #================================================= # SETUP LOGROTATE