|
@@ -0,0 +1,53 @@
|
|
|
+#!/bin/sh
|
|
|
+#
|
|
|
+# This script backs a directory up, and uploads the backup to a SSH server.
|
|
|
+#
|
|
|
+# On the server, a directory containing the date of the backup is created,
|
|
|
+# for instance 20230402 if the script was launched on the 2nd of April 2023.
|
|
|
+# The files are copied inside this directory.
|
|
|
+#
|
|
|
+# If a former directory exists, the files that are unchanged are linked to
|
|
|
+# it. So for instance, if 20230101/big_file exists and 20230102/big_file is
|
|
|
+# unchanged, then 20230102 will be a hard (not symbolic) link. This is achieved
|
|
|
+# using --link-dest from rsync (see man rsync).
|
|
|
+#
|
|
|
+# The following environment variables must be defined:
|
|
|
+# - LOCAL_FOLDER_PATH: a relative or absolute path to the directory to backup.
|
|
|
+# The script will exit with value 10 if the path does not exist, or
|
|
|
+# if the file is not a directory.
|
|
|
+# - REMOTE_FOLDER_PATH: a relative or absolute path to the directory in which
|
|
|
+# the backups are created.
|
|
|
+# - REMOTE_USER: The username to use when connecting to the SSH server.
|
|
|
+# - REMOTE_SERVER: The server to connect to.
|
|
|
+
|
|
|
+# This functions returns the last folder of the form 20230402 on the remote
|
|
|
+# SSH server, or an empty string if none is found.
|
|
|
+find_newest_folder() {
|
|
|
+ ssh -o StrictHostKeyChecking=no -l "${REMOTE_USER}" "${REMOTE_SERVER}" "cd ${REMOTE_FOLDER_PATH} && ls -td ./*/ | head -1"
|
|
|
+}
|
|
|
+
|
|
|
+[[ -d "${LOCAL_FOLDER_PATH}" ]] || exit 10
|
|
|
+
|
|
|
+echo "Listing file in local folder"
|
|
|
+ls -l ${LOCAL_FOLDER_PATH}
|
|
|
+
|
|
|
+# E.g. 20230402.
|
|
|
+remote_folder=${REMOTE_FOLDER_PATH}/$(date +'%Y%m%d')
|
|
|
+
|
|
|
+echo "Looking for previous folder..."
|
|
|
+last_folder=$(find_newest_folder)
|
|
|
+if [[ -n "$last_folder" ]]; then
|
|
|
+ echo "Found previous folder: ${REMOTE_FOLDER_PATH}/${last_folder}"
|
|
|
+ link_parameter="--link-dest=${REMOTE_FOLDER_PATH}/${last_folder}"
|
|
|
+else
|
|
|
+ echo "No previous folder found."
|
|
|
+ link_parameter="--progress"
|
|
|
+fi
|
|
|
+
|
|
|
+echo "Creating remote folder: ${remote_folder}"
|
|
|
+ssh -o StrictHostKeyChecking=no -l "${REMOTE_USER}" "${REMOTE_SERVER}" "mkdir -p ${remote_folder}"
|
|
|
+
|
|
|
+cd ${LOCAL_FOLDER_PATH}
|
|
|
+echo "Copying files."
|
|
|
+rsync -e "ssh -o StrictHostKeyChecking=no" --verbose --archive "${link_parameter}" * "${REMOTE_USER}"@"${REMOTE_SERVER}":"${remote_folder}" || exit 20
|
|
|
+echo "Done copying files."
|