#!/bin/bash
#
# $Id: rh_iso_extract.sh,v 1.5 2002/08/17 15:04:49 kambiz Exp $
#

set -e

usage() {

cat <<EOF

rh_iso_extract.sh [ options ]

Valid options are:
       -h | --help     This help
       -a | --arch     The architecture to work with [ default i386 ]
       -d | --dest-dir The destination dir prefix    [ default /var/ftp ]
       -i | --iso-dir  The source iso dir prefix     [ default /var/ftp ]
       -r | --release  The release name              [ default beta/null ]

If you cannot loop mount a file on an NFS filesystem,
e.g. 2.2.x kernel based systems, you should copy your
iso images to a local directory and override the iso-dir
and dest-dir defaults.

e.g.
  # mkdir -p /mnt/scratch/ftp/pub/redhat/linux/RELEASE/en/iso/i386/

  # cp /var/ftp/pub/redhat/linux/RELEASE/en/iso/i386/*.iso \\
             /mnt/scratch/ftp/pub/redhat/linux/RELEASE/en/iso/i386/

  # rh_iso_extract.sh -i /mnt/scratch/ftp/pub -d /var/ftp/pub

EOF
exit 1
}

TEMP=`getopt -o ha:d:i:r: --long help,arch:,dest-dir:,iso-dir:,release: -n 'rh_iso_extract.sh' -- "$@"`

eval set -- "$TEMP"

while true ; do
       case "$1" in
               -h|--help) usage ;;
               -a|--arch)
                       ARCH=$2
                       shift 2
                       ;;
               -d|--dest-dir)
                       DESTPREFIX=$2
                       shift 2
                       ;;
               -i|--iso-dir)
                       ISOPREFIX=$2
                       shift 2
                       ;;
               -r|--release)
                       RELEASE=$2
                       shift 2
                       ;;
               --) shift ; break;;
               *) echo "Internal error!" ; exit 1;;
       esac
done

### Begin config

LOCAL_BASE_DIR=/var/ftp/pub
LOCAL_DEST_DIR=/var/ftp/pub

if [ "$ISOPREFIX" != "" ]; then
       LOCAL_BASE_DIR=$ISOPREFIX
       LOCAL_DEST_DIR=$ISOPREFIX
fi

if [ "$DESTPREFIX" != "" ]; then
       LOCAL_DEST_DIR=$DESTPREFIX
fi

if [ "$RELEASE" = "" ]; then
       RELEASE=beta/null
fi

RH_BASE_DIR=redhat/linux

RELEASE_BASE_DIR=$LOCAL_BASE_DIR/$RH_BASE_DIR/$RELEASE
RELEASE_DEST_DIR=$LOCAL_DEST_DIR/$RH_BASE_DIR/$RELEASE

ISO_BASE_DIR=$RELEASE_BASE_DIR/en/iso
OS_BASE_DIR=$RELEASE_DEST_DIR/en/os

DOC_ISO_DIR=$ISO_BASE_DIR/doc
DOC_DIR=$RELEASE_BASE_DIR/en/doc

# where to mount the iso's
MNTPNT=/mnt/cdrom

# white space separated list of architectures
ARCH_LIST="i386"

if [ "$ARCH" != "" ]; then
       ARCH_LIST="$ARCH"
fi

echo DESTPREFIX=$DESTPREFIX
echo ISOPREFIX=$ISOPREFIX
echo RELEASE=$RELEASE
echo ISO_BASE_DIR=$ISO_BASE_DIR
echo OS_BASE_DIR=$OS_BASE_DIR
echo ARCH_LIST=$ARCH_LIST

# who will own the created files
OWNER=rsync
OWNER_GRP=rsync

# whether to extract the doc iso as well: yes/no
DO_DOC=no

### End config

do_one_arch() {
   # Usage: do_one_arch arch
   arch=$1
   archdir=$OS_BASE_DIR/$arch
   arch_isodir=$ISO_BASE_DIR/$arch

   mkdir -p $archdir

   if ( ls $arch_isodir/*-$arch-*.iso > /dev/null 2>&1 ) ; then
       for disc in $arch_isodir/*-$arch-*.iso; do
           echo Expanding `basename $disc` ...
           mount -o loop $disc $MNTPNT
           if ( cd $MNTPNT && pax -rw ./* $archdir ); then
               umount $MNTPNT
               echo Done
           else
               umount $MNTPNT
               exit 1
           fi
       done
   else
       echo "Unable to find $arch_isodir/*-$arch-*.iso"
   fi
}

do_one_srpms() {
   # Usage: do_one_srpms arch
   arch=$1
   srpms_dir=$OS_BASE_DIR/$arch/SRPMS
   arch_isodir=$ISO_BASE_DIR/$arch

   mkdir -p $srpms_dir

   if ( ls $arch_isodir/*-SRPMS-*.iso > /dev/null 2>&1 ) ; then
       for disc in $arch_isodir/*-SRPMS-*.iso; do
           echo Expanding `basename $disc` ...
           mount -o loop $disc $MNTPNT
           if ( cd $MNTPNT/SRPMS && pax -rw ./* $srpms_dir ); then
               umount $MNTPNT
               echo Done
           else
              umount $MNTPNT
              exit 1
           fi
       done
   else
       echo "Unable to find $arch_isodir/*-SRPMS-*.iso"
   fi
}

do_docs() {
   # Usage: do_docs
   mkdir -p $DOC_DIR

   if ( ls ${DOC_ISO_DIR}/*-docs.iso ) ; then
       for disc in ${DOC_ISO_DIR}/*-docs.iso; do
           echo Expanding `basename $disc` ...
           mount -o loop $disc $MNTPNT
           if ( cd $MNTPNT && pax -rw ./* $DOC_DIR ); then
               umount $MNTPNT
               echo Done
           else
               umount $MNTPNT
               exit 1
           fi
       done
   else
       echo "Unable to find $arch_isodir/*-docs.iso"
   fi
}

clean_trans_tbl() {
   # Usage: clean_trans_tbl dir
   dir=$1
   echo "Removing TRANS.TBL files from $1"
   find $dir -type f -name TRANS.TBL | xargs rm -f
}

set_owner() {
   # Usage: set_owner dir
   dir=$1
   echo "Setting user/group ownership for $1"
   # Do this in 2 steps to be more portable between *NIX systems
   chown -R $OWNER $dir
   chgrp -R $OWNER_GRP $dir
}

if [ "$DO_DOC" = "yes" ]; then
   docdir=$DOC_DIR

   if [ -d $docdir ] ; then
       echo "Removing existing documentation in $docdir"
       rm -rf $docdir
   fi

   do_docs
   clean_trans_tbl $docdir
   set_owner $docdir
fi

for arch in $ARCH_LIST; do
   archdir=$OS_BASE_DIR/$arch

   if [ -d $archdir ] ; then
       echo "Removing existing distribution in $archdir"
       rm -rf $archdir
   fi

   do_one_arch $arch
   do_one_srpms $arch
   clean_trans_tbl $archdir
   set_owner $archdir
done