diff options
Diffstat (limited to 'local/mib2c-update')
-rwxr-xr-x | local/mib2c-update | 358 |
1 files changed, 358 insertions, 0 deletions
diff --git a/local/mib2c-update b/local/mib2c-update new file mode 100755 index 0000000..ebdfd34 --- /dev/null +++ b/local/mib2c-update @@ -0,0 +1,358 @@ +#!/bin/bash +# +# $Id: mib2c-update 16702 2007-09-16 09:51:41Z magfr $ +# +# script to merge custom code into updated mib2c code +# +#----- example .mib2c-updaterc ----- +#UPDATE_OID=ipAddressTable +#UPDATE_CONF=mib2c.mfd.conf +#UPDATE_MIB2C_OPTS= +#UPDATE_NOPROBE=1 +#----- example .mib2c-updaterc ----- + +#---------------------------------------------------------------------- +# +# defaults +# +UPDATE_CURR=$PWD +UPDATE_ORIG=$PWD/.orig +UPDATE_NEW=$PWD/.new +UPDATE_MERGED=$PWD/.merged +UPDATE_BACKUP=$PWD/.backup +UPDATE_PATCH=$PWD/.patch + +# +# number of diff context lines / patch fuzz factor +# +FUZZ=5 +FIRST_RUN=0 + +#---------------------------------------------------------------------- +# +debug() +{ + if [ $UPDATE_DEBUG -ge 1 ]; then + echo $1 + fi +} + +error() +{ + echo "ERROR: $@" > /dev/stderr +} + +die() +{ + error "$@" + exit 99 +} + +safecd() +{ + cd $1 + if [ $? -ne 0 ]; then + die "changing to directory $1 from $PWD failed!" + fi +} + +safecp() +{ + cp $@ + if [ $? -ne 0 ]; then + die "'cp $@' failed!" + fi +} + +#---------------------------------------------------------------------- +# +check_setup() +{ + rc=1 + for d in $UPDATE_CURR $UPDATE_ORIG $UPDATE_NEW $UPDATE_MERGED $UPDATE_PATCH $UPDATE_BACKUP $UPDATE_BACKUP/curr $UPDATE_BACKUP/orig + do + if [ ! -d $d ]; then + echo "Creating missing directory $d" + mkdir -p $d + if [ $? -ne 0 ]; then + error "Could not create directory $d" + rc=0 + fi + fi + done + + if [ -z "$UPDATE_OID" ]; then + error "Environment variable missing! Set UPDATE_OID in .mib2c-updaterc" + rc=0 + fi + + if [ -z "$UPDATE_CONF" ]; then + error "Environment variable missing! Set UPDATE_CONF in .mib2c-updaterc" + rc=0 + fi + +# if [ -z "$UPDATE_" ]; then +# error "Environment variable missing! Set UPDATE_ in .mib2c-updaterc" +# rc=0 +# fi + + if [ $rc -eq 0 ] && [ $UPDATE_NOPROBE -ne 1 ]; then + mib2c -c unknown > /dev/null 2>&1 + if [ $? -eq 0 ]; then + error "WARNING: mib2c returns 0 on error conditions!" + rc=0 + fi + fi + + return $rc +} + +#---------------------------------------------------------------------- +# +do_diff() +{ + DD_ORIG=$1 + DD_CURR=$2 + DD_OUTPUT=$3 + # u | c unified | context + # r recursive + # b ignore blank lines + # w ignore white space + # p Show which C function each change is in. + # d smaller changes + # --exclude='*Makefile' --unidirectional-new-file + local rc=0 + local rcs=0 + safecd $DD_ORIG + echo " checking files in $1 ($PWD)" + files=`ls *$UPDATE_OID* 2>/dev/null` + if [ ! -z "$files" ]; then + for f in $files; do + diff -U $FUZZ -p -b -w --show-c-function \ + -I "$""Id:" $f $DD_CURR/$f >> $DD_OUTPUT + rc=$? + rcs=`expr $rcs + $rc` + if [ $rc -eq 1 ]; then + echo " $f is different" + fi + done + fi + if [ $rcs -eq 0 ]; then + rm -f $DD_OUTPUT + fi + safecd - + return $rcs +} + +#---------------------------------------------------------------------- +# +do_cp() +{ + src=$1 + dest=$2 + if [ ! -d $dest ]; then + die "dest $dest is not a directory" + fi + if [ ! -d $src ]; then + die "src $src is not a directory" + fi + safecd $src + files=`ls *$UPDATE_OID* 2>/dev/null| egrep "(file|onf|m2d|txt|\.c|\.h)$"` + if [ -z "$files" ]; then + echo " no files to copy from $src" + else + safecp $files $dest + if [ $? -ne 0 ]; then + die "error while copying files from $src to $dest in $PWD" + fi + fi + safecd - +} + +#---------------------------------------------------------------------- +# +save_diff() +{ + echo "Creating patch for your custom code" + cnt=`ls $UPDATE_CURR/*$UPDATE_OID* 2>/dev/null | egrep "(file|onf|m2d|txt|\.c|\.h)$" | wc -l` + if [ $cnt -eq 0 ]; then + echo " no custom code!" + FIRST_RUN=1 + return + fi + + do_diff $UPDATE_ORIG/ $UPDATE_CURR/ $UPDATE_PATCH/custom.$UPDATE_DATE + if [ $? -eq 0 ]; then + echo " no custom code changes found." + fi +} + +#---------------------------------------------------------------------- +# +gen_code() +{ + copy_defaults . $UPDATE_NEW + + safecd $UPDATE_NEW + files=`ls *$UPDATE_OID* 2>/dev/null | grep -v "^default"` + if [ ! -z "$files" ]; then + rm -f $files > /dev/null 2>&1 + fi + echo "mib2c $@ -c $UPDATE_CONF $UPDATE_MIB2C_OPTS $UPDATE_OID" + mib2c $@ -c $UPDATE_CONF $UPDATE_MIB2C_OPTS $UPDATE_OID + if [ $? -ne 0 ]; then + die "bad rc $rc from mib2 while generation new code." + fi + safecd - +} + +#---------------------------------------------------------------------- +# +check_new() +{ + echo "Checking for updates to generated code" + do_diff $UPDATE_ORIG/ $UPDATE_NEW/ $UPDATE_PATCH/generated.$UPDATE_DATE + if [ $? -eq 0 ]; then + echo "Generated code has not changed." + safecd $UPDATE_PATCH + files=`ls *.$UPDATE_DATE 2>/dev/null ` + if [ ! -z "$files" ]; then + rm $files + fi + exit 0 + fi +} + +#---------------------------------------------------------------------- +# +merge_code() +{ + files=`ls $UPDATE_MERGED/* 2>/dev/null ` + if [ ! -z "$files" ]; then + rm $UPDATE_MERGED/* + fi + do_cp $UPDATE_NEW $UPDATE_MERGED + + if [ -f $UPDATE_PATCH/custom.$UPDATE_DATE ]; then + touch .M2C-UPDATE-MERGE-FAILED + echo "Patching new generated code in $UPDATE_MERGED ($PWD)" + # --forward = ignore already applied + patch --forward -F $FUZZ -N -d $UPDATE_MERGED -i $UPDATE_PATCH/custom.$UPDATE_DATE + if [ $? -ne 0 ]; then + error "Could not apply custom code patch to new generated code" + die "You must fix the problem in $UPDATE_MERGED, and then re-run mib2c-update." + fi + rm .M2C-UPDATE-MERGE-FAILED + fi +} + +copy_defaults() +{ + SRC=$1 + DST=$2 + if [ -d $SRC/defaults ]; then + safecp -a $SRC/defaults $DST + else + files=`ls $SRC/default-*.m2d 2>/dev/null ` + if [ ! -z "$files" ]; then + safecp $files $DST + fi + fi + +} + +copy_merged() +{ + echo "Backing up current code to $UPDATE_BACKUP/curr" + do_cp $UPDATE_CURR $UPDATE_BACKUP/curr/ + copy_defaults . $UPDATE_BACKUP/curr/ + + echo "Copying merged code to $UPDATE_CURR" + do_cp $UPDATE_MERGED $UPDATE_CURR/ + + + echo "Backing up original code to $UPDATE_BACKUP/orig" + do_cp $UPDATE_ORIG $UPDATE_BACKUP/orig/ + echo "Saving new original code to $UPDATE_ORIG" + do_cp $UPDATE_NEW $UPDATE_ORIG/ +} + +copy_new() +{ + echo "Copying code to $UPDATE_CURR" + do_cp $UPDATE_NEW $UPDATE_CURR/ + # copy defaults back to current dir (which may not be UPDATE_CURR) + copy_defaults $UPDATE_NEW . + + echo "Saving original code to $UPDATE_ORIG" + do_cp $UPDATE_NEW $UPDATE_ORIG/ +} + +copy_code() +{ + if [ $FIRST_RUN -ne 1 ]; then + copy_merged + else + copy_new + fi + + # always get defaults from UPDATE_NEW, since those are what were used. + copy_defaults $UPDATE_NEW . +} + + +#---------------------------------------------------------------------- +UPDATE_NOPROBE=0 + +if [ -f $HOME/.mib2c-updaterc ]; then + . $HOME/.mib2c-updaterc +fi + +if [ -f .mib2c-updaterc ]; then + . .mib2c-updaterc +fi + +check_setup +if [ $? -ne 1 ]; then + exit 1 +fi + +UPDATE_DATE=`date "+%F_%I.%M"` +echo "Starting regneration of $UPDATE_OID using $UPDATE_CONF at $UPDATE_DATE" + +if [ -f .M2C-UPDATE-MERGE-FAILED ]; then + echo "It appears that the last run of mib2c-update was not able to merge" + echo "your changes automatically. Do you want to:" + echo + while : ; do + echo "[c)opy merged files to $UPDATE_CURR]" + echo "[r)e-run from scratch]" + echo "[q)uit]" + echo "(c|r|q) ?" + read ans + if [ "x$ans" = "xr" ]; then + rm .M2C-UPDATE-MERGE-FAILED + break + elif [ "x$ans" = "xc" ]; then + echo "Have you have manually merged all the" + echo "changes into the merged directory?" + echo "(y|n)" + read ans + if [ "x$ans" != "xy" ]; then + echo "Ok. Try again after you've done that." + exit 1 + fi + rm .M2C-UPDATE-MERGE-FAILED + copy_code + exit 0 + fi + done +fi + +save_diff +gen_code $@ +if [ $FIRST_RUN -ne 1 ]; then + check_new + merge_code +fi +copy_code |