#!/bin/bash
# Possibly add options for Vat Close Bootarea
# Test with --no-write option
# 3/22/2020 Additions and modifications by Richard Nolde
#
# All the files needed to build the Bluray disk structure must be
# present in SOURCEDIR before this script is run.

# Command line arguments:
# SourceDir Device FILE|WORM|RW VolumeID FilesetID

if [ ! -x "/usr/sbin/mkudffs" ] ; then
    echo "Cannot find mkudffs utility."
    exit 1
fi

if [ ! -x "/usr/bin/bdwrite" ] ; then
    echo "Cannot find bdwrite utility."
    exit 1
fi

if [[ $UID -ne 0 ]] ; then
   echo "This script must be run as root" 1>&2
   exit 1
fi

if [ $# -lt 4 ]
then
    echo "Syntax: $0 SourceDir Device File|Worm|RW VolumeID FilesetID"
    echo "If you do not have a Bluray burner, use None for device."
    echo "Enclose VolumeID and FilesetID in single quotes if they "
    echo "contain special characters. Use File to create disk image."
    echo "Use WORM for single write media, RW for rewritable media "
    echo "to burn Bluray disk after creating the file UDF system."
    exit 1
fi

SOURCEDIR=`dirname $1/NoSuchFile`
cd ${SOURCEDIR}

echo "Creating UDFS filesystem in ${SOURCEDIR}"
if [ -d ${SOURCEDIR}/udfs ]
then
    echo "${SOURCEDIR}/udfs exists. Replace? Y/N"
    read RESPONSE
    RESPONSE=`echo ${RESPONSE} | cut -c1`
    if [ "${RESPONSE}" = "Y" ] || [ "${RESPONSE}" = "y" ]
    then
       rm -rf ${SOURCEDIR}/udfs
       mkdir -p ${SOURCEDIR}/udfs || \
	  echo "Unable to create ${SOURCEDIR}/udfs"
    fi
else
    mkdir -p ${SOURCEDIR}/udfs || \
	echo "Unable to create ${SOURCEDIR}/udfs"
fi

if [ ! -w  ${SOURCEDIR}/udfs ]
then
    echo "Scratch directory ${SOURCEDIR}/udfs does not exist or is not writeable."
    exit 1
fi

DEVICE=$2
if [ "${DEVICE}" = "None" ] || [ "${DEVICE}" = "none" ]
then
    DEVICE="/dev/null"
fi

if [ ! -e ${DEVICE} ]
then
    echo "${DEVICE} does not exist."
    exit 1
fi

if [ -f ${IMAGEFILE} ]
then
   rm -f  ${IMAGEFILE}
fi

MEDIA=`echo $3 | cut -c1`
case  ${MEDIA} in
    F|f)
	MEDIA="File";;
    W|w)
	MEDIA="WORM";;
    R|r)
	MEDIA="RW";;
    *)
	echo "Invalid Media type. Must be one of File, WORM, RW."
	exit 1;;
esac

VOLUMEID=$4
IMAGEID=`echo ${VOLUMEID} | sed 's/ /_/g'`
IMAGEFILE="${SOURCEDIR}/${IMAGEID}.udfs"

FILESETID=$5
if [ -z "${FILESETID}" ]
then
    LENGTH=`echo "${FILESETID}" | wc -c`
    if [ ${LENGTH} - gt 30 ]
    then
       echo "${FILESETID} is too long. Max 31 characters."
       exit 1
    fi
    FILESETID="${VOLUMEID}"
fi
    
SIZE=`du -cb ${SOURCEDIR}/bd.m2ts* | tail -1 | sed -e 's/[\t].*//'`
BLOCKS=$((SIZE/2048 + 4096))

echo "Volume ID will be set to ${VOLUMEID}."
echo "File set ID will be set to ${FILESETID}"
echo "IMAGEFILE will be set to ${IMAGEFILE}."
echo "UDF File system will be ${BLOCKS} blocks."
echo "Device for Bluray burner will be ${DEVICE}"
echo "using ${MEDIA} media."

gsettings set org.gnome.desktop.media-handling automount false

echo "Formatting UDF File System..."
#mkudffs -m bdr --udfrev=2.50 -b 2048 --label="${VOLUMEID}" ${IMAGEFILE} ${BLOCKS} || \
mkudffs -b 2048 --label="${VOLUMEID}" --vsid="${VOLUMEID}" --fsid="${FILESETID}" --packetlen=32 ${IMAGEFILE} ${BLOCKS} || \
    exit 1
MEDIASIZE=`du -hs ${IMAGEFILE} | tail -n1 | cut -f1`
echo "UDF Bluray disk image created at ${IMAGEFILE} is ${MEDIASIZE}"

grep "${SOURCEDIR}/udfs" /etc/mtab
MOUNTED=$?
if [ ${MOUNTED} -eq 0 ]
then
    echo "${SOURCEDIR}/udfs is already mounted as loop device. Unmounting now."
    umount "${SOURCEDIR}/udfs"
fi


echo "Mounting UDF File System ${IMAGEFILE} at ${SOURCEDIR}/udfs"
mount -v -t udf -o loop ${IMAGEFILE} ${SOURCEDIR}/udfs

echo "Writing to File System. This may take some time..."
bdwrite ${SOURCEDIR}/udfs ${SOURCEDIR}/bd.m2ts*

echo "Unmounting File System..."
umount ${SOURCEDIR}/udfs

if [ "${MEDIA}" != "File" ]
then
   echo "To burn bluray, load writable media now."
   echo "UDF file system will require at least ${MEDIASIZE} space."
   echo "If loaded media is not large enough, type Exit to abort now or anything else to continue."
   read RESPONSE
   if [ "${RESPONSE}" = "Exit" ] || [ "${RESPONSE}" = "exit" ]
   then
      exit 1
   fi
fi

echo "Burning File System to ${MEDIA} media. This may take some time..."
if [ "${MEDIA}" = "RW" ]
then
   echo " Executing command: dd if=${IMAGEFILE} of=${DEVICE} bs=2048000"
   dd if=${IMAGEFILE} of=${DEVICE} bs=2048000
else
   if [ "${MEDIA}" = "WORM" ]
   then
      echo "Executing command: growisofs -dvd-compat -Z ${DEVICE}=${IMAGEFILE}"
      growisofs -dvd-compat -Z ${DEVICE}=${IMAGEFILE}
   fi
fi
    
echo "Finished  at `date`."
