---
title: cf_tools
slug: cf_tools
lang: de
summary: Kurzbeschreibung hier.
tags: [Crumbforest]
---
# cf_tools

Kurzer Einstiegstext.

## Notizen
- Punkt 1
- Punkt 2

## FAQ
Q: Worum geht es?
A: …

# CF Tools — Kurz-Doku (Stand heute)

**Ziel:** Kleine, robuste Shell-Hilfen rund um unseren Snapshot-Collector unter `/var/cf`.
Fokus: Übersicht behalten, Qualität prüfen, aufräumen – ohne den Live-Betrieb zu stören.

---

## Verzeichnis-Layout

```
/var/cf
├── snapshots/               # Bilder, nach Layer/Device
│   └── L1/
│       └── SVGA_ESP01/
│           ├── 1758995431.jpg
│           └── ...
└── index/                   # flache Indizes je Device (optional)
    └── L1-SVGA_ESP01.txt
```

---

## Voraussetzungen

* Debian/Raspberry Pi OS (arm64) oder ähnlich
* Bash, coreutils, findutils
* `jq` (für JSON-Ausgabe): `sudo apt-get install -y jq`
* **Optional:** `inotify-tools` für Live-Follow: `sudo apt-get install -y inotify-tools`

---

## Installation

```bash
# Datei ablegen & ausführbar machen:
sudo tee /usr/local/bin/cf-tools.sh >/dev/null <<'SH'
# (hier steht dein cf-tools.sh Inhalt)
SH
sudo chmod +x /usr/local/bin/cf-tools.sh

# Bequemer Kurzbefehl:
sudo ln -sf /usr/local/bin/cf-tools.sh /usr/local/bin/cf-tools
```

> Standardpfade sind im Script fix: `ROOT=/var/cf`, `SNAPS=$ROOT/snapshots`, `INDEX=$ROOT/index`.

---

## Schnellstart

```bash
# Letzte 60 Minuten – Bilder pro Device zählen (Layer L1):
cf-tools recent L1 60

# Top-5 Talker im 60-Minuten-Fenster:
cf-tools top L1 60 5

# Kennzahlen eines Geräts (Text):
cf-tools device L1 SVGA_ESP04

# Kennzahlen als JSON (ideal für Monitoring):
cf-tools device-json L1 SVGA_ESP04 | jq

# Letzte Datei (voller Pfad):
cf-tools last-file L1 SVGA_ESP10

# Doppelte Layer/Device-Pfade finden:
cf-tools dupe-ids
```

---

## Kommandoreferenz

### Basics

* `cf-tools recent [LAYER] [min]`
  Zählt pro Device die Dateien der letzten *min* Minuten (Default: `L1`, `60`).

* `cf-tools top [LAYER] [min] [N]`
  Sortiert nach Anzahl, zeigt Top-N (Default: `L1`, `60`, `5`).

* `cf-tools device LAYER DEVICE`
  Einzeilige Kennzahlen: **TOTAL**, **SIZE**, **AGE_S**, **RECENT_60m**, **LAST**.

* `cf-tools device-json LAYER DEVICE`
  Gleiches als JSON (für Prom/Logs/API-Verbrauch).

* `cf-tools last-file LAYER DEVICE`
  Gibt den Pfad der jüngsten Datei zurück.

* `cf-tools dupe-ids`
  Zeigt doppelte Paare `LAYER/DEVICE` (z. B. Tippfehler oder doppelt geflashte IDs).

### Maintenance

* `cf-tools prune-empty`
  Leere Verzeichnisse entfernen.

* `cf-tools rebuild-index`
  Baut `index/LAYER-DEVICE.txt` aus Dateinamen/Mtime neu.

* `cf-tools fix-perms`
  Setzt Besitz **sysop:sysop** und `2775` rekursiv auf `/var/cf`.

### Misc

* `cf-tools gallery-url LAYER DEVICE`
  Linksnack zur Mini-Gallery des Collectors.

* `cf-tools follow LAYER DEVICE` *(optional, braucht inotify-tools)*
  Live-Anzeige neuer Dateien (nur Dateinamen; sicher für Produktion).

* `cf-tools purge LAYER DEVICE [older_min]`
  **Vorsichtig**: Löscht Dateien älter als *older_min* Minuten (Default: 60).

---

## Beispiele (typische Checks)

**1) Wer sendet gerade regelmäßig?**

```bash
cf-tools top L1 10 10
```

**2) Ist ein bestimmtes Device frisch?**

```bash
cf-tools device L1 SVGA_ESP07
# ... AGE_S=3  RECENT_60m=355  -> OK
```

**3) Monitoring-Hook (JSON)**

```bash
cf-tools device-json L1 SVGA_ESP05 | jq -r '.age_s'
# → Zahl in Sekunden (z.B. für Alarm, falls > 60)
```

**4) Nach Cleanup leere Ordner entfernen**

```bash
cf-tools prune-empty
```

**5) Rechte nach Restore reparieren**

```bash
cf-tools fix-perms
```

---

## Zusammenspiel mit unseren Diensten

* **Collector (FastAPI)** schreibt Bilder nach `/var/cf/snapshots/<Layer>/<Device>/...`
* **Retention (systemd timer)** hält das Volumen sauber (z. B. `>7 Tage` löschen)
* **Doctor (manuell/cron)**: Health-Report über alle Devices (Durchsatz, Stale, Disk)

> `cf-tools` ergänzt das Trio: schnelle Sichtbarkeit, Ad-hoc-Wartung, Skript-Hooks.

---

## Optional: kleine Automatisierungen

**Top-Talker minütlich in ein Log (Beispiel)**

```bash
sudo tee /usr/local/bin/cf-top-minute.sh >/dev/null <<'BASH'
#!/usr/bin/env bash
set -euo pipefail
stamp=$(date '+%F %T')
echo "[$stamp]" >> /var/log/cf-top.log
cf-tools top L1 10 10 >> /var/log/cf-top.log
echo >> /var/log/cf-top.log
BASH
sudo chmod +x /usr/local/bin/cf-top-minute.sh
```

`/etc/systemd/system/cf-top-minute.timer`

```ini
[Unit]
Description=CF Top Minute Timer
[Timer]
OnCalendar=*:*:00
Unit=cf-top-minute.service
Persistent=true
[Install]
WantedBy=timers.target
```

`/etc/systemd/system/cf-top-minute.service`

```ini
[Unit]
Description=CF Top Minute
[Service]
Type=oneshot
ExecStart=/usr/local/bin/cf-top-minute.sh
```

Aktivieren:

```bash
sudo systemctl daemon-reload
sudo systemctl enable --now cf-top-minute.timer
```

---

## Best Practices

* **NTP aktiv:** saubere Timestamps → schöne Dateinamen & zuverlässige „Age“-Checks.
* **IDs eindeutig:** pro ESP eindeutige `DEVICE_ID`; Duplikate mit `dupe-ids` aufspüren.
* **Retention früh festlegen:** z. B. 48 h für Rohbilder; Alarme & Pose-Snippets länger.
* **Rechte konsistent:** nach manuellen Kopieraktionen `cf-tools fix-perms`.
* **Stille Geräte** im Blick: `AGE_S`/`RECENT_60m` per JSON ins Monitoring aufnehmen.

---

## Troubleshooting (kurz)

* **Ordner existiert nicht:** `not found: /var/cf/snapshots/L1/XYZ`
  → Device/Layer-Name prüfen (Groß/Klein), ESP-Konfig, Collector-Logs.

* **AGE_S sehr groß / RECENT_60m = 0:**
  → ESP online? WLAN/MQTT/Collector erreichbar? `cf-doctor.sh` laufen lassen.

* **Viele leere Ordner:**
  → `cf-tools prune-empty`

* **Index veraltet:**
  → `cf-tools rebuild-index`

---

## Roadmap (wenn wir Lust haben)

* `cf-tools summary` (kompakter Gesamtstatus aller Devices)
* `cf-tools stale [min]` (nur Ausreißer listen)
* `cf-tools to-archive` (Stundenclips vorbereiten, Übergabe an ffmpeg-Job)
* Export als Prometheus-Textformat

---

**That’s it.**
Schlank, CLI-freundlich, gut skriptbar – und nah dran am, was wir **wirklich** täglich brauchen.
