components/foomatic/fppd/supportedonly.sh
changeset 335 223d5bf98b72
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/foomatic/fppd/supportedonly.sh	Wed Jun 22 13:27:13 2011 -0700
@@ -0,0 +1,234 @@
+#!/bin/bash
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+#
+
+# Find the PPD files delivered by foomatic that Solaris does not support.
+# There are two reasons for non-support:
+#
+#	1. license/patent issues with the driver (listed in file nolicense). These
+#	   files are removed and not delivered
+#	2. The driver used by the PPD file must be brought downand compiled and
+#	   Solaris has not chosen to do so. In that case the PPD file is delivered,
+#	   but not included in the generated cache file.
+#
+# The unsupported PPD file should be listed in $BUILD_DIR/ppdunsupported for
+# review. The catchall file, ppdsnomatch, should be empty. If not, a new
+# case is needed in this script. The other files are there for debugging
+# purposes.
+
+# Notes:
+#	drivers come in several flavors: gs built in, gs uniprint, postscript,
+#	hpijs, and then the several other drivers.
+# Drivers are noted in many PPD files with driverType. To sort these, look
+# for:	driverType G/GhostScript built-in:
+#	driverType U/GhostScript Uniprint:
+#	driverType F/Filter: "" 
+# Drivers are also noted in the name of the ppd file. This is used
+# to cull out postscript, hpijs, and pxlmono . These do not reliably
+# use driverType. note: pxlmono driver is a gs built-in but many of the
+# ppd files that use this driver do not utilize the driverType line.
+# driverType I/IJS: "" is not reliable for hpijs as not used in many ppds.
+ 
+# driverType F/Filter: "" denotes ppd files that use GhostScript and
+# then pipe that output to one or more other drivers. These will only be 
+# supported if Solaris compiles and delivers these drivers.
+
+# Make sure that there are no undefined variables
+set -ue
+
+# Sanitize PATH
+PATH=/usr/bin:/bin
+
+if [ -z "${1-}" ] || [ -z "${2-}" ] ||
+	[ -z "${3-}" ] || [ -z "${4-}" ]; then
+	echo "Usage: $0 build-dir tree-of-ppds cache-file nolicense-file"
+	exit 1
+fi
+
+# Build directory
+BUILD_DIR="$1"
+# Where PPD files are located
+BASE="$2"
+# Cache file to be created
+CACHE="$3"
+# File listing PPDs with no/invalid license
+NOLICENSE="$4"
+# Base install path for PPD files
+IPATH=/usr/share/ppd/SUNWfoomatic
+
+# Script will fail if set
+FAIL_LATER=""
+
+mkdir -p "$( dirname "$CACHE" )"
+/bin/rm -f ${BUILD_DIR}/ppdunsupported \
+		${BUILD_DIR}/ppdsupported \
+		${BUILD_DIR}/ppdsnomatch \
+		"$CACHE"
+
+# files which should be included in the cache
+
+
+#-----
+##
+## add_to_cache
+##
+## That means the PPD will be included in ## generated cache. Function uses
+## global variables $i and $j. Function expects that we are already in
+## directory $i
+##
+#-----
+add_to_cache() {
+	typeset SRCFILE
+	typeset PPDFILE
+
+	# Add the file to the cache
+	case "$j" in
+		*.gz)
+			SRCFILE=${BUILD_DIR}/ppd.$$
+			gzcat $BASE/$i/$j >${SRCFILE}
+			PPDFILE="${IPATH}/$i/$j"
+			;;
+		*)
+			SRCFILE=$BASE/$i/$j
+			PPDFILE="${IPATH}/$i/$j.gz"
+			;;
+	esac
+
+	typeset MANU=$i
+	typeset MODEL
+	MODEL=`grep "*ModelName:" $SRCFILE | cut -d '"' -f2`
+	typeset NICKN
+	NICKN=`grep "*NickName:" $SRCFILE | cut -d '"' -f2`
+
+	typeset k
+	for k in ${MODEL}
+	do
+		# change / to \/ for sed
+		typeset i_clean=$(echo $k | sed -e 's/\//\\\//g')
+		NICKN=$( echo $NICKN |
+			sed -e "s/$i_clean//" | sed -e "s/^ //" )
+	done
+
+	echo ${MANU}:${MODEL}:${NICKN}:::${PPDFILE} >> ${CACHE}
+}
+
+
+#-----
+##
+## supported
+##
+## process PPD supported file.
+##
+#-----
+supported() {
+	echo "$i/$j" >> ${BUILD_DIR}/ppdsupported
+	add_to_cache
+}
+
+#-----
+##
+## unsupported
+##
+## Handle PPD files NOT supported and thus included in the cache
+##
+#-----
+unsupported() {
+	echo "$i/$j - $1" >> ${BUILD_DIR}/ppdunsupported
+}
+
+#-----
+##
+## nomatch
+##
+## Handle PPD files for which we don't know how to decide whether it's
+## supported or not
+##
+#-----
+nomatch() {
+	echo "$i/$j" >> ${BUILD_DIR}/ppdsnomatch
+	echo "file '$i/$j' did not match any rule"
+	FAIL_LATER=1
+}
+
+# Go to directory with PPD files
+cd "$BASE"
+
+# Walk through all the PPD files available
+for i in *
+do
+	cd "$i"
+		for j in *
+		do
+			# First detect all files listed in the "nolicense" file
+			if ls $j | /usr/xpg4/bin/grep -f "$NOLICENSE" >/dev/null ; then
+				echo "Removing file '$j' because it is listed in 'nolicense' file"
+				/bin/rm $j
+				continue
+			fi
+
+			# The following cases pull out supported drivers
+			if ls $j | grep Postscript > /dev/null; then
+				supported
+				continue
+			fi
+
+			if grep "driverType G/GhostScript built-in: " $j >> /dev/null; then
+				supported
+				continue
+			fi
+
+			if grep "driverType U/GhostScript Uniprint: " $j >> /dev/null; then
+				supported
+				continue
+			fi
+
+			# HPLIP (hpijs) supplies it's own Foomatic PPD files
+			if ls $j | grep hpijs > /dev/null; then
+				unsupported 'hpijs'
+				continue
+			fi
+
+			if ls $j | grep pxlmono > /dev/null; then
+				supported 'pxlmono'
+				continue
+			fi
+
+			# These are the unsupported printers unless
+			# we build and deliver the drivers
+			if grep "driverType F/Filter: """ $j >> /dev/null; then
+				unsupported 'driverType F/Filter'
+				continue
+			fi
+
+			# No match : this should not happen
+			nomatch
+		done
+	cd ..
+done
+
+if [ -n "$FAIL_LATER" ]; then
+	exit 1
+else
+	exit 0
+fi