#!/bin/sh
# Ben Winslow <rain bluecherry net>, 2007

cleanup()
{
	if [ ! -z "$MOUNTPOINT" ]; then
		umount "$MOUNTPOINT"
		rmdir "$MOUNTPOINT"
		MOUNTPOINT=""
	fi
	if [ ! -z "$EXCLUDELIST" ]; then
		rm -f "$EXCLUDELIST"
		EXCLUDELIST=""
	fi
}

MOUNTPOINT=""
EXCLUDELIST=""

trap cleanup HUP INT QUIT TERM 0

if [ "$#" -lt "2" ]; then
	echo "usage: $0 <imagein> <imageout> [excludefiles...]" >&2
	echo >&2
	echo "This script regenerates an ISO/UDF image, optionally excluding" >&2
	echo "the file(s) listed in excludefiles.  All files listed in excludefiles" >&2
	echo "should be relative to the CD root, without a leading slash." >&2
	echo >&2
	echo "root privileges are required to run this script." >&2
	echo "The script will attempt to run su for you if you are not root." >&2
	exit 1
fi

if [ "`id -u`" != 0 ]; then
	if [ "x$SU_ATTEMPT" = "x1" ]; then
		echo "Failed to become root!" >&2
		exit 1
	fi
	echo "Attempting to become root..." >&2
	export SU_ATTEMPT=1
	exec su root -s "$0" -- "$@"
	echo "Failed to become root!" >&2
	exit 1
elif [ "x$SU_ATTEMPT" = "x1" ]; then
	echo "Successfully became root." >&2
	echo >&2
fi

IMAGE="$1"
shift
OUTFILE="$1"
shift

if [ ! -r "$IMAGE" ]; then
	echo "Unable to read '$IMAGE'" >&2
	exit 1
fi

if [ -b "$IMAGE" ]; then
	LOOP=""
	DEVTYPE="block device"
elif [ -f "$IMAGE" ]; then
	LOOP=",loop"
	DEVTYPE="image"
else
	echo "$IMAGE is an unknown type" >&2
	exit 1
fi

echo "Reading metadata from $DEVTYPE $IMAGE..."
ISOINFO="`isoinfo -d -i "$IMAGE"`" || exit 1
SYSID="`echo "$ISOINFO" | grep "^System id: " | cut -d' ' -f3-`"
VOLID="`echo "$ISOINFO" | grep "^Volume id: " | cut -d' ' -f3-`"
VOLSETID="`echo "$ISOINFO" | grep "^Volume set id: " | cut -d' ' -f4-`"
PUBID="`echo "$ISOINFO" | grep "^Publisher id: " | cut -d' ' -f3-`"
PREPID="`echo "$ISOINFO" | grep "^Data preparer id: " | cut -d' ' -f4-`"
APPID="`echo "$ISOINFO" | grep "^Application id: " | cut -d' ' -f3-`"
# feh.
COPYRIGHT="`echo "$ISOINFO" | grep "^Copyright File id: " | cut -d' ' -f4-`"
ABSTRACTFILE="`echo "$ISOINFO" | grep "^Abstract File id: " | cut -d' ' -f4-`"
BIBLIOFILE="`echo "$ISOINFO" | grep "^Bibliographic File id: " | cut -d' ' -f4-`"
VOLSETSIZE="`echo "$ISOINFO" | grep "^Volume set size is: " | cut -d' ' -f5-`"
VOLSETNUM="`echo "$ISOINFO" | grep "^Volume set sequence number is: " | cut -d' ' -f6-`"

echo "Volume ID: '$VOLID' (copyright '$COPYRIGHT')"
echo "Published by '$PUBID', prepared by '$PREPID'"
echo "System ID: '$SYSID'"
echo

MOUNTPOINT="`mktemp -d -t remakeudf.XXXXXXXXXX`" || exit 1

#echo "Using mountpoint $MOUNTPOINT"
if ! mount -o "ro$LOOP" -t udf "$IMAGE" "$MOUNTPOINT"; then
	# mounting failed, so avoid having cleanup() unmount it
	MOUNTPOINT=""
	exit 1
fi

EXCLUDELIST="`mktemp -t remakeudf.XXXXXXXXX`" || exit 1
for x in "$@"; do
	if [ ! -f "$MOUNTPOINT/$x" ]; then
		echo "warning: $x not found in image!" >&2
	fi
	echo "$MOUNTPOINT/$x" >> "$EXCLUDELIST"
done

genisoimage -abstract "$ABSTRACTFILE" -A "$APPID" -biblio "$BIBLIOFILE" -copyright "$COPYRIGHT" -publisher "$PUBID" -p "$PREPID" -sysid "$SYSID" -udf -V "$VOLID" -volset "$VOLSETID" -volset-size "$VOLSETSIZE" -volset-seqno "$VOLSETNUM" -o "$OUTFILE" -iso-level 1 -input-charset UTF-8 -no-pad -exclude-list "$EXCLUDELIST" "$MOUNTPOINT" 2>&1 |
awk '
{
	if ($0 ~ /estimate finish/) {
		printf("%s\r", $0);
		extranl=1;
	} else if ($0 ~ /^(Total (translation|rockridge|directory))|Path table size|Max brk space/) {
	} else {
		if (extranl) {
			printf("\n");
			extranl=0;
		}
		print
	}
}'
# -input-charset/-output-charset?  -iso-level?  -root?  -sort?
