Add design spec for kydriv Kyocera 3505ci Apple Silicon driver
This commit is contained in:
commit
49ad65435e
164
docs/superpowers/specs/2026-06-02-kydriv-design.md
Normal file
164
docs/superpowers/specs/2026-06-02-kydriv-design.md
Normal file
@ -0,0 +1,164 @@
|
||||
# kydriv — Kyocera 3505ci Treiber für Apple Silicon
|
||||
|
||||
## Kontext
|
||||
|
||||
Der Kyocera/TA 3505ci Multifunktionsdrucker erfordert zur Nutzung einen Abteilungscode (Kostenstelle). Der bisherige Intel-Mac-Treiber bot dafür ein Textfeld im Druckdialog. Der aktuelle Apple-Silicon-Treiber von Kyocera hat diese Funktion nicht. Dieses Projekt entwickelt einen Ersatztreiber für macOS auf Apple Silicon, der die fehlenden Funktionen — insbesondere die Kostenstelle — wiederherstellt.
|
||||
|
||||
## Ursachenanalyse
|
||||
|
||||
Der alte Intel-Treiber bestand aus drei Schichten:
|
||||
|
||||
1. **APDialogExtension-Plugins** (`.plugin`-Bundles) — Objective-C/Cocoa-Panels im Druckdialog. Intel-only, von Apple deprecated. Zuständig für die UI (Textfelder, Checkboxen).
|
||||
2. **CUPS-Filter** (`kyoprefilter_E`, `kyofilter_E`) — kompilierte Intel-Binaries. Zuständig für PostScript-Verarbeitung und Einschleusen von Gerätebefehlen.
|
||||
3. **PPD-Datei** — Textdatei, architekturunabhängig.
|
||||
|
||||
Auf Apple Silicon fehlen die Punkte 1 und 2. Der neue Kyocera-Treiber hat nur eine abgespeckte PPD ohne die Plugin-Mechanismen.
|
||||
|
||||
## Lösungsansatz
|
||||
|
||||
**PPD + Python CUPS-Filter**, verteilt als signiertes `.pkg`.
|
||||
|
||||
- Die APDialogExtension-Plugins werden nicht ersetzt (deprecated API). Stattdessen werden Kostenstellen als benannte Optionen in der PPD geführt und per Preset gespeichert.
|
||||
- Die Intel-Filter werden durch ein Python-Script ersetzt, das architekturunabhängig ist.
|
||||
- Der Kyocera-Treiber wird vollständig umgangen — die Lösung ist eigenständig.
|
||||
|
||||
## Komponenten
|
||||
|
||||
```
|
||||
kydriv/
|
||||
├── ppd/
|
||||
│ └── TA3505ci_AS.ppd # modifizierte PPD
|
||||
├── filter/
|
||||
│ └── kyofilter # Python CUPS-Filter
|
||||
├── installer/
|
||||
│ ├── root/ # Dateisystem-Abbild für pkgbuild
|
||||
│ │ ├── Library/Printers/PPDs/Contents/Resources/TA3505ci_AS.ppd
|
||||
│ │ └── usr/libexec/cups/filter/kyofilter
|
||||
│ ├── scripts/
|
||||
│ │ └── postinstall
|
||||
│ └── build.sh
|
||||
└── docs/superpowers/specs/
|
||||
```
|
||||
|
||||
**Datenfluss:**
|
||||
```
|
||||
macOS App (PDF) → CUPS pdftops → PostScript → kyofilter (Python) → Drucker
|
||||
```
|
||||
|
||||
## PPD-Datei (`TA3505ci_AS.ppd`)
|
||||
|
||||
Basis: `TA3505ci.PPD` (Intel-Treiber, Version 8.6006).
|
||||
|
||||
**Entfernt:**
|
||||
- Alle 11 `*APDialogExtension:`-Zeilen
|
||||
- `*cupsPreFilter: "application/pdf 0 kyoprefilter_E"`
|
||||
|
||||
**Geändert:**
|
||||
```diff
|
||||
- *cupsFilter: "application/vnd.cups-postscript 0 kyofilter_E"
|
||||
+ *cupsFilter: "application/vnd.cups-postscript 0 kyofilter"
|
||||
```
|
||||
|
||||
**KmManagment-Sektion** (ersetzt die alte Liste 00000000–00000030):
|
||||
|
||||
```ppd
|
||||
*% Kostenstelle (5-stellig) direkt eintragen — keine führenden Nullen nötig.
|
||||
*% Zeile kopieren und Zahl ersetzen:
|
||||
*% *KmManagment MG12345/Code 12345: ""
|
||||
*OpenUI *KmManagment/Job Accounting: PickOne
|
||||
*DefaultKmManagment: Default
|
||||
*OrderDependency: 60 AnySetup *KmManagment
|
||||
*KmManagment Default/Aus: ""
|
||||
*KmManagment MG12345/Code 12345: ""
|
||||
*?KmManagment: ""
|
||||
*End
|
||||
*CloseUI: *KmManagment
|
||||
```
|
||||
|
||||
Der PPD-Wert bleibt leer (`""`), da der Filter die PostScript-Injection übernimmt.
|
||||
|
||||
**Unverändert:** alle anderen Optionen — InputSlot, PageSize, KCStaple, OutputBin, Duplex, Farbe etc.
|
||||
|
||||
## Python CUPS-Filter (`kyofilter`)
|
||||
|
||||
**Installationspfad:** `/usr/libexec/cups/filter/kyofilter`
|
||||
**Rechte:** 755, root:wheel
|
||||
**Interpreter:** `/usr/bin/python3` (macOS vorinstalliert)
|
||||
|
||||
**CUPS-Schnittstelle:**
|
||||
```
|
||||
kyofilter <job-id> <user> <title> <copies> <options> [filename]
|
||||
```
|
||||
- Eingabe: PostScript (stdin oder Datei)
|
||||
- Ausgabe: PostScript (stdout)
|
||||
- Logs: stderr → CUPS error_log
|
||||
|
||||
**Logik:**
|
||||
|
||||
1. `argv[5]` parsen → Key=Value-Dict
|
||||
2. `KmManagment`-Wert lesen
|
||||
3. Startet mit `MG` und ist numerisch → Code extrahieren, auf 8 Stellen zero-padden
|
||||
4. Sonst → reiner Passthrough
|
||||
5. PostScript-Stream zeilenweise lesen:
|
||||
- Vor `%%EndSetup`: `(XXXXXXXX) statusdict /setmanagementnumber get exec` injizieren
|
||||
- Alle anderen Zeilen unverändert weiterleiten
|
||||
6. Fallback: falls kein `%%EndSetup` gefunden → vor erstem `%%Page:` injizieren, Warning ins Log
|
||||
|
||||
**Beispiel:** Kostenstelle `12345` → `(00012345) statusdict /setmanagementnumber get exec`
|
||||
|
||||
## Installer (`.pkg`)
|
||||
|
||||
**Gebaut mit:** `pkgbuild` + Developer ID Installer Zertifikat
|
||||
**Bundle-ID:** `de.kydriv.driver`
|
||||
|
||||
```bash
|
||||
pkgbuild \
|
||||
--root installer/root \
|
||||
--scripts installer/scripts \
|
||||
--identifier "de.kydriv.driver" \
|
||||
--version "1.0.0" \
|
||||
--sign "Developer ID Installer: NAME (TEAM-ID)" \
|
||||
kydriv-driver-1.0.0.pkg
|
||||
```
|
||||
|
||||
**postinstall-Script:**
|
||||
```bash
|
||||
#!/bin/bash
|
||||
chmod 755 /usr/libexec/cups/filter/kyofilter
|
||||
chown root:wheel /usr/libexec/cups/filter/kyofilter
|
||||
launchctl kickstart -k system/org.cups.cupsd
|
||||
```
|
||||
|
||||
**Notarisierung** (einmalig pro Release):
|
||||
```bash
|
||||
xcrun notarytool submit kydriv-driver-1.0.0.pkg \
|
||||
--apple-id EMAIL --team-id TEAM-ID --password APP-PASSWORT --wait
|
||||
xcrun stapler staple kydriv-driver-1.0.0.pkg
|
||||
```
|
||||
|
||||
Notarisierte `.pkg`-Dateien bleiben dauerhaft gültig, auch nach Ablauf des Entwicklerzertifikats.
|
||||
|
||||
## Benutzer-Workflow nach Installation
|
||||
|
||||
1. Kostenstelle in PPD eintragen (einmalig, Texteditor)
|
||||
2. `.pkg` installieren
|
||||
3. Drucker in Systemeinstellungen hinzufügen → `TA3505ci_AS.ppd` auswählen
|
||||
4. Druckdialog → Job Accounting → eigene Kostenstelle wählen
|
||||
5. Preset speichern
|
||||
6. Ab sofort: Preset auswählen → drucken
|
||||
|
||||
## Testing
|
||||
|
||||
| Stufe | Methode | Erfolgskriterium |
|
||||
|-------|---------|-----------------|
|
||||
| 1 | Filter mit Beispiel-PS über stdin aufrufen | Injection vor `%%EndSetup` im Output |
|
||||
| 2 | `cupstestppd ppd/TA3505ci_AS.ppd` | Ausgabe: PASS |
|
||||
| 3 | Manuelle Installation, Testseite drucken | Seite kommt raus |
|
||||
| 4 | CUPS-Log + Kyocera-Webinterface Job-Log | Kostenstelle korrekt erfasst |
|
||||
| 5 | `.pkg` auf frischem System installieren | End-to-End-Workflow funktioniert |
|
||||
|
||||
## Offene Fragen / Nächste Schritte
|
||||
|
||||
- Genaue Kostenstellen-Codes für die PPD erfragen und eintragen
|
||||
- Verifizieren, dass `setmanagementnumber` auf dem 3505ci die Kostenstelle korrekt bucht (Stufe 4)
|
||||
- Ggf. weitere Kyocera-spezifische PPD-Optionen aus dem alten Treiber übernehmen
|
||||
Loading…
x
Reference in New Issue
Block a user