a much improved smbprint script.

Alfred Perlstein alfred at freebsd.org
Sat Dec 8 15:45:02 GMT 2001


We found that the smbprint script included in the samba distribution
is really broken.

The main problem is that smbprint doesn't always get every byte
from stdin for some reason probably due to the cli engine it uses
flushing stdin.

Most likely it can be fixed by having it check stdin for isatty or
something, but for now the attached replacement does the right thing
by using the -c command line option rather than stdin.  It also
allows one to set all kinds of other nifty bells and whistles
including:

  .) smb user to use.
  .) smb password to use.
  .) which smb config file to use.
  .) which IP to use
  .) debug flags

Enjoy and give me a shout out in the CVS log. :)
Peter Swain also worked on getting this in working order.

#!/bin/sh 

# This script is an input filter for printcap printing on a unix machine. It
# uses the smbclient program to print the file to the specified smb-based 
# server and service.
# For example you could have a printcap entry like this
#
# smb:lp=/dev/null:sd=/usr/spool/smb:sh:if=/usr/local/samba/smbprint
#
# which would create a unix printer called "smb" that will print via this 
# script. You will need to create the spool directory /usr/spool/smb with
# appropriate permissions and ownerships for your system.

# Set these to the server and service you wish to print to 
# In this example I have a WfWg PC called "lapland" that has a printer 
# exported called "printer" with no password.

#
# Script further altered by hamiltom at ecnz.co.nz (Michael Hamilton)
# so that the server, service, and password can be read from 
# a /usr/var/spool/lpd/PRINTNAME/.config file.
#
# Script further modified by Richard Sharpe to fix some things.
# Get rid of the -x on the first line, and add parameters
#
#    -t  now causes translate to be used when sending files
#
# In order for this to work the /etc/printcap entry must include an 
# accounting file (af=...):
#
#   cdcolour:\
#	:cm=CD IBM Colorjet on 6th:\
#	:sd=/var/spool/lpd/cdcolour:\
#	:af=/var/spool/lpd/cdcolour/acct:\
#	:if=/usr/local/etc/smbprint:\
#	:mx=0:\
#	:lp=/dev/null:
#
# The /usr/var/spool/lpd/PRINTNAME/.config file should contain:
#   server=PC_SERVER
#   service=PR_SHARENAME
#   password="password"
#
# E.g.
#   server=PAULS_PC
#   service=CJET_371
#   password=""

smbclient=/usr/pkg/bin/smbclient

#
# The last parameter to the filter is the accounting file name.
#   Extract the directory name from the file name.
#   Concat this with /.config to get the config file.
#
TRANS=0
eval acct_file=\${$#}
spool_dir=`dirname $acct_file` 
config_file=$spool_dir/.config

# Should read the following variables set in the config file:
#   server
#   service
#   password
#   username (optional)
#   IP (optional)
#   debug (optional)
#   debugsmb (optional)
#   debugfile (optional)
. $config_file

if [ "x$password" = "x"] ; then
	password="-N"
fi

if [ "x$username" == "x" ] ; then
	username="$server";
fi


while getopts t c; do
	case $c in
	t)
		TRANS=1
		;;

	'?')  # Bad parameters, ignore it ...
		;;
	esac
done

command="print - ;"
if [ $TRANS -eq 1 ]; then
	command="translate;$command";
fi

debugfile="/tmp/smb-print.log"
if [ "x$debug" = "x" -o $debug -eq 0 ] ; then
	debugfile=/dev/null debugargs=
else
	set -x; exec >>$debugfile 2>&1
	debugargs="$debugfile."
	#[ "x$debugsmb" == "x" ] || debugargs="$debugargs -d $debugsmb"
fi

$smbclient \
	"\\\\$server\\$service" \
	$password \
	${smbconf:+-s} $smbconf \
	${IP:+-I} $IP \
	${debugargs:+-l} $debugargs \
	-U $username \
	-P \
	-c "$command"

----- End forwarded message -----

-- 
-Alfred Perlstein [alfred at freebsd.org]
'Instead of asking why a piece of software is using "1970s technology,"
 start asking why software is ignoring 30 years of accumulated wisdom.'
                           http://www.morons.org/rants/gpl-harmful.php3




More information about the samba-technical mailing list