r23689: Squashed commit of the following:
[ira/wip.git] / examples / printing / smbprint
index 5a00a2a8aa870c4966092eca080dca3726463b70..3d4b53f850a6580d58affae6bda0d3b5840762c3 100755 (executable)
@@ -1,4 +1,4 @@
-#!/bin/sh 
+#!/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 
 #
 #    -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=...):
 #
 #   service=CJET_371
 #   password=""
 
-#
-# Debugging log file, change to /dev/null if you like.
-#
-logfile=/tmp/smb-print.log
-# logfile=/dev/null
+#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.
@@ -67,29 +70,107 @@ config_file=$spool_dir/.config
 #   server
 #   service
 #   password
-eval `cat $config_file`
+#   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
-       ;;
+while test $# -gt 0; do
+       case "$1" in
+       -t)
+               TRANS=1
+               ;;
 
-    '?')  # Bad parameters, ignore it ...
-       ;;
-  esac
+        *)   # 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
+
+touch $debugfile
+if [ -h $debugfile ]; then
+       echo "$debugful is a symlink.  Turning off debugging!"
+       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"
 #
-# Some debugging help, change the >> to > if you want to same space.
-#
-echo "server $server, service $service" >> $logfile
-
-(
-# NOTE You may wish to add the line `echo translate' if you want automatic
-# CR/LF translation when printing.
-       if [ $TRANS -eq 1 ]; then
-          echo translate
-        fi
-       echo "print -"
-       cat
-) | /usr/local/samba/bin/smbclient "\\\\$server\\$service" $password -U $server -N -P >> $logfile