#!/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 #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