Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#!/bin/rc
rfork s

if (! ~ $DEBUG '') flag x +

LPDELAY=60

if (! ~ $#* 2 && ! ~ $#* 3) {
        echo 'usage generic local_cmd _remote_cmd [ success_cmd ]' >[1=2]
        exit 'argument count'
}
LOCAL_CMD=$1
REMOTE_CMD=$2
SUCCESS_CMD=$3

# we don't want to make a LOCK file unless we are at the destination
# let the spooler take care of moving it there
# this is necessary for clients and servers that share the
# same name space
if (! ~ $THIS_HOST $DEST_HOST || ! LOCK $LPSPOOL/$LPDEST/LOCK $sysname $pid) exit ''

cd $LPSPOOL

MAXTRY=2
PRINTLOG=$LPLOGDIR/$LPDEST^.st

fn schedule{
        FILE=`{
                @{
                        rfork n
                        bind -b $LPLIB/sched /bin
                        $SCHED $LPDEST
                }
        }
}

while (schedule; ! ~ $#FILE 0) {
        SCHEDLINE=`{cat $LPDEST/$FILE(1)^id}
        LSLINE=`{ls -l $LPDEST/$FILE(1)}
        if (! test -s $LPDEST/.seqno) {
                echo 0 > $LPDEST/.seqno
        }
        if not {
                LPSEQNO = `{cat $LPDEST/.seqno | awk '{seqno = $1 + 1; if (seqno > 999) seqno = 0; print seqno}'}
                echo $LPSEQNO > $LPDEST/.seqno
        }
        STARTIME=`{date}
        if (! test -s $LPDEST/$FILE(1)) {
                echo $SCHEDLINE(2)$SCHEDLINE(4)'        '$SCHEDLINE(3)  $SCHEDLINE(5)' ! '$LSLINE(6) $STARTIME(4) >> $LPLOG
                rm -f $LPDEST/$FILE $LPDEST/$FILE^id
        }
        if not {
                if (~ $THIS_HOST $DEST_HOST) {
                        if (test -f $LPLIB/perm/$LPDEST && grep -s $SCHEDLINE(2) $LPLIB/perm/$LPDEST) {
                                echo you are not allowed to use printer $LPDEST | mail $SCHEDLINE(2)
                                rm -f $LPDEST/$FILE(1) $LPDEST/$FILE(1)^id
                        }
                        if not {
                                > $PRINTLOG
                                STARTIME=`{date}
                                eval $LOCAL_CMD
                                rv=$status
                                ENDTIME=`{date}
                                status=$rv
                                if () {
                                        echo $SCHEDLINE(1)^$SCHEDLINE(3)'       '$SCHEDLINE(2)' '$SCHEDLINE(4)' + '$LSLINE(6)' '$STARTIME(4)' '$ENDTIME(4)
                                        eval $SUCCESS_CMD
                                        rm -f $LPDEST/$FILE(1) $LPDEST/$FILE(1)^id
                                }
                                if not {
                                        echo $SCHEDLINE(1)^$SCHEDLINE(3)'       '$SCHEDLINE(2)' '$SCHEDLINE(4)' - '$LSLINE(6)' '$STARTIME(4)' '$ENDTIME(4)' status='$rv
                                        THISTRY=`{echo $SCHEDLINE(4) + 1|hoc}
                                        echo $SCHEDLINE(1) $SCHEDLINE(2) $SCHEDLINE(3) $THISTRY >$LPDEST/$FILE(1)^id
                                        if (test $THISTRY -ge $MAXTRY) {
                                                if (test -d $LPLIB/prob/$LPDEST) {
                                                        cp $LPDEST/$FILE(1) $LPLIB/prob/$LPDEST
                                                        cp $LPDEST/$FILE(1)^id $LPLIB/prob/$LPDEST
                                                        cp $PRINTLOG $LPLIB/prob/$LPDEST/$FILE(1)^log
                                                }
                                                upasname=daemon
                                                mail $SCHEDLINE(2) <<endmail1
                                                rm -f $LPDEST/$FILE(1) $LPDEST/$FILE(1)^id
                                        }
                                        if not {
                                                touch $LPDEST/$FILE(1)
                                                sleep $LPDELAY
                                        }
                                }
                        }
                }
                if not {
# we don't want to be here
#                       trap '' 13      # temp hack: ignore SIGPIPE
                        STARTIME=`{date}
                        eval $REMOTE_CMD 
                        rv=$status
                        ENDTIME=`{date}
                        if (~ $rv '') {
                                echo $SCHEDLINE(1)^$SCHEDLINE(3)'       '$SCHEDLINE(2)' '$SCHEDLINE(4)' + '$LSLINE(6)' '$STARTIME(4)' '$ENDTIME(4)
                                rm -f $LPDEST/$FILE(1) $LPDEST/$FILE(1)^id
                        }
                        if not {
                                echo $SCHEDLINE(1)^$SCHEDLINE(3)'       '$SCHEDLINE(2)' '$SCHEDLINE(4)' - '$LSLINE(6)' '$STARTIME(4)' '$ENDTIME(4)
                                echo status $rv from '$REMOTE_CMD'
                                THISTRY=`{echo $SCHEDLINE(4) + 1|hoc}
                                echo $SCHEDLINE(1) $SCHEDLINE(2) $SCHEDLINE(3) $THISTRY >$LPDEST/$FILE(1)^id
                                if (~ $THISTRY $MAXTRY) {
                                        upasname=daemon
                                        mail $SCHEDLINE(2) <<endmail2
                                }
                                if not {
                                        touch $LPDEST/$FILE(1)
                                        sleep $LPDELAY

                                # this is here to deal with running out of
                                # Datakit channels or other stupid problems
                                # backoff connection attempts but not too long
                                        LPDELAY=`{echo $LPDELAY '*' 2|hoc}
                                        if (test $LPDELAY -gt 960)
                                                LPDELAY=60
                                }
                        }
                }
        }
}
Your job has failed to print on $LPDEST after $MAXTRY attempt(s).
If the directory $LPLIB/prob/$LPDEST exists on $DEST_HOST,
the file has been put there along with the printer log file.
                        Your friendly printer daemon
endmail1
Your job has failed to print on $LPDEST after $MAXTRY attempt(s).
There is a problem in sending the job to $DEST_HOST,
but I'll keep trying.  Have a nice day.
                        Your enthusiastic printer daemon
endmail2
UNLOCK $LPSPOOL/$LPDEST
rm $LPSPOOL/$LPDEST >[2]/dev/null