123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- #!/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
|