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