| #!/bin/bash |
| # |
| # $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: $@" > /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 |