#!/usr/bin/env bash
##########################################################################
# Driver Disk builder for SUSE 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>"
  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 SLES11 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"
path=$1
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##*:}
#kerver="2.6.16.60-0.21" #"2.6.16.60-0.21" 2.6.5-7.97
arch=${1%%:*}
echo "INFO: Working Kernel version is $kerver"
echo "INFO: Building driver disk for SUSE $kerver-$arch"

  # Find out sles OS type
typeStr=$(echo "$kerver" | sed -e 's/\-/ /; s/^\(.*\) .*/\1/; s/^2.../ /; s/\./ /;s/^\(.*\) .*/\1/')

if [ $typeStr -eq 16 ]; then
ostype="sles10"
elif [ $typeStr -eq 32 ]; then
ostype="sles11"
else
typeStr=$(echo "$kerver" | sed -e 's/\-/ /; s/^\(.*\) .*/\1/; s/^2.../ /; s/\./ /')
if [ $typeStr -eq 5 ]; then
ostype="sles9"
else
echo "INFO:unknown SUSE OS type"
fi
fi

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

if [ "$kvstr" == "0.12" -o "7.97" ]; then
kerupd="SP1"
elif [ "$kvstr" == "0.21" -o "7.139" ]; then
kerupd="SP2"
elif [ "$kvstr" == "0.54" -o "7.191" ]; then
kerupd="SP3"
else
echo "INFO:No matching updates found for $kerver kernel"
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/dd$ostype-$kerupd-$TAG-$disttag-$arch-$kerver.log"

wd=$dir/ddisk/sles
try mkdir -p $wd


  # Create directory structure
try mkdir -p $wd/linux/suse/$arch"-$ostype"/{install,modules}
cwd=$wd/linux/suse/$arch"-$ostype"
try cd $cwd
try echo '''UpdateName:     Solarflare Communications 10GB ethernet driver disk 
   UpdateID:       200911070000001 
   UpdatePriority: 98''' > dud.cfg
try echo > $cwd/install/update.pre
try echo '''#! /bin/sh 
   echo -e "`date` :\tbegin update.post" >> /tmp/DUD.log 
   pushd `dirname $0` 
   yast -i *.rpm >> /tmp/DUD.log 
   popd 
   echo -e "`date` :\tend update.post" >> /tmp/DUD.log''' > ./install/update.post
  
  # Set Driverdisk mandatory kernel types
mkertype="kmp-default kmp-smp"

  # copy default & smp kernel rpms to install directory
for ktype in $mkertype; do
srpm_path=$dir/RPMS/$arch/"solarflare-sfc-$ktype-"$version"_"$kerver"-1."$arch".rpm"
if [ $srpm_path ]; then
try cp $srpm_path $cwd/install
echo "INFO: Copied RPMS from $srpm_path"
else
echo "INFO:No sorce rpm available at $dir/RPMS/"
fi
done
echo $path

  # copy sfc*.ko files and dependent files
modPath="$path/dkms/var_lib/sfc/$version/$kerver"-default"/$arch/module"
destPath="$cwd/modules/"
echo $modPath $destPath
  # Copy sfc.ko to modules directory
cp $modpath"/sfc.ko" $destPath

 
  # Find dependency list for sfc.ko
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"

  # Copy all dependency files to modules directory 
if [ -n "$dep" ]; then
for file in $dep; do
    found=$(find $modPath -name $file".ko")
    [ -n "$found" ] || fail "Error:$file not found"
    cp $found $destPath
done
fi

  # create dependency order file
echo $dep > $destPath/module.order

  # zip $wd/linux  folder then copy it to $wd
try cd $wd
target="dd$ostype-$kerupd-"$TAG-$kerver".tar.gz"
try -czvp $target .
