#!/bin/bash # # $Id: rh_iso_extract.sh,v 1.5 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