summaryrefslogtreecommitdiff
path: root/hpcups-update-ppds.sh
diff options
context:
space:
mode:
Diffstat (limited to 'hpcups-update-ppds.sh')
-rw-r--r--hpcups-update-ppds.sh107
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