home *** CD-ROM | disk | FTP | other *** search
/ tusportal.tus.k12.pa.us / tusportal.tus.k12.pa.us.tar / tusportal.tus.k12.pa.us / Wyse / latest-image.raw / 0.img / usr / bin / smbprngenpdf < prev    next >
Text File  |  2009-11-26  |  8KB  |  245 lines

  1. #! /bin/bash
  2. # Copyright (c) 2003 SuSE Linux AG, Nuernberg, Germany.
  3. # All rights reserved.
  4. #
  5. # $Id: smbprngenpdf,v 1.3 2003/07/30 16:30:40 lmuelle Exp $
  6. #
  7. # Author: Martin Rode, Programmfabrik GmbH, http://www.programmfabrik.de/
  8. #         <martin.rode@programmfabrik.de>
  9. #         Lars Mueller <lmuelle@SuSE.de>, 2003
  10. #
  11. # Based on Martin Rode's work as published in the iX magacine 2003-03, 139 ff.
  12. #
  13. # This program is free software; you can redistribute it and/or modify it
  14. # under the terms of the GPL.
  15. #
  16.  
  17. BASENAME=$( basename $0)
  18. PATH="/usr/bin:/bin"
  19.  
  20. # decide if we use stdout or logger for the debug messages
  21. if [ /dev/stdout -ef /dev/null ]; then
  22.     debug_cmd="logger -t ${BASENAME} -- \$*"
  23. else
  24.     debug_cmd="echo \$2"
  25. fi
  26.  
  27. # set a default debug level
  28. declare -i DEBUG=2
  29. function debug()
  30. {
  31.     # return if the message's debug level is greater than the current
  32.     test $1 -gt ${DEBUG} && return
  33.  
  34.     eval ${debug_cmd}
  35.     return
  36. }
  37.  
  38. function backup()
  39. {
  40.     # if no such file exits or no backups are wanted return
  41.     if [ ! -e "${DOCUMENT_DEST_DIR}/${DOCUMENT_NAME}.$1" ] || [ ${BACKUP_AMOUNT} -eq 0 ]; then
  42.         return
  43.     fi
  44.     # check if we must shift the backup files
  45.     declare -i filenum=0 maxfilenum=0
  46.     IFS='
  47. '
  48.     for file in $( find ${DOCUMENT_DEST_DIR} -type f -regex "${DOCUMENT_DEST_DIR}/${DOCUMENT_NAME}-backup-[0-9]+.$1"); do
  49.         rest=${file#${DOCUMENT_DEST_DIR}/${DOCUMENT_NAME}-backup-}
  50.         filenum=$( echo ${rest%.$1} | egrep "[0-9]+")
  51.         debug 7 "${LINENO} file:<${file}> rest:<${rest}> filenum:<${filenum}>"
  52.         test ${filenum} -gt $maxfilenum && maxfilenum=${filenum}
  53.     done
  54.     debug 5 "${LINENO} backupamount:<${BACKUP_AMOUNT}> maxfilenum:<${maxfilenum}>"
  55.     test ${maxfilenum} -ge ${BACKUP_AMOUNT} && maxfilenum=$[BACKUP_AMOUNT-1]
  56.     while [ ${maxfilenum} -ge 1 ]; do
  57.         test -e "${DOCUMENT_DEST_DIR}/${DOCUMENT_NAME}-backup-${maxfilenum}.$1" && \
  58.             mv "${DOCUMENT_DEST_DIR}/${DOCUMENT_NAME}-backup-${maxfilenum}.$1" "${DOCUMENT_DEST_DIR}/${DOCUMENT_NAME}-backup-$[maxfilenum+1].$1"
  59.         maxfilenum=$[maxfilenum-1]
  60.     done
  61.     mv "${DOCUMENT_DEST_DIR}/${DOCUMENT_NAME}.$1" "${DOCUMENT_DEST_DIR}/${DOCUMENT_NAME}-backup-1.$1"
  62. }
  63.  
  64. function usage()
  65. {
  66.     cat <<EOM
  67. ${BASENAME} is thought to convert a SMB print spool file to a PDF.
  68.  
  69. By default the destionation directory is a sub directory of the users home
  70. directory, ~/PDF/. Due to privacy the create mode setting of the Samba share is
  71. taken in account while creating the sub diretory and the document file. The sub
  72. directory could be changed with the -D option.
  73.  
  74. An alternate destionation directory could be set with -p. Then no default sub
  75. directory is set.
  76.  
  77. As an intermediate step a PostScript file is created. You could decide if this
  78. file should be kept with the -k option.
  79.  
  80. ${BASENAME} options:
  81.  
  82.     -D      destination sub directory
  83.     -J      job name as provided by the %j macro
  84.     -b      amount of backups kept; default are 10
  85.     -c      print job page count as provided by the %c macro
  86.     -d      set a debug level to write messages to the syslog
  87.     -k      keep the PostScript file
  88.     -p      absolute path to the destination directory
  89.     -h      this text
  90.     -s      spool file name as provided by the %s macro
  91.     -u      user name as provided by the %u macro
  92.     -z      spool file size as provided by the %z macro
  93. EOM
  94.     exit $1
  95. }
  96.  
  97. # set defaults
  98. declare -i BACKUP_AMOUNT="5"
  99. KEEP_PS_FILE=""
  100. SPOOL_FILE_NAME=""
  101.  
  102. while getopts :D:J:b:c:d:ihkp:s:u:z: opt ; do
  103.     case ${opt} in
  104.         \:|\?)  case ${OPTARG} in
  105.                 D)    debug 1 "-D requires a sub directory"
  106.                     ;;
  107.                 J)    debug 1 "-J requires a job name"
  108.                     ;;
  109.                 b)    debug 1 "-b requires a numerical value for the backup amount"
  110.                     ;;
  111.                 c)    debug 1 "-c requires the ammount of pages"
  112.                     ;;
  113.                 d)    debug 1 "-d requires a numerical debug level"
  114.                     ;;
  115.                 p)    debug 1 "-p requires a directory name"
  116.                     ;;
  117.                 s)    debug 1 "-s requires a spool file"
  118.                     ;;
  119.                 u)    debug 1 "-u requires a user name"
  120.                     ;;
  121.                 z)    debug 1 "-z requires the spool file size"
  122.                     ;;
  123.                 *)    echo "Unknown option: -${OPTARG}"
  124.                     ;;
  125.             esac
  126.             exit 1
  127.             ;;
  128.         D)    DEST_SUB_DIR=${OPTARG}
  129.             ;;
  130.         J)    JOB_NAME=${OPTARG}
  131.             ;;
  132.         b)    if echo ${OPTARG} | egrep "[^0-9]" >/dev/null; then
  133.                 debug 1 "-b requires a numerical value not <${OPTARG}> for the backup amount"
  134.                 exit 1
  135.             fi
  136.             BACKUP_AMOUNT=${OPTARG}
  137.             ;;
  138.         c)    PAGE_COUNT=${OPTARG}
  139.             ;;
  140.         d)    if echo ${OPTARG} | egrep "[^0-9]" >/dev/null; then
  141.                 debug 1 "-d requires a numerical debug level not <${OPTARG}>"
  142.                 exit 1
  143.             fi
  144.             DEBUG=${OPTARG}
  145.             ;;
  146.         k)    KEEP_PS_FILE="1"
  147.             ;;
  148.         p)    DOCUMENT_DEST_DIR=${OPTARG}
  149.             ;;
  150.         h)    usage
  151.             ;;
  152.         s)    SPOOL_FILE_NAME=${OPTARG}
  153.             ;;
  154.         u)    USER_NAME=${OPTARG}
  155.             ;;
  156.         z)    SPOOL_FILE_SIZE=${OPTARG}
  157.             ;;
  158.     esac
  159. done
  160. debug 10 "${LINENO} s:<${SPOOL_FILE_NAME}> J:<${JOB_NAME}> c:<${PAGE_COUNT}> z:<${SPOOL_FILE_SIZE}> u:<${USER_NAME}>"
  161.  
  162. # if called without an argument show the help and exit
  163. if [ -z ${SPOOL_FILE_NAME} ]; then
  164.     debug 1 "No spool file provided with -s spool_file_name; use -h for help"
  165.     exit 1
  166. fi
  167.  
  168. # set DEST_SUB_DIR to default if no DOCUMENT_DEST_DIR was set by -p
  169. if [ -z ${DOCUMENT_DEST_DIR} ] && [ -z ${DEST_SUB_DIR} ]; then
  170.     DEST_SUB_DIR="PDF"
  171. fi
  172.  
  173. if [ ${DOCUMENT_DEST_DIR} ]; then
  174.     DOCUMENT_DEST_DIR=$( eval echo ${DOCUMENT_DEST_DIR})
  175.     test ${DEST_SUB_DIR} && DOCUMENT_DEST_DIR=${DOCUMENT_DEST_DIR}/${DEST_SUB_DIR}
  176.     debug 5 "${LINENO} u:<${USER_NAME}> s:<${SPOOL_FILE_NAME}> documentdestdir:<${DOCUMENT_DEST_DIR}>"
  177. else
  178.     USER_HOME_DIR=$( eval echo ~${USER_NAME})
  179.     test ${USER_HOME_DIR} || USER_HOME_DIR="/var/tmp"
  180.     DOCUMENT_DEST_DIR=${USER_HOME_DIR}/${DEST_SUB_DIR}
  181.     debug 5 "${LINENO} u:<${USER_NAME}> s:<${SPOOL_FILE_NAME}> homedir:<${USER_HOME_DIR}> dessubdir:<${DEST_SUB_DIR}>"
  182. fi
  183.  
  184.  
  185. if [ ${JOB_NAME} ]; then
  186.     echo ${JOB_NAME} | egrep -i "^[A-Za-z0-9_]*://" && \
  187.     DOCUMENT_NAME=${JOB_NAME} || \
  188.     DOCUMENT_NAME=${JOB_NAME%.*}
  189.     debug 7 "${LINENO} j:<${JOB_NAME}> documentname:<${DOCUMENT_NAME}>"
  190. else
  191.     DOCUMENT_NAME=$( egrep -i "^%%Title: " ${SPOOL_FILE_NAME} | \
  192.         head -n 1 | \
  193.         sed -e 's/^%%Title: //g' \
  194.             -e 's/^(//g' \
  195.             -e 's/\(.*\)\..*/\1/g' | \
  196.         tr -d "\r\n")
  197.     DOCUMENT_NAME=$( echo -e -n ${DOCUMENT_NAME})
  198.     debug 7 "${LINENO} documentname:<${DOCUMENT_NAME}>"
  199. fi
  200.  
  201. # remove leading URL:// and replace laft '/' with '_'
  202. DOCUMENT_NAME=$( echo ${DOCUMENT_NAME} | \
  203.     sed -e "s/^[A-Za-z0-9_]*:\/\///g" -e "s/\/$//g" -e "s/\//_/g")
  204. debug 7 "${LINENO} documentname:<${DOCUMENT_NAME}>"
  205.  
  206. rc=0
  207. # create destination directory if it not exists
  208. if [ ! -d "${DOCUMENT_DEST_DIR}" ]; then
  209.     mkdir -p "${DOCUMENT_DEST_DIR}" || rc=1
  210.     chown ${USER_NAME}: "${DOCUMENT_DEST_DIR}" || rc=1
  211.     chmod  --reference=${SPOOL_FILE_NAME} "${DOCUMENT_DEST_DIR}" || rc=1
  212.     chmod a+x "${DOCUMENT_DEST_DIR}" || rc=1
  213.     test ${rc} -gt 0 && debug 2 "${LINENO} can't create destdirectory:<${DOCUMENT_DEST_DIR}>"
  214. fi
  215.  
  216. test  ${KEEP_PS_FILE} && backup ps
  217. # create new file with permissions of the spool file
  218. touch "${DOCUMENT_DEST_DIR}/${DOCUMENT_NAME}.ps"
  219. chmod --reference=${SPOOL_FILE_NAME} "${DOCUMENT_DEST_DIR}/${DOCUMENT_NAME}.ps"
  220. # extract PostScript part from the spool file
  221. awk '/^%!PS-Adobe/,/^%%EOF/' ${SPOOL_FILE_NAME} >"${DOCUMENT_DEST_DIR}/${DOCUMENT_NAME}.ps"
  222.  
  223. backup pdf
  224. # create new file with permissions of the spool file
  225. touch "${DOCUMENT_DEST_DIR}/${DOCUMENT_NAME}.pdf"
  226. chmod --reference=${SPOOL_FILE_NAME} "${DOCUMENT_DEST_DIR}/${DOCUMENT_NAME}.pdf"
  227. # create PDF file from PostScript
  228. gs -q -dPARANOIDSAFER -dCompatibilityLevel=1.3 -dNOPAUSE -dBATCH \
  229.     -sDEVICE=pdfwrite -sOutputFile="${DOCUMENT_DEST_DIR}/${DOCUMENT_NAME}.pdf" \
  230.     -c save pop -f "${DOCUMENT_DEST_DIR}/${DOCUMENT_NAME}.ps"
  231.  
  232. # handle ps file
  233. if [ ${KEEP_PS_FILE} ]; then
  234.     debug 0 "${LINENO} keep intermediate PostScript file"
  235. else
  236.     rm -f "${DOCUMENT_DEST_DIR}/${DOCUMENT_NAME}.ps"
  237. fi
  238.  
  239. # handle smbprn spool file
  240. if [ ${DEBUG} -gt 2 ]; then
  241.     debug 3 "${LINENO} s:<${SPOOL_FILE_NAME}> not removed"
  242. else
  243.     rm -f ${SPOOL_FILE_NAME}
  244. fi
  245.