linux-l: Deskjet am Netz (Loesungsvorschlag)

Andreas Fitzner fitzner at informatik.hu-berlin.de
Mo Jun 1 13:10:14 CEST 1998


So was Aehnliches was Joachim als zweite Lsgvariante
vorgeschlagen hat.

Das Problem ist doch erst die PS daten in PCL 
umzuwandeln und dann das zeug via jetdirect zu versenden.

Moegliche Loesung bei Verwendung von lpr, ..
 1.) an einen Filter schicken
 2.) Gefiltertes an ip schicken


Genaueres:

Die User drucken auf 'dsk'. Also erst nach pcl wandeln.
------ Eintrag in /etc/printcap ---------------
dsk:\
   :lp=/dev/null:\
   :sd=/usr/spool/lp1:\
   :af=/var/log/lpd-acc:\
   :lf=/var/log/lpd-err:\
   :if=/usr/local/bin/tex/dsk_filter:\
   :sh: 
---------------------------------------------
'dsk' ist also an /dev/null angeschlossen :->
aber vorher kommen die Daten in meinen Filter.

So wird der job durch meinen filter 'dsk_filter' geschickt.
das ist ein Perlscript von mir, das erkennt ob PS oder PCL 
kommt.

------------- dsk_filter --------------------
#! /usr/bin/perl

$LOG=">>/tmp/dsk_filter.log";
$tmp_file="/var/spool/hm";    # also hier muss man sich was bauen,
			      # damit man immer dynamisch ein
			      # eineindeutigen Namen erzeugt. damit
			      # das script auch parallel laufen kann.

################################################################################
open(LOG,$LOG) || die;

w2log("anfang ", join("/", at ARGV));
w2log("writing to $tmp_file");

$a=<>;
if ($a =~ /^%[%!]/) {
	# ist eps /^%!/ oder fast eps /^%%/
	print LOG "e?ps !?\n";

	open(GS,"| gs -dNOPAUSE -q -sDEVICE=djet500 -sOutputFile=$tmp_file -") || die;
	  print GS $a;
	  while (<>) { print GS $_; }
	close(GS); 

} elsif ($a =~ /^\033E\033/) {
	# HP PCL ist \033 E \033 (siehe /etc/magic)
	# und durchgefuehrte eigene Versuche
	# 033 ist 27 dec = esc
  print LOG "PCL !?\n";
   open(TMP,">$tmp_file") || die;
	  print TMP $a;
	  while (<>) { print TMP; }
   close(TMP);

} else {
   	# Es Koennte jetzt auch noch non-eps ps sein
   	# oder ascii text ?
   	# 
   	# ich weiss nicht so recht, was mach ich damit?
   	# am besten ich veraendere erst mal nix
  print LOG "unrecognized format, I don't change it\n";
   open(TMP,">$tmp_file") || die;
	  print TMP $a;
	  while (<>) { print TMP; }
   close(TMP);
}

# ok jetzt hab ich das umgewandelte in $tmp_file
# jetzt schick ich es auf "dsk_remote" ab 
w2log("starting new printjob");
	system("lpr -Pdsk_remote $tmp_file");
w2log("ende");

################################################################################

sub w2log { # write 2 log
 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)
           =localtime(time);

 if ($sec<10) { $sec="0$sec"; } 
 if ($min<10) { $min="0$min"; } 
 if ($hour<10) { $houre="0$hour"; } 
 $mon++;
 print LOG "$hour:$min:$sec $mday-$mon-$year: ", @_, "\n";
}    

close(LOG);
-----------------------------------

so und jetzt muss natuerlich in der printcap sowas wie
-------- Eintrag in /etc/printcap ---------------
dsk_remote:\
     :sd=/var/spool/lpd/dsk_remote:\
     :mx#0:\
     :rm=192.168.1.9:\
     :rp=dsk_remote:    
# also die ip-adress ... ist klar
# und dsk_remote koennte/(sollte?) der dns 
# name vom drucker sein
-------------------------------------------------

Also zusammenfassend
 die User drucken auf 'dsk' der an /dev/null angeschlossen ist :->
 mein Druckerfilter ist aber zwischen dsk -> /dev/null und
 schickt die veraenderten (oder wenn schon PCL, dann nicht
 veraenderten) Daten an den Drucker 'dsk_remote'
 'dsk' und 'dsk_remote' muessen natuerlich mit
 spooldir's und allen ans jeweilige system angepasst werden.


bye, Andreas
Ich bitte die sicherlich zahlreich vorhandenen Rechtschreibfehler respective
Tippfehler zu ignorieren :->




Mehr Informationen über die Mailingliste linux-l