367 lines
8.6 KiB
Plaintext
367 lines
8.6 KiB
Plaintext
|
#!/bin/sh
|
||
|
#
|
||
|
# $Id$
|
||
|
#
|
||
|
# 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: $@" >&2
|
||
|
}
|
||
|
|
||
|
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 $PWD/.mib2c-updaterc ]; then
|
||
|
. $PWD/.mib2c-updaterc
|
||
|
else
|
||
|
echo "creating example .mib2c-udpaterc. edit as needed and re-run "
|
||
|
echo "mib2c-update."
|
||
|
|
||
|
echo "UPDATE_OID=ipAddressTable" >> .mib2c-updaterc
|
||
|
echo "UPDATE_CONF=mib2c.mfd.conf" >> .mib2c-updaterc
|
||
|
echo "UPDATE_MIB2C_OPTS=" >> .mib2c-updaterc
|
||
|
echo "#UPDATE_NOPROBE=1" >> .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
|