From 723551cdff8cd89cfb61f0f66fc4c6d851a9d51a Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Fri, 16 May 2025 03:46:44 +0200 Subject: [PATCH] Fix. --- .../home/plom/.local/bin/print_torrents | 24 +++-- bookworm/scripts/lib/constants_seedbox | 3 +- testing/scripts/sync_rtorrent_download.sh | 88 ++++++++++++++----- 3 files changed, 81 insertions(+), 34 deletions(-) diff --git a/bookworm/copy/seedbox/home/plom/.local/bin/print_torrents b/bookworm/copy/seedbox/home/plom/.local/bin/print_torrents index 56f0125..18814bd 100755 --- a/bookworm/copy/seedbox/home/plom/.local/bin/print_torrents +++ b/bookworm/copy/seedbox/home/plom/.local/bin/print_torrents @@ -8,26 +8,32 @@ cd $(dirname "$0") PATTERN_TORRENTNAME=".*e4:name[0-9]+:(.+)12:piece length.*" PATTERN_DU_NONSUMMARY="^[[:graph:]]+[[:blank:]]+\.\/" PATTERN_DU_SIZE_NAME="^([[:graph:]]+)\t\.\/(.+)$" -PATH_SESSIONS="${HOME}/session" -PATH_DOWNLOADS="${HOME}/downloads" -SESSION_IGNORE='--hide=rtorrent.lock --hide=rtorrent.input_history' +PATH_SESSIONS="${HOME}/${DIRNAME_SESSION}" +PATH_DOWNLOADS="${HOME}/${DIRNAME_DOWNLOADS}" +SESSION_FILES_TO_IGNORE='rtorrent.lock rtorrent.input_history' cd "${PATH_SESSIONS}" HASHED_TITLES= -COLLECTED_HASHES= +ALREADY_COLLECTED= hash_titles() { local FILENAME=$1 local HASH=$(printf '%s' "${FILENAME}" | sed 's/\'"${EXT_TORRENT}"'.*//g' | grep -E "${PATTERN_HASH_ONLY}") - if [ ! -z "${HASH}" ]; then + if [ -z "${HASH}" ]; then + local TO_IGNORE + for TO_IGNORE in ${SESSION_FILES_TO_IGNORE}; do + if [ "${TO_IGNORE}" = "${FILENAME}" ]; then + return + fi + done + printf '? ? %s\n' "${FILENAME}" + else echo "${ALREADY_COLLECTED}" | grep "${HASH}" > /dev/null && continue - ALREADY_COLLECTED=$(printf '%s\n%s' "${HASH}" "${ALREADY_COLLECTED}") + ALREADY_COLLECTED=$(printf '%s\n%s' "${HASH}" "${ALREADY_COLLECTED}") local TITLE=$(cat -v "${FILENAME}" | head -1 | sed -E "s/${PATTERN_TORRENTNAME}/\1/g") HASHED_TITLES=$(printf '%s:%s\n%s' "${HASH}" "${TITLE}" "${HASHED_TITLES}") fi } -for_line_in "$(ls -1 *${EXT_TORRENT}*)" hash_titles -print_error( ) { printf '? ? %s\n' "$1"; } -for_line_in "$(ls -1 ${SESSION_IGNORE} | grep -vE "^${PATTERN_HASH}"'\'"${EXT_TORRENT}")" print_error +for_line_in "$(ls -1)" hash_titles cd "${PATH_DOWNLOADS}" SIZED_DOWNLOADS=$(du -ad1 -bh | grep -E "${PATTERN_DU_NONSUMMARY}" | sed -E "s/${PATTERN_DU_SIZE_NAME}/\1:\2/g") diff --git a/bookworm/scripts/lib/constants_seedbox b/bookworm/scripts/lib/constants_seedbox index 9b812b8..71998d5 100644 --- a/bookworm/scripts/lib/constants_seedbox +++ b/bookworm/scripts/lib/constants_seedbox @@ -2,4 +2,5 @@ EXT_TORRENT='.torrent' PATTERN_HASH_CHAR='[A-Z0-9]' PATTERN_HASH="${PATTERN_HASH_CHAR}{40}" PATTERN_HASH_ONLY="^${PATTERN_HASH}\$" - +DIRNAME_DOWNLOADs='downloads' +DIRNAME_SESSION='session' diff --git a/testing/scripts/sync_rtorrent_download.sh b/testing/scripts/sync_rtorrent_download.sh index 57afbf4..d701b55 100755 --- a/testing/scripts/sync_rtorrent_download.sh +++ b/testing/scripts/sync_rtorrent_download.sh @@ -11,7 +11,7 @@ cd $(dirname "$0") . lib/path_tmp_timestamped DIRNAME_DOWNLOAD='download' -DIRNAME_SESSION='session' +CMD_PRINT_TORRENTS='print_torrents' prefixed_msg_init abort_if_offline @@ -56,13 +56,46 @@ parse_line() { } for_line_in "$(ls -1)" parse_line cd - > /dev/null -OVERVIEW_REMOTE=$(ssh -t -q "${SERVER}" 'sh -cl print_torrents') +OVERVIEW_REMOTE=$(ssh -t -q "${SERVER}" "sh -cl ${CMD_PRINT_TORRENTS}") + +OVERVIEW_BOTH= +OVERVIEW_ONLY_REMOTE= +OVERVIEW_ONLY_LOCAL="${OVERVIEW_LOCAL}" +compare_overviews() { + local LINE_REMOTE="$1" + local FOUND= + local NEXT_UNUSED= + find_local_mirror() { + local LINE_LOCAL="$1" + if [ "${LINE_LOCAL}" = "${LINE_REMOTE}" ]; then + OVERVIEW_BOTH=$(printf '%s\n%s' "${LINE_LOCAL}" "${OVERVIEW_BOTH}") + FOUND=1 + else + NEXT_UNUSED=$(printf '%s\n%s' "${LINE_LOCAL}" "${NEXT_UNUSED}") + fi + } + for_line_in "${OVERVIEW_ONLY_LOCAL}" find_local_mirror + if [ -z "${FOUND}" ]; then + OVERVIEW_ONLY_REMOTE=$(printf '%s\n%s' "${LINE_REMOTE}" "${OVERVIEW_ONLY_REMOTE}") + fi + OVERVIEW_ONLY_LOCAL="${NEXT_UNUSED}" +} +for_line_in "${OVERVIEW_REMOTE}" compare_overviews if [ -z "${SELECTION}" ]; then - prefixed_msg 'Found remotely:' - for_line_in "${OVERVIEW_REMOTE}" prefixed_msg - prefixed_msg 'Found locally:' - for_line_in "${OVERVIEW_LOCAL}" prefixed_msg + list_overview() { + local MSG="$1" + local OVERVIEW="$2" + prefixed_msg "${MSG}" + if [ -z "${OVERVIEW}" ]; then + prefixed_msg '(none)' + else + for_line_in "${OVERVIEW}" prefixed_msg + fi + } + list_overview 'Found remotely and locally:' "${OVERVIEW_BOTH}" + list_overview 'Found only remotely:' "${OVERVIEW_ONLY_REMOTE}" + list_overview 'Found only locally:' "${OVERVIEW_ONLY_LOCAL}" exit 0 fi @@ -75,18 +108,25 @@ find_match() { abort "Ambiguous selection, more than one hash starting with: ${SELECTION}" fi FOUND=1 - HASH=$(printf '%s' "${_LINE_CUT}" | cut -d' ' -f 1) - TITLE=$(printf '%s' "${_LINE_CUT}" | cut -d' ' -f 3-) + HASH=$(printf '%s' "${LINE_CUT}" | cut -d' ' -f 1) + TITLE=$(printf '%s' "${LINE_CUT}" | cut -d' ' -f 3-) fi } SYNC_DOWN= -for_line_in "${OVERVIEW_REMOTE}" find_match +BOTHSIDED= +for_line_in "${OVERVIEW_BOTH}" find_match +if [ ! -z "${FOUND}" ]; then + BOTHSIDED=1 +fi +for_line_in "${OVERVIEW_ONLY_REMOTE}" find_match if [ ! -z "${FOUND}" ]; then SYNC_DOWN=1 fi -for_line_in "${OVERVIEW_LOCAL}" find_match +for_line_in "${OVERVIEW_ONLY_LOCAL}" find_match if [ -z "${FOUND}" ]; then abort "No known hash starting with: ${SELECTION}" +elif [ ! -z "${BOTHSIDED}" ]; then + abort 'Target present on both sides, nothing to do.' fi prefixed_msg_no_nl "Hash ${HASH} selected for " if [ -z "${SYNC_DOWN}" ]; then printf 'LOCAL'; else printf 'REMOTE'; fi @@ -94,24 +134,24 @@ printf ' media: %s\n' "${TITLE}" TARGET_DIR="${LOCAL_STORE}/${TITLE}" TMP_DIR=/$(path_tmp_timestamped "${TITLE}") +TMP_DIR_DOWNLOAD="${TMP_DIR}/${DIRNAME_DOWNLOAD}" +TMP_DIR_SESSION="${TMP_DIR}/${DIRNAME_SESSION}" if [ -z "${SYNC_DOWN}" ]; then prefixed_msg 'Uploading …' - #ssh -t -q "${SERVER}" "mkdir ${TMP_DIR}" - #scp -r "${TARGET_DIR}/"* "${SERVER}:${TMP_DIR}/" - #ssh -t -q "${SERVER}" "mv ${TMP_DIR}/download downloads/${TITLE}" - #ssh -t -q "${SERVER}" "mv ${TMP_DIR}/session/* session/" - #ssh -t -q "${SERVER}" "rmdir -p ${TMP_DIR}/session" + ssh -t -q "${SERVER}" "mkdir ${TMP_DIR}" + scp -r "${TARGET_DIR}/"* "${SERVER}:${TMP_DIR}/" + ssh -t -q "${SERVER}" "mv ${TMP_DIR_DOWNLOAD} ~/${DIRNAME_DOWNLOADS}/${TITLE}" + ssh -t -q "${SERVER}" "mv ${TMP_DIR_SESSION}/* ~/${DIRNAME_SESSION}/" + ssh -t -q "${SERVER}" "rmdir ${TMP_DIR_SESSION} && rmdir ${TMP_DIR}" else prefixed_msg 'Downloading …' - #abort_if_exists "${TARGET_DIR}" - #SESSION_DIR="${TMP_DIR}/session" - #DOWNLOAD_DIR="${TMP_DIR}/download" - #mkdir -p "${SESSION_DIR}" - #mkdir -p "${DOWNLOAD_DIR}" - #scp "${SERVER}:~/session/${HASH}"* "${SESSION_DIR}/" - #scp -r "${SERVER}:~/downloads/${TITLE}" "${DOWNLOAD_DIR}/" - #prefixed_msg "Storing in: ${TARGET_DIR}" - #mv "${TMP_DIR}" "${TARGET_DIR}" + abort_if_exists "${TARGET_DIR}" + mkdir -p "${TMP_DIR_SESSION}" + mkdir -p "${TMP_DIR_DOWNLOAD}" + scp "${SERVER}:~/${DIRNAME_SESSION}/${HASH}"* "${TMP_DIR_SESSION}/" + scp -r "${SERVER}:~/${DIRNAME_DOWNLOADS}/${TITLE}" "${TMP_DIR_DOWNLOAD}/" + prefixed_msg "Storing in: ${TARGET_DIR}" + mv "${TMP_DIR}" "${TARGET_DIR}" fi prefixed_msg_exit -- 2.30.2