#!/bin/bash -u
#-------------------------------------------------------------------------------
# cdromburn.sh                                   (C) 2003 T.Birnthaler OSTC GmbH
# CDs, DVDs auf verschiedene Arten kopieren/brennen.
#-------------------------------------------------------------------------------
# Folgende (symbolischen) Links auf dieses Skript anlegen, um das Brennen von
# CDROMs auf verschiedene Arten zu ermöglichen:
# * cd2cd.sh:       Direkt-Kopie einer Daten-CDROM
# * dvd2dvd.sh:     Direkt-Kopie einer Daten-DVD
# * img2cd.sh:      Kopie eines Daten-CDROM-Images
# * img2dvd.sh:     Kopie eines Daten-DVD-Images
# * dir2cd.sh:      Verzeichnis auf Daten-CDROM brennen
# * dir2dvd.sh:     Verzeichnis auf Daten-DVD brennen
# * file2cd.sh:     Dateiliste auf Daten-CDROM brennen
# * file2dvd.sh:    Dateiliste auf Daten-DVD brennen
# * audio2cd.sh:    Direkt-Kopie einer Audio-CD
# * audiodir2cd.sh: Kopie eines Audio-CD-Verzeichnisses
# * video2video:    Direkt-Kopie einer Video-CDROM (cdrdao)
# * img2video:      Kopie einer Video-CDROM-Images (cdrdao)
#------------------------------------------------------------------------------
# TODO:
# * -dao macht Mist (zählt nicht hoch, CD unbrauchbar), nur für Audio-CDs?
# * Vorher testen, ob genug Platz im Verzeichnis TMPDIR verfügbar ist
#------------------------------------------------------------------------------
clear

# Man muss zum Brennen root sein
[ "$UID" != 0 ] && echo 'Vorher root werden!!!' && exit

# Programme (alte + neue Variante)
 CDRECORD=wodim
 CDRECORD=cdrecord
DVDRECORD=cdrecord-dvd
DVDRECORD=wodim
DVDRECORD=cdrecord
  MKISOFS=genisoimg
  MKISOFS=mkisofs
 CDDA2WAV=icedax
 CDDA2WAV=cdda2wav
    EJECT=eject
       DD=dd

# Konstanten (anpassen!)
           DBG="1"
           DBG=
        TMPDIR="/data"
        TMPDIR="/data/burn/"
        TMPDIR="/tmp/burn/"
        TMPDIR="/s101/burn/"
         CDROM="/dev/cdrom"
        DVDROM="/dev/dvd"
         IMAGE="$TMPDIR/image.cd"
         AUDIO="$TMPDIR/audio.cd"
         SPEED="24"
         SPEED="8"
        DEVICE="0,0,0"
        DEVICE="/dev/hdc"
        DEVICE="/dev/scd0"
         LOCAL="/img"

# CD-ROM record options (evtl. anpassen!)
 DATACDRECOPTS="-v -dao driveropts=burnfree dev=$DEVICE speed=$SPEED" # or burnproof
 DATACDRECOPTS="-v      driveropts=burnfree dev=$DEVICE speed=$SPEED" # or burnproof
AUDIOCDRECOPTS="-v      driveropts=burnfree dev=$DEVICE speed=$SPEED" # or burnproof
DATADVDRECOPTS="-v -dao driveropts=burnfree dev=$DEVICE speed=$SPEED" # or burnproof
DATADVDRECOPTS="-v      driveropts=burnfree dev=$DEVICE speed=$SPEED" # or burnproof
# -r=Rock Ridge (UNIX), -J=Joliet (Windows), -L=31 Zeichen-Namen, -l=.-Namen erlauben, -V-Vol-ID
     MKISOOPTS="-r -J -l -L -V"
     MKISOOPTS="-r -J -l -allow-leading-dots -V"

# Verzeichnis fuer Image anlegen + leeren
[ -e $TMPDIR ] && rm -r $TMPDIR
[ -e $TMPDIR ] || mkdir -p $TMPDIR

#-------------------------------------------------------------------------------
# Genuegend Speicherplatz fuer CD/DVD-Image vorhanden?
#-------------------------------------------------------------------------------
function chkspace()
{
	if [ -e "$1" ]
	then
		NEED=$(du -ks $1 | awk '{print $1}')
	else
		NEED="$1"
	fi
	echo "'$NEED' KByte free space needed"

	FREE=$(df -k $TMPDIR | awk 'NR == 2 {print $4}')
	echo "'$FREE' KByte free space on '$TMPDIR'"

	if [ $FREE -lt "$NEED" ]
	then
		echo "ERROR: not enough space $NEED free (just $FREE)"
		exit
	fi
}

#-------------------------------------------------------------------------------
# Daten-CDROM kopieren (Image einlesen und wieder brennen)
#-------------------------------------------------------------------------------
function cd2cd()
{
	echo 'Daten-CD kopieren, lese CD ein'
	chkspace 800000
	$DD if=$CDROM of=$IMAGE
	$EJECT $CDROM
	read -n 1 -p 'Bitte leere CD einlegen '
	$CDRECORD $DATACDRECOPTS -data $IMAGE
	$EJECT $CDROM
}

#-------------------------------------------------------------------------------
# Daten-CDROM kopieren (Image einlesen und wieder brennen)
#-------------------------------------------------------------------------------
function dvd2dvd()
{
	echo 'Daten-DVD kopieren, lese DVD ein'
	chkspace 5000000
	$DD if=$CDROM of=$IMAGE
	$EJECT $CDROM
	read -n 1 -p 'Bitte leere DVD einlegen '
	$DVDRECORD $DATADVDRECOPTS -data $IMAGE
	$EJECT $DVDROM
}

#-------------------------------------------------------------------------------
# CDROM-Image brennen (bereits auf Festplatte)
#-------------------------------------------------------------------------------
function img2cd()
{
	[ $# -gt 0 ] && IMAGE=$1
	if [ ! -e "$IMAGE" ]
	then
		echo "Image '$IMAGE' existiert nicht"
	else
		chkspace $IMAGE
		echo "Image '$IMAGE' auf CD brennen"
		$CDRECORD $DATACDRECOPTS -data $IMAGE
		$EJECT $CDROM
	fi
}

#-------------------------------------------------------------------------------
# DVD-Image brennen (bereits auf Festplatte)
#-------------------------------------------------------------------------------
function img2dvd()
{
	[ $# -gt 0 ] && IMAGE=$1
	if [ ! -e "$IMAGE" ]
	then
		echo "Image '$IMAGE' existiert nicht"
	else
		chkspace $IMAGE
		echo "Image '$IMAGE' auf DVD brennen"
		$DVDRECORD $DATADVDRECOPTS -data $IMAGE
		$EJECT $DVDROM
	fi
}

#-------------------------------------------------------------------------------
# Verzeichnis auf CDROM brennen (Volumename = Verzeichnisname)
#-------------------------------------------------------------------------------
function dir2cd()
{
	[ $# -ne 1 ] && echo "Verzeichnis-Parameter fehlt"       && exit
	[ ! -d $1 ]  && echo "'$1' ist kein Verzeichnis" && exit
	pushd $1 > /dev/null
	[ $? != 0 ] && echo "cannot change to dir '$1'" && exit
	chkspace $1
	VOLNAME=$(pwd)
	VOLNAME=$(basename "$VOLNAME")
	echo "Verzeichnis '$VOLNAME' auf CD brennen"
	$MKISOFS $MKISOOPTS "$VOLNAME" -o $IMAGE "."
	$CDRECORD $DATACDRECOPTS -data $IMAGE
	$EJECT $CDROM
	popd > /dev/null
}

#-------------------------------------------------------------------------------
# Verzeichnis auf DVD brennen (Volumename = Verzeichnisname)
#-------------------------------------------------------------------------------
function dir2dvd()
{
	[ $# -ne 1 ] && echo "Verzeichnis-Parameter fehlt"       && exit
	[ ! -d $1 ]  && echo "'$1' ist kein Verzeichnis" && exit
	pushd $1 > /dev/null
	[ $? != 0 ] && echo "cannot change to dir '$1'" && exit
	chkspace $1
	VOLNAME=$(pwd)
	VOLNAME=$(basename "$VOLNAME")
	echo "Verzeichnis '$VOLNAME' auf DVD brennen"
	$MKISOFS $MKISOOPTS "$VOLNAME" -o $IMAGE "."
	echo "$DVDRECORD $DATADVDRECOPTS -data $IMAGE"
	$DVDRECORD $DATADVDRECOPTS -data $IMAGE
	$EJECT $DVDROM
	popd > /dev/null
}

#-------------------------------------------------------------------------------
# Datei auf CDROM brennen (Volumename = 1. Dateiname)
#-------------------------------------------------------------------------------
function file2cd()
{
	[ $# -eq 0 ] && echo 'Datei-Parameter fehlt' && exit
	# Max. 32 Zeichen als Volume-Label erlaubt
	VOLNAME=$(basename "$1" | cut -c1-32)
	chkspace $1
	echo "Datei(en) '$1' auf CD brennen"
	$MKISOFS $MKISOOPTS "$VOLNAME" -o $IMAGE "$@"
	$CDRECORD $DATACDRECOPTS -data $IMAGE
	$EJECT $CDROM
}

function file2dvd()
{
	[ $# -eq 0 ] && echo 'Datei-Parameter fehlt' && exit
	VOLNAME=$(basename "$1")
	chkspace $1
	echo "Datei(en) '$1' auf DVD brennen"
	$MKISOFS $MKISOOPTS "$VOLNAME" -o $IMAGE "$@"
	$DVDRECORD $DATADVDRECOPTS -data $IMAGE
	$EJECT $DVDROM
}

#-------------------------------------------------------------------------------
# Audio-CD lesen und brennen
#-------------------------------------------------------------------------------
function audio2cd()
{
	echo 'Audio-CD kopieren, lese CD ein'
	[ -e $AUDIO ] && rm -rf $AUDIO 2> /dev/null
	mkdir $AUDIO
	chkspace 800000
	pushd $AUDIO > /dev/null
	[ $? != 0 ] && echo "cannot change to dir '$AUDIO'" && exit
	$CDDA2WAV -v255 -D$DEVICE -B -Owav
	$EJECT $CDROM
	read -n 1 -p 'Bitte leere CD einlegen '
	$CDRECORD $AUDIOCDRECOPTS -useinfo *.wav
	$EJECT $CDROM
	popd > /dev/null
}

#-------------------------------------------------------------------------------
# Audio-CD brennen (Verzeichnis bereits auf Festplatte)
#-------------------------------------------------------------------------------
function audiodir2cd()
{
	[ $# -ne 1 ] && echo "Verzeichnis-Parameter fehlt"       && exit
	[ ! -d $1 ]  && echo "'$1' ist kein Verzeichnis" && exit
	pushd $1 > /dev/null
	[ $? != 0 ] && echo "cannot change to dir '$1'" && exit
	chkspace $1
	VOLNAME=$(basename "$1")
	echo "Audio-Verzeichnis '$VOLNAME' auf CD brennen"
	$CDRECORD $AUDIOCDRECOPTS -useinfo *.wav
	$EJECT $CDROM
	popd > /dev/null
}

#-------------------------------------------------------------------------------
# Video-CD kopieren (Image und TOC-Datei liegenlassen)
#-------------------------------------------------------------------------------
function video2video()
{
	pushd $TMPDIR > /dev/null
	[ $? != 0 ] && echo "cannot change to dir '$TMPDIR'" && exit
	chkspace 800000
	echo "Video-CD kopieren"
	$CDRDAO copy --device $DEVICE --keepimage
	$EJECT $CDROM
	popd > /dev/null
}


#-------------------------------------------------------------------------------
# Video-CD mit Image beschreiben (TOC-Datei notwendig)
#-------------------------------------------------------------------------------
function img2video()
{
	pushd $TMPDIR > /dev/null
	[ $? != 0 ] && echo "cannot change to dir '$TMPDIR'" && exit
	echo "Image auf Video-CD kopieren"
	$CDRDAO write --device $DEVICE cd*.toc
	$EJECT $CDROM
	popd > /dev/null
}

#-------------------------------------------------------------------------------
# Für Debug-Zwecke (erfolgt der richtige Aufruf?)
#-------------------------------------------------------------------------------
if [ "$DBG" ]; then
	function cd2cd()       { echo "cd2cd"; }
	function dvd2dvd()     { echo "dvd2dvd"; }
	function img2cd()      { echo "img2cd"; }
	function img2dvd()     { echo "img2dvd"; }
	function dir2cd()      { echo "dir2cd"; }
	function dir2dvd()     { echo "dir2dvd"; }
	function file2cd()     { echo "file2cd"; }
	function file2dvd()    { echo "file2dvd"; }
	function audio2cd()    { echo "audio2cd"; }
	function audiodir2cd() { echo "audiodir2cd"; }
	function video2video() { echo "video2video"; }
	function img2video()   { echo "img2video"; }
fi

# Trick: Aufruf der gewünschten Funktion (Name ohne Pfad davor + ".sh" dahinter)
[ "$DBG" ] && echo "AUFRUF: $(basename $0 .sh)" "$@"
$(basename "$0" .sh) "$@"

