12 Monate Crumbforest-Wachstum, sortiert nach Waldlogik. Struktur: - 454 Dokumente in 7 organischen Ebenen - Lichtung → Waldrand → Waldmitte → Wurzeln → Krone → Unterholz → Samen - INDEX.md für jede Ebene (eigene Stimme) - WALDKARTE.md (Master-Navigation) - crumbcodex.md (Das Versprechen zwischen Krümel & Bits) - lichtung/willkommen.md (Nullfeld-Einstieg für Kinder) Philosophie: - Waldlogik statt Ordnerlogik - Tiefe, Licht, Wurzeln - wie ein echter Wald - Schutz für Krümel, Tiefe für Gräber, Poesie für Atmende Repos verbunden: - OZM-Keks-Handbuch-v1 (Das Wissen) - Crumb-Core-v.1 (Das Herz) - 194.164.194.191 - crumbmissions (Das Spiel) Wuuuhuuuuu! 🦉✨
269 lines
6.0 KiB
Markdown
269 lines
6.0 KiB
Markdown
---
|
||
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.
|