#!/bin/bash 
# Written by Connie Sieh

SL_URL_BASE_ftp="ftp://ftp.scientificlinux.org/linux/scientific/7x/"
SL_URL_BASE=$SL_URL_BASE_ftp
CONTEXT_URL_BASE="${SL_URL_BASE_ftp}/contexts/"
ARCH=x86_64
DVD_VERSION_MAJOR=7
DVD_VERSION=7.2
DVD_ISO_NAME_DVD=SL-${DVD_VERSION_MAJOR}-DVD-${ARCH}.iso
DVD_ISO_NAME=$DVD_ISO_NAME_DVD
WORKDIR=/srv/SL-contexts/
CONTEXT_NAME=''
DATE=`date "+%y%m%d"`
TESTING_OR_RELEASED=x86_64

#############################################################
usage () {
    echo ''             >&2
    echo "$0 -c context [ -u urlofcontext ] [ -o out dvd name ] [ -i in dvd name ] " >&2
    echo ''             >&2

    echo 'This script will create a DVD with the context rpms , SL 7x DVD will be base' >&2
    echo ''                                   >&2
    echo ' -c: Context to use - required '  	      >&2
    echo ' -u: Url of context - defaults to SL main repo '  	      >&2
    echo ' -o: Output DVD name - defaults to <workdir>/SL_<context>_DVD_<date>.iso '  >&2
    echo ' -i: Input DVD name - defaults to SL 7x Install DVD , located in Workdir , will download if a url is given'  	      >&2
    echo ' -w: Workdir - defaults to /srv/SL-contexts, Need ( 2.1 x DVD size ) + (size of context rpms) available space  '  	      >&2
    echo ' -f: Use ftp to download contexts even if url says http  '  	      >&2
    echo ''                                   >&2
    echo ''                                   >&2


    exit 1
}

##########
# setup args in the right order for making getopt evaluation
# nice and easy.  You'll need to read the manpages for more info
args=$(getopt -o c:u:i:o:w:hft -- "$@")
eval set -- "$args"

for arg in $@; do
    case $1 in
        -- )
            # end of getopt args, shift off the -- and get out of the loop
            shift
            break 2
           ;;
         -c )
            # Context to include 
            CONTEXT_NAME="$2"
            CONTEXT_OUT_ISO=SL-$CONTEXT_NAME-DVD.iso
            shift
            shift
           ;;
         -u )
            # URL location of Context to include 
            CONTEXT_URL="$2"
            shift
            shift
           ;;
         -o )
            # Name of output DVD
            CONTEXT_OUT_ISO="$2"
            shift
            shift
           ;;
         -i )
            # Name of input DVD
            IN_ISO_NAME="$2"
            shift
            shift
           ;;
         -w )
            # workdir 
            WORKDIR="$2"
            shift
            shift
           ;;
         -t )
            # Use testing repo
            TESTING_OR_RELEASED=testing
            shift
           ;;
         -f )
            # Use ftp even if the url says http 
            CONTEXT_URL_ftp_or_http="ftp"
            shift
           ;;
         -h )
            # get help
            usage
            shift
           ;;
    esac
done

if [ -z $CONTEXT_NAME ] ; then
    usage
fi

if [ -z $CONTEXT_URL ] ; then
   CONTEXT_URL=${CONTEXT_URL_BASE}/${CONTEXT_NAME}/${TESTING_OR_RELEASED}
fi
if [ ${CONTEXT_URL:0:3} = "ftp" ] ; then
  CONTEXT_URL_ftp_or_http="ftp"
else 
  if [ ${CONTEXT_URL:0:4} = "http" ] ; then
     if [ $CONTEXT_URL_ftp_or_http = "ftp" ] ; then  
        #We want ftp no matter what
        CONTEXT_URL_ftp_or_http="ftp"
     else
        CONTEXT_URL_ftp_or_http="http"
     fi
  fi
fi
if [ -z $IN_ISO_NAME ] ; then
   IN_ISO_URL="${SL_URL_BASE_ftp}/$ARCH/iso/${DVD_ISO_NAME}"
else
   if [ ${IN_ISO_NAME:0:3} = "ftp" ] || [ ${IN_ISO_NAME:0:4} = "http" ] ; then
      IN_ISO_URL=${IN_ISO_NAME}
      DVD_ISO_NAME="${IN_ISO_URL##*/}"
   else
      DVD_ISO_NAME="${IN_ISO_NAME}"
   fi
fi

echo "CONTEXT_NAME is $CONTEXT_NAME"
echo "CONTEXT_URL is $CONTEXT_URL"
echo "DVD_ISO_NAME is $DVD_ISO_NAME"
echo "IN_ISO_URL $IN_ISO_URL"
echo "WORKDIR $WORKDIR"
echo "CONTEXT_OUT_ISO $CONTEXT_OUT_ISO"

# Check that we have everything that the command line options indicated
if [ ! -d $WORKDIR ] ; then
  echo "Making $WORKDIR since it did not exist"
  mkdir -p $WORKDIR/$CONTEXT_NAME 
fi

# GET the BASE DVD
# Make the iso dir if needed
if [ ! -d $WORKDIR/$CONTEXT_NAME/iso ] ; then
  cd $WORKDIR/$CONTEXT_NAME
  mkdir iso 
fi

cd $WORKDIR/$CONTEXT_NAME/iso
#Check to see if we already have the DVD iso and download if not
if [ ! -s $DVD_ISO_NAME ] ; then 
  wget --no-parent --no-host-directories --no-directories $WGET_EXTRA_OPTIONS $IN_ISO_URL   
fi

#Now get the context
if [ ! -d $WORKDIR/$CONTEXT_NAME/contexts/$CONTEXT_NAME ] ; then
   echo "Making $WORKDIR/$CONTEXT_NAME/contexts/$CONTEXT_NAME since it does not exist"
   mkdir -p $WORKDIR/$CONTEXT_NAME/contexts/$CONTEXT_NAME
   mkdir -p $WORKDIR/$CONTEXT_NAME/contexts/$CONTEXT_NAME/repodata
else
   if [ ! -d $WORKDIR/$CONTEXT_NAME/oldcontexts ] ; then
      mkdir $WORKDIR/$CONTEXT_NAME/oldcontexts
   fi
   if [ -d $WORKDIR/$CONTEXT_NAME/oldcontexts/${CONTEXT_NAME}.$DATE ] ; then
      if [ -d $WORKDIR/$CONTEXT_NAME/oldcontexts/${CONTEXT_NAME}.$DATE.1 ] ; then
         echo "Removing $WORKDIR/$CONTEXT_NAME/oldcontexts/${CONTEXT_NAME}.$DATE.1"
         /bin/rm -r $WORKDIR/$CONTEXT_NAME/oldcontexts/${CONTEXT_NAME}.$DATE.1
      fi
      echo "Moving $WORKDIR/$CONTEXT_NAME/contexts/$CONTEXT_NAME.$DATE to $WORKDIR/$CONTEXT_NAME/oldcontexts/${CONTEXT_NAME}.$DATE.1"
      mv -f  $WORKDIR/$CONTEXT_NAME/oldcontexts/${CONTEXT_NAME}.$DATE $WORKDIR/$CONTEXT_NAME/oldcontexts/${CONTEXT_NAME}.$DATE.1
   fi
   echo "Moving $WORKDIR/$CONTEXT_NAME/contexts/$CONTEXT_NAME to $WORKDIR/$CONTEXT_NAME/oldcontexts/${CONTEXT_NAME}.$DATE"
   mv -f  $WORKDIR/$CONTEXT_NAME/contexts/$CONTEXT_NAME $WORKDIR/$CONTEXT_NAME/oldcontexts/${CONTEXT_NAME}.$DATE
   mkdir -p $WORKDIR/$CONTEXT_NAME/contexts/$CONTEXT_NAME
   mkdir -p $WORKDIR/$CONTEXT_NAME/contexts/$CONTEXT_NAME/repodata
fi

if [ $CONTEXT_URL_ftp_or_http = "http" ] ; then  
   cd $WORKDIR/$CONTEXT_NAME/contexts/$CONTEXT_NAME/repodata
   wget  --no-parent --no-host-directories --no-directories ${CONTEXT_URL}/repodata/* 
   cd $WORKDIR/$CONTEXT_NAME/contexts/$CONTEXT_NAME
   wget  --no-parent --no-host-directories --no-directories ${CONTEXT_URL}/*.rpm 
else
   if [ $CONTEXT_URL_ftp_or_http = "ftp" ] ; then  
       cd $WORKDIR/$CONTEXT_NAME/contexts/$CONTEXT_NAME
       lftp -e "mirror ${CONTEXT_URL} . ; bye"
   fi
fi

#Now mount the existing DVD loopback
TMPDIR_ISO=$(mktemp -d)
mount -o loop $WORKDIR/$CONTEXT_NAME/iso/${DVD_ISO_NAME}  $TMPDIR_ISO 


# Get existing "vol id" from base iso image.

VOL_ID=`isoinfo -d -i $WORKDIR/$CONTEXT_NAME/iso/${DVD_ISO_NAME} | grep "Volume id:" | cut -f2 -d":"`


TMPDIR_NEWBASE=$(mktemp -d)

cd $TMPDIR_ISO/
#copy off base files
find . -maxdepth 1 -type f  -print | cpio -pvdum $TMPDIR_NEWBASE/
rm $TMPDIR_NEWBASE/TRANS.TBL
#copy off isolinux as mkisofs needs to write to this directory so moving to $TMPDIR_NEWBASE/
find  isolinux/ -print | cpio -pvdum $TMPDIR_NEWBASE/
rm $TMPDIR_NEWBASE/isolinux/boot.cat
cd $TMPDIR_NEWBASE/isolinux
sed -e "s/menu title Scientific/menu title Scientific $CONTEXT_NAME Context/" isolinux.cfg > /tmp/isolinux.cfg
cp /tmp/isolinux.cfg isolinux.cfg

cd $TMPDIR_ISO/
#Determine toplevel directories from mounted original CD
TOP_CD_DIRS=`find . -maxdepth 1 -type d -print | sed -e "s/.//" | sed -e "s,/,," | sed -e "s/isolinux//"` 
for DIR in $TOP_CD_DIRS
do
  GRAFT_DIRS="${GRAFT_DIRS} ${DIR}=$TMPDIR_ISO/${DIR}"
done

#get .treeinfo from base DVD and add context treeinfo part
OLD_VARIANT=`grep "variant = " $TMPDIR_ISO/.treeinfo | cut -f2 -d "=" | sed -e "s/ //"` 
#Overwrite old .treeinfo with new one that have context in it
cat  $TMPDIR_ISO/.treeinfo $WORKDIR/treeinfo.context | sed -e "s/<CONTEXT>/$CONTEXT_NAME/" | sed -e "s/$OLD_VARIANT/contexts/" > $TMPDIR_NEWBASE/.treeinfo

cd $TMPDIR_NEWBASE/
/usr/bin/mkisofs -v -U -J -R -T -m repoview -m boot.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot -e images/efiboot.img -no-emul-boot -graft-points \
  -V $VOL_ID \
  -o $WORKDIR/$CONTEXT_NAME/$CONTEXT_OUT_ISO \
  $TMPDIR_NEWBASE \
  $GRAFT_DIRS \
  contexts=$WORKDIR/$CONTEXT_NAME/contexts

cd 
umount $TMPDIR_ISO

# Now add the isohybird and implantisomd5 based on how pungi does it 
#Pungi.INFO: Running /usr/bin/isohybrid -u /srv/pungi/SL/7.1/RC2/x86_64/iso/Scientific-DVD-x86_64-7.1.iso
#Pungi.INFO: Running /usr/bin/implantisomd5 /srv/pungi/SL/7.1/RC2/x86_64/iso/Scientific-DVD-x86_64-7.1.iso

/usr/bin/isohybrid -u $WORKDIR/$CONTEXT_NAME/$CONTEXT_OUT_ISO 

echo "running /usr/bin/implantisomd5 to add checksums to iso image" 
/usr/bin/implantisomd5 $WORKDIR/$CONTEXT_NAME/$CONTEXT_OUT_ISO

#Make checksum file
echo "running /usr/bin/sha256sum against $WORKDIR/$CONTEXT_NAME/$CONTEXT_OUT_ISO" 
/usr/bin/sha256sum $WORKDIR/$CONTEXT_NAME/$CONTEXT_OUT_ISO > $WORKDIR/$CONTEXT_NAME/$CONTEXT_OUT_ISO.sha256
