PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : In Datei drucken, dann zum richtigen Drucker



werkzeugprofi
05.01.07, 18:00
Hallo Zusammen,

zunächst Euch allen ein gutes, gesundes und frohes neues Jahr.

Bei uns läuft Suse Linux 2.6.12 - 64 mit Samba 3.0.3.1.

Nun habe ich folgendes vor:
Wir benutzen auf den Clients eine altes DOS Anwendung, die leider nur LPT1-3 kennt. Wir haben aber die Möglichkeit, aus dieser Anwendung heraus direkt eine Duckdatei zu erzeugen. Die Druckerformatierung wird, wie früher üblich, von der DOS Anwendung vorgenommen, d.h. diese Datei könnte ich mit copy auf den passenden Drucker senden und er würde sie ordentlich ausdrucken.

Dieses Feature würde mein Problem lösen, wenn ich wüsste, wie ich Linux dazu bewege, aus einem bestimmten Verzeichnis alles, was da ankommt, direkt auf einen ganz bestimmten Netzwerkdrucker zu spoolen.
Ein Problem ist, dass ich bei mehreren, hintereinanderfolgenden Druckjobs keine Möglichkeit habe, den Dateinamen differenziert zu vergeben, d.h. das Abfragen und ggf. Abholen sowie Löschen einer evtl. vorh. Datei muss sehr schnell gehen.

Zur Zeit arbeiten wir unter Samba mit Cups, aber das kann man ja bekanntlich umstellen.

Kennt hier vielleicht jemand eine Möglichkeit, einen solchen Pseudospooler zu realisieren.

Gruss

Rainer

BedriddenTech
05.01.07, 19:07
Ich fürchte, du wirst um etwas Programmierarbeit nicht herumkommen. Im Prinzip willst du das Ereignis "Datei geschrieben" abfangen, und das ist ein Kernel-Ereignis, das du Abfangen kannst - aber eben als Programmierer.

Ein kleines Perlscript könnte z.B. dieses CPAN-Modul hier nutzen: http://search.cpan.org/~mlehmann/Linux-Inotify2-1.1/

gadget
05.01.07, 21:18
Ich hatte in meinem Studenten-Job auch mal diese Situation: Ein altes DOS-Programm, das nur LPT ansprechen konnte. Wir hatten damals ein Utility namens dos-spooler oder so ähnlich, kann mich aber nicht mehr genau erinnern.

Vielleicht kannst Du so ein Tool ergooglen, ich bin auf die Schnelle mal hierher (http://forum.tecchannel.de/forum/showthread.php?t=1922) gelangt, von dort wird auf ein Shareware-Tool Dosprn verlinkt.

Hast Du es schon mit einer net use // Freigabe versucht?

sirmoloch
05.01.07, 21:32
Inotify wäre elegant, aber es geht auch einfach. ;)

Ein Cronjob, der einmal pro Minute auf der Linux-Box aufgerufen wird, mit folgendem Inhalt:


#!/bin/sh
export SPOOLDIR="/mein/pfad"
export PRINTER="meine-warteschlange"

for i in $SPOOLDIR/*
do
a2ps $i
rm $i
done

Als "Druckprogramm" könntest du natürlich auch nur lpr oder was auch immer benutzern. So werden aber auf jeden Fall alle deine Jobs abgearbeitet.

werkzeugprofi
06.01.07, 11:47
Hallo Zusammen,

vielen Dank für Eure Hilfe!!!

@gadget
Das Proggi habe ich mal installiert, läuft wirklich nicht schlecht. Nur leider kann ich nicht unterschiedliche Files unterschiedlichen Queues zuordnen, jedenfalls nicht automatisch. Trotzdem, eine LPT habe ich jetzt schon mal mehr ;-)

Hast Du es schon mit einer net use // Freigabe versucht?
Ja, es gibt sogar von MS einen Artikel, indem beschrieben wird, wie man in der REG Schlüssel für bis zu 9 LPT´s anlegt. Nur leider funktioniert das nur ordentlich mit den DOS Befehlen (copy etc.), Programme machen da nicht mit, und das ist sogar dokumentiert:mad:

BTW: Bei mir war´s CPM auf einem Z80:)

@BedriddenTech + sirmoloch
Der Cron-Job ist keine schlechte Lösung, ich befürchte nur, dass ich mir auf dem Server einen Haufen CPU-Last einfange, wenn der alle 5 Sekunden diverse Spoolverzeichnisse abklappern soll.
Der Kernelevent wäre natürlich eine grandiose Lösung, nur, dann müsste ich im Grunde genommen einen kompletten Spooler nachprogrammieren, zumindest wenn ich abhängig vom Verzeichnis eine Queue adressieren will.

Ich stelle mir den jetztigen Ablauf so vor (bitte berichtigen, wenn ich falsch liege):
Unter Samba sind die Queues, sprich Verzeichnisse, freigegeben. Wenn jetzt auf einer Queue ein Job eintrifft, wird von Samba der Kernel Event Inotify angeschubst. Dieser wiederum veranlasst das Drucksystem aktiv zu werden und im zugeordneten Pfad nach einer Datei zu suchen. Diese wird dann vom Printer Daemon an den Drucker gesendet, evtl. unter Verwendung div. Filter.

Wenn ich mit dieser Betrachtungsweise richtig liege, dann hätte ich doch theoretisch zwei Möglichkeiten, CUPS etc. zu nutzen:
1. Ich schaffe es bei Erstellung der Datei diesen Kernel Event auszulösen, aber wie, wenn die Datei extern (Client) erstellt wird.
2. Ich versuche, das Spoolsystem von Samba zu überlisten. Es gibt da den PDF Printer, eigentlich macht der doch genau das, was ich will, nur er erzeugt halt pdf Files.
Hier ein Auszug aus meiner smb.conf:


#-----------------------------------------------------------------------------#

[pdf]

#-----------------------------------------------------------------------------#

#----- Welches Drucksystem wird verwendet
#----- Standard: printing = einkompiliert (Haengt vom System ab)
#----- Umschaltung von Cups auf BSD wegen print command = (laeuft nicht unter cups)
printing = bsd

#----- Kommentar zur Freigabe
#----- Standard: comment =
comment = PDF Datei erzeugen

#----- Zuweisung des Unix-Verzeichnisses zur Freigabe
#----- Standard: Path = /var/tmp
path = /mnt/samba/public/temp/spool

#----- Auszufuehrender Befehl beim Drucken
#----- Standard: print command = lp -r -P%p %s
print command = /usr/bin/smbprngenpdf -p /mnt/samba/public/temp/spool -d 10 -k -s %s -J '%J_%u' -c %c -u %u -z %z

#----- Freigabe fuer Drucker
#----- Standard: printable = no
printable = Yes

#----- Verfuegbarkeit der Freigabe
#----- Standard: available = yes
available = Yes

#----- Zugriffsrechte fuer neu erstellte Dateien
#----- Standard: create mask = 0744
create mask = 0777

#----- Freigabe fuer Gaeste, Synonym: public = yes
#----- Standard: guest ok = no
guest ok = yes

#-----------------------------------------------------------------------------#


Könnte man nicht hier eine andere Druckfunktion einsetzen, z. B. LPD oder a2ps?
Aber auch hier bleibt das Problem offen, wie kommt der Job in die Queue, oder noch besser, wie kriegt die Queue mit, dass da in ihrem Verzeichnis ein File angekommen ist?

Kennt nicht jemand sowas schon fertig (und damit meine ich nicht den Spooler von Samba ;))

Gruss

Rainer

BedriddenTech
07.01.07, 14:16
Hallo,

mit Inotify würdest du keinen Spooler nachbauen. Die Vorgehensweise ist in etwa folgendermaßen:

Du lädst das Inotify-Modul,
du registrierst beim Modul eine Routine, die beim Ereignis "Datei geschrieben" aufgerufen wird,
in der Routine schnappst du dir den Dateinamen und rufst ein Programm, z.B. a2ps auf, das den Druck übernimmt, und löschst die Datei dann,
im Hauptteil des Programms steht etwas à la "while(1) { ... }", damit das Skript aktiv bleibt.


Fertig. Das Ereignis "Datei geschrieben" löst der Kernel aus, das Modul fängt's ab und gibt es an deine Routine weiter. Minimaler aufwand für dich eigentlich.

marce
07.01.07, 15:09
Du könntest das auch einfach über eine named-Pipe lösen...

werkzeugprofi
07.01.07, 22:27
Hallo Zusammen,

aus der Qualität der bisherigen Antworten schliesse ich auf die hier versammelte Kompetenz,... und ich bin begeistert :) DANKE!!!

@BedriddenTech

Minimaler aufwand für dich eigentlich.
Danke für die Blumen, aber Du überschätzt da bei weitem meine Fähigkeiten. Wäre das Pascal oder Basic oder ein DOS - Script (früher nannten wir das Batch-Job ;-) ), dann ja, aber unter Linux und dann auch noch in Perl, ich glaube, ich würde Lichtjahre brauchen, mindestens...
Bin doch froh, dass meine Linux-Server das tuen, was ich von denen will (meistens).

@marce
Danke für den Tip.

So wie ich das mit den Named-Pipes verstehe, würde es funktionieren, wenn ich die Datei auf einer Linux Maschine erzeugen würde. Dann könnte ich sie in die Pipe leiten (z.B. mit | oder so) und anschliessend drucken lassen. Aber wenn die auf einem Client unter WINxxx erzeugt und via Samba eingeliefert wird, wie adressiere ich dann die Pipe oder den Event dazu?

Gruss

Rainer

marce
07.01.07, 22:38
was geht: Du kannst die Pipe auf einer Unix-Maschine erzeugen und dann recht einfach vom DOS aus in die schreiben, wie in eine Datei (Adressierungssyntax ist "ähnlich" wie Samba) - bemühe mal Google mit "named pipe dos" - da sind ein paar recht gute Links, auch aus der MS-Knowledgebase. Und was als Server hinten dran hängt ist eigentlich egal...

Habe das mal verwendet, um einen PDF-Server für div. OS-Clients zu erzeugen: Druckertreiber schreibt in Named-Pipe, am Ende derer wartet ein Ghostscript und macht PDFs die über einen Apache abeholt werden...

BedriddenTech
08.01.07, 19:04
Wenn du's über named pipes löst, würdest du dann bitte die Lösung präsentieren?

werkzeugprofi
10.01.07, 16:40
@marce
Danke für die Erläuterung. Habe mich ´mal in named pipes ein bisschen eingelesen, das könnte funktionieren. Sobald ich etwas mehr Zeit habe, wird das getestet.

BTW: Wenn ich mit mkfifo eine Pipe auf einem Samba Share erzeugt habe, kann ich dann unter Samba ganz normal eine Datei mit diesem Namen auf diese Pipe kopieren und die würde dann dort gespeichert, bis sie abgerufen wird?

@BedriddenTech
Werd ich machen.

Gruss

Rainer

marce
10.01.07, 17:21
Sorry, dass ich solange nicht geantwortet habe - der Thread ging irgendwie noch an mir vorbei.

Konkrete Anleitung und Code kann ich leider nicht liefern - der liegt im CVS der alten Firma und bei mir zuhause ist leider davon nichts aufzufinden, müsste also das Projekt von vorne an aufzäumen...

Blade
14.01.07, 12:04
So ein Problem erledige ich am Client direkt. Nutze den MS - net use - Befehl. Öffne ein DOS-Fenster und gib ein:

net use lpt3 \\Server\laser /yes

Server und laser musst Du natürlich Deinem System anpassen. Der laser-Drucker ist per SAMBA-Server frei gegeben. Ab sofort hast Du eine LPT3-Schnittstelle auf der MS-Kiste, gut genug für das DOS-Programm. Du kannst das Ganze in eine Batch schreiben und diese beim Windows-Start ausführen lassen. So wird Dir LPT3 immer parat sein.

werkzeugprofi
14.01.07, 12:38
Hallo Blade,

danke für den Vorschlag.
Aber wie ich weiter oben schon beschrieben habe, geht es hier um LPT > 3.

Gruss

Rainer

Blade
14.01.07, 13:14
Habe ich nirgendwo gelesen, dass Du einen LPT größer 3 benötigst, warum eigentlich ... ist mir unverständlich.

werkzeugprofi
14.01.07, 15:19
Hallo Blade,


Habe ich nirgendwo gelesen, dass Du einen LPT größer 3 benötigst,

Siehe Post vom 06/01/07

Ja, es gibt sogar von MS einen Artikel, indem beschrieben wird, wie man in der REG Schlüssel für bis zu 9 LPT´s anlegt. Nur leider funktioniert das nur ordentlich mit den DOS Befehlen (copy etc.), Programme machen da nicht mit, und das ist sogar dokumentiert


warum eigentlich ... ist mir unverständlich.
Weil wir aus besagter DOS Anwendung div. Formulare auf versch. Druckern ausgeben müssen, z.B. Lieferscheine, Rechnungen, Packzettel, Wareneingangsbelege, Etiketten und was eine Warenwirtschaft sonst noch so ausspuckt.

Gruss

Rainer

Blade
14.01.07, 16:25
Danke für die Erklärung mit den vielen benötigten Schnittstellen. :ugly: ... Dein Posting vom "Siehe Post vom 06/01/07" hatte ich schon gelesen, da stand das aber nicht so explizit drin, dass Du mehr als 3 LPTs BRAUCHST und im 1. Posting ging es um 1 bis 3. Egal, hast Du denn den net use - Befehl eigentlich mal getestet? Da brauchst Du nichts in der Registry rumfummeln.

http://support.microsoft.com/kb/314499

werkzeugprofi
14.01.07, 16:45
Hallo Blade,

natürlich benutzen wir NET USE, schon seit Jahren (früher unter NW 3.11 war das CAPTURE). Z. Zt. stellen mit manuell per BATCH JOB auf eine andere Queue um. Natürlich wird das auch ab und an vergessen und dann rennt wieder jemand durch´s Haus seinen Lieferschein suchen oder ein Packzettel wird rausgefaxt usw.
Leider funktioniert seit W2K/XP das mit den 9 LPT nicht mehr (s.o.) und so suche ich eine Alternative.

Gruss

Rainer

werkzeugprofi
01.05.07, 09:17
Hallo Zusammen,

nur mal zur Info, das Problem ist gelöst!

Es gibt da das Perl-Script "iwatch" von Cahya Wirawan, stand im Linuxmagazin vom 03/2007. Es benutzt die Inotify-Schnittstelle des Kernels, daher auch erst ab Kernel 2.6.13 zu benutzen.

Das funktioniert super gut :D

Gruss

Rainer