summaryrefslogtreecommitdiff
path: root/examples/printing/smbprint
blob: e2bbdc2f16ee975a8181a899595885e630a55ec1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#!/bin/bash

# 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@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
#
# Further modifications by Alfred Perlstein to fix some problems and
# improve the quality of the code (3-Dec-2001).
#
# More hacking by Richard Sharpe to improve portability. 9-Dec-2001.
#
# 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
# Assume that smbclient will be in the same place as smbprint

smbclient="`dirname $0`/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 test $# -gt 0; do
	case "$1" in
	-t)
		TRANS=1
		;;

	 *)   # Bad Parameters, ignore them ...
		;;
	 esac
	 shift
done

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

##
## Some security checks on the logfile if we are using it
##
## make the directory containing the logfile is necessary 
## and set the permissions to be rwx for owner only
##

debugfile="/tmp/smb-print/logfile"
logdir=`dirname $debugfile`
if [ ! -d $logdir ]; then 
	mkdir -m 0700 $logdir
fi

##
## check ownership.  If I don't own it refuse to 
## create the logfile
##
if [ ! -O $logdir ]; then
	echo "user running script does not own $logdir. Ignoring any debug options."
	debug=""
fi

##
## We should be safe at this point to create the log file
## without fear of a symlink attack -- move on to more script work.
##

if [ "x$debug" = "x" ] ; then 
		debugfile=/dev/null debugargs=
else
        if [ $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
fi

if [ "x$smbconf" != "x" ]; then

	smbconf="-s $smbconf"

fi

if [ "x$IP" != "x" ]; then

	IP="-I $IP"

fi

if [ "x$debugargs" != "x" ]; then

	debugargs="-l $debugargs"

fi

$smbclient \
	"\\\\$server\\$service" \
	$password \
	$smbconf \
	$IP \
	$debugargs \
	-U $username \
	-c "$command"
#