From c0a40dd2df551e5e7cda8ba7b8f987bc52c81dce Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Mon, 22 May 2017 15:24:16 +0200 Subject: [PATCH] New helpers ynh_store_file_checksum and ynh_backup_if_checksum_is_different (#286) * New helpers ynh_store_checksum_config and ynh_compare_checksum_config Helpers for avoid destruction of personalised config files. If the config file was manually modified, make a backup of it. The name of this backup is returned, so the packager can choose which of this both file will used by default. * Implement @JimboJoe's comments. * Setting local variables as local * Adding warning about $app that should be defined * Remove "globally" in comment to limit confusion * Remove "globally" in comment to limit confusion * Remove compress and use /home/yunohost.conf/backup * Changing timestamp format to match regen-conf's * Tested and fixed ;) --- data/helpers.d/filesystem | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/data/helpers.d/filesystem b/data/helpers.d/filesystem index 0d13c4825..f0f3afb06 100644 --- a/data/helpers.d/filesystem +++ b/data/helpers.d/filesystem @@ -81,6 +81,44 @@ properly with chmod/chown." >&2 echo $TMP_DIR } +# Calculate and store a file checksum into the app settings +# +# $app should be defined when calling this helper +# +# usage: ynh_store_file_checksum file +# | arg: file - The file on which the checksum will performed, then stored. +ynh_store_file_checksum () { + local checksum_setting_name=checksum_${1//[\/ ]/_} # Replace all '/' and ' ' by '_' + ynh_app_setting_set $app $checksum_setting_name $(sudo md5sum "$1" | cut -d' ' -f1) +} + +# Verify the checksum and backup the file if it's different +# This helper is primarily meant to allow to easily backup personalised/manually +# modified config files. +# +# $app should be defined when calling this helper +# +# usage: ynh_backup_if_checksum_is_different file +# | arg: file - The file on which the checksum test will be perfomed. +# +# | ret: Return the name a the backup file, or nothing +ynh_backup_if_checksum_is_different () { + local file=$1 + local checksum_setting_name=checksum_${file//[\/ ]/_} # Replace all '/' and ' ' by '_' + local checksum_value=$(ynh_app_setting_get $app $checksum_setting_name) + if [ -n "$checksum_value" ] + then # Proceed only if a value was stored into the app settings + if ! echo "$checksum_value $file" | sudo md5sum -c --status + then # If the checksum is now different + backup_file="/home/yunohost.conf/backup/$file.backup.$(date '+%Y%m%d.%H%M%S')" + sudo mkdir -p "$(dirname "$backup_file")" + sudo cp -a "$file" "$backup_file" # Backup the current file + echo "File $file has been manually modified since the installation or last upgrade. So it has been duplicated in $backup_file" >&2 + echo "$backup_file" # Return the name of the backup file + fi + fi +} + # Remove a file or a directory securely # # usage: ynh_secure_remove path_to_remove