#!/usr/bin/env bash

set -x

##########################################################################
# Driver Disk builder for RHEL5 kernels
#########################################################################
me=$(basename "$0")
bin=$(cd "$(dirname "$0")" && /bin/pwd)

err  () { echo >&2 "$*";    }
log  () { err "$me: $*";    }
vlog () { $verbose && err "$me: $*"; }
fail () { log "$*"; exit 1; }
try  () { "$@" || fail "'$*' failed"; }
trace() { log "invoking: $*"; "$@"; }
vtrace() { vlog "invoking: $*"; "$@"; }

usage() {
  err
  err "usage:"
  err "  $me [options] <dir> <tag> net <distro> <sp> <arch:kernel>"
  err
  err "options:"
  err "  --disttag <x>     -- specify disttag (only used for log file name)"
  err "  -v                -- verbose logging"
  err
  err "eg: $me /home/bob/v5 v1_1_5010 net RHEL5 base i686:2.4.20-8"
  err
  exit 1
}
######################################################################
# main()

verbose=false
disttag=

  # Parse the command line arguments.
while [ $# -gt 0 ]; do
  case "$1" in
    --disttag)  disttag="$2"; shift;;
    -v)         verbose=true;;
    -*)         usage;;
    *)          break;;
  esac
  shift
done

[ $# -eq 6 ] || usage
dir="$1/rpm"
shift
TAG="$1"
version="$(echo "$TAG" | sed 's/^v//; s/_/./g')"
shift
[ "x$1" = xnet ] || fail "$me: type must be 'net'"
shift
DISTRO=$1
shift
SP=$1
shift

vlog "whoami=$(whoami)"
vlog "$(uname -a)"

  # Some sanity please!
try [ -d "$dir" ]
try cd "$dir"

logd="$dir/logs"
try mkdir -p "$logd"

  # Gives fake kernel version
kerver=${1##*:}
echo "fake kernel version is $kerver"
arch=${1%%:*}

  # This part of code is to find out kernel update for installing creatrepo rpm
kvstr=$(echo "$kerver" | sed -e 's/^2....../ /; s/\./ /; s/^\(.*\) .*/\1/')

if [ "$kvstr" -eq 53 ]; then
kerupd="update1"
elif [ "$kvstr" -eq 92 ]; then
kerupd="update2"
elif [$kvstr -eq 128 ]; then
kerupd="update3"
elif [$kvstr -eq 164 ]; then
kerupd="update4"
elif [$kvstr -eq 194 ]; then
kerupd="update5"
else
echo "INFO:No matching updates found for $kerver kernel"
fi

  # Find out running OS type
# arch="$1"
# shift
if [ $arch == "i686" ]; then
srcarch="x86"
else
srcarch=$arch
fi

[ -n "$LD_PRELOAD" ] && {
  # This bit of hackery combines with hackery in the rpmbuild-master
  # scripts to make it look like we're running on a different system from
  # the one the kernel thinks we're running.  (Needed because we run this
  # script in a chroot environment).
  export "FAKEARCH_MACHINE=$arch"
  export "FAKEARCH_RELEASE=$kerver"
  vlog "fakearch: $(uname -a)"
}

logf="$logd/ddrhel5-$TAG-$disttag-$kerver-$arch.log"

wd=$dir/ddisk/rhel5
# ensure things are clean
if [ -d "$wd" ]; then
    rm -Rf "$ed" || fail "Could not remove '$wd'"
fi
try mkdir -p $wd

  # check creatrepo availability
repo=$(rpm -qa | grep createrepo && echo OK || echo "Please install createrepo")
[ "$repo" == "Please install createrepo" ] && fail "Please install createrepo"
echo "INFO: createrepo rpm already installed $repo"

  # unpack  reference driverdisk
try tar -C $wd -jxpvf /home/ha/iSCSI/DDisk/ddiskit-0.9.9.tar.bz2

try cd $wd/ddiskit-0.9.9
 # Make it easier to debug by printing the commands run
perl -pi -e 's/^\t\@/\t/' $wd/ddiskit-0.9.9/Build.rules

  # Copy  source rpm 
try mkdir -p "$wd/ddiskit-0.9.9/sfc/rpm/"{SPECS,SOURCES,SRPMS}
cwd=$wd/ddiskit-0.9.9
srpm_path=$dir/SRPMS/"sfc-"$version"-1.src.rpm"

  # Checks rpm availability
if [ $srpm_path ]; then
try cp $srpm_path $cwd/sfc/rpm/SRPMS/"sfc-"$version"-1.src.rpm"
echo "INFO: Copied SRPMS from $srpm_path" 
try cd $cwd/sfc/rpm/SOURCES
else
echo "INFO:No sorce rpm available at $dir/SRPMS/"
fi

  # Extract sfc.spec from rpm
try rpm2cpio ../SRPMS/"sfc-"$version"-1.src.rpm" | cpio -d --extract
try mv ./sfc.spec ../SPECS/
try cd $cwd/sfc

  # build modinfo file in sfc folder
try echo '''sfc
   net
      Solarflare NIC adapter''' > ./modinfo

  # As sfc.ko not ready at this stage, creating empty modules.dep, pcitable
  # files to avoid build failure 
echo > modules.dep
echo > pcitable
try chmod +x *
echo "changed permissions"

  # Create directory with Kernel version(target kernel)
try cd $cwd/
try echo $kerver > kversions
echo "INFO:created kversions"

  # Clear off dist directory
try echo > dist
echo "INFO: Created dist file"

  # Modify subdirs folder with "sfc" , remove rest
try echo sfc > subdirs

  # For clean image, remove "images" folder created on first run

if [ -d $cwd/images ];then
try rm -rf $cwd/images
fi

try mkdir -p $cwd/images
try chmod a+w -R $cwd/images

  # Forced to build twice.first stage builds all *.ko from SRPMS
  # After first stage pcitable & modules.dep will be prepared from sfc.ko
  # second stage make builds actual ddisk.
  # NOTE: make looks for SU permissions to delete *.tmp files.

log "Generating non-pendency ddisk: arch=$arch log=$(basename "$logf")"
try make disk 2>&1 | tee -a "$logf"  
rc=$?
echo "INFO:Created non dependency disk"

try cd $cwd

  # if driver needs dependency files then enable the follwing lines of code
  # Expected modules.dep content. Dependency may change in future
  # echo sfc:  i2c-core mtdcore hwmon mtdpart hwmon-vid i2c-algo-bit > ./modules.dep
  # echo \tmtdpart: mtdcore >> ./modules.dep
  # echo i2c-algo-bit: i2c-core >> ./modules.dep
  # Expected pcitable content. more lines may include in future
  # echo 0x1924  0x0703  "sfc"   "Solarflare NIC adapter"\n > pcitable
  # echo 0x1924  0x0710  "sfc"   "Solarflare NIC adapter"\n >> pcitable
  # echo 0x1924  0x0803  "sfc"   "Solarflare NIC adapter"\n >> pcitable

modPath=/lib/modules/$kerver/kernel/drivers
destPath=./modules/$kerver/$arch
dep=$(/sbin/modinfo -F depends $destPath/sfc.ko | sed 's/,/ /g')
try $(echo "$dep" | sed 's/,/ /g; s/^/sfc: /' >> $cwd/sfc/modules.dep)
echo "INFO:prepared modules.dep"

  # Preparing dependency order as above functionality adds dependency for sfc.ko only
if [ -n "$dep" ]; then
for file in $dep; do
    if [ "$file" == "i2c-algo-bit" ]; then
    echo "i2c-algo-bit:i2c-core" >> $cwd/sfc/modules.dep
    elif [ "$file" == "mtdpart" ]; then
    echo "mtdpart:mtdcore" >> $cwd/sfc/modules.dep
    fi
     found=$(find $modPath -name $file".ko")
     [ -n "$found" ] || fail "Error:$file not found"
      cp $found $destPath
done
fi

  # preparing Pci table
pci=$(/sbin/modinfo -F alias $destPath/sfc.ko | sed 's/^pci:v0000\(....\)d0000\(....\)sv\*sd\*bc\*sc\*i\*$/0x\1  0x\2 "sfc" "Solarflare NIC adapter"/; t; d')
try $(echo "$pci" | sed "s/#/ /" &> $cwd/sfc/pcitable) 
echo "INFO:prepared pcitable"

  # Clean dd.img.gz created in first run
if [ -e $cwd/images/dd.img.gz ];then
try rm $cwd/images/dd.img.gz
fi

  # Now creates actual ddisk for rhel5
try make disk 2>&1 | tee -a "$logf"
rc=$?

echo "ddrhel5-builder completed OK"
