#!/bin/bash -x # Simple script to convert a specified postscript file into a PDF document # and place it in a location that is shared by the Samba server. # # Arguments: # 1st - The name of the spool file # 2nd - $HOME directory of the submitting SAMBA user # 3rd - the destination print queue # 4th - 9th = the print job name # # # John Bright, 2001, jbright@winfordeng.com # Modification for GWI estimate print processing on 2/23/2006 # # This particular iteration of the printpdf script is used to take the modified # Imaginera report (the .QRP file) that prints the estimate report with a header # page with database fields and values and atrips that first page from the print job. # Pages two through the end of the document are then converted to a PDF file and also # sent to a print queue for printing with the information from the "cover/header" sheet # sent to a control file that will be used by other processes to file the PDF and # parsed data from the header page into an SQL database. # # This allows GWI to maintain a record/copy of all estimates that are printed without # losing previous itterations. # # [update the following paragraph to document the eventual methodology] # We will create the pdf into a temporary file based upon the current date and time. # After we are finished, we"ll rename it to a file with the same date, but ending # in .pdf. We do this because if a user tries to open a PDF that is still being written, # they will get a message that it is corrupt, when it is actually just not done yet. ### added 6/30/2006 ### #Before we decide to process this file, let"s make sure that it is an estimate. # we do this by checking the printjob name for the title of the appropriate report. # The report file that was modified is: fcce1248.qrp so we will look for that. #First we will need to assemble the jobname variable from the parameters 4 through 9. # The reason why we have to assemble the variable is because some job names will have spaces # in them and will appear as MULTIPLE variables. ##Disableing the JOBNAME section because we KNOW that Imaginera uses the QRP name as it"s ## print job description. ### - ##go ahead and assign the fourth paramter "$4" to the JOBNAME variable ### - #JOBNAME=$4 ### - # ### - ##check to see if we have more than four variables by checking to see if ### - ## the total number of variables ( $# ) is greather than 4. ### - #if [ "$#" -gt 4 ] ; then ### - # #Start a loopy sequence (man seq) and start with the fifth variable and go until ### - # #you reach the total number of variables as listed by "$#" ### - # for PART in $(seq 5 "$#") ; do ### - # #I don"t understand the eval line...but it works. SO until I need to change it, I"ll just use it. ### - # eval PART=\$${PART} ### - # #tack on the next paramater onto JOBNAME ### - # JOBNAME="$JOBNAME ${PART}" ### - # done ### - #fi ### - # ### - ##echo the printjob name and grep for the desired string and if the string is NOT found ### - ## then let"s just send this job straight to the printer because it"s not an estimate. ### - #if ! echo "$JOBNAME" | grep -iq "fcce1248" ; then function createdest () { # Be sure the Directory in which to place the output # exists and is writable by the user if [ ! -e "$DESTDIR" ] ; then mkdir -pm 770 "$DESTDIR" #create the directory fi # end of the loop that creates the destination directory if it doesn"t exist } function errorMail () { # mail to admin on error conditions SUBJECT="GWI: print estimate/quote error:" TO=(netadmin@gwiinc.com) # sending the message # echo -e "$ERRTEXT | mail -s $SUBJECT " echo -e "$ERRTEXT" | smtp=mail mail -s "$SUBJECT" $TO echo "sent, mail exitcode $?" } function print () { # Issue the print command to the originally intended printer and use # the original unprocessed filename. lpr -P $3 $1 #now exit this script because we are done. exit } function quote () { #Start by making sure that the destination directory exists by running the # createdest (create destination) function createdest #convert the job to a temporary text file /usr/bin/ps2ascii $1 $1-$DATE.ascii #extract the estimate number from the temporary text file ESTNUM=`grep "Specification Number" $1-$DATE.ascii | cut -f2 -d: |sed s#\ ##g | cut -b 1-5` #Check to see if there is more than one spec number found on the quote by checking the # length of the ESTNUM variable. If it is, then reset ESTNUM to equal "combo" if [ "`expr length \"$ESTNUM\"`" -gt "7" ] ; then ESTNUM="combo" fi #delete the temporary text file rm $1-$DATE.ascii #convert the spool job to a PDF ps2pdf $1 $OUTDIR/$1-$DATE.temp ######################################################################### # save the pdf to the estimate directory but use the estimate number # # retrieved from the temporary text file # ######################################################################### #Assign a variable we can use to manipulate should the destination file already exists QUOTENUM=$ESTNUM-quote #Build the name of the destination file FILE="$FPREFIX$QUOTENUM.pdf" #set some checking variables to be used should the name exist or in case of a problem UNIQUE=2 RUNAWAY=1 #Check to see if the spool file has been deleted yet. If not, continue the do loop # This prevents us from overwriting an existing file -- we are looking for a unique name while [ -f $OUTDIR/$1 ] ; do if [ -f "$DESTDIR$FILE" ] ; then QUOTENUM=${ESTNUM}-quote-$UNIQUE ; UNIQUE=$(( $UNIQUE + 1 )) #update the filename FILE="$FPREFIX$QUOTENUM.pdf" #close this if loop and return to the begining of the do loop #otherwise else #if an error occurs that keeps the original file from being moved or deleted # then this printestimate script will run in an infinite loop causing the log # files to fill up the disk space and causing runaway CPU usage. # We have runaway set to 10 itterations if [ $RUNAWAY -gt 10 ] ; then #possible Critical error.. echo "Print job terminated - can't remove original spool file" > $2/$DESTDIR/CRITICAL-STOP-$DATE.TXT exit else RUNAWAY=$(( $RUNAWAY + 1 )) fi #move the temporary PDF file to the destination folder using the now # verified unique name echo "PREPARING TO MOVE THE FILE...MOVING MOVING MOVING!" mv "$OUTDIR/$1-$DATE.temp" "$DESTDIR$FILE" #change the permissions chmod 444 "$DESTDIR$FILE" #Send the PDF to the printer ONLY if we know it got to its # destination directory properly. This will help clue us into trouble if [ -f $DESTDIR$FILE ] ; then lpr -P $3 $1 else #exit if it didn"t get there properly. #set the text for errorMail ERRTEXT="unable to put $DESTDIR$FILE in its place. Printing aborted" #then run the errorMail function errorMail exit fi # Now remove the spool file thus ending the do loop from runing again. # rm $1 #$OUTDIR/$1 mv $1 $1.keeper-quote fi #end the "If spool file exists" do loop done exit } function estimate { ######################################################################### # Star the printestimate processing now that we have determined that # # this print job is indeed an estimate # ######################################################################### #Start by making sure that the destination directory exists by running the # createdest (create destination) function createdest ################################################# # Begin the routine that parces the source file # # into an estimate pdf and its header PS page # ################################################# #extract the first "header" sheet /usr/bin/psselect -q -p1 $1 $1-$DATE.ascii #convert the entire PS to a PDF ps2pdf $1 $OUTDIR/$1-$DATE.pdf # then remove the first "header" page ps2pdf -dFirstPage=2 $OUTDIR/$1-$DATE.pdf $OUTDIR/$1-$DATE.temp #clean up after ourselves rm $OUTDIR/$1-$DATE.pdf #convert the header to a temporary ascii file #a not-so-clean way to do it-> #ps2ascii $1-header $OUTDIR/$1-$DATE.ascii /usr/local/bin/pstotext $1-$DATE.ascii > $OUTDIR/$1-$DATE.header #remove the control characters from the extracted header sheet sed s/[[:cntrl:]]//g < $OUTDIR/$1-$DATE.header > $1-$DATE.ascii #clean up the temporary file created rm $OUTDIR/$1-$DATE.header ################################################# # extract the information from the header page # # and build an array..assign variables that we # # will need # ################################################# #read in the header file and process each line into an Array while read EACHLINEINFILE; do #Assign each line into an array VAR[$COUNT]="$EACHLINEINFILE" COUNT=$(( $COUNT + 1 )) done < $1-$DATE.ascii #Clean up the header file rm $1-$DATE.ascii #let"s grab the spec_combo number from the header file. SPEC_COMBO=${VAR[1]} #the record"s spec_combo number #Variables that we don"t need but are left in/commented out for # documentation purposes ##assign variables using our array -AND- while we are ## at it...let"s strip out any single quotes so that they don"t accidently ## get interpreted later on and close an echo early. ##"SPEC_DESCR=`echo ${VAR[2]} | tr -d \'` #the spec description" ##"CUSTOMER=`echo ${VAR[3]} | tr -d \'` #the customer name" ##"PROD_DESCR=`echo ${VAR[4]} | tr -d \'` #the product description" #Set the PRINTUSER variable to equal the name of the user"s HOMEDIRECTORY # without the complete path. I could have attempted to use %u for unix user, but #this ensures the data I want PRINTUSER=`basename $2` ################################################# # Move the PDF into the proper location, send # # it to the printer and file the information # # into the sql database. # ################################################# #bob #Assign a variable we can use to manipulate should the destination file exists CHKSPEC_COMBO=$SPEC_COMBO #Build the name of the destination file FILE="$FPREFIX$CHKSPEC_COMBO.pdf" #set some checking variables to be used should the name exist or in case of a problem UNIQUE=2 RUNAWAY=1 #Check to see if the spool file has been deleted yet. If not, continue the do loop # This prevents us from overwriting an existing file -- we are looking for a unique name while [ -f $OUTDIR/$1 ] ; do if [ -f "$DESTDIR$FILE" ] ; then CHKSPEC_COMBO=${SPEC_COMBO}-$UNIQUE ; UNIQUE=$(( $UNIQUE + 1 )) #update the filename FILE="$FPREFIX$CHKSPEC_COMBO.pdf" #close this if loop and return to the begining of the do loop #otherwise else #if an error occurs that keeps the original file from being moved or deleted # then this printestimate script will run in an infinite loop causing the log # files to fill up the disk space and causing runaway CPU usage. # We have runaway set to 10 itterations if [ $RUNAWAY -gt 10 ] ; then #possible Critical error.. echo "Print job terminated - can't remove original spool file" > $2/$DESTDIR/CRITICAL-STOP-$DATE.TXT exit else RUNAWAY=$(( $RUNAWAY + 1 )) fi #move the temporary PDF file to the destination folder using the now # verified unique name echo "PREPARING TO MOVE THE FILE...MOVING MOVING MOVING!" mv "$OUTDIR/$1-$DATE.temp" "$DESTDIR$FILE" #change the permissions chmod 444 "$DESTDIR$FILE" #Send the PDF to the printer ONLY if we know it got to its # destination directory properly. This will help clue us into trouble if [ -f $DESTDIR$FILE ] ; then lpr -P $3 $DESTDIR$FILE else #if it didn"t get there properly, don"t bother running the # SQL command ERRTEXT="Unable to add an estimate to the SQL database for $DESTDIR$FILE" errorMail exit fi #Let"s prepare the UNC path to the file so that user can open the file # when the search page shows the link. Using the UNC path # (\\server\path\to\file.pdf) prevents the hard coding of a physical # drive mapping which COULD potentially be changed or not mapped. #Strip off the /home part of the path so that we can replace it FILELINK=`echo $DESTDIR$FILE | cut -b 6-` #Add in the server name where the PDF is stored FILE_LINK="//gwifs$FILELINK" # Now remove the spool file thus ending the do loop from runing again. rm $1 #$OUTDIR/$1 mv $1 $1.keeper-estimate ######################################################### # Now the that PDF file is nicely stored away, let"s # # call the SQL statement that will file the information # # about this estimate into the sql database # ######################################################### #The ORIGINAL "go to the MS SQL database" ISQL ROUTINE # #TODO check for successful ISQL entry and notify if it doesn"t succeed. # #save missed submissions into a file somewhere # echo "INSERT INTO esttable (date,time,spec_combo,spec_descr,customer,prod_descr,file_link,printuser) VALUES ('$DBDATE','$DBTIME','$SPEC_COMBO','$SPEC_DESCR','$CUSTOMER','$PROD_DESCR','$FILE_LINK','$PRINTUSER')" | /usr/local/bin/sqlprompt #** PERL routine ** # The NEW method is to use the local postgres database on gwifs along # with a PERL script # calling the estimate pl with three parameters # 1. the absolute path to the header page # 2. the UNC pathname where the file is stored # 3. the name of the user who printed the estimate perl /usr/local/bin/estimates.pl $1-$DATE.ascii $FILE_LINK $PRINTUSER fi #end the "If spool file exists" do loop done } #Let"s start setting some variables. DATE=`date +%b%d-%H%M` #seconds were removed...that kind of granularity isn"t needed YEAR=`date +%Y` MON=`date +%m` #Set the file prefix variable. This will be prepended to the spec_number FPREFIX=`date +%d-%H.%M-` #set the destination directory name DESTDIR=/home/sys/data/estimates/$YEAR/$MON/ #Assign the OUTDIR variable to equal where the print job will go OUTDIR=/tmp #Test the $4 variable to see if it equals FCCE1248.QRP (an estimate) if [ "$4" == "FCCE1248.QRP" ] ; then #run the estimate function estimate $1 $2 $3 $4 exit elif [ "$4" == "FQUO1248.QRP" ] ; then #run the quote function echo "IT IS A QUOTE...preparing to run the QUOTE function" quote $1 $2 $3 exit else #run the print function print $1 $2 $3 exit fi