Wire up unused config vars found in follow-up audit pass
TRANSCODE_LOG_RETENTION was documented as trimming the daily transcode log but never referenced — log grew unbounded. TRANSCODE_ORPHAN_AGE was shown in --status but never used, so empty session folders were deleted immediately instead of after the documented grace period, risking a race against ffmpeg creating a folder just before writing its first segment. docker_watchdog.sh's daemon-health thresholds were only hardcoded fallbacks despite comments claiming they were master.conf-configurable, and it referenced a heartbeat feature that was never implemented (that's owned by watchdog_orchestrator.sh, its caller) — added the three thresholds to master.conf for real and removed the stale heartbeat claim. Also added the missing HOSTN_PARTNERSHIP_SERVICES_STACK block to host.conf.template (containers.sh already read it via detect_hosts, just never had a template entry) and corrected play_state_sync.sh's doc comment for PLAY_SYNC_TYPES' actual default.
This commit is contained in:
@@ -813,6 +813,11 @@
|
|||||||
# Notification batching — one summary per cycle instead of one ping per event
|
# Notification batching — one summary per cycle instead of one ping per event
|
||||||
WATCHDOG_BATCH_NOTIFY=true
|
WATCHDOG_BATCH_NOTIFY=true
|
||||||
|
|
||||||
|
# Docker daemon health check — hung daemon detection at the start of each cycle
|
||||||
|
WATCHDOG_DAEMON_TIMEOUT=20 # seconds — timeout for all docker commands
|
||||||
|
WATCHDOG_DAEMON_STRIKE_LIMIT=3 # consecutive failed checks before restart attempt
|
||||||
|
WATCHDOG_DAEMON_RESTART_WAIT=900 # seconds to wait after restart before verifying
|
||||||
|
|
||||||
# Appdata size monitoring — two-part catch-all for runaway growth and oversized log files.
|
# Appdata size monitoring — two-part catch-all for runaway growth and oversized log files.
|
||||||
#
|
#
|
||||||
# Part 1 — Growth rate (zero-config):
|
# Part 1 — Growth rate (zero-config):
|
||||||
|
|||||||
@@ -151,6 +151,11 @@
|
|||||||
# "my-Radarr.xml"
|
# "my-Radarr.xml"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# XML templates pushed to mirror during onboard — other services (not auth, not arr).
|
||||||
|
HOSTN_PARTNERSHIP_SERVICES_STACK=(
|
||||||
|
# "my-Lidarr.xml"
|
||||||
|
)
|
||||||
|
|
||||||
# Paths the partner should collect during the grace window after offboard.
|
# Paths the partner should collect during the grace window after offboard.
|
||||||
HOSTN_PARTNERSHIP_MIRROR_BACKUPS=(
|
HOSTN_PARTNERSHIP_MIRROR_BACKUPS=(
|
||||||
# "/mnt/user/appdata-Fallback/Partner-Emby"
|
# "/mnt/user/appdata-Fallback/Partner-Emby"
|
||||||
|
|||||||
@@ -808,6 +808,11 @@
|
|||||||
# Notification batching — one summary per cycle instead of one ping per event
|
# Notification batching — one summary per cycle instead of one ping per event
|
||||||
WATCHDOG_BATCH_NOTIFY=true
|
WATCHDOG_BATCH_NOTIFY=true
|
||||||
|
|
||||||
|
# Docker daemon health check — hung daemon detection at the start of each cycle
|
||||||
|
WATCHDOG_DAEMON_TIMEOUT=20 # seconds — timeout for all docker commands
|
||||||
|
WATCHDOG_DAEMON_STRIKE_LIMIT=3 # consecutive failed checks before restart attempt
|
||||||
|
WATCHDOG_DAEMON_RESTART_WAIT=900 # seconds to wait after restart before verifying
|
||||||
|
|
||||||
# Appdata size monitoring — two-part catch-all for runaway growth and oversized log files.
|
# Appdata size monitoring — two-part catch-all for runaway growth and oversized log files.
|
||||||
#
|
#
|
||||||
# Part 1 — Growth rate (zero-config):
|
# Part 1 — Growth rate (zero-config):
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
# false = local servers only (this host's Emby + Jellyfin)
|
# false = local servers only (this host's Emby + Jellyfin)
|
||||||
# PLAY_SYNC_DAYS How many days back to check for played items (default: 90)
|
# PLAY_SYNC_DAYS How many days back to check for played items (default: 90)
|
||||||
# Use 0 to sync all played items (slow on large libraries).
|
# Use 0 to sync all played items (slow on large libraries).
|
||||||
# PLAY_SYNC_TYPES Comma-separated item types to sync (default: Movie,Episode,Audio)
|
# PLAY_SYNC_TYPES Comma-separated item types to sync (default: Movie,Episode —
|
||||||
|
# Audio excluded, music library too large; favorites handled separately)
|
||||||
#
|
#
|
||||||
# ==============================================================================================
|
# ==============================================================================================
|
||||||
# RUNTIME MODES
|
# RUNTIME MODES
|
||||||
|
|||||||
@@ -230,10 +230,11 @@ cleanup_location() {
|
|||||||
|
|
||||||
done < <(find "$location" -type f -mmin +"$max_age" 2>/dev/null)
|
done < <(find "$location" -type f -mmin +"$max_age" 2>/dev/null)
|
||||||
|
|
||||||
# Remove empty directories — but NEVER remove transcoding-temp
|
# Remove empty directories older than TRANSCODE_ORPHAN_AGE — but NEVER remove
|
||||||
# transcoding-temp must always exist on ramdisk so Emby finds it there first
|
# transcoding-temp. Age gate avoids deleting a session folder ffmpeg just
|
||||||
|
# created but hasn't written its first segment into yet.
|
||||||
if [[ "$DRY_RUN" == false ]]; then
|
if [[ "$DRY_RUN" == false ]]; then
|
||||||
find "$location" -mindepth 1 -type d -empty \
|
find "$location" -mindepth 1 -type d -empty -mmin +"${TRANSCODE_ORPHAN_AGE:-30}" \
|
||||||
! -name "transcoding-temp" -delete 2>/dev/null
|
! -name "transcoding-temp" -delete 2>/dev/null
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -647,6 +647,14 @@ if [[ "$DRY_RUN" == false && "$NO_LOG" == false && -n "${TRANSCODE_DAILY_LOG:-}"
|
|||||||
echo "${TODAY}|${RAMDISK_USED_GB}|${FLIP_COUNT}|${RAM_SESSION_COUNT}|${SSD_SESSION_COUNT}" \
|
echo "${TODAY}|${RAMDISK_USED_GB}|${FLIP_COUNT}|${RAM_SESSION_COUNT}|${SSD_SESSION_COUNT}" \
|
||||||
>> "$TRANSCODE_DAILY_LOG" 2>/dev/null || true
|
>> "$TRANSCODE_DAILY_LOG" 2>/dev/null || true
|
||||||
log "Daily log written: $TRANSCODE_DAILY_LOG"
|
log "Daily log written: $TRANSCODE_DAILY_LOG"
|
||||||
|
|
||||||
|
# Trim entries older than TRANSCODE_LOG_RETENTION days
|
||||||
|
LOG_CUTOFF=$(date -d "${TRANSCODE_LOG_RETENTION:-90} days ago" '+%Y-%m-%d' 2>/dev/null)
|
||||||
|
if [[ -n "$LOG_CUTOFF" ]]; then
|
||||||
|
awk -F'|' -v cutoff="$LOG_CUTOFF" '$1 >= cutoff' "$TRANSCODE_DAILY_LOG" \
|
||||||
|
> "${TRANSCODE_DAILY_LOG}.tmp" 2>/dev/null && \
|
||||||
|
mv "${TRANSCODE_DAILY_LOG}.tmp" "$TRANSCODE_DAILY_LOG"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ==============================================================================================
|
# ==============================================================================================
|
||||||
|
|||||||
@@ -82,7 +82,8 @@
|
|||||||
#
|
#
|
||||||
# Silent When Healthy
|
# Silent When Healthy
|
||||||
# Runs 96 times per day. Producing output on every clean cycle would make
|
# Runs 96 times per day. Producing output on every clean cycle would make
|
||||||
# logs useless. Output only when something needs attention or a heartbeat fires.
|
# logs useless. Output only when something needs attention — alive heartbeat
|
||||||
|
# is handled by watchdog_orchestrator.sh, the caller, not this script.
|
||||||
#
|
#
|
||||||
# ==============================================================================================
|
# ==============================================================================================
|
||||||
# OPERATIONAL SAFEGUARDS
|
# OPERATIONAL SAFEGUARDS
|
||||||
@@ -196,8 +197,9 @@
|
|||||||
# WATCHDOG_BATCH_NOTIFY
|
# WATCHDOG_BATCH_NOTIFY
|
||||||
# Collect cycle events and send as one notification (default: true)
|
# Collect cycle events and send as one notification (default: true)
|
||||||
#
|
#
|
||||||
# DOCKER_WATCHDOG_HEARTBEAT_HOURS
|
# WATCHDOG_DAEMON_TIMEOUT / WATCHDOG_DAEMON_STRIKE_LIMIT / WATCHDOG_DAEMON_RESTART_WAIT
|
||||||
# Hours between alive heartbeat log entries
|
# Docker daemon health check: command timeout, strikes before restart attempt,
|
||||||
|
# seconds to wait after restart before verifying
|
||||||
#
|
#
|
||||||
# DOCKER_WATCHDOG_INTENTIONAL_FILE
|
# DOCKER_WATCHDOG_INTENTIONAL_FILE
|
||||||
# Path to intentional stops state file (STATE_DIR). Containers in this file
|
# Path to intentional stops state file (STATE_DIR). Containers in this file
|
||||||
|
|||||||
Reference in New Issue
Block a user