xref: /plan9/sys/lib/lp/daemon/generic (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
13e12c5d1SDavid du Colombier#!/bin/rc
2219b2ee8SDavid du Colombierrfork s
3219b2ee8SDavid du Colombier
4219b2ee8SDavid du Colombierif (! ~ $DEBUG '') flag x +
53e12c5d1SDavid du Colombier
63e12c5d1SDavid du ColombierLPDELAY=60
73e12c5d1SDavid du Colombier
83e12c5d1SDavid du Colombierif (! ~ $#* 2 && ! ~ $#* 3) {
93e12c5d1SDavid du Colombier	echo 'usage generic local_cmd _remote_cmd [ success_cmd ]' >[1=2]
103e12c5d1SDavid du Colombier	exit 'argument count'
113e12c5d1SDavid du Colombier}
123e12c5d1SDavid du ColombierLOCAL_CMD=$1
133e12c5d1SDavid du ColombierREMOTE_CMD=$2
143e12c5d1SDavid du ColombierSUCCESS_CMD=$3
153e12c5d1SDavid du Colombier
16219b2ee8SDavid du Colombier# we don't want to make a LOCK file unless we are at the destination
17219b2ee8SDavid du Colombier# let the spooler take care of moving it there
18219b2ee8SDavid du Colombier# this is necessary for clients and servers that share the
19219b2ee8SDavid du Colombier# same name space
20219b2ee8SDavid du Colombierif (! ~ $THIS_HOST $DEST_HOST || ! LOCK $LPSPOOL/$LPDEST/LOCK $sysname $pid) exit ''
213e12c5d1SDavid du Colombier
223e12c5d1SDavid du Colombiercd $LPSPOOL
233e12c5d1SDavid du Colombier
243e12c5d1SDavid du ColombierMAXTRY=2
25219b2ee8SDavid du ColombierPRINTLOG=$LPLOGDIR/$LPDEST^.st
263e12c5d1SDavid du Colombier
27219b2ee8SDavid du Colombierfn schedule{
28219b2ee8SDavid du Colombier	FILE=`{
29219b2ee8SDavid du Colombier		@{
30219b2ee8SDavid du Colombier			rfork n
31219b2ee8SDavid du Colombier			bind -b $LPLIB/sched /bin
32219b2ee8SDavid du Colombier			$SCHED $LPDEST
33219b2ee8SDavid du Colombier		}
34219b2ee8SDavid du Colombier	}
35219b2ee8SDavid du Colombier}
36219b2ee8SDavid du Colombier
37219b2ee8SDavid du Colombierwhile (schedule; ! ~ $#FILE 0) {
383e12c5d1SDavid du Colombier	SCHEDLINE=`{cat $LPDEST/$FILE(1)^id}
393e12c5d1SDavid du Colombier	LSLINE=`{ls -l $LPDEST/$FILE(1)}
40*9a747e4fSDavid du Colombier	if (! test -s $LPDEST/.seqno) {
41*9a747e4fSDavid du Colombier		echo 0 > $LPDEST/.seqno
42*9a747e4fSDavid du Colombier	}
43*9a747e4fSDavid du Colombier	if not {
44*9a747e4fSDavid du Colombier		LPSEQNO = `{cat $LPDEST/.seqno | awk '{seqno = $1 + 1; if (seqno > 999) seqno = 0; print seqno}'}
45*9a747e4fSDavid du Colombier		echo $LPSEQNO > $LPDEST/.seqno
46*9a747e4fSDavid du Colombier	}
47219b2ee8SDavid du Colombier	STARTIME=`{date}
48219b2ee8SDavid du Colombier	if (! test -s $LPDEST/$FILE(1)) {
49219b2ee8SDavid du Colombier		echo $SCHEDLINE(2)$SCHEDLINE(4)'	'$SCHEDLINE(3)	$SCHEDLINE(5)' ! '$LSLINE(6) $STARTIME(4) >> $LPLOG
50219b2ee8SDavid du Colombier		rm -f $LPDEST/$FILE $LPDEST/$FILE^id
51219b2ee8SDavid du Colombier	}
52219b2ee8SDavid du Colombier	if not {
533e12c5d1SDavid du Colombier		if (~ $THIS_HOST $DEST_HOST) {
543e12c5d1SDavid du Colombier			if (test -f $LPLIB/perm/$LPDEST && grep -s $SCHEDLINE(2) $LPLIB/perm/$LPDEST) {
553e12c5d1SDavid du Colombier				echo you are not allowed to use printer $LPDEST | mail $SCHEDLINE(2)
563e12c5d1SDavid du Colombier				rm -f $LPDEST/$FILE(1) $LPDEST/$FILE(1)^id
573e12c5d1SDavid du Colombier			}
583e12c5d1SDavid du Colombier			if not {
593e12c5d1SDavid du Colombier				> $PRINTLOG
603e12c5d1SDavid du Colombier				STARTIME=`{date}
613e12c5d1SDavid du Colombier				eval $LOCAL_CMD
623e12c5d1SDavid du Colombier				rv=$status
633e12c5d1SDavid du Colombier				ENDTIME=`{date}
64219b2ee8SDavid du Colombier				status=$rv
65219b2ee8SDavid du Colombier				if () {
663e12c5d1SDavid du Colombier					echo $SCHEDLINE(1)^$SCHEDLINE(3)'	'$SCHEDLINE(2)'	'$SCHEDLINE(4)' + '$LSLINE(6)' '$STARTIME(4)' '$ENDTIME(4)
673e12c5d1SDavid du Colombier					eval $SUCCESS_CMD
683e12c5d1SDavid du Colombier					rm -f $LPDEST/$FILE(1) $LPDEST/$FILE(1)^id
693e12c5d1SDavid du Colombier				}
703e12c5d1SDavid du Colombier				if not {
71219b2ee8SDavid du Colombier					echo $SCHEDLINE(1)^$SCHEDLINE(3)'	'$SCHEDLINE(2)'	'$SCHEDLINE(4)' - '$LSLINE(6)' '$STARTIME(4)' '$ENDTIME(4)' status='$rv
72219b2ee8SDavid du Colombier					THISTRY=`{echo $SCHEDLINE(4) + 1|hoc}
733e12c5d1SDavid du Colombier					echo $SCHEDLINE(1) $SCHEDLINE(2) $SCHEDLINE(3) $THISTRY >$LPDEST/$FILE(1)^id
743e12c5d1SDavid du Colombier					if (test $THISTRY -ge $MAXTRY) {
753e12c5d1SDavid du Colombier						if (test -d $LPLIB/prob/$LPDEST) {
763e12c5d1SDavid du Colombier							cp $LPDEST/$FILE(1) $LPLIB/prob/$LPDEST
773e12c5d1SDavid du Colombier							cp $LPDEST/$FILE(1)^id $LPLIB/prob/$LPDEST
783e12c5d1SDavid du Colombier							cp $PRINTLOG $LPLIB/prob/$LPDEST/$FILE(1)^log
793e12c5d1SDavid du Colombier						}
803e12c5d1SDavid du Colombier						upasname=daemon
813e12c5d1SDavid du Colombier						mail $SCHEDLINE(2) <<endmail1
823e12c5d1SDavid du Colombier						rm -f $LPDEST/$FILE(1) $LPDEST/$FILE(1)^id
833e12c5d1SDavid du Colombier					}
843e12c5d1SDavid du Colombier					if not {
853e12c5d1SDavid du Colombier						touch $LPDEST/$FILE(1)
863e12c5d1SDavid du Colombier						sleep $LPDELAY
873e12c5d1SDavid du Colombier					}
883e12c5d1SDavid du Colombier				}
893e12c5d1SDavid du Colombier			}
903e12c5d1SDavid du Colombier		}
913e12c5d1SDavid du Colombier		if not {
92219b2ee8SDavid du Colombier# we don't want to be here
933e12c5d1SDavid du Colombier#			trap '' 13	# temp hack: ignore SIGPIPE
943e12c5d1SDavid du Colombier			STARTIME=`{date}
953e12c5d1SDavid du Colombier			eval $REMOTE_CMD 
963e12c5d1SDavid du Colombier			rv=$status
973e12c5d1SDavid du Colombier			ENDTIME=`{date}
98219b2ee8SDavid du Colombier			if (~ $rv '') {
993e12c5d1SDavid du Colombier				echo $SCHEDLINE(1)^$SCHEDLINE(3)'	'$SCHEDLINE(2)'	'$SCHEDLINE(4)' + '$LSLINE(6)' '$STARTIME(4)' '$ENDTIME(4)
1003e12c5d1SDavid du Colombier				rm -f $LPDEST/$FILE(1) $LPDEST/$FILE(1)^id
1013e12c5d1SDavid du Colombier			}
1023e12c5d1SDavid du Colombier			if not {
1033e12c5d1SDavid du Colombier				echo $SCHEDLINE(1)^$SCHEDLINE(3)'	'$SCHEDLINE(2)'	'$SCHEDLINE(4)' - '$LSLINE(6)' '$STARTIME(4)' '$ENDTIME(4)
1043e12c5d1SDavid du Colombier				echo status $rv from '$REMOTE_CMD'
1053e12c5d1SDavid du Colombier				THISTRY=`{echo $SCHEDLINE(4) + 1|hoc}
1063e12c5d1SDavid du Colombier				echo $SCHEDLINE(1) $SCHEDLINE(2) $SCHEDLINE(3) $THISTRY >$LPDEST/$FILE(1)^id
1073e12c5d1SDavid du Colombier				if (~ $THISTRY $MAXTRY) {
1083e12c5d1SDavid du Colombier					upasname=daemon
1093e12c5d1SDavid du Colombier					mail $SCHEDLINE(2) <<endmail2
1103e12c5d1SDavid du Colombier				}
1113e12c5d1SDavid du Colombier				if not {
1123e12c5d1SDavid du Colombier					touch $LPDEST/$FILE(1)
1133e12c5d1SDavid du Colombier					sleep $LPDELAY
1143e12c5d1SDavid du Colombier
1153e12c5d1SDavid du Colombier				# this is here to deal with running out of
1163e12c5d1SDavid du Colombier				# Datakit channels or other stupid problems
1173e12c5d1SDavid du Colombier				# backoff connection attempts but not too long
1183e12c5d1SDavid du Colombier					LPDELAY=`{echo $LPDELAY '*' 2|hoc}
1193e12c5d1SDavid du Colombier					if (test $LPDELAY -gt 960)
1203e12c5d1SDavid du Colombier						LPDELAY=60
1213e12c5d1SDavid du Colombier				}
1223e12c5d1SDavid du Colombier			}
1233e12c5d1SDavid du Colombier		}
1243e12c5d1SDavid du Colombier	}
125219b2ee8SDavid du Colombier}
1263e12c5d1SDavid du ColombierYour job has failed to print on $LPDEST after $MAXTRY attempt(s).
1273e12c5d1SDavid du ColombierIf the directory $LPLIB/prob/$LPDEST exists on $DEST_HOST,
1283e12c5d1SDavid du Colombierthe file has been put there along with the printer log file.
1293e12c5d1SDavid du Colombier			Your friendly printer daemon
1303e12c5d1SDavid du Colombierendmail1
1313e12c5d1SDavid du ColombierYour job has failed to print on $LPDEST after $MAXTRY attempt(s).
1323e12c5d1SDavid du ColombierThere is a problem in sending the job to $DEST_HOST,
1333e12c5d1SDavid du Colombierbut I'll keep trying.  Have a nice day.
1343e12c5d1SDavid du Colombier			Your enthusiastic printer daemon
1353e12c5d1SDavid du Colombierendmail2
1363e12c5d1SDavid du ColombierUNLOCK $LPSPOOL/$LPDEST
1373e12c5d1SDavid du Colombierrm $LPSPOOL/$LPDEST >[2]/dev/null
138