summaryrefslogtreecommitdiff
path: root/local/mib2c-update
diff options
context:
space:
mode:
Diffstat (limited to 'local/mib2c-update')
-rwxr-xr-xlocal/mib2c-update358
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