diff options
Diffstat (limited to 'hpcups-update-ppds.sh')
| -rw-r--r-- | hpcups-update-ppds.sh | 107 | 
1 files changed, 107 insertions, 0 deletions
diff --git a/hpcups-update-ppds.sh b/hpcups-update-ppds.sh new file mode 100644 index 0000000..2e97ef5 --- /dev/null +++ b/hpcups-update-ppds.sh @@ -0,0 +1,107 @@ +#!/bin/bash + +## Copyright (C) 2010 Red Hat, Inc. +## Authors: +##  Tim Waugh <twaugh@redhat.com> + +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. + +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +## Purpose: Update hpcups PPDs when necessary. + +sock=/var/run/cups/cups.sock +running=$(LC_ALL=C lpstat -h "$sock" -r 2>/dev/null) +if [ "$?" -ne 0 ] +then +    # No lpstat in path +    exit 0 +fi + +if [ -z "${running##*not*}" ] +then +    # scheduler is not running +    exit 0 +fi + +trap 'rm -f "$tmpdir"/models; rmdir "$tmpdir"; exit 0' \ +    0 HUP INT QUIT ILL ABRT PIPE TERM + +debug=true +tmpdir="$(mktemp -d)" +for ppd in /etc/cups/ppd/*.ppd +do +    [ -r "$ppd" ] || continue +    queue="${ppd#/etc/cups/ppd/}" +    queue="${queue%.ppd}" +    lpstat -h "$sock" -p "$queue" &>/dev/null || continue + +    # We have PPD associated with a queue.  Find out its NickName +    $debug && echo "Examining $queue" +    nickname="$(grep '^\*NickName:' "$ppd")" +    nickname="${nickname#*\"}" # strip text up to and incl first double quote +    nickname="${nickname%\"*}" # strip final double quote +    $debug && echo "NickName is: $nickname" + +    # Is it an hpcups PPD? +    [ -z "${nickname##*, hpcups*}" ] || continue +    $debug && echo "hpcups: true" + +    # No: need to regenerate the PPD. +    if [ ! -f "$tmpdir/models" ] +    then +	# Get list of driver URIs and NickNames +	lpinfo -h "$sock" --include-schemes=drv -m 2>/dev/null >"$tmpdir/models" +    fi + +    # Strip hpcups version from NickName +    nickname="${nickname%, hpcups*}" +    $debug && echo "Stripped NickName: $nickname" +    while read line +    do +	uri=${line%% *} +	nn="${line#$uri }" +	[ -z "${nn##*, hpcups*}" ] || continue + +	nn="${nn%, hpcups*}" +	if [ "$nn" == "$nickname" ] +	then +	    $debug && echo "Match found, URI: $uri" + +	    # Unfortunately CUPS will reset the page size when we +	    # change the PPD, due to the weird page size names that +	    # HPLIP uses.  Try to maintain the existing page size. +	    size="$(grep '^\*DefaultPageSize:' "$ppd")" +	    size="${size##* }" # strip until after first ' ' +	    size="${size%% *}" # strip after any ' ' +	    $debug && echo "PageSize is $size" + +	    if [ -z "${size#*Duplex}" ] +	    then +		# Special handling for duplex sizes because HPLIP +		# broke backwards compatibility with *that* too! +		size="${size%Duplex}.Duplex" +	    fi + +	    null=/dev/null +	    $debug && null=/dev/stdout +	    lpadmin -h "$sock" -p "$queue" -m "$uri" &>"$null" || : +	    $debug && echo "PPD regenerated" + +	    lpadmin -h "$sock" -p "$queue" -o PageSize="$size" &>"$null" || : +	    $debug && echo "PageSize restored to $size" +	    break +	fi +    done <"$tmpdir/models" +done +exit 0  | 
