commit efa2ea22528c47a69569e967c86b7f605d572ddb from: matthias date: Sat Dec 22 11:15:09 2007 UTC o Add config file o Add more options o Handle build stamps correct (first stage) commit - 91b7f4815a918efd255a534b656ddaa260dc0c0f commit + efa2ea22528c47a69569e967c86b7f605d572ddb blob - ae2f440093b4e1414096dfc125f514141da02ef4 blob + 241ef3fb6d68ac039923d9cb20af387e13b35c29 --- server/gen_update.sh +++ server/gen_update.sh @@ -1,43 +1,44 @@ #!/bin/sh -# Base directory where the unpatched and the patched system is -#BASE=/usr/scratch/update-dragonfly -BASE=/home/update/up - - -SUM=/sbin/sha1 -ARCH=`uname -m` -VERSION=`uname -r | cut -d '-' -f 1` -LOC="${BASE}/${VERSION}/${ARCH}" -INDEX="${LOC}/INDEX" - -if [ $# -le 2 ]; then - echo "Usage: $0 " +if [ -e gen_update.conf ]; then + . gen_update.conf +else + echo "Config file not found." exit 1 fi -prefix=$1 -opath=$2 -mpath=$3 +export PATH=/sbin:/bin:/usr/sbin:/usr/bin:${PATH} -# Keep track of the real pathes in the system -ropath="" -rmpath="" -otemp=$2 +# Print a message if -v is given +log() +{ + MSG=$1 + if [ ${DEBUG} -eq 1 ]; then + echo ${MSG} + fi +} + # Check if $LOC is available startup() { - if [ ! -d $LOC ]; then - echo "$LOC does not exists. Create it" - mkdir -p $LOC - chmod -R 701 ${BASE} - elif [ -d $LOC ]; then - echo "$LOC exists. Clean it" - rm -rf -I $LOC/* - mkdir -p $LOC + + ARCH=`uname -m` + VERSION=`uname -r | cut -d '-' -f 1` + LOC="${BASE}/${VERSION}/${ARCH}" + INDEX="${LOC}/INDEX" + + if [ ! -d ${LOC} ]; then + log "${LOC} does not exists. Create it" + install -d -o root -g wheel -m 750 -p ${LOC} + elif [ -d ${LOC} ]; then + log "${LOC} exists. Clean it" + rm -rf -I ${LOC}/* fi + if [ -e ${BSLOG} ]; then + rm ${BSLOG} + fi } # Copy the complete file to the update directory. This is usefull if the user @@ -52,7 +53,7 @@ copy_file() FLOC=${LOC}/`echo ${5} | sed -e 's/\//_/g'` - echo "Copy $1 to $FLOC" + #echo "Copy $1 to $FLOC" case "`stat -f "%ST" $prefix/${1}`" in '*') @@ -85,10 +86,10 @@ create_patch() DIFF="${LOC}/${NAME}.diff" case "${FTYPE}" in - '*') + '*'|*) # Executable, so use bsdiff (works with shell scripts # as well) - bsdiff $prefix/${1} $prefix/${2} ${DIFF} + bsdiff $prefix/${1} $prefix/${2} ${DIFF} || return 1 if [ ! -e ${DIFF} ]; then echo "Creating ${DIFF} failed. Abort" exit $? @@ -101,22 +102,47 @@ create_patch() '@') echo "No symlink support" ;; - *) + #*) # Normal file - diff -uN $prefix/${1} $prefix/${2} > ${DIFF} - if [ ! -e ${DIFF} ]; then - echo "Creating ${DIFF} failed. Abort" - exit $? - fi - SUM_DIFF="`${SUM} -q ${DIFF}`" + # diff -uN $prefix/${1} $prefix/${2} > ${DIFF} + # if [ ! -e ${DIFF} ]; then + # echo "Creating ${DIFF} failed. Abort" + # exit $? + # fi + # SUM_DIFF="`${SUM} -q ${DIFF}`" # Generate INDEX entry - echo "${5}#`basename ${DIFF}`#${SUM_DIFF}#${3}#${4}"\ - >> ${INDEX} - ;; + # echo "${5}#`basename ${DIFF}`#${SUM_DIFF}#${3}#${4}"\ + # >> ${INDEX} esac } +create_build_stamp() +{ + # $1 = orig path + # $2 = new path + # $3 = real path + + #if [ " + CNT=`${DC} ${1} ${2}` || return 1 + # If we have a difference between 1 and 128 chars, consider the file + # modified from a build timestamp. See Colin Percivals Paper for + # further information + if [ ${CNT} -ge 1 -a ${CNT} -le 128 ]; then + log "Create build stamp for ${3}" + echo "${3}" >> ${BSLOG} + else + O1="obdj1" + O2="obdj2" + echo `objdump -a ${1}` > ${01} + echo `objdump -a ${2}` > ${02} + if [ `diff -u ${01} ${02} | wc -l | awk '{print $1}'` -ge 1 ]; then + echo "${3}" >> ${BSLOG} + fi + log "Big difference for ${3}: ${CNT} chars" + fi +} + dir() { #echo "Start with $1" @@ -133,6 +159,12 @@ dir() # Start recursion dir $i fi + # Don't try to diff fortune files. They are randomized during + # every build (and dont ask me why) + if [ "$ropath" = "/usr/share/games/fortune" ]; then + log "Dont try to diff fortunes dat files" + break + fi # Compare two files if [ -f "$prefix/$opath/$i" ]; then if [ -f "$prefix/$mpath/$i" ]; then @@ -141,16 +173,19 @@ dir() NSUM=`${SUM} -q $prefix/$mpath/$i` # Checksum different, so generate a patch if [ "${OSUM}" != "${NSUM}" ]; then - echo -n "NOTE: $ropath/$i and " - echo "$rmpath/$i differ. Create patch" - # Create a pathc - create_patch "$opath/$i" "$mpath/$i" "${OSUM}" "${NSUM}" "${ropath}/$i" - copy_file "$opath/$i" "$mpath/$i" "${OSUM}" "${NSUM}" "${ropath}/$i" + if [ ${BFLAG} -eq 0 ]; then + log "NOTE: $ropath/$i and + $rmpath/$i differ. Create patch" + create_patch "$opath/$i" "$mpath/$i" "${OSUM}" "${NSUM}" "${ropath}/$i" + copy_file "$opath/$i" "$mpath/$i" "${OSUM}" "${NSUM}" "${ropath}/$i" + else + create_build_stamp "$prefix/$opath/$i" "$prefix/$mpath/$i" "${ropath}/$i" + fi fi # XXX What to do now? else - echo -n "WARNING: $prefix/$opath/$i exists " - echo "whether $prefix/$mpath/$i not" + log "WARNING: $prefix/$opath/$i exists + whether $prefix/$mpath/$i not" fi fi done @@ -170,9 +205,54 @@ dir() fi } +usage() +{ + echo "usage: $0 [-bh] " + echo " -b : Create build stamps log" + echo " -h : Display this help" + echo " -v : Be more verbose" + echo "" + echo "Example $0 /usr/build old new" + exit 0 +} + +args=`getopt bhv $*` + +if [ $? -ne 0 ]; then + usage +fi + +BFLAG=0 +DEBUG=0 + +set -- $args +for i; do + case "$i" in + # Create build stamps log + -b) + BFLAG=1 + shift;; + -h) + usage; shift;; + -v) + DEBUG=1 + shift;; + --) + shift; break;; + esac +done + +prefix=$1 +opath=$2 +mpath=$3 + +# Keep track of the real pathes in the system +ropath="" +rmpath="" +otemp=$2 + startup cd "$prefix/$opath" -#dir "$prefix/$opath" dir "." # Generate the INDEX hash blob - /dev/null blob + e203569f341289bbc4803a53dbe554a856f79669 (mode 644) --- /dev/null +++ server/gen_update.conf @@ -0,0 +1,11 @@ +# Base directory where the unpatched and the patched system is +#BASE=/usr/scratch/update-dragonfly +BASE=/home/update/up + +# Path to the diffcount program +DC=/root/update-dragonfly/server/diffcount + +# Checksum program +SUM=/sbin/sha1 + +BSLOG=${BASE}/BSLOG