home · contact · privacy
Fix.
authorChristian Heller <c.heller@plomlompom.de>
Fri, 16 May 2025 01:46:44 +0000 (03:46 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Fri, 16 May 2025 01:46:44 +0000 (03:46 +0200)
bookworm/copy/seedbox/home/plom/.local/bin/print_torrents
bookworm/scripts/lib/constants_seedbox
testing/scripts/sync_rtorrent_download.sh

index 56f0125fc26f88be72b690bbf06dee47e2ae4869..18814bdd5df25450e4cdec40a442534c1dc82437 100755 (executable)
@@ -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")
index 9b812b8b799796fafd5bdcff0022af8da527c06a..71998d56e823caf71e2c4d3de7d6a01f5e73ddc6 100644 (file)
@@ -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'
index 57afbf48c9b58233ab9d93b0031b53483a220f8d..d701b55c2e1ff4984d7c1192e793d99148bcedbb 100755 (executable)
@@ -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