fix(log/echo): log → info for section-level status across 4 scripts
lidarr_cleanup, sonarr_cleanup, radarr_cleanup: container health result, safety layer 1 pass, import scan queued/complete, API query, found N items, in-memory map built, item|tracked count, tracked% safety check, first-run baseline, root/orphan-age config, empty folder cleanup start/done cert_monitor: domains to check count, warn/crit threshold display Per-item loop lines (Fetching N/M, Still scanning..., OK per-domain) remain as log() — verbose only.
This commit is contained in:
+17
-17
@@ -172,7 +172,7 @@ detect_hosts
|
|||||||
|
|
||||||
# Skip if Lidarr is not configured on this host
|
# Skip if Lidarr is not configured on this host
|
||||||
if [[ -z "${LIDARR_URL:-}" ]] || [[ -z "${LIDARR_API_KEY:-}" ]]; then
|
if [[ -z "${LIDARR_URL:-}" ]] || [[ -z "${LIDARR_API_KEY:-}" ]]; then
|
||||||
log "Lidarr not configured on $MY_ID ($LOCAL_SERVER_NAME) — skipping"
|
info "Lidarr not configured on $MY_ID ($LOCAL_SERVER_NAME) — skipping"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -243,8 +243,8 @@ fi
|
|||||||
CONTAINER_HEALTH=$(timeout "$DOCKER_TIMEOUT" docker inspect -f \
|
CONTAINER_HEALTH=$(timeout "$DOCKER_TIMEOUT" docker inspect -f \
|
||||||
'{{.State.Health.Status}}' "$LIDARR_CONTAINER" 2>/dev/null)
|
'{{.State.Health.Status}}' "$LIDARR_CONTAINER" 2>/dev/null)
|
||||||
case "$CONTAINER_HEALTH" in
|
case "$CONTAINER_HEALTH" in
|
||||||
healthy) log "$LIDARR_CONTAINER is healthy" ;;
|
healthy) info "$LIDARR_CONTAINER is healthy" ;;
|
||||||
"") log "$LIDARR_CONTAINER has no health check — proceeding" ;;
|
"") info "$LIDARR_CONTAINER has no health check — proceeding" ;;
|
||||||
starting)
|
starting)
|
||||||
error "$LIDARR_CONTAINER is still starting — aborting"
|
error "$LIDARR_CONTAINER is still starting — aborting"
|
||||||
notify "Lidarr cleanup aborted on $(hostname) — container still starting" \
|
notify "Lidarr cleanup aborted on $(hostname) — container still starting" \
|
||||||
@@ -258,7 +258,7 @@ case "$CONTAINER_HEALTH" in
|
|||||||
*) warn "$LIDARR_CONTAINER health: $CONTAINER_HEALTH — proceeding with caution" ;;
|
*) warn "$LIDARR_CONTAINER health: $CONTAINER_HEALTH — proceeding with caution" ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
log "Safety layer 1 passed — container healthy"
|
info "Safety layer 1 passed — container healthy"
|
||||||
|
|
||||||
# ==============================================================================================
|
# ==============================================================================================
|
||||||
# ── HELPER FUNCTIONS ──────────────────────────────────────────────────────────────────────────
|
# ── HELPER FUNCTIONS ──────────────────────────────────────────────────────────────────────────
|
||||||
@@ -326,10 +326,10 @@ done
|
|||||||
unset _cp
|
unset _cp
|
||||||
|
|
||||||
if [[ -n "$LIDARR_CONTAINER_ROOT" ]]; then
|
if [[ -n "$LIDARR_CONTAINER_ROOT" ]]; then
|
||||||
log "Triggering DownloadedAlbumsScan on: $LIDARR_CONTAINER_ROOT"
|
info "Triggering DownloadedAlbumsScan on: $LIDARR_CONTAINER_ROOT"
|
||||||
SCAN_PAYLOAD="{\"name\": \"DownloadedAlbumsScan\", \"path\": \"$LIDARR_CONTAINER_ROOT\"}"
|
SCAN_PAYLOAD="{\"name\": \"DownloadedAlbumsScan\", \"path\": \"$LIDARR_CONTAINER_ROOT\"}"
|
||||||
else
|
else
|
||||||
log "No path map match — triggering DownloadedAlbumsScan (all root folders)"
|
info "No path map match — triggering DownloadedAlbumsScan (all root folders)"
|
||||||
SCAN_PAYLOAD='{"name": "DownloadedAlbumsScan"}'
|
SCAN_PAYLOAD='{"name": "DownloadedAlbumsScan"}'
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -344,7 +344,7 @@ SCAN_CMD_ID=$(echo "$SCAN_RESPONSE" | jq -r '.id // empty' 2>/dev/null)
|
|||||||
if [[ -z "$SCAN_CMD_ID" ]]; then
|
if [[ -z "$SCAN_CMD_ID" ]]; then
|
||||||
warn "Could not trigger import scan — proceeding without pre-flight"
|
warn "Could not trigger import scan — proceeding without pre-flight"
|
||||||
else
|
else
|
||||||
log " Import scan queued (command ID: $SCAN_CMD_ID) — waiting for completion..."
|
info "Import scan queued (command ID: $SCAN_CMD_ID) — waiting for completion..."
|
||||||
POLL_TIMEOUT=${LIDARR_IMPORT_SCAN_TIMEOUT:-600}
|
POLL_TIMEOUT=${LIDARR_IMPORT_SCAN_TIMEOUT:-600}
|
||||||
POLLED=0
|
POLLED=0
|
||||||
while [[ "$POLLED" -lt "$POLL_TIMEOUT" ]]; do
|
while [[ "$POLLED" -lt "$POLL_TIMEOUT" ]]; do
|
||||||
@@ -353,7 +353,7 @@ else
|
|||||||
"${LIDARR_URL}/api/v1/command/${SCAN_CMD_ID}" 2>/dev/null | \
|
"${LIDARR_URL}/api/v1/command/${SCAN_CMD_ID}" 2>/dev/null | \
|
||||||
jq -r '.status // empty' 2>/dev/null)
|
jq -r '.status // empty' 2>/dev/null)
|
||||||
case "$SCAN_STATUS" in
|
case "$SCAN_STATUS" in
|
||||||
completed) log "Import scan complete ✅"; break ;;
|
completed) info "Import scan complete ✅"; break ;;
|
||||||
failed) warn "Import scan reported failed — proceeding anyway"; break ;;
|
failed) warn "Import scan reported failed — proceeding anyway"; break ;;
|
||||||
esac
|
esac
|
||||||
sleep 10
|
sleep 10
|
||||||
@@ -379,7 +379,7 @@ fi
|
|||||||
# Safety Layer 3 — API version check
|
# Safety Layer 3 — API version check
|
||||||
check_arr_version "$LIDARR_URL" "$LIDARR_API_KEY" "v1" "$LIDARR_VERSION_MAJOR" "Lidarr" || exit 1
|
check_arr_version "$LIDARR_URL" "$LIDARR_API_KEY" "v1" "$LIDARR_VERSION_MAJOR" "Lidarr" || exit 1
|
||||||
|
|
||||||
log " Querying Lidarr API..."
|
info "Querying Lidarr API..."
|
||||||
|
|
||||||
# Fetch all artists
|
# Fetch all artists
|
||||||
ARTIST_RESPONSE=$(lidarr_api "artist") || {
|
ARTIST_RESPONSE=$(lidarr_api "artist") || {
|
||||||
@@ -400,7 +400,7 @@ if [[ "$ARTIST_COUNT" -eq 0 ]]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log "Found $ARTIST_COUNT artists — fetching track files..."
|
info "Found $ARTIST_COUNT artists — fetching track files..."
|
||||||
|
|
||||||
TMP_DIR="/tmp/lidarr_cleanup_$$"
|
TMP_DIR="/tmp/lidarr_cleanup_$$"
|
||||||
mkdir -p "$TMP_DIR"
|
mkdir -p "$TMP_DIR"
|
||||||
@@ -429,7 +429,7 @@ while IFS= read -r _tracked_path; do
|
|||||||
[[ -n "$_tracked_path" ]] && TRACKED_MAP["$_tracked_path"]=1
|
[[ -n "$_tracked_path" ]] && TRACKED_MAP["$_tracked_path"]=1
|
||||||
done < "$TRACKED_FILE"
|
done < "$TRACKED_FILE"
|
||||||
unset _tracked_path
|
unset _tracked_path
|
||||||
log "Built in-memory lookup map: ${#TRACKED_MAP[@]} tracked paths"
|
info "Built in-memory lookup map: ${#TRACKED_MAP[@]} tracked paths"
|
||||||
TRACKED_COUNT=$(wc -l < "$TRACKED_FILE")
|
TRACKED_COUNT=$(wc -l < "$TRACKED_FILE")
|
||||||
|
|
||||||
# Safety Layer 5 — tracked count > 0
|
# Safety Layer 5 — tracked count > 0
|
||||||
@@ -440,7 +440,7 @@ if [[ "$TRACKED_COUNT" -eq 0 ]]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log " $ARTIST_COUNT artists | $TRACKED_COUNT tracked files"
|
info "$ARTIST_COUNT artists | $TRACKED_COUNT tracked files"
|
||||||
|
|
||||||
# Safety Layer 6 — percentage drop vs last known count
|
# Safety Layer 6 — percentage drop vs last known count
|
||||||
if [[ -f "$LIDARR_TRACKED_COUNT_FILE" ]]; then
|
if [[ -f "$LIDARR_TRACKED_COUNT_FILE" ]]; then
|
||||||
@@ -455,10 +455,10 @@ if [[ -f "$LIDARR_TRACKED_COUNT_FILE" ]]; then
|
|||||||
"Lidarr Cleanup" "warning"
|
"Lidarr Cleanup" "warning"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
log "Tracked count: ${PCT}% of last run ($TRACKED_COUNT vs $LAST_COUNT) ✅"
|
info "Tracked count: ${PCT}% of last run ($TRACKED_COUNT vs $LAST_COUNT) ✅"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
log "No previous count on record — first run, saving baseline"
|
info "No previous count on record — first run, saving baseline"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "$TRACKED_COUNT" > "$LIDARR_TRACKED_COUNT_FILE"
|
echo "$TRACKED_COUNT" > "$LIDARR_TRACKED_COUNT_FILE"
|
||||||
@@ -468,7 +468,7 @@ echo "$TRACKED_COUNT" > "$LIDARR_TRACKED_COUNT_FILE"
|
|||||||
# ==============================================================================================
|
# ==============================================================================================
|
||||||
echo ""
|
echo ""
|
||||||
echo "━━━ $ICON_CLEAN Scanning Music Root ━━━"
|
echo "━━━ $ICON_CLEAN Scanning Music Root ━━━"
|
||||||
log " Root: $LIDARR_MUSIC_ROOT | Orphan age: ${LIDARR_ORPHAN_AGE} days"
|
info "Root: $LIDARR_MUSIC_ROOT | Orphan age: ${LIDARR_ORPHAN_AGE} days"
|
||||||
|
|
||||||
START=$(date +%s)
|
START=$(date +%s)
|
||||||
ORPHAN_COUNT=0
|
ORPHAN_COUNT=0
|
||||||
@@ -563,9 +563,9 @@ if [[ "$DRY_RUN" == false ]]; then
|
|||||||
|
|
||||||
done < <(find "$LIDARR_MUSIC_ROOT" -type f 2>/dev/null)
|
done < <(find "$LIDARR_MUSIC_ROOT" -type f 2>/dev/null)
|
||||||
|
|
||||||
log "Cleaning up empty folders..."
|
info "Cleaning up empty folders..."
|
||||||
find "$LIDARR_MUSIC_ROOT" -mindepth 1 -type d -empty -delete 2>/dev/null
|
find "$LIDARR_MUSIC_ROOT" -mindepth 1 -type d -empty -delete 2>/dev/null
|
||||||
log "Empty folders removed"
|
info "Empty folders removed"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
END=$(date +%s)
|
END=$(date +%s)
|
||||||
|
|||||||
+14
-14
@@ -222,8 +222,8 @@ fi
|
|||||||
CONTAINER_HEALTH=$(timeout "$DOCKER_TIMEOUT" docker inspect -f \
|
CONTAINER_HEALTH=$(timeout "$DOCKER_TIMEOUT" docker inspect -f \
|
||||||
'{{.State.Health.Status}}' "$RADARR_CONTAINER" 2>/dev/null)
|
'{{.State.Health.Status}}' "$RADARR_CONTAINER" 2>/dev/null)
|
||||||
case "$CONTAINER_HEALTH" in
|
case "$CONTAINER_HEALTH" in
|
||||||
healthy) log "$RADARR_CONTAINER is healthy" ;;
|
healthy) info "$RADARR_CONTAINER is healthy" ;;
|
||||||
"") log "$RADARR_CONTAINER has no health check — proceeding" ;;
|
"") info "$RADARR_CONTAINER has no health check — proceeding" ;;
|
||||||
starting)
|
starting)
|
||||||
error "$RADARR_CONTAINER is still starting — aborting"
|
error "$RADARR_CONTAINER is still starting — aborting"
|
||||||
notify "Radarr cleanup aborted on $(hostname) — container still starting" \
|
notify "Radarr cleanup aborted on $(hostname) — container still starting" \
|
||||||
@@ -237,7 +237,7 @@ case "$CONTAINER_HEALTH" in
|
|||||||
*) warn "$RADARR_CONTAINER health: $CONTAINER_HEALTH — proceeding with caution" ;;
|
*) warn "$RADARR_CONTAINER health: $CONTAINER_HEALTH — proceeding with caution" ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
log "Safety layer 1 passed — container healthy"
|
info "Safety layer 1 passed — container healthy"
|
||||||
|
|
||||||
# ==============================================================================================
|
# ==============================================================================================
|
||||||
# ── HELPER FUNCTIONS ──────────────────────────────────────────────────────────────────────────
|
# ── HELPER FUNCTIONS ──────────────────────────────────────────────────────────────────────────
|
||||||
@@ -312,10 +312,10 @@ done
|
|||||||
unset _cp
|
unset _cp
|
||||||
|
|
||||||
if [[ -n "$RADARR_CONTAINER_ROOT" ]]; then
|
if [[ -n "$RADARR_CONTAINER_ROOT" ]]; then
|
||||||
log "Triggering DownloadedMoviesScan on: $RADARR_CONTAINER_ROOT"
|
info "Triggering DownloadedMoviesScan on: $RADARR_CONTAINER_ROOT"
|
||||||
SCAN_PAYLOAD="{\"name\": \"DownloadedMoviesScan\", \"path\": \"$RADARR_CONTAINER_ROOT\"}"
|
SCAN_PAYLOAD="{\"name\": \"DownloadedMoviesScan\", \"path\": \"$RADARR_CONTAINER_ROOT\"}"
|
||||||
else
|
else
|
||||||
log "No path map match — triggering DownloadedMoviesScan (all root folders)"
|
info "No path map match — triggering DownloadedMoviesScan (all root folders)"
|
||||||
SCAN_PAYLOAD='{"name": "DownloadedMoviesScan"}'
|
SCAN_PAYLOAD='{"name": "DownloadedMoviesScan"}'
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -330,7 +330,7 @@ SCAN_CMD_ID=$(echo "$SCAN_RESPONSE" | jq -r '.id // empty' 2>/dev/null)
|
|||||||
if [[ -z "$SCAN_CMD_ID" ]]; then
|
if [[ -z "$SCAN_CMD_ID" ]]; then
|
||||||
warn "Could not trigger import scan — proceeding without pre-flight"
|
warn "Could not trigger import scan — proceeding without pre-flight"
|
||||||
else
|
else
|
||||||
log " Import scan queued (command ID: $SCAN_CMD_ID) — waiting for completion..."
|
info "Import scan queued (command ID: $SCAN_CMD_ID) — waiting for completion..."
|
||||||
POLL_TIMEOUT=${RADARR_IMPORT_SCAN_TIMEOUT:-600}
|
POLL_TIMEOUT=${RADARR_IMPORT_SCAN_TIMEOUT:-600}
|
||||||
POLLED=0
|
POLLED=0
|
||||||
while [[ "$POLLED" -lt "$POLL_TIMEOUT" ]]; do
|
while [[ "$POLLED" -lt "$POLL_TIMEOUT" ]]; do
|
||||||
@@ -339,7 +339,7 @@ else
|
|||||||
"${RADARR_URL}/api/v3/command/${SCAN_CMD_ID}" 2>/dev/null | \
|
"${RADARR_URL}/api/v3/command/${SCAN_CMD_ID}" 2>/dev/null | \
|
||||||
jq -r '.status // empty' 2>/dev/null)
|
jq -r '.status // empty' 2>/dev/null)
|
||||||
case "$SCAN_STATUS" in
|
case "$SCAN_STATUS" in
|
||||||
completed) log "Import scan complete ✅"; break ;;
|
completed) info "Import scan complete ✅"; break ;;
|
||||||
failed) warn "Import scan reported failed — proceeding anyway"; break ;;
|
failed) warn "Import scan reported failed — proceeding anyway"; break ;;
|
||||||
esac
|
esac
|
||||||
sleep 10
|
sleep 10
|
||||||
@@ -365,7 +365,7 @@ fi
|
|||||||
# Safety Layer 3 — API version check
|
# Safety Layer 3 — API version check
|
||||||
check_arr_version "$RADARR_URL" "$RADARR_API_KEY" "v3" "$RADARR_VERSION_MAJOR" "Radarr" || exit 1
|
check_arr_version "$RADARR_URL" "$RADARR_API_KEY" "v3" "$RADARR_VERSION_MAJOR" "Radarr" || exit 1
|
||||||
|
|
||||||
log " Querying Radarr API..."
|
info "Querying Radarr API..."
|
||||||
|
|
||||||
# Fetch all movies
|
# Fetch all movies
|
||||||
MOVIES_RESPONSE=$(radarr_api "movie") || {
|
MOVIES_RESPONSE=$(radarr_api "movie") || {
|
||||||
@@ -386,7 +386,7 @@ if [[ "$MOVIE_COUNT" -eq 0 ]]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log "Found $MOVIE_COUNT movies — fetching movie files..."
|
info "Found $MOVIE_COUNT movies — fetching movie files..."
|
||||||
|
|
||||||
TMP_DIR="/tmp/radarr_cleanup_$$"
|
TMP_DIR="/tmp/radarr_cleanup_$$"
|
||||||
mkdir -p "$TMP_DIR"
|
mkdir -p "$TMP_DIR"
|
||||||
@@ -419,7 +419,7 @@ while IFS= read -r _tracked_path; do
|
|||||||
[[ -n "$_tracked_path" ]] && TRACKED_MAP["$_tracked_path"]=1
|
[[ -n "$_tracked_path" ]] && TRACKED_MAP["$_tracked_path"]=1
|
||||||
done < "$TRACKED_FILE"
|
done < "$TRACKED_FILE"
|
||||||
unset _tracked_path
|
unset _tracked_path
|
||||||
log "Built in-memory lookup map: ${#TRACKED_MAP[@]} tracked paths"
|
info "Built in-memory lookup map: ${#TRACKED_MAP[@]} tracked paths"
|
||||||
TRACKED_COUNT=$(wc -l < "$TRACKED_FILE")
|
TRACKED_COUNT=$(wc -l < "$TRACKED_FILE")
|
||||||
|
|
||||||
# Safety Layer 5 — tracked count > 0
|
# Safety Layer 5 — tracked count > 0
|
||||||
@@ -430,14 +430,14 @@ if [[ "$TRACKED_COUNT" -eq 0 ]]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log " $MOVIE_COUNT movies | $TRACKED_COUNT tracked movie files"
|
info "$MOVIE_COUNT movies | $TRACKED_COUNT tracked movie files"
|
||||||
|
|
||||||
# ==============================================================================================
|
# ==============================================================================================
|
||||||
# ━━━ Scan Movies Root ━━━
|
# ━━━ Scan Movies Root ━━━
|
||||||
# ==============================================================================================
|
# ==============================================================================================
|
||||||
echo ""
|
echo ""
|
||||||
echo "━━━ $ICON_CLEAN Scanning Movies Root ━━━"
|
echo "━━━ $ICON_CLEAN Scanning Movies Root ━━━"
|
||||||
log " Root: $RADARR_MOVIES_ROOT | Orphan age: ${RADARR_ORPHAN_AGE} days"
|
info "Root: $RADARR_MOVIES_ROOT | Orphan age: ${RADARR_ORPHAN_AGE} days"
|
||||||
|
|
||||||
START=$(date +%s)
|
START=$(date +%s)
|
||||||
ORPHAN_COUNT=0
|
ORPHAN_COUNT=0
|
||||||
@@ -537,12 +537,12 @@ if [[ "$DRY_RUN" == false ]]; then
|
|||||||
done | sort -u
|
done | sort -u
|
||||||
)
|
)
|
||||||
|
|
||||||
log "Cleaning up empty folders..."
|
info "Cleaning up empty folders..."
|
||||||
for host_path in "${ARR_PATH_MAP[@]}" "$RADARR_MOVIES_ROOT"; do
|
for host_path in "${ARR_PATH_MAP[@]}" "$RADARR_MOVIES_ROOT"; do
|
||||||
[[ -d "$host_path" ]] && \
|
[[ -d "$host_path" ]] && \
|
||||||
find "$host_path" -mindepth 1 -type d -empty -delete 2>/dev/null
|
find "$host_path" -mindepth 1 -type d -empty -delete 2>/dev/null
|
||||||
done
|
done
|
||||||
log "Empty folders removed"
|
info "Empty folders removed"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
END=$(date +%s)
|
END=$(date +%s)
|
||||||
|
|||||||
+14
-14
@@ -222,8 +222,8 @@ fi
|
|||||||
CONTAINER_HEALTH=$(timeout "$DOCKER_TIMEOUT" docker inspect -f \
|
CONTAINER_HEALTH=$(timeout "$DOCKER_TIMEOUT" docker inspect -f \
|
||||||
'{{.State.Health.Status}}' "$SONARR_CONTAINER" 2>/dev/null)
|
'{{.State.Health.Status}}' "$SONARR_CONTAINER" 2>/dev/null)
|
||||||
case "$CONTAINER_HEALTH" in
|
case "$CONTAINER_HEALTH" in
|
||||||
healthy) log "$SONARR_CONTAINER is healthy" ;;
|
healthy) info "$SONARR_CONTAINER is healthy" ;;
|
||||||
"") log "$SONARR_CONTAINER has no health check — proceeding" ;;
|
"") info "$SONARR_CONTAINER has no health check — proceeding" ;;
|
||||||
starting)
|
starting)
|
||||||
error "$SONARR_CONTAINER is still starting — aborting"
|
error "$SONARR_CONTAINER is still starting — aborting"
|
||||||
notify "Sonarr cleanup aborted on $(hostname) — container still starting" \
|
notify "Sonarr cleanup aborted on $(hostname) — container still starting" \
|
||||||
@@ -237,7 +237,7 @@ case "$CONTAINER_HEALTH" in
|
|||||||
*) warn "$SONARR_CONTAINER health: $CONTAINER_HEALTH — proceeding with caution" ;;
|
*) warn "$SONARR_CONTAINER health: $CONTAINER_HEALTH — proceeding with caution" ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
log "Safety layer 1 passed — container healthy"
|
info "Safety layer 1 passed — container healthy"
|
||||||
|
|
||||||
# ==============================================================================================
|
# ==============================================================================================
|
||||||
# ── HELPER FUNCTIONS ──────────────────────────────────────────────────────────────────────────
|
# ── HELPER FUNCTIONS ──────────────────────────────────────────────────────────────────────────
|
||||||
@@ -312,10 +312,10 @@ done
|
|||||||
unset _cp
|
unset _cp
|
||||||
|
|
||||||
if [[ -n "$SONARR_CONTAINER_ROOT" ]]; then
|
if [[ -n "$SONARR_CONTAINER_ROOT" ]]; then
|
||||||
log "Triggering DownloadedEpisodesScan on: $SONARR_CONTAINER_ROOT"
|
info "Triggering DownloadedEpisodesScan on: $SONARR_CONTAINER_ROOT"
|
||||||
SCAN_PAYLOAD="{\"name\": \"DownloadedEpisodesScan\", \"path\": \"$SONARR_CONTAINER_ROOT\"}"
|
SCAN_PAYLOAD="{\"name\": \"DownloadedEpisodesScan\", \"path\": \"$SONARR_CONTAINER_ROOT\"}"
|
||||||
else
|
else
|
||||||
log "No path map match — triggering DownloadedEpisodesScan (all root folders)"
|
info "No path map match — triggering DownloadedEpisodesScan (all root folders)"
|
||||||
SCAN_PAYLOAD='{"name": "DownloadedEpisodesScan"}'
|
SCAN_PAYLOAD='{"name": "DownloadedEpisodesScan"}'
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -330,7 +330,7 @@ SCAN_CMD_ID=$(echo "$SCAN_RESPONSE" | jq -r '.id // empty' 2>/dev/null)
|
|||||||
if [[ -z "$SCAN_CMD_ID" ]]; then
|
if [[ -z "$SCAN_CMD_ID" ]]; then
|
||||||
warn "Could not trigger import scan — proceeding without pre-flight"
|
warn "Could not trigger import scan — proceeding without pre-flight"
|
||||||
else
|
else
|
||||||
log " Import scan queued (command ID: $SCAN_CMD_ID) — waiting for completion..."
|
info "Import scan queued (command ID: $SCAN_CMD_ID) — waiting for completion..."
|
||||||
POLL_TIMEOUT=${SONARR_IMPORT_SCAN_TIMEOUT:-600}
|
POLL_TIMEOUT=${SONARR_IMPORT_SCAN_TIMEOUT:-600}
|
||||||
POLLED=0
|
POLLED=0
|
||||||
while [[ "$POLLED" -lt "$POLL_TIMEOUT" ]]; do
|
while [[ "$POLLED" -lt "$POLL_TIMEOUT" ]]; do
|
||||||
@@ -339,7 +339,7 @@ else
|
|||||||
"${SONARR_URL}/api/v3/command/${SCAN_CMD_ID}" 2>/dev/null | \
|
"${SONARR_URL}/api/v3/command/${SCAN_CMD_ID}" 2>/dev/null | \
|
||||||
jq -r '.status // empty' 2>/dev/null)
|
jq -r '.status // empty' 2>/dev/null)
|
||||||
case "$SCAN_STATUS" in
|
case "$SCAN_STATUS" in
|
||||||
completed) log "Import scan complete ✅"; break ;;
|
completed) info "Import scan complete ✅"; break ;;
|
||||||
failed) warn "Import scan reported failed — proceeding anyway"; break ;;
|
failed) warn "Import scan reported failed — proceeding anyway"; break ;;
|
||||||
esac
|
esac
|
||||||
sleep 10
|
sleep 10
|
||||||
@@ -365,7 +365,7 @@ fi
|
|||||||
# Safety Layer 3 — API version check
|
# Safety Layer 3 — API version check
|
||||||
check_arr_version "$SONARR_URL" "$SONARR_API_KEY" "v3" "$SONARR_VERSION_MAJOR" "Sonarr" || exit 1
|
check_arr_version "$SONARR_URL" "$SONARR_API_KEY" "v3" "$SONARR_VERSION_MAJOR" "Sonarr" || exit 1
|
||||||
|
|
||||||
log " Querying Sonarr API..."
|
info "Querying Sonarr API..."
|
||||||
|
|
||||||
# Fetch all series
|
# Fetch all series
|
||||||
SERIES_RESPONSE=$(sonarr_api "series") || {
|
SERIES_RESPONSE=$(sonarr_api "series") || {
|
||||||
@@ -386,7 +386,7 @@ if [[ "$SERIES_COUNT" -eq 0 ]]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log "Found $SERIES_COUNT series — fetching episode files..."
|
info "Found $SERIES_COUNT series — fetching episode files..."
|
||||||
|
|
||||||
TMP_DIR="/tmp/sonarr_cleanup_$$"
|
TMP_DIR="/tmp/sonarr_cleanup_$$"
|
||||||
mkdir -p "$TMP_DIR"
|
mkdir -p "$TMP_DIR"
|
||||||
@@ -418,7 +418,7 @@ while IFS= read -r _tracked_path; do
|
|||||||
[[ -n "$_tracked_path" ]] && TRACKED_MAP["$_tracked_path"]=1
|
[[ -n "$_tracked_path" ]] && TRACKED_MAP["$_tracked_path"]=1
|
||||||
done < "$TRACKED_FILE"
|
done < "$TRACKED_FILE"
|
||||||
unset _tracked_path
|
unset _tracked_path
|
||||||
log "Built in-memory lookup map: ${#TRACKED_MAP[@]} tracked paths"
|
info "Built in-memory lookup map: ${#TRACKED_MAP[@]} tracked paths"
|
||||||
TRACKED_COUNT=$(wc -l < "$TRACKED_FILE")
|
TRACKED_COUNT=$(wc -l < "$TRACKED_FILE")
|
||||||
|
|
||||||
# Safety Layer 5 — tracked count > 0
|
# Safety Layer 5 — tracked count > 0
|
||||||
@@ -429,14 +429,14 @@ if [[ "$TRACKED_COUNT" -eq 0 ]]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log " $SERIES_COUNT series | $TRACKED_COUNT tracked episode files"
|
info "$SERIES_COUNT series | $TRACKED_COUNT tracked episode files"
|
||||||
|
|
||||||
# ==============================================================================================
|
# ==============================================================================================
|
||||||
# ━━━ Scan TV Root ━━━
|
# ━━━ Scan TV Root ━━━
|
||||||
# ==============================================================================================
|
# ==============================================================================================
|
||||||
echo ""
|
echo ""
|
||||||
echo "━━━ $ICON_CLEAN Scanning TV Root ━━━"
|
echo "━━━ $ICON_CLEAN Scanning TV Root ━━━"
|
||||||
log " Root: $SONARR_TV_ROOT | Orphan age: ${SONARR_ORPHAN_AGE} days"
|
info "Root: $SONARR_TV_ROOT | Orphan age: ${SONARR_ORPHAN_AGE} days"
|
||||||
|
|
||||||
START=$(date +%s)
|
START=$(date +%s)
|
||||||
ORPHAN_COUNT=0
|
ORPHAN_COUNT=0
|
||||||
@@ -536,12 +536,12 @@ if [[ "$DRY_RUN" == false ]]; then
|
|||||||
done | sort -u
|
done | sort -u
|
||||||
)
|
)
|
||||||
|
|
||||||
log "Cleaning up empty folders..."
|
info "Cleaning up empty folders..."
|
||||||
for host_path in "${ARR_PATH_MAP[@]}" "$SONARR_TV_ROOT"; do
|
for host_path in "${ARR_PATH_MAP[@]}" "$SONARR_TV_ROOT"; do
|
||||||
[[ -d "$host_path" ]] && \
|
[[ -d "$host_path" ]] && \
|
||||||
find "$host_path" -mindepth 1 -type d -empty -delete 2>/dev/null
|
find "$host_path" -mindepth 1 -type d -empty -delete 2>/dev/null
|
||||||
done
|
done
|
||||||
log "Empty folders removed"
|
info "Empty folders removed"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
END=$(date +%s)
|
END=$(date +%s)
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ if [[ ${#CERT_MONITOR_DOMAINS[@]} -eq 0 ]]; then
|
|||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log "Domains to check: ${#CERT_MONITOR_DOMAINS[@]}"
|
info "Domains to check: ${#CERT_MONITOR_DOMAINS[@]}"
|
||||||
|
|
||||||
[[ "$DRY_RUN" == true ]] && warn "DRY RUN — results shown but no notifications sent"
|
[[ "$DRY_RUN" == true ]] && warn "DRY RUN — results shown but no notifications sent"
|
||||||
|
|
||||||
@@ -203,8 +203,8 @@ check_cert() {
|
|||||||
echo ""
|
echo ""
|
||||||
echo "━━━ $ICON_CERT Certificate Monitor — $(date '+%Y-%m-%d %H:%M:%S') ━━━"
|
echo "━━━ $ICON_CERT Certificate Monitor — $(date '+%Y-%m-%d %H:%M:%S') ━━━"
|
||||||
echo "$ICON_HOST $MY_ID ($LOCAL_SERVER_NAME)"
|
echo "$ICON_HOST $MY_ID ($LOCAL_SERVER_NAME)"
|
||||||
log "Warn threshold: ${CERT_WARN_DAYS} days"
|
info "Warn threshold: ${CERT_WARN_DAYS} days"
|
||||||
log "Crit threshold: ${CERT_CRIT_DAYS} days"
|
info "Crit threshold: ${CERT_CRIT_DAYS} days"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
START=$(date +%s)
|
START=$(date +%s)
|
||||||
|
|||||||
Reference in New Issue
Block a user