diff --git a/helpers/helpers.v2.1.d/backup b/helpers/helpers.v2.1.d/backup index 6b147ed6a..21ee091a4 100644 --- a/helpers/helpers.v2.1.d/backup +++ b/helpers/helpers.v2.1.d/backup @@ -4,19 +4,16 @@ CAN_BIND=${CAN_BIND:-1} # Add a file or a directory to the list of paths to backup # -# usage: ynh_backup --src_path=src_path [--dest_path=dest_path] [--is_big] [--not_mandatory] -# | arg: -s, --src_path= - file or directory to bind or symlink or copy. it shouldn't be in the backup dir. -# | arg: -d, --dest_path= - destination file or directory inside the backup dir +# usage: ynh_backup --target=/path/to/stuff [--is_big] [--not_mandatory] +# | arg: -s, --target= - file or directory to bind or symlink or copy. it shouldn't be in the backup dir. # | arg: -b, --is_big - Indicate data are big (mail, video, image ...) # | arg: -m, --not_mandatory - Indicate that if the file is missing, the backup can ignore it. # # This helper can be used both in a system backup hook, and in an app backup script # -# `ynh_backup` writes `src_path` and the relative `dest_path` into a CSV file, and it +# `ynh_backup` writes `target` and the corresponding path inside the archive (dest_path) into a CSV file, and it # creates the parent destination directory # -# If `dest_path` is ended by a slash it complete this path with the basename of `src_path`. -# # Example in the context of a wordpress app : # ``` # ynh_backup "/etc/nginx/conf.d/$domain.d/$app.conf" @@ -49,7 +46,7 @@ CAN_BIND=${CAN_BIND:-1} # each of his backup. And so handle that part differently. # # As this part of your backup may not be done, your restore script has to handle it. -# In your restore script, use `--not_mandatory` with `ynh_restore_file` +# In your restore script, use `--not_mandatory` with `ynh_restore` # As well in your remove script, you should not remove those data ! Or an user may end up with # a failed upgrade restoring an app without data anymore ! # @@ -65,13 +62,11 @@ ynh_backup() { # TODO find a way to avoid injection by file strange naming ! # ============ Argument parsing ============= - local -A args_array=([s]=src_path= [d]=dest_path= [b]=is_big [m]=not_mandatory) - local src_path - local dest_path + local -A args_array=([t]=target= [b]=is_big [m]=not_mandatory) + local target local is_big local not_mandatory ynh_handle_getopts_args "$@" - dest_path="${dest_path:-}" is_big="${is_big:-0}" not_mandatory="${not_mandatory:-0}" # =========================================== @@ -83,9 +78,9 @@ ynh_backup() { # don't backup big data items if [ $is_big -eq 1 ] && ([ ${do_not_backup_data:-0} -eq 1 ] || [ $BACKUP_CORE_ONLY -eq 1 ]); then if [ $BACKUP_CORE_ONLY -eq 1 ]; then - ynh_print_info --message="$src_path will not be saved, because 'BACKUP_CORE_ONLY' is set." + ynh_print_info --message="$target will not be saved, because 'BACKUP_CORE_ONLY' is set." else - ynh_print_info --message="$src_path will not be saved, because 'do_not_backup_data' is set." + ynh_print_info --message="$target will not be saved, because 'do_not_backup_data' is set." fi return 0 fi @@ -94,16 +89,10 @@ ynh_backup() { # Format correctly source and destination paths # ============================================================================== # Be sure the source path is not empty - if [ ! -e "$src_path" ]; then + if [ ! -e "$target" ]; then ynh_print_warn --message="Source path '${src_path}' does not exist" if [ "$not_mandatory" == "0" ]; then - # This is a temporary fix for fail2ban config files missing after the migration to stretch. - if echo "${src_path}" | grep --quiet "/etc/fail2ban"; then - touch "${src_path}" - ynh_print_info --message="The missing file will be replaced by a dummy one for the backup !!!" - else - return 1 - fi + return 1 else return 0 fi @@ -111,37 +100,11 @@ ynh_backup() { # Transform the source path as an absolute path # If it's a dir remove the ending / - src_path=$(realpath "$src_path") + src_path=$(realpath "$target") - # If there is no destination path, initialize it with the source path - # relative to "/". + # Initialize the dest path with the source path relative to "/". # eg: src_path=/etc/yunohost -> dest_path=etc/yunohost - if [[ -z "$dest_path" ]]; then - dest_path="${src_path#/}" - - else - if [[ "${dest_path:0:1}" == "/" ]]; then - - # If the destination path is an absolute path, transform it as a path - # relative to the current working directory ($YNH_CWD) - # - # If it's an app backup script that run this helper, YNH_CWD is equal to - # $YNH_BACKUP_DIR/apps/APP_INSTANCE_NAME/backup/ - # - # If it's a system part backup script, YNH_CWD is equal to $YNH_BACKUP_DIR - dest_path="${dest_path#$YNH_CWD/}" - - # Case where $2 is an absolute dir but doesn't begin with $YNH_CWD - if [[ "${dest_path:0:1}" == "/" ]]; then - dest_path="${dest_path#/}" - fi - fi - - # Complete dest_path if ended by a / - if [[ "${dest_path: -1}" == "/" ]]; then - dest_path="${dest_path}/$(basename $src_path)" - fi - fi + dest_path="${src_path#/}" # Check if dest_path already exists in tmp archive if [[ -e "${dest_path}" ]]; then @@ -170,25 +133,6 @@ ynh_backup() { mkdir --parents $(dirname "$YNH_BACKUP_DIR/${dest_path}") } -# Restore all files that were previously backuped in a core backup script or app backup script -# -# usage: ynh_restore -# -# Requires YunoHost version 2.6.4 or higher. -ynh_restore() { - # Deduce the relative path of $YNH_CWD - local REL_DIR="${YNH_CWD#$YNH_BACKUP_DIR/}" - REL_DIR="${REL_DIR%/}/" - - # For each destination path begining by $REL_DIR - cat ${YNH_BACKUP_CSV} | tr --delete $'\r' | grep --only-matching --no-filename --perl-regexp "^\".*\",\"$REL_DIR.*\"$" \ - | while read line; do - local ORIGIN_PATH=$(echo "$line" | grep --only-matching --no-filename --perl-regexp "^\"\K.*(?=\",\".*\"$)") - local ARCHIVE_PATH=$(echo "$line" | grep --only-matching --no-filename --perl-regexp "^\".*\",\"$REL_DIR\K.*(?=\"$)") - ynh_restore_file --origin_path="$ARCHIVE_PATH" --dest_path="$ORIGIN_PATH" - done -} - # Return the path in the archive where has been stocked the origin path # # [internal] @@ -212,17 +156,16 @@ with open(sys.argv[1], 'r') as backup_file: # Restore a file or a directory # -# usage: ynh_restore_file --origin_path=origin_path [--dest_path=dest_path] [--not_mandatory] -# | arg: -o, --origin_path= - Path where was located the file or the directory before to be backuped or relative path to $YNH_CWD where it is located in the backup archive -# | arg: -d, --dest_path= - Path where restore the file or the dir. If unspecified, the destination will be `ORIGIN_PATH` or if the `ORIGIN_PATH` doesn't exist in the archive, the destination will be searched into `backup.csv` +# usage: ynh_restore --target=/path/to/stuff [--not_mandatory] +# | arg: -t, --target= - Path where was located the file or the directory before to be backuped or relative path to $YNH_CWD where it is located in the backup archive # | arg: -m, --not_mandatory - Indicate that if the file is missing, the restore process can ignore it. # # Use the registered path in backup_list by ynh_backup to restore the file at the right place. # # examples: -# ynh_restore_file -o "/etc/nginx/conf.d/$domain.d/$app.conf" +# ynh_restore -t "/etc/nginx/conf.d/$domain.d/$app.conf" # # You can also use relative paths: -# ynh_restore_file -o "conf/nginx.conf" +# ynh_restore -t "conf/nginx.conf" # # If `DEST_PATH` already exists and is lighter than 500 Mo, a backup will be made in # `/var/cache/yunohost/appconfbackup/`. Otherwise, the existing file is removed. @@ -234,62 +177,51 @@ with open(sys.argv[1], 'r') as backup_file: # # Requires YunoHost version 2.6.4 or higher. # Requires YunoHost version 3.5.0 or higher for the argument --not_mandatory -ynh_restore_file() { +ynh_restore() { # ============ Argument parsing ============= - local -A args_array=([o]=origin_path= [d]=dest_path= [m]=not_mandatory) - local origin_path - local dest_path + local -A args_array=([t]=target= [m]=not_mandatory) + local target local not_mandatory ynh_handle_getopts_args "$@" - origin_path="/${origin_path#/}" - # Default value for dest_path = /$origin_path - dest_path="${dest_path:-$origin_path}" + target="/${target#/}" not_mandatory="${not_mandatory:-0}" # =========================================== - local archive_path="$YNH_CWD${origin_path}" + local archive_path="$YNH_CWD${target}" # If archive_path doesn't exist, search for a corresponding path in CSV if [ ! -d "$archive_path" ] && [ ! -f "$archive_path" ] && [ ! -L "$archive_path" ]; then if [ "$not_mandatory" == "0" ]; then - archive_path="$YNH_BACKUP_DIR/$(_get_archive_path \"$origin_path\")" + archive_path="$YNH_BACKUP_DIR/$(_get_archive_path \"$target\")" else return 0 fi fi # Move the old directory if it already exists - if [[ -e "${dest_path}" ]]; then + if [[ -e "${target}" ]]; then # Check if the file/dir size is less than 500 Mo - if [[ $(du --summarize --bytes ${dest_path} | cut --delimiter="/" --fields=1) -le "500000000" ]]; then - local backup_file="/var/cache/yunohost/appconfbackup/${dest_path}.backup.$(date '+%Y%m%d.%H%M%S')" + if [[ $(du --summarize --bytes ${target} | cut --delimiter="/" --fields=1) -le "500000000" ]]; then + local backup_file="/var/cache/yunohost/appconfbackup/${target}.backup.$(date '+%Y%m%d.%H%M%S')" mkdir --parents "$(dirname "$backup_file")" - mv "${dest_path}" "$backup_file" # Move the current file or directory + mv "${target}" "$backup_file" # Move the current file or directory else - ynh_safe_rm --target=${dest_path} + ynh_safe_rm --target=${target} fi fi - # Restore origin_path into dest_path - mkdir --parents $(dirname "$dest_path") + # Restore target into target + mkdir --parents $(dirname "$target") # Do a copy if it's just a mounting point if mountpoint --quiet $YNH_BACKUP_DIR; then if [[ -d "${archive_path}" ]]; then archive_path="${archive_path}/." - mkdir --parents "$dest_path" + mkdir --parents "$target" fi - cp --archive "$archive_path" "${dest_path}" + cp --archive "$archive_path" "${target}" # Do a move if YNH_BACKUP_DIR is already a copy else - mv "$archive_path" "${dest_path}" - fi - - # Boring hack for nginx conf file mapped to php7.3 - # Note that there's no need to patch the fpm config because most php apps - # will call "ynh_add_fpm_config" during restore, effectively recreating the file from scratch - if [[ "${dest_path}" == "/etc/nginx/conf.d/"* ]] && grep 'php7.3.*sock' "${dest_path}" - then - sed -i 's/php7.3/php7.4/g' "${dest_path}" + mv "$archive_path" "${target}" fi }