#!/bin/sh

# author: herrmann@redhat.com 24.11.2003
#
# this script mounts linux-isos, runs through all rpms and writes all relevant metadata into a defined filestructure
#
# - package profile: name arch version description
# - package content: files with owner and permissions
# - package provides 
# - package requirements

MOUNTPOINT=/tmp/iso
ROOT=$PWD/distri
START=$PWD
SUSE=/tmp/suse

alias rpm='rpm --nosignature'


usage() {
	echo $*
	exit 1
}

# because we will mount isos, we have to run as root

if [ `id -u` -ne 0 ];then
	echo "you must run this as root!"
	exit 1
fi

# did we get a file with iso locations ?

if [ $# -eq 1 ];then
	if [ ! -r $1 ];then
		usage "could not read $1"
	fi
else
	usage "usage: $0 <isolist>"
fi

# check environment

if [ ! -d $MOUNTPOINT ];then
	mkdir $MOUNTPOINT 2>/dev/null
	[ $? -ne 0 ] && usage "could not create mount-point $MOUNTPOINT"
fi
if [ ! -d $ROOT ];then
	mkdir $ROOT 2>/dev/null
	[ $? -ne 0 ] && usage "could not create root $root"
fi
if [ ! -d $SUSE ];then
	mkdir $SUSE 2>/dev/null
	[ $? -ne 0 ] && usage "could not create susetmp $SUSE"
fi
rm -rf $SUSE/*

cat /proc/mounts|grep '[^\w]'$MOUNTPOINT'\b' >/dev/null
if [ $? -eq 0 ];then
	usage "$MOUNTPOINT is currently mounted. umount first and rerun"
fi


# start work

cat $1|while read iso
do
	if [ ! -r $iso ]
	then 
		echo "could not read iso $iso - skipping"
		continue
	fi
	REL=`basename $iso|sed -e 's/dis[kc][0-9-]*//' -e 's/cd[0-9-]*//' -e 's/\.iso//' -e 's/boxset//' -e 's/RC1.0//' -e 's/re1007//' -e 's/[-.]\+/-/' -e 's/-$//'`
	mount -oloop,ro $iso $MOUNTPOINT
	cd $MOUNTPOINT
	# Red Hat ?
	if [ -d RedHat/RPMS ];then
		cd RedHat/RPMS
	# SuSE ?
	elif [ -d suse -o -d UnitedLinux ];then
		# because suse puts their rpms into several directories, we create one and add symlinks
		cd $SUSE
		rm -f *
		find $MOUNTPOINT -name '*.rpm' -not -name '*src.rpm' -exec ln -s {} . \;
		echo -e '\t'`ls|wc -l` symlinks created for suse rpms
	fi
	# define arch
	FIRST=`ls *rpm 2>/dev/null|grep -v noarch|head -n1`
	# do we have rpms ?
	if [ -z "$FIRST" ];then 
		cd $START
		umount $MOUNTPOINT
		echo
		continue
	fi
	echo -n processing `basename $iso`
	ARCH=`rpm -qp $FIRST --qf '%{ARCH}'`
	echo -en "\tfound arch is $ARCH"
	ARCH=`echo $ARCH|sed -e 's/i.86/i386/'`
	echo -e "\t - corrected is $ARCH"
	# prepare tree
	TREE=$ROOT/$REL/$ARCH
	# skip if exists
	if [ -d $TREE ];then
		if [ -e $TREE/done ];then
			if grep $iso $TREE/done >/dev/null;then
				echo "########## `basename $iso` already parsed - skipping ##########"
				cd $START
				umount $MOUNTPOINT
				continue
			fi
		fi
	else
		mkdir -p $TREE
	fi
	# start processing for all rpms
	ls *rpm|while read rpm
	do
		echo -n '.'
		# extract metadata
		rpm -qp $rpm --qf '%{NAME}\t%{ARCH}\t%{VERSION}-%{RELEASE}\t%{SUMMARY}\n' >> $TREE/packages &
		# extract filelist
		rpm -qlvp $rpm > $TREE/$rpm-fileslong &
		rpm -qlp $rpm > $TREE/$rpm-files &
		# extract provides
		rpm -qp $rpm --provides > $TREE/$rpm-provides &
		# extract requires
		rpm -qp $rpm --requires > $TREE/$rpm-requires &
		wait
		echo -en ''
	done
	echo
	# cleanup
	cd $START
	umount $MOUNTPOINT
	echo $iso >> $TREE/done

done

