fix: ocrmypdf-Pin auf 17.4.1, Preflight erkennt den GS-Fall, Rauchtest (v0.6.1)
v0.6.0 hat ocrmypdf auf 16.13.0 gepinnt, um einen ungewollten Major-Sprung
zu verhindern. Auf Bestandsinstallationen war das ein DOWNGRADE (dort lief
via ">=16.0" bereits 17.x) — und 16.13.0 bricht auf Debian 12 mit dem
Bord-Ghostscript 10.0.0 bei JEDER PDF ab, sobald skip_text gesetzt ist.
Im Test auf CT 200 lief das Update mit Exit 0 durch, der Dienst blieb
"active", --check-config meldete "Preflight ok" — und jede Datei landete
in error/. Stiller Totalausfall.
- requirements.txt: ocrmypdf==17.4.1 (real auf Debian 12 + gs 10.0.0
verifiziert). Ab 17.0.0 steht die GS-Pruefung in ocrmypdf unter einem
`if options.output_type.startswith('pdfa')`; bis 16.x lief sie ohne
diesen Guard und schlug auch bei output_type="pdf" zu.
- check_preflight() prueft Ghostscript nicht mehr nur bei gesetztem
pdfa_level, sondern bildet die reale Bedingung ab:
betroffene GS-Version UND skip_text UND (PDF/A ODER ocrmypdf < 17).
Der Dienst bricht damit beim Start ab statt bei der ersten Datei.
- update.sh zeigt Versionsspruenge der gepinnten Pakete; Downgrades als
WARN, auch in der Abschluss-Zusammenfassung.
- update.sh faehrt nach dem Start einen Rauchtest (eingebettete Mini-PDF
durch die echte Pipeline) und raeumt restlos auf. Uebersprungen, wenn
Upload-Ziele oder E-Mail-Notify aktiv sind, damit kein Testmuell zum
Kunden geht. Abschaltbar mit --no-smoke-test.
- Doku korrigiert: pdfa_level = "" allein ist keine Entwarnung, die haengt
an der ocrmypdf-Version.
152 Tests gruen.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+108
@@ -1,5 +1,113 @@
|
||||
# Changelog
|
||||
|
||||
## [0.6.1] - 2026-09-22
|
||||
|
||||
> **Fuer Bestandsinstallationen wichtig.** Wer 0.6.0 bereits eingespielt hat,
|
||||
> laeuft auf Debian 12 mit hoher Wahrscheinlichkeit im Totalausfall: der Dienst
|
||||
> meldet `active`, `--check-config` meldet "Preflight ok" — und **jede** PDF
|
||||
> landet in `error/`. Nach dem Update auf 0.6.1 nachsehen, ob in `error/`
|
||||
> unverarbeitete Dateien liegen, und diese zurueck nach `incoming/` schieben.
|
||||
> Der Updater faehrt jetzt selbst einen Rauchtest, der so einen Zustand sofort
|
||||
> aufdeckt.
|
||||
|
||||
### Fixed
|
||||
- **ocrmypdf-Pin von 16.13.0 auf 17.4.1 korrigiert — das war ein stiller
|
||||
Totalausfall.** 0.6.0 pinnte `ocrmypdf==16.13.0`. Auf Bestandssystemen mit
|
||||
vorher `ocrmypdf>=16.0` war das ein **Downgrade** von 17.4.1, und auf
|
||||
Debian 12 (Ghostscript 10.0.0) bricht ocrmypdf 16.13.0 bei jeder PDF ab:
|
||||
|
||||
```
|
||||
MissingDependencyError: Ghostscript 10.0.0 through 10.02.0 (your version:
|
||||
10.0.0) contain serious regressions that corrupt PDFs with existing text
|
||||
```
|
||||
|
||||
Ursache, verifiziert im Quelltext von
|
||||
`ocrmypdf/builtin_plugins/ghostscript.py::check_options()`: bis
|
||||
einschliesslich 16.x laeuft die Ghostscript-Pruefung **bedingungslos** —
|
||||
`skip_text=true` allein genuegt, `output_type` wird gar nicht geprueft,
|
||||
obwohl die Fehlermeldung selbst `--output-type pdf` empfiehlt. Ab **17.0.0**
|
||||
umschliesst denselben Block ein
|
||||
`if options.output_type.startswith('pdfa'):`; ohne PDF/A wird Ghostscript
|
||||
nicht angefasst. `run_ocr()` setzt bei leerem `pdfa_level` genau
|
||||
`output_type="pdf"` und hielt sich damit faelschlich fuer sicher.
|
||||
|
||||
Betroffen war nicht nur das Update, sondern ebenso jede **Neuinstallation**:
|
||||
`skip_text = true` ist der Default. — 17.4.1 ist die auf Debian 12 + gs 10.0.0
|
||||
real verifizierte Version; `skip_text` bleibt in 17.x als Alias fuer
|
||||
`mode='skip'` unterstuetzt, `run_ocr()` musste nicht angepasst werden.
|
||||
|
||||
- **Preflight prueft jetzt die reale Bedingung.** `check_preflight()` sah die
|
||||
Ghostscript-Version bisher nur bei gesetztem `pdfa_level` an (`if pdfa_level:`)
|
||||
— genau deshalb ging der kaputte Zustand als "Preflight ok" durch. Die neue
|
||||
Bedingung (`_gs_block_reason()`) bildet ocrmypdf nach:
|
||||
|
||||
```
|
||||
betroffene GS-Version UND skip_text UND (pdfa_level ODER ocrmypdf < 17)
|
||||
```
|
||||
|
||||
Die Signatur ist jetzt `check_preflight(pdfa_level, skip_text)`; alle
|
||||
Aufrufstellen (`run()`, `run_once()`, `--check-config`) reichen beides durch.
|
||||
`redo_ocr` steht bewusst **nicht** in der Bedingung: die Config kennt keinen
|
||||
solchen Key, und ein erfundener waere schlimmer als ein fehlender.
|
||||
|
||||
Ergebnis: der Dienst bricht beim **Start** mit Exit 2 ab statt bei der ersten
|
||||
Datei, und `--check-config` meldet den Zustand als **Fehler** (Exit 2) — also
|
||||
auch mitten im Update. Die Meldung nennt beide Auswege: Ghostscript >= 10.02.1
|
||||
aus bookworm-backports (der Installer bietet das an) oder
|
||||
`[ocr].skip_text = false`.
|
||||
|
||||
### Added
|
||||
- **`update.sh` macht Versionsspruenge der Kernabhaengigkeiten sichtbar.** Die
|
||||
Versionen der in `requirements.txt` gepinnten Pakete werden vor und nach
|
||||
`pip install` gemessen; Downgrades erscheinen als `[WARN]`, Upgrades und neue
|
||||
Pakete als `[INFO]`, beides zusaetzlich in der Abschluss-Zusammenfassung. Das
|
||||
Downgrade 17.4.1 -> 16.13.0 verschwand bisher wortlos hinter
|
||||
`[INFO] Dependencies ok ✓`.
|
||||
- **Rauchtest in `update.sh`.** Nach dem Start jeder Instanz geht eine winzige
|
||||
Test-PDF durch die **echte** Pipeline; der Test gilt als bestanden, wenn sie
|
||||
in `outgoing/` ankommt. Erst das deckt einen Totalausfall auf, den systemd
|
||||
nicht sieht.
|
||||
- Die Test-PDF (694 Bytes, eine Seite) steckt als base64 im Skript — kein
|
||||
Pillow, kein `gs`, kein `convert` noetig.
|
||||
- Eindeutiger Dateiname (`__smoketest_update_<zeitstempel>_<pid>.pdf`), der
|
||||
mit keiner Kundendatei kollidieren kann.
|
||||
- **Raeumt restlos auf** — Testdatei und Ergebnis, in `incoming/`, `working/`
|
||||
(inkl. `__ocr_`-Zwischendatei), `outgoing/`, `error/` und Archiv, auch bei
|
||||
Fehlschlag und Timeout.
|
||||
- **Uebersprungen** bei Instanzen mit aktivem `[upload.nextcloud]`,
|
||||
`[upload.sftp]`, `[notify.email]` oder `[upload.folder]` mit gesetztem
|
||||
`target`: dort wuerde die Testdatei nach aussen gehen, im Zweifel zum
|
||||
Kunden. `[upload.folder]` ohne `target` schreibt nach `outgoing/` und ist
|
||||
harmlos.
|
||||
- Wartezeit `SMOKE_TIMEOUT` (Standard 90 s), danach durchgefallen — das
|
||||
Skript haengt nicht.
|
||||
- Ein Fehlschlag setzt den Exit-Code auf 1 und nennt den `journalctl`-Befehl,
|
||||
rollt aber **nichts** zurueck.
|
||||
- Abschaltbar mit `--no-smoke-test`, dokumentiert in `--help`.
|
||||
- `--check-config` zeigt zusaetzlich `skip_text` sowie die installierte
|
||||
ocrmypdf- und Ghostscript-Version an.
|
||||
|
||||
### Changed
|
||||
- **Doku praezisiert.** `config.example.toml`, `config.py`,
|
||||
`docs/INSTALLATION.md` und `docs/UPDATE.md` behaupteten sinngemaess,
|
||||
`pdfa_level = ""` sei der sichere Default gegen den Ghostscript-Bug. Das
|
||||
stimmt so nicht: die Entwarnung haengt an der ocrmypdf-Version und gilt erst
|
||||
ab 17. Der Ghostscript-Abschnitt in `INSTALLATION.md` stellt die Bedingung
|
||||
jetzt je ocrmypdf-Major gegenueber und nennt `skip_text = false` als zweiten
|
||||
Weg; `UPDATE.md` beschreibt Rauchtest und Versionssprung-Meldung.
|
||||
- Kommentarblock in `requirements.txt` korrigiert: der Schutz gilt gegen den
|
||||
naechsten ungewollten Major-Sprung (18), **nicht** gegen 17 — samt
|
||||
Begruendung, warum 16.x fuer uns unbrauchbar ist.
|
||||
|
||||
### Tests
|
||||
- 152 statt 135 Tests. Neu: die Preflight-Matrix aus GS-Version x `skip_text` x
|
||||
`pdfa_level` x ocrmypdf-Major — darunter der Fall, der durchrutschte
|
||||
(betroffene GS-Version + `skip_text=true` + leeres `pdfa_level` +
|
||||
ocrmypdf 16.x muss `PreflightError` ausloesen) und die Gegenprobe, dass
|
||||
dieselbe Config mit ocrmypdf 17.x **nicht** ausloest (sonst startet keine
|
||||
Debian-12-Bestandsinstanz mehr). Dazu `ocrmypdf_checks_gs_always()`, der
|
||||
Abbruch in `run_once()` und Exit 2 bei `--check-config`.
|
||||
|
||||
## [0.6.0] - 2026-09-22
|
||||
|
||||
### Added
|
||||
|
||||
Reference in New Issue
Block a user