Blame local/mib2c-update

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