Gromlox
Anmeldungsdatum: 8. Januar 2020
Beiträge: 25
|
Guten Tag! Ich habe eine frage ich suche zurzeit nach einer Lösung für mein Schulprojekt, ich möchte gerne Windows beibringen auf CUPS also ein einen Spooler zu drucken damit diser den Auftrag an alle Verfügbaren Drucker weiterleitet. (CUPS Ubuntu Server Grafisch) In meinen Projekt sind das 2 Drucker also soll einmal gedruckt werden und der Auftrag sollte 2x im Puffer gespeichert werden (jeweils einmal pro Drucker) Und dann sollte mann sich mithilfe NFC Authentifizieren und nun soll der Druckjob von diesem Drucker wo man sich authentifiziert ausgedruckt werden. Ist also nicht mehr stand ortsabhängig! Danke schon mal für euer bemühen! Mit freundlichen Grüßen Chris
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11237
Wohnort: München
|
Hallo, Gromlox schrieb: In meinen Projekt sind das 2 Drucker also soll einmal gedruckt werden und der Auftrag sollte 2x im Puffer gespeichert werden (jeweils einmal pro Drucker)
Gibt es da einen Mechanismus die nicht authentifizierten Druck-Jobs automatisch aufzuräumen? Gromlox schrieb: Und dann sollte mann sich mithilfe NFC Authentifizieren und nun soll der Druckjob von diesem Drucker wo man sich authentifiziert ausgedruckt werden.
Wie genau funktioniert die Authentifizierung? Macht das der Drucker selber oder geht das über einen externen Mechanismus? Wenn das extern läuft, könnte man sich überlegen neue Jobs in eine pausierte Warteschlange für einen virtuellen Drucker zu packen und die dann nach der Authentifizierung mit lpmove in die Warteschlange für den jeweiligen Drucker zu verschieben - das hätte den Vorteil, dass der Job nicht an mehreren Stellen "herumhängt". CUPS kann soweit ich weiß nicht selbstständig einen Druckjob an mehrere Drucker verteilen. Ich habe von Tea4CUPS gelesen, mit dem man sowas realisieren können soll - allerdings scheint das Projekt seit längerem ungepflegt zu sein und die Unterstützung für RAW-Queues wird langfristig aus CUPS verschwinden.
|
Gromlox
(Themenstarter)
Anmeldungsdatum: 8. Januar 2020
Beiträge: 25
|
seahawk1986 schrieb:
Gibt es da einen Mechanismus die nicht authentifizierten Druck-Jobs automatisch aufzuräumen?
Nein ein mechanismus ist soweit nicht geplant gewesen da der Puffer bei neuen Aufträgen doch sowieso geleert wird oder?
seahawk1986 schrieb: Wie genau funktioniert die Authentifizierung? Macht das der Drucker selber oder geht das über einen externen Mechanismus?
Diese sollte wie leider nicht erwähnt mit einem NFC Reader (rasp und NFC Platine) stattfinden
seahawk1986 schrieb: Wenn das extern läuft, könnte man sich überlegen neue Jobs in eine pausierte Warteschlange für einen virtuellen Drucker zu packen und die dann nach der Authentifizierung mit lpmove in die Warteschlange für den jeweiligen Drucker zu verschieben - das hätte den Vorteil, dass der Job nicht an mehreren Stellen "herumhängt".
Wie willst du herausfinden wo man sich authentifiziert ? Darum gehts ja das es nicht vom Standort abhängt. Kann er auslesen wo das passiert und die Datei dort hinsenden?
seahawk1986 schrieb: CUPS kann soweit ich weiß nicht selbstständig einen Druckjob an mehrere Drucker verteilen. Ich habe von Tea4CUPS gelesen, mit dem man sowas realisieren können soll - allerdings scheint das Projekt seit längerem ungepflegt zu sein und die Unterstützung für RAW-Queues wird langfristig aus CUPS verschwinden.
Okey danke schonmal für deine Antwort ich werde mir das mal anschauen! Ich hatte halt gedacht es geht einfacher mit einem Skript aber dies wird ja kaum mehr von CUPS unterstüzt
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11237
Wohnort: München
|
Mir ist noch nicht ganz klar, was da genau passieren soll... - korrigiere mich bitte falls ich das falsch verstanden habe: Du hast Nutzer, die Druckaufträge erteilen (also z.B. aus einer Anwendung heraus drucken). Danach läuft der Nutzer zu einem Drucker seiner Wahl und hält seinen NFC-Token an den daneben stehenden Leser. Der Drucker gibt darauf hin die in der Warteschlange vorhandenen Druckaufträge für den Nutzer aus. Der Leser müsste dann also wissen, neben welchem Drucker er steht und dann dem CUPS-Server sagen, dass er die Druckaufträge für den Nutzer, die in der Warteschlange stecken, in die Warteschlange für den jeweiligen Drucker packen soll.
|
Gromlox
(Themenstarter)
Anmeldungsdatum: 8. Januar 2020
Beiträge: 25
|
seahawk1986 schrieb: Mir ist noch nicht ganz klar, was da genau passieren soll... - korrigiere mich bitte falls ich das falsch verstanden habe: Du hast Nutzer, die Druckaufträge erteilen (also z.B. aus einer Anwendung heraus drucken). Danach läuft der Nutzer zu einem Drucker seiner Wahl und hält seinen NFC-Token an den daneben stehenden Leser. Der Drucker gibt darauf hin die in der Warteschlange vorhandenen Druckaufträge für den Nutzer aus. Der Leser müsste dann also wissen, neben welchem Drucker er steht und dann dem CUPS-Server sagen, dass er die Druckaufträge für den Nutzer, die in der Warteschlange stecken, in die Warteschlange für den jeweiligen Drucker packen soll.
Ja genau so ist es, dies will ich umgehen indem ich einfach die dokumente auf alle schicke und das einfach dort gedruckt wird wo man gescannt hat!
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11237
Wohnort: München
|
Gromlox schrieb: Ja genau so ist es, dies will ich umgehen indem ich einfach die dokumente auf alle schicke und das einfach dort gedruckt wird wo man gescannt hat!
Ich sehe nicht, warum das "einfach" sein soll... - wie willst du kontrollieren, welche Jobs in der Queue eines Druckers dann tatsächlich gedruckt werden sollen? Und wie löscht du für den anderen Drucker die Aufträge aus dessen Warteschlange, die bereits gedruckt wurden? Ich führe mal aus, wie ich mir das vorstelle (das funktioniert dann ähnlich wie die Find-Me Funktion von papercut, die wohl die selbe Idee hatten und das professionell umgesetzt haben): Man legt wie in https://www.papercut.com/kb/Main/SetupNullPrinterOnMac beschrieben (funktioniert unter Linux genauso) einen Virtuellen Drucker an und setzt diesen als Standard-Drucker und über die Wartungs-Einstellungen auf pausiert, so dass er keine Aufträge wegwirft. Unter Windows kann man den Drucker über die URL http://SERVER:631/printer/Druckername einrichten lassen - als Treiber nimmt man den Generischen P(ost)S(cript) Treiber von Microsoft. Für die Folgenden Beispiele habe ich meinen Drucker NullPrinter genannt. Jetzt kann ich Druckaufträge anlegen, die in der gestoppten Queue landen, z.B. mit Hilfe der Shell (oder über den freigegebenen Drucker):
$ lp -d NullPrinter Datei.pdf
Anfrage-ID ist NullPrinter-5 (1 Datei(en)) und sie mir mit dem Befehl lpstat auflisten lassen:
$ lpstat -o NullPrinter
NullPrinter-5 NUTZERNAME 10240 Mi 08 Jan 2020 14:21:36 CET
Wenn ich jetzt einen NFC-Token sehe, kenne ich den Ort des Lesers und kann darüber den gewünschten Ziel-Drucker ermitteln, hier z.B. ComputerRaum und aus dem Token kann ich den Nutzernamen (hier NUTZERNAME) ableiten, der in der Druckwarteschlange steht. Dann suche ich mir die Namen der Druck-Jobs aus der Liste heraus, die zum Nutzer passen:
user="NUTZERNAME"
printer="ComputerRaum"
jobs=$(lpstat -o NullPrinter | awk -v username="$user" '($2==username){print $1}')
Dann verschiebe ich den oder die Jobs auf den gewünschten Drucker:
for job in "${jobs[@]}"
do
lpmove "$job" "$printer"
done
Und damit landen die Aufträge in der Warteschlange des gewünschten Druckers und werden abgearbeitet.
|
Gromlox
(Themenstarter)
Anmeldungsdatum: 8. Januar 2020
Beiträge: 25
|
seahawk1986 schrieb: Gromlox schrieb: Ja genau so ist es, dies will ich umgehen indem ich einfach die dokumente auf alle schicke und das einfach dort gedruckt wird wo man gescannt hat!
Ich sehe nicht, warum das "einfach" sein soll... - wie willst du kontrollieren, welche Jobs in der Queue eines Druckers dann tatsächlich gedruckt werden sollen? Und wie löscht du für den anderen Drucker die Aufträge aus dessen Warteschlange, die bereits gedruckt wurden? Ich führe mal aus, wie ich mir das vorstelle (das funktioniert dann ähnlich wie die Find-Me Funktion von papercut, die wohl die selbe Idee hatten und das professionell umgesetzt haben): Man legt wie in https://www.papercut.com/kb/Main/SetupNullPrinterOnMac beschrieben (funktioniert unter Linux genauso) einen Virtuellen Drucker an und setzt diesen als Standard-Drucker und über die Wartungs-Einstellungen auf pausiert, so dass er keine Aufträge wegwirft. Unter Windows kann man den Drucker über die URL http://SERVER:631/printer/Druckername einrichten lassen - als Treiber nimmt man den Generischen P(ost)S(cript) Treiber von Microsoft. Für die Folgenden Beispiele habe ich meinen Drucker NullPrinter genannt. Jetzt kann ich Druckaufträge anlegen, die in der gestoppten Queue landen, z.B. mit Hilfe der Shell (oder über den freigegebenen Drucker):
$ lp -d NullPrinter Datei.pdf
Anfrage-ID ist NullPrinter-5 (1 Datei(en)) und sie mir mit dem Befehl lpstat auflisten lassen:
$ lpstat -o NullPrinter
NullPrinter-5 NUTZERNAME 10240 Mi 08 Jan 2020 14:21:36 CET
Wenn ich jetzt einen NFC-Token sehe, kenne ich den Ort des Lesers und kann darüber den gewünschten Ziel-Drucker ermitteln, hier z.B. ComputerRaum und aus dem Token kann ich den Nutzernamen (hier NUTZERNAME) ableiten, der in der Druckwarteschlange steht. Dann suche ich mir die Namen der Druck-Jobs aus der Liste heraus, die zum Nutzer passen:
user="NUTZERNAME"
printer="ComputerRaum"
jobs=$(lpstat -o NullPrinter | awk -v username="$user" '($2==username){print $1}')
Dann verschiebe ich den oder die Jobs auf den gewünschten Drucker:
for job in "${jobs[@]}"
do
lpmove "$job" "$printer"
done
Und damit landen die Aufträge in der Warteschlange des gewünschten Druckers und werden abgearbeitet.
Das machst du ja jetz alles von Hand, ist es möglich das man das in ein Skriptum umwandelt? Da ich das mache ohne anfangs erfahrung zu besitzen ist es leider sehr schlecht bei mir!
Würde mich über weitere Hilfe freuen!
Danke das du mir bis jetz schon geholfen hast!
LG!
|
Bournless
Anmeldungsdatum: 4. Mai 2019
Beiträge: 915
|
Hallo Gromlox, ich finde die Idee (das eigentliche Projektthema) von euch Gromlox und _user013_ sehr charmant.
Ich gehe mal davon aus, dass es sich hier, um das selbe Projekt handelt!? IMHO lässt sich das nur technisch/logisch realisieren, wenn man jedem Drucker/Netzwerkdrucker einen Raspberrypi, inkl. NFC-Modul und Touchscreen vorschaltet, da ihr ja einen jeden beliebigen Drucker (unabhängig von Hersteller/Modell, usw.) einsetzen wollt. Die Raspberrypi fungieren dann als CUPS-Server und übernehmen gleichzeitig die Authentifizierung per NFC. Den logischen Anteil hat Dir seahawk1986 bereits ausführlich geschildert. Danke dafür seahawk1986 ! Ob sich der ganze Kostenaufwand überhaupt lohnt, sei mal dahingestellt. PS an die Mitleser: Fast alle Hersteller (HP, EPSON, Kyocera, Ricoh und Brother) bieten Geräte an, die diese Funktion OOTB haben.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11237
Wohnort: München
|
Bournless schrieb: IMHO lässt sich das nur technisch/logisch realisieren, wenn man jedem Drucker/Netzwerkdrucker einen Raspberrypi, inkl. NFC-Modul und Touchscreen vorschaltet, da ihr ja einen jeden beliebigen Drucker (unabhängig von Hersteller/Modell, usw.) einsetzen wollt. Die Raspberrypi fungieren dann als CUPS-Server und übernehmen gleichzeitig die Authentifizierung per NFC.
Wenn man sich auf Drucker beschränkt, die übers Netzwerk erreichbar sind (also einen eigenen Print-Server besitzen), reicht sogar ein CUPS-Server und für einen kostengünstigen NFC-Leser tun es vermutlich auch ein Microcontroller wie der ESP32 oder ESP2688, den man ins WLAN hängen kann. Je nach Anspruch an die Sicherheit kann man dann z.B. per nacktem UDP/TCP, MQTT oder einem HTTP(S) Request das Event an den Server weiterreichen. Gromlox schrieb: Das machst du ja jetz alles von Hand, ist es möglich das man das in ein Skriptum umwandelt? Da ich das mache ohne anfangs erfahrung zu besitzen ist es leider sehr schlecht bei mir!
Die Transferleistung die Abfolge einzelner Terminal-Befehle in ein Skript zu verwandeln (vgl. auch Shell/Bash-Skripting-Guide für Anfänger) ist nicht besonders groß - Shebang davor und dann die Befehle zeilenweise eintragen:
| #!/usr/bin/env bash
user="$1"
printer="$2"
jobs=($(lpstat -o "NullPrinter" | awk -v username="$user" '($2==username){print $1}'))
for job in "${jobs[@]}"
do
lpmove "$job" "$printer"
done
|
Und schon hat man ein Skript, dem man als erstes Argument den Benutzernamen und als zweites Argument den Namen des Druckers bzw. der Queue mitgeben kann, in die der Job verschoben werden soll. Jetzt müsste also das Programm, das den Token vom NFC-Reader liest nur die beiden Werte Nutzername und Zieldrucker ermitteln und die dem Skript (das man ausführbar machen sollte) als Argumente übergeben:
./move_printjobs_for_user NUTZERNAME DRUCKER
|
Bournless
Anmeldungsdatum: 4. Mai 2019
Beiträge: 915
|
seahawk1986 Wenn man sich auf Drucker beschränkt, die übers Netzwerk erreichbar sind (also einen eigenen Print-Server besitzen),
So wie den TE verstanden habe, will er aber eine generelle/allumfassende Lösung herbeiführenen. Ich verstehe zudem immer noch nicht, wie man ein simples NFC (nicht RFID!) Lesegerät im LAN einem Host, einer IP oder einem Dienst zuweisen könnte?
|
Gromlox
(Themenstarter)
Anmeldungsdatum: 8. Januar 2020
Beiträge: 25
|
seahawk1986 schrieb: Bournless schrieb: IMHO lässt sich das nur technisch/logisch realisieren, wenn man jedem Drucker/Netzwerkdrucker einen Raspberrypi, inkl. NFC-Modul und Touchscreen vorschaltet, da ihr ja einen jeden beliebigen Drucker (unabhängig von Hersteller/Modell, usw.) einsetzen wollt. Die Raspberrypi fungieren dann als CUPS-Server und übernehmen gleichzeitig die Authentifizierung per NFC.
Wenn man sich auf Drucker beschränkt, die übers Netzwerk erreichbar sind (also einen eigenen Print-Server besitzen), reicht sogar ein CUPS-Server und für einen kostengünstigen NFC-Leser tun es vermutlich auch ein Microcontroller wie der ESP32 oder ESP2688, den man ins WLAN hängen kann. Je nach Anspruch an die Sicherheit kann man dann z.B. per nacktem UDP/TCP, MQTT oder einem HTTP(S) Request das Event an den Server weiterreichen. Gromlox schrieb: Das machst du ja jetz alles von Hand, ist es möglich das man das in ein Skriptum umwandelt? Da ich das mache ohne anfangs erfahrung zu besitzen ist es leider sehr schlecht bei mir!
Die Transferleistung die Abfolge einzelner Terminal-Befehle in ein Skript zu verwandeln (vgl. auch Shell/Bash-Skripting-Guide für Anfänger) ist nicht besonders groß - Shebang davor und dann die Befehle zeilenweise eintragen:
| #!/usr/bin/env bash
user="$1"
printer="$2"
jobs=($(lpstat -o "NullPrinter" | awk -v username="$user" '($2==username){print $1}'))
for job in "${jobs[@]}"
do
lpmove "$job" "$printer"
done
|
Und schon hat man ein Skript, dem man als erstes Argument den Benutzernamen und als zweites Argument den Namen des Druckers bzw. der Queue mitgeben kann, in die der Job verschoben werden soll. Jetzt müsste also das Programm, das den Token vom NFC-Reader liest nur die beiden Werte Nutzername und Zieldrucker ermitteln und die dem Skript (das man ausführbar machen sollte) als Argumente übergeben:
./move_printjobs_for_user NUTZERNAME DRUCKER
Da ich relativ neu bin auf diesem Gebiet könntest du mir Tipps geben wie ich das jetz realisiere , das Script erstelle ich mit Nano wohin Speicher ich das dann ins backend? Und hast du eine Idee wie ich die User und Passwort Daten dann in mein Skript schicke und dies dann automatisch abgesendet wird weil das dann vollautomatisch währe ? Weil er müsste ja nur den Standort User und Passwort bekommen die der nfc Chip enthält ... leider hab ich gar kein Plan wie ich das jetz handlen soll... im Projekt is es wichtig einen Lernfortschritt zu haben und vlt würdest du mir mit Tipps weiterhelfen denn ich bin ziehmlich an verzweifeln mit dieser Geschichte ! Aber danke für das Script und noch einen schönen Abend ! Vielleicht hast du die Zeit und könntest mir das schildern ! Ich verbleibe mit freundlichen Grüßen Chris
|
_user013_
Anmeldungsdatum: 1. Januar 2020
Beiträge: 3
|
Hallo erstmal, Vielen Dank für eure großzügige Hilfe @seahawk1986 und @Bournless! Bournless schrieb: seahawk1986 Wenn man sich auf Drucker beschränkt, die übers Netzwerk erreichbar sind (also einen eigenen Print-Server besitzen),
So wie den TE verstanden habe, will er aber eine generelle/allumfassende Lösung herbeiführenen. Ich verstehe zudem immer noch nicht, wie man ein simples NFC (nicht RFID!) Lesegerät im LAN einem Host, einer IP oder einem Dienst zuweisen könnte?
Auf dem Raspberry ist ein ein RFID RC522 Modul an den GPIO Ports angeschlossen, für das Lesen und Schreiben gibt eis eine Read.py und Write.py Datei welche mit Python3 ausgeführt werden. Zudem befindet sich in unserem Netzwerk ein Bind9 DNS Server und der Raspberry PI besitzt eine statische IP-Adresse. Schönen Abend noch, Gruß!
|
Gromlox
(Themenstarter)
Anmeldungsdatum: 8. Januar 2020
Beiträge: 25
|
Hallo ich habe nun das mit Tea4Cups versucht und es klappt auch nur hat sich jetz ein echt nerviger fehler eingeschlichen -.- es funktioniert das beide Drucker den selben AUftrag erhalten und drucken, leider kommt es dann zu einem Loop da sie sich immer wieder den Auftrag schicken!
Das ist der verursacher:
prehook_firstprinter: /usr/bin/lp -d FirstPrinter -o raw $TEADATAFILE
prehook_secondprinter: /usr/bin/lp -d SecondPrinter -o raw $TEADATAFILE
Damit senden die Drucker sich gegenseitig den Auftrag!
Kann man das nur einmal ausführen lassen?
Normal sollte das doch irgendwie gehen aber ich komme einfach nicht dahinter Danke LG
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11237
Wohnort: München
|
Kannst du mal deine vollständige Konfiguration zeigen? An welche Queue/Drucker sendest du den Druckauftrag ursprünglich? Nach meinem Verständnis wäre es am sinnvollsten die prehooks für eine raw Virtual Queue zu definieren (vgl. https://wiki.debian.org/CUPSTea4CUPS#capturing), an die die Druckaufträge gesendet und von dort aus dann über die Hooks an die eigentlichen Drucker verteilt werden.
|
Gromlox
(Themenstarter)
Anmeldungsdatum: 8. Januar 2020
Beiträge: 25
|
seahawk1986 schrieb: Kannst du mal deine vollständige Konfiguration zeigen? An welche Queue/Drucker sendest du den Druckauftrag ursprünglich? Nach meinem Verständnis wäre es am sinnvollsten die prehooks für eine raw Virtual Queue zu definieren (vgl. https://wiki.debian.org/CUPSTea4CUPS#capturing), an die die Druckaufträge gesendet und von dort aus dann über die Hooks an die eigentlichen Drucker verteilt werden.
Konfig! <Printer HP_Laserjet_4050>
UUID urn:uuid:2068daa5-40ed-34be-6eba-e93b54abac70
Info HP 2 Drucker
Location Serverraum
MakeModel HP LaserJet 4050 Series Postscript (recommended)
DeviceURI socket://172.30.208.6:9100
State Idle
StateTime 1578568689
ConfigTime 1578565403
Type 8425668
Accepting Yes
Shared Yes
JobSheets none none
QuotaPeriod 0
PageLimit 0
KLimit 0
OpPolicy default
ErrorPolicy retry-job
Attribute marker-colors none
Attribute marker-levels 99
Attribute marker-names Toner Cartridge HP C4127X
Attribute marker-types toner
Attribute marker-change-time 1578568677
</Printer>
<Printer HP_LaserJet_4100>
UUID urn:uuid:d9052545-424b-3bc0-47d7-0ca110d02957
Info HP_LaserJet_4100
MakeModel HP LaserJet 4100 Series v.3010.107 Postscript (recommended)
DeviceURI tea4cups://hp:/net/HP_LaserJet_4100_Series?ip=172.30.208.5
State Idle
StateTime 1578568685
ConfigTime 1578402582
Type 8425668
Accepting Yes
Shared Yes
JobSheets none none
QuotaPeriod 0
PageLimit 0
KLimit 0
OpPolicy default
ErrorPolicy retry-job
</Printer> und Die Tea4Cuos Konfig das oben war die Printer Config von Cups # First we set all top-level directives in the [global] section
[global]
prehook_firstprinter: /usr/bin/lp -d HP_LaserJet_4100 -o raw $TEADATAFILE
prehook_secondprinter: /usr/bin/lp -d HP_Laserjet_4050 -o raw $TEADATAFILE Das ist das einzige was ich geändert habe, kannst du mir schildern wie ich prehooks für eine raw virtual quele definiere und wie ich die dann weiterleite (automatisch) Danke fpr deine schnelle antwort LG Bearbeitet von Cranvil: Bitte verwende in Zukunft Codeblöcke, um die Übersicht im Forum zu verbessern!
|