mirror of
https://github.com/YunoHost/yunohost.git
synced 2024-09-03 20:06:10 +02:00
helpers2.1: simplify backup/restore helper syntax: ynh_restore_file -> ynh_restore to be symetric with ynh_backup. Remove unused --dest_dir arg, rename --src/origin_path to --target
This commit is contained in:
parent
8117f438d4
commit
701828bf45
1 changed files with 33 additions and 101 deletions
|
@ -4,19 +4,16 @@ CAN_BIND=${CAN_BIND:-1}
|
||||||
|
|
||||||
# Add a file or a directory to the list of paths to backup
|
# 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]
|
# usage: ynh_backup --target=/path/to/stuff [--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: -s, --target= - 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
|
|
||||||
# | arg: -b, --is_big - Indicate data are big (mail, video, image ...)
|
# | 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.
|
# | 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
|
# 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
|
# 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 :
|
# Example in the context of a wordpress app :
|
||||||
# ```
|
# ```
|
||||||
# ynh_backup "/etc/nginx/conf.d/$domain.d/$app.conf"
|
# 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.
|
# 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.
|
# 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
|
# 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 !
|
# 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 !
|
# TODO find a way to avoid injection by file strange naming !
|
||||||
|
|
||||||
# ============ Argument parsing =============
|
# ============ Argument parsing =============
|
||||||
local -A args_array=([s]=src_path= [d]=dest_path= [b]=is_big [m]=not_mandatory)
|
local -A args_array=([t]=target= [b]=is_big [m]=not_mandatory)
|
||||||
local src_path
|
local target
|
||||||
local dest_path
|
|
||||||
local is_big
|
local is_big
|
||||||
local not_mandatory
|
local not_mandatory
|
||||||
ynh_handle_getopts_args "$@"
|
ynh_handle_getopts_args "$@"
|
||||||
dest_path="${dest_path:-}"
|
|
||||||
is_big="${is_big:-0}"
|
is_big="${is_big:-0}"
|
||||||
not_mandatory="${not_mandatory:-0}"
|
not_mandatory="${not_mandatory:-0}"
|
||||||
# ===========================================
|
# ===========================================
|
||||||
|
@ -83,9 +78,9 @@ ynh_backup() {
|
||||||
# don't backup big data items
|
# 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 [ $is_big -eq 1 ] && ([ ${do_not_backup_data:-0} -eq 1 ] || [ $BACKUP_CORE_ONLY -eq 1 ]); then
|
||||||
if [ $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
|
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
|
fi
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
@ -94,16 +89,10 @@ ynh_backup() {
|
||||||
# Format correctly source and destination paths
|
# Format correctly source and destination paths
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# Be sure the source path is not empty
|
# 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"
|
ynh_print_warn --message="Source path '${src_path}' does not exist"
|
||||||
if [ "$not_mandatory" == "0" ]; then
|
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
|
return 1
|
||||||
fi
|
|
||||||
else
|
else
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
@ -111,38 +100,12 @@ ynh_backup() {
|
||||||
|
|
||||||
# Transform the source path as an absolute path
|
# Transform the source path as an absolute path
|
||||||
# If it's a dir remove the ending /
|
# 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
|
# Initialize the dest path with the source path relative to "/".
|
||||||
# relative to "/".
|
|
||||||
# eg: src_path=/etc/yunohost -> dest_path=etc/yunohost
|
# eg: src_path=/etc/yunohost -> dest_path=etc/yunohost
|
||||||
if [[ -z "$dest_path" ]]; then
|
|
||||||
dest_path="${src_path#/}"
|
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
|
|
||||||
|
|
||||||
# Check if dest_path already exists in tmp archive
|
# Check if dest_path already exists in tmp archive
|
||||||
if [[ -e "${dest_path}" ]]; then
|
if [[ -e "${dest_path}" ]]; then
|
||||||
ynh_print_err --message="Destination path '${dest_path}' already exist"
|
ynh_print_err --message="Destination path '${dest_path}' already exist"
|
||||||
|
@ -170,25 +133,6 @@ ynh_backup() {
|
||||||
mkdir --parents $(dirname "$YNH_BACKUP_DIR/${dest_path}")
|
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
|
# Return the path in the archive where has been stocked the origin path
|
||||||
#
|
#
|
||||||
# [internal]
|
# [internal]
|
||||||
|
@ -212,17 +156,16 @@ with open(sys.argv[1], 'r') as backup_file:
|
||||||
|
|
||||||
# Restore a file or a directory
|
# Restore a file or a directory
|
||||||
#
|
#
|
||||||
# usage: ynh_restore_file --origin_path=origin_path [--dest_path=dest_path] [--not_mandatory]
|
# usage: ynh_restore --target=/path/to/stuff [--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: -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: -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`
|
|
||||||
# | arg: -m, --not_mandatory - Indicate that if the file is missing, the restore process can ignore it.
|
# | 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.
|
# Use the registered path in backup_list by ynh_backup to restore the file at the right place.
|
||||||
#
|
#
|
||||||
# examples:
|
# 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:
|
# # 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
|
# 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.
|
# `/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 2.6.4 or higher.
|
||||||
# Requires YunoHost version 3.5.0 or higher for the argument --not_mandatory
|
# Requires YunoHost version 3.5.0 or higher for the argument --not_mandatory
|
||||||
ynh_restore_file() {
|
ynh_restore() {
|
||||||
# ============ Argument parsing =============
|
# ============ Argument parsing =============
|
||||||
local -A args_array=([o]=origin_path= [d]=dest_path= [m]=not_mandatory)
|
local -A args_array=([t]=target= [m]=not_mandatory)
|
||||||
local origin_path
|
local target
|
||||||
local dest_path
|
|
||||||
local not_mandatory
|
local not_mandatory
|
||||||
ynh_handle_getopts_args "$@"
|
ynh_handle_getopts_args "$@"
|
||||||
origin_path="/${origin_path#/}"
|
target="/${target#/}"
|
||||||
# Default value for dest_path = /$origin_path
|
|
||||||
dest_path="${dest_path:-$origin_path}"
|
|
||||||
not_mandatory="${not_mandatory:-0}"
|
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 archive_path doesn't exist, search for a corresponding path in CSV
|
||||||
if [ ! -d "$archive_path" ] && [ ! -f "$archive_path" ] && [ ! -L "$archive_path" ]; then
|
if [ ! -d "$archive_path" ] && [ ! -f "$archive_path" ] && [ ! -L "$archive_path" ]; then
|
||||||
if [ "$not_mandatory" == "0" ]; 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
|
else
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Move the old directory if it already exists
|
# 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
|
# Check if the file/dir size is less than 500 Mo
|
||||||
if [[ $(du --summarize --bytes ${dest_path} | cut --delimiter="/" --fields=1) -le "500000000" ]]; then
|
if [[ $(du --summarize --bytes ${target} | cut --delimiter="/" --fields=1) -le "500000000" ]]; then
|
||||||
local backup_file="/var/cache/yunohost/appconfbackup/${dest_path}.backup.$(date '+%Y%m%d.%H%M%S')"
|
local backup_file="/var/cache/yunohost/appconfbackup/${target}.backup.$(date '+%Y%m%d.%H%M%S')"
|
||||||
mkdir --parents "$(dirname "$backup_file")"
|
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
|
else
|
||||||
ynh_safe_rm --target=${dest_path}
|
ynh_safe_rm --target=${target}
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Restore origin_path into dest_path
|
# Restore target into target
|
||||||
mkdir --parents $(dirname "$dest_path")
|
mkdir --parents $(dirname "$target")
|
||||||
|
|
||||||
# Do a copy if it's just a mounting point
|
# Do a copy if it's just a mounting point
|
||||||
if mountpoint --quiet $YNH_BACKUP_DIR; then
|
if mountpoint --quiet $YNH_BACKUP_DIR; then
|
||||||
if [[ -d "${archive_path}" ]]; then
|
if [[ -d "${archive_path}" ]]; then
|
||||||
archive_path="${archive_path}/."
|
archive_path="${archive_path}/."
|
||||||
mkdir --parents "$dest_path"
|
mkdir --parents "$target"
|
||||||
fi
|
fi
|
||||||
cp --archive "$archive_path" "${dest_path}"
|
cp --archive "$archive_path" "${target}"
|
||||||
# Do a move if YNH_BACKUP_DIR is already a copy
|
# Do a move if YNH_BACKUP_DIR is already a copy
|
||||||
else
|
else
|
||||||
mv "$archive_path" "${dest_path}"
|
mv "$archive_path" "${target}"
|
||||||
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}"
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue