OpenSolaris_b135/pkgdefs/common_files/i.configmapconf

#!/bin/sh
# 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
#
#
#pragma ident	"%Z%%M%	%I%	%E% SMI"
#
#
# Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#
# Note that this script imposes restriction on the format of the new file
# that is delivered by the package.
# The format has to be:
# selection=enable idvendor=16 idproduct=32 cfgndx=1;
# Each record is a separate line, all single spaces, and all values in
# decimal
#

hex2dec()
{
	printf "ibase=16\n %s\n" $* | bc
}

CLEANUP_FILE=/tmp/CLEANUP
TMP_FILE=/tmp/configmap.$$
TMP_FILE1=/tmp/configmap1.$$
export TMP_FILE

while read src dst
do

# Now merge the contents of the old and the new CONF_MAP file.
# src is the new file that this package is installing, and dst is the
# file present on the system.
# The algorithm to merge them is simple. We skim and filter out those entries
# from dst file that we don't want from the src file. These entries are the
# disabled entries and the ones that have idvendor and idproduct only.
# This list of unwanted items is constructed as a grep string. Finally, we
# do a "grep -v" of these items from src file, and add the remaining entries
# to the dst file.
#

	CONF_MAP=$dst
	CONF_MAP_OLD=${dst}.old
	CONF_MAP_NEW=$src

	if [ -f ${CONF_MAP} ]
	then
		# There is an existing file on the system.

		# build a string of items that we don't want from the new file.
		grepstr="^\*|^\#"
		echo $grepstr > $TMP_FILE
		# preprocess the old file
		sed -e  \
		'
		# delete comments
		/^#.*/d
		/^\*.*/d
		# change mulitple tabs to a single space
		s/[	][	]*/ /g
		# change multiple spaces to a single space
		s/[ ][ ]*/ /g
		# get rid of leading spaces
		s/^ //g
		# get rid of trailing spaces
		s/[ ][ ]*$//g
		# strip spaces around =
		s/[ ]*=[ ]*/=/g
		# put everything to lower case
		y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' \
		$CONF_MAP | 
		# get rid of newlines
		tr -s "\n" " " |
		# make each record into a single line
		tr ";" "\n" | 
		# fish out entries that are enabled or disabled but have no 
		# pathname/srno specified
		egrep -v 'pathname|srno|^[ ]*$' |
		while read line
		do
			vendorstr=""
			productstr=""
			for arg in $line
			do
				# var=${arg%=*}
				# value=${arg#*=}
				var=`expr $arg : '\(.*\)=.*' \| $arg`
				value=`expr $arg : '.*=\(.*\)' \| $arg`
				case $var in
					idvendor)
						# val=${value#0x}
						val=`expr $value : \
							'[0][xX]\(.*\)' \
							\| $value`
						if [ "$value" != "$val" ]
						then
							# hex -> dec
							val=`hex2dec $val`
						fi
						vendorstr="idvendor=$val"
					;;
					idproduct)
						# val=${value#0x}
						val=`expr $value : \
							'[0][xX]\(.*\)' \
							\| $value`
						if [ "$value" != "$val" ]
						then
							# hex -> dec
							val=`hex2dec $val`
						fi
						productstr="idproduct=$val"
					;;
				esac
			done
			# build the grep str
			if [ -n "$vendorstr" ] || [ -n "$productstr" ]
			then
				grepstr="$grepstr|$vendorstr $productstr"
			fi
			echo $grepstr > $TMP_FILE
		done

		# grepstr now contains all the entries that we don't want
		# from new CONF_MAP
		cp $CONF_MAP $TMP_FILE1
		egrep -vi -f $TMP_FILE  $CONF_MAP_NEW >> $TMP_FILE1
		rm $TMP_FILE

		# Now, TMP_FILE1 is the real new config file to be stored.

		# If the existing file and the new one are identical,
		# nothing will be done.
		cmp -s ${CONF_MAP} ${TMP_FILE1}
		if [ $? = 0 ]
		then
			rm ${TMP_FILE1}
			continue
		fi

		# The existing file is different with the new one. Save it as .old
		# if .old exists, move it to .old.xxx
		if [ -f ${CONF_MAP_OLD} ]
		then
			# suffix is day, hr, min, sec
			# - it should be unique enough
			suffix=`date '+%d%H''%M''%S'`
			mv ${CONF_MAP_OLD} ${CONF_MAP_OLD}.$suffix
			echo "EXISTING_FILE_RENAMED: ${CONF_MAP_OLD} "\
			    "${CONF_MAP_OLD}.$suffix" >>  ${CLEANUP_FILE}
		fi
		cp $CONF_MAP $CONF_MAP_OLD
		echo "EXISTING_FILE_RENAMED: ${CONF_MAP} ${CONF_MAP_OLD}"\
		    >> ${CLEANUP_FILE}

		# Replace the config file with the new one.
		mv $TMP_FILE1 $CONF_MAP

	else
		# we are newly installing this file
		cp $CONF_MAP_NEW $CONF_MAP
	fi
done
exit 0