# HG changeset patch # User František Kučera # Date 1555689157 -7200 # Node ID 1c7536a0beda5d73e76960339966af699159adcf # Parent 4c9994be06881738b0d887aab6b4582a1ef616be optional callback → local clone diff -r 4c9994be0688 -r 1c7536a0beda vcs-backup.sh --- a/vcs-backup.sh Fri Apr 19 16:53:22 2019 +0200 +++ b/vcs-backup.sh Fri Apr 19 17:52:37 2019 +0200 @@ -25,6 +25,7 @@ VCS_BACKUP_SNAPSHOT_DIR="$VCS_BACKUP_DATA_DIR/snapshot"; VCS_BACKUP_SUBVOLUME_SOCKET="/run/vcs-backup-subvolume"; VCS_BACKUP_CLONE_SOCKET="/run/vcs-backup-clone"; +VCS_BACKUP_CLONE_CALLBACK_SOCKET="clone-callback"; VCS_BACKUP_USER="vcs-backup"; VCS_BACKUP_MANAGER="vcs-backup-manager"; @@ -70,7 +71,12 @@ vcs_backup_public_clientSubmitBackupRequest() { if isValidTypeAndURL "$1" "$2"; then loadConfigFile ~/.config/vcs-backup/client.cfg - ${VCS_BACKUP_SSH_COMMAND[@]} vcs-backup.sh serverSubmitBackupRequest "$1" "$2" "$3" + ${VCS_BACKUP_SSH_COMMAND[@]} vcs-backup.sh serverSubmitBackupRequest "$1" "$2" "$3" "$4" + if [[ "$4" == "clone" ]]; then + if [[ "$1" == "hg" ]]; then hg clone "ssh://${VCS_BACKUP_SERVER}//mnt/data/current/$1/$(urlToRelativeDirectoryPath $2)"; + elif [[ "$1" == "git" ]]; then git clone "ssh://${VCS_BACKUP_SERVER}//mnt/data/current/$1/$(urlToRelativeDirectoryPath $2)"; + fi + fi else echo "Unsupported VCS type: '$1' or URL: '$2'" >&2; fi @@ -89,11 +95,18 @@ setfacl -m u:${VCS_BACKUP_USER}:r "$absolutePath/url.txt" setfacl -m u:${VCS_BACKUP_USER}:rw "$absolutePath/state.txt" echo "$relativePath" | socat -u - unix-send:${VCS_BACKUP_SUBVOLUME_SOCKET}; + if [[ "$3" == "public" ]]; then cd "$VCS_BACKUP_PUBLIC_DIR"; mkdir -p "$(dirname $relativePath)"; ln -rs "../current/$relativePath" "$(dirname $relativePath)"; fi + + if [[ "$4" == "clone" ]]; then + socat -u "unix-recvfrom:$absolutePath/${VCS_BACKUP_CLONE_CALLBACK_SOCKET},mode=777" - | while read m; do # TODO: ,group=${VCS_BACKUP_USER} and no 777 + echo "Message from the clone service: $m"; + done; + fi else echo "Unsupported VCS type: '$1' or URL: '$2'" >&2; fi @@ -120,6 +133,7 @@ socat -u "unix-recv:${VCS_BACKUP_CLONE_SOCKET},mode=700" - | while read d; do vcsType=$(echo "$d" | sed 's@/.*@@g'); url=$(cat "$VCS_BACKUP_CONFIG_DIR/$d/url.txt"); + if isValidTypeAndURL "$vcsType" "$url"; then if [[ "$vcsType" == "hg" ]]; then hg clone -U "$url" "$VCS_BACKUP_CURRENT_DIR/$d"; elif [[ "$vcsType" == "git" ]]; then git clone --bare "$url" "$VCS_BACKUP_CURRENT_DIR/$d"; @@ -127,7 +141,11 @@ else echo "Unsupported VCS type: '$vcsType' or URL: '$url'" >&2; fi - # TODO: call-back to the client if client is waiting (socket exist in the config dir) + + callBackSocket="$VCS_BACKUP_CONFIG_DIR/$d/$VCS_BACKUP_CLONE_CALLBACK_SOCKET"; + if [[ -e "$callBackSocket" ]]; then + echo "done" | socat -u - unix-send:"$callBackSocket"; + fi done }