You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

57 lines
2.0 KiB

#!/usr/bin/env bash
set -euo pipefail
# Purpose: Watch docker logs of a host container and react to an error pattern.
# Notes:
# - This runs *inside* a container with /var/run/docker.sock mounted.
# - Requires docker CLI inside this container.
# ---- Config via env (with sane defaults) ----
CONTAINER_NAME="${CONTAINER_NAME:-paperless-ai}"
OLLAMA_HOST="${OLLAMA_HOST:-192.168.222.12}"
OLLAMA_PORT="${OLLAMA_PORT:-11434}"
ERROR_PATTERN="${ERROR_PATTERN:-Error: \\[ERROR\\] Document analysis failed: connect EHOSTUNREACH ${OLLAMA_HOST}:${OLLAMA_PORT}}"
WOL_MAC="${WOL_MAC:-}"
WOL_BCAST="${WOL_BCAST:-255.255.255.255}"
WOL_PORT="${WOL_PORT:-9}"
DOCKER_CLI="${DOCKER_CLI:-docker}" # docker CLI binary name
NC_CMD="${NC_CMD:-nc}" # netcat
WOL_MAC="${WOL_MAC:-}" # optional: MAC to WOL
SINCE="${SINCE:-0s}" # logs window (e.g., 5m)
log() { printf '[%(%F %T)T] %s\n' -1 "$*"; }
send_wol() {
# 'wol' can send to a specific broadcast IP and UDP port
wol -i "$WOL_BCAST" -p "$WOL_PORT" "$WOL_MAC" || true
}
# Basic pre-flight: show which container is watched
log "Watching logs for container='${CONTAINER_NAME}' since='${SINCE}'"
log "Looking for pattern: ${ERROR_PATTERN}"
# Stream logs and parse
"${DOCKER_CLI}" logs -f --since "${SINCE}" "${CONTAINER_NAME}" 2>&1 | \
while IFS= read -r line; do
# echo "$line" # uncomment for debugging
if echo "$line" | grep -qE "${ERROR_PATTERN}"; then
log "Detected EHOSTUNREACH for Ollama (${OLLAMA_HOST}:${OLLAMA_PORT})."
# ... in your remediation block:
if [[ -n "$WOL_MAC" ]]; then
log "Sending WOL to $WOL_MAC via ${WOL_BCAST}:${WOL_PORT}"
send_wol
fi
# --- remediation examples (optional) ---
# if [[ -n "$WOL_MAC" ]]; then
# log "Sending WOL to ${WOL_MAC}"
# $WOL_CMD "$WOL_MAC" || true
# fi
# until $NC_CMD -z "$OLLAMA_HOST" "$OLLAMA_PORT"; do
# log "Waiting for Ollama to be reachable..."
# sleep 2
# done
# log "Ollama reachable again."
fi
done