/
/
/
1#!/bin/sh
2set -eu
3
4# -------- Config from env --------
5FRIGATE_BASE_URL="${FRIGATE_BASE_URL:-http://frigate:5000}"
6CAMERAS_CSV="${CAMERAS:-}"
7HTTP_USER="${HTTP_USER:-}"
8HTTP_PASS="${HTTP_PASS:-}"
9
10MQTT_HOST="${MQTT_HOST:-localhost}"
11MQTT_PORT="${MQTT_PORT:-1883}"
12MQTT_USER="${MQTT_USER:-}"
13MQTT_PASS="${MQTT_PASS:-}"
14MQTT_TLS="${MQTT_TLS:-0}" # set to 1 to enable TLS
15MQTT_CA="${MQTT_CA:-}" # e.g. /mqtt-ca/ca.crt
16
17# -------- Helpers --------
18log() { printf '%s %s\n' "$(date -Is)" "$*" >&2; }
19
20mqtt_sub_once() {
21 topic="$1"
22 # Build mosquitto_sub args
23 set -- -h "$MQTT_HOST" -p "$MQTT_PORT" -C 1 -W 3 -t "$topic"
24 [ -n "$MQTT_USER" ] && set -- "$@" -u "$MQTT_USER"
25 [ -n "$MQTT_PASS" ] && set -- "$@" -P "$MQTT_PASS"
26 if [ "$MQTT_TLS" = "1" ]; then
27 set -- "$@" --tls-version tlsv1.2
28 [ -n "$MQTT_CA" ] && set -- "$@" --cafile "$MQTT_CA"
29 fi
30 mosquitto_sub "$@" 2>/dev/null || true
31}
32
33is_camera_enabled() {
34 cam="$1"
35 payload="$(mqtt_sub_once "frigate/${cam}/enabled/state" | tr -d '\r')"
36 [ "$payload" = "ON" ]
37}
38
39fetch_snapshot() {
40 cam="$1"
41 TS="$(date +%Y%m%d_%H%M%S)"
42 outdir="/snapshots/${cam}/$(date +%Y-%m-%d)"
43 mkdir -p "$outdir"
44
45 AUTH_ARGS=""
46 if [ -n "$HTTP_USER" ] && [ -n "$HTTP_PASS" ]; then
47 AUTH_ARGS="-u ${HTTP_USER}:${HTTP_PASS}"
48 fi
49
50 # curl -f: non-2xx -> failure
51 if curl -fsS $AUTH_ARGS "${FRIGATE_BASE_URL}/api/${cam}/latest.jpg" \
52 -o "${outdir}/${cam}_${TS}.jpg"; then
53 log "Saved snapshot for ${cam} -> ${outdir}/${cam}_${TS}.jpg"
54 else
55 log "HTTP fetch failed for ${cam} from ${FRIGATE_BASE_URL}"
56 fi
57}
58
59# -------- Main --------
60if [ -z "$CAMERAS_CSV" ]; then
61 log "No CAMERAS provided; set CAMERAS env (comma-separated)."
62 exit 0
63fi
64
65for cam in $(echo "$CAMERAS_CSV" | tr ',' ' '); do
66 if is_camera_enabled "$cam"; then
67 fetch_snapshot "$cam" || true
68 else
69 log "Camera '${cam}' not enabled (state != ON). Skipping."
70 fi
71done
72