#!/usr/bin/env bash set -euo pipefail IFS=$'\n\t' ### Configuration ### REMOTE_USER="crowetic" REMOTE_HOST="devnet-node-5.qortal.link" REMOTE_PORT=22225 REMOTE_BASE_DIR="/qortal" # stop.sh, start.sh, db/, qortal.jar live here LOCAL_SYNC_DIR="/mnt/4TB-WDB/DATA/QortalCloud/DevNet" MAX_LOCAL_AGE_DAYS=2 # roll new remote archive only if local copy ≥ this KEEP_LOCAL_ARCHIVES=2 # keep this many archives locally ####################### log(){ echo "[$(date +'%H:%M:%S')] $*"; } # 1) Inspect the newest local archive log "Inspecting local archives…" LATEST_LOCAL=$(ls -1t "${LOCAL_SYNC_DIR}"/db-Devnet-*.7z 2>/dev/null | head -1 || true) if [[ -n "$LATEST_LOCAL" ]]; then TS=$(stat -c %Y "$LATEST_LOCAL") AGE=$(( ( $(date +%s) - TS ) / 86400 )) log "→ Found ${LATEST_LOCAL##*/}, age=${AGE}d" else log "→ No local archives found." AGE=$((MAX_LOCAL_AGE_DAYS+1)) fi # 2) Conditionally roll a new archive on remote if (( AGE >= MAX_LOCAL_AGE_DAYS )); then NEW_ARCH="db-Devnet-$(date +%Y%m%d_%H%M%S).7z" log "→ Local ≥${MAX_LOCAL_AGE_DAYS}d old; creating ${NEW_ARCH} on remote" ssh -p"${REMOTE_PORT}" "${REMOTE_USER}@${REMOTE_HOST}" bash -l </dev/null || { echo "ERROR: install p7zip-full"; exit 1; } # stop.sh (ignore failure) if [[ -x ./stop.sh ]]; then set +e; ./stop.sh; set -e fi [[ -d db ]] || { echo "ERROR: db/ missing"; exit 1; } 7z a "${NEW_ARCH}" db # restart (best effort) if [[ -x ./start.sh ]]; then ./start.sh fi # prune remote: keep only the newest 1 archive ls -1t db-Devnet-*.7z \ | tail -n +2 \ | xargs -r rm -f -- EOF # fetch the newly created archive log "Rsyncing new archive → local" rsync -avP -e "ssh -p${REMOTE_PORT}" \ "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_BASE_DIR}/${NEW_ARCH}" \ "${LOCAL_SYNC_DIR}/" else log "→ Local archive is fresh (<${MAX_LOCAL_AGE_DAYS}d); skipping archive creation." fi # 3) Always rsync qortal.jar log "Rsyncing qortal.jar → local" rsync -avP -e "ssh -p${REMOTE_PORT}" \ "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_BASE_DIR}/qortal.jar" \ "${LOCAL_SYNC_DIR}/" log "Rsyncing qortal.jar to main devnet files folder" rsync -avP -e "ssh -p${REMOTE_PORT}" \ "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_BASE_DIR}/qortal.jar" \ "${LOCAL_SYNC_DIR}/qortal-DevNet" log "Rsyncing settings.json to both local locations" rsync -avP -e "ssh -p${REMOTE_PORT}" \ "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_BASE_DIR}/settings.json" \ "${LOCAL_SYNC_DIR}/qortal-DevNet/settings.json" SRC_DIR="${LOCAL_SYNC_DIR}/qortal-DevNet" ARCHIVE="${LOCAL_SYNC_DIR}/qortal-DevNet-MAIN.7z" TMP_DIR="${LOCAL_SYNC_DIR}/temp" TMP_ARCHIVE="${LOCAL_SYNC_DIR}/temp.7z" log() { echo "[$(date +'%F %T')] $*"; } # 1. If there is no archive, or if any file in SRC_DIR is newer than ARCHIVE, rebuild. if [[ ! -f "$ARCHIVE" ]] || find "$SRC_DIR" -type f -newer "$ARCHIVE" | read; then log "Changes detected (or no archive yet). Rebuilding 7z…" # Clean temp rm -rf "$TMP_DIR" mkdir -p "$TMP_DIR" # Mirror the tree in temp rsync -a --delete "$SRC_DIR/" "$TMP_DIR/" # Create the archive 7z a "$TMP_ARCHIVE" "$TMP_DIR" # Atomically replace the old archive mv -f "$TMP_ARCHIVE" "$ARCHIVE" log "Archive updated at $ARCHIVE" else log "No changes since last archive; skipping rebuild." fi # 4) Prune local archives: keep only the newest $KEEP_LOCAL_ARCHIVES log "Pruning local archives to the ${KEEP_LOCAL_ARCHIVES} most recent" cd "${LOCAL_SYNC_DIR}" ls -1t db-Devnet-*.7z \ | tail -n +$((KEEP_LOCAL_ARCHIVES+1)) \ | xargs -r rm -f -- log "✔ Done."