Automated CD Burning using AutoMount
One recent project for my employer was to create a headless (pc with no keyboard, mouse, or monitor) CD burner that automagically detects an inserted flash card, renames the files, and burns them to a CD along with a Flash Projector application that plays the images on PC's or Mac's.
My solution was to use the AutoFS automounter daemon, and shell scripts. Much of the scripting ideas borrowed heavily from the BashBurn project.
The hardware used was commodity workstations, and a 9-in-one flashcard reader configured as a SCSI device. See the following articles for interesting info: http://www.grack.com/news/2003/Atech9-in-1CardReader.html http://www.cs.sfu.ca/~ggbaker/personal/cf-linux
The file test.sh is run by cron every 20 seconds, piping the command through sleep:
* * * * * root sleep 0; /usr/local/copydisk/test.sh && sleep 20; /usr/local/copydisk/test.sh && sleep 40; /usr/local/copydisk/test.shTest.sh contents:
#!/bin/bash if [ -f /usr/local/copydisk/cd.pid ];then echo "We are running..." exit else echo "Not running...better check the drives..." /usr/local/copydisk/copydisk.sh fi
All that does is check for a pid, so we don't get too many running copies of our copying script, copydisk.sh:
#!/bin/bash touch /usr/local/copydisk/cd.pid export CONFFILE="/usr/local/copydisk/burnrc" export ROOTDIR="$(cat ${CONFFILE} | grep -v '^#' | grep ROOTDIR: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]//g")" export ROOTDIR="${ROOTDIR%*/}" export CDROM="$(cat ${CONFFILE} | grep -v '^#' | grep CDROM: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]//g")" export CDMNT="$(cat ${CONFFILE} | grep -v '^#' | grep CDMNT: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]//g")" export CDWRITER="$(cat ${CONFFILE} | grep -v '^#' | grep CDWRITER: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]//g")" export SPEED="$(cat ${CONFFILE} | grep -v '^#' | grep SPEED: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]//g")" export BLANKING="$(cat ${CONFFILE} | grep -v '^#' | grep BLANKING: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]//g")" export BURNDIR="$(cat ${CONFFILE} | grep -v '^#' | grep BURNDIR: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]//g")" export WORKDIR="$(cat ${CONFFILE} | grep -v '^#' | grep WORKDIR: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]//g")" export RUNDIR="$(cat ${CONFFILE} | grep -v '^#' | grep RUNDIR: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]//g")" export BURNDIR="${BURNDIR%*/}" # additional information for the CD: export LABEL="$(cat ${CONFFILE} | grep -v '^#' | grep LABEL: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]*//g")" export COPYRIGHT="$(cat ${CONFFILE} | grep -v '^#' | grep COPYRIGHT: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]*//g")" export DESCRIPTION="$(cat ${CONFFILE} | grep -v '^#' | grep DESCRIPTION: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]*//g")" export AUTHOR="$(cat ${CONFFILE} | grep -v '^#' | grep AUTHOR: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]*//g")" export PUBLISHER="$(cat ${CONFFILE} | grep -v '^#' | grep PUBLISHER: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]*//g")" export NAMEOFPACKAGE="$(cat ${CONFFILE} | grep -v '^#'| grep NAMEOFPACKAGE: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]*//g")" export NUMBEROFCDS="$(cat ${CONFFILE} | grep -v '^#' | grep NUMBEROFCDS: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]*//g")" export CURRENTNUMBER="$(cat ${CONFFILE} | grep -v '^#' | grep CURRENTNUMBER: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]*//g")" # some advanced options: export NORMALIZE="$(cat ${CONFFILE} | grep -v '^#' | grep NORMALIZE: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]*//g")" export OPT_ONE="$(cat ${CONFFILE} | grep -v '^#' | grep OPT_ONE: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]*//g")" export FIFODIR="$(cat ${CONFFILE} | grep -v '^#' | grep FIFODIR: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]*//g")" export OVERBURN="$(cat ${CONFFILE} | grep -v '^#' | grep OVERBURN: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]*//g")" # voice rendering export BURNF="$(cat ${CONFFILE} | grep -v '^#' | grep BURNF: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]*//g")" export BURNS="$(cat ${CONFFILE} | grep -v '^#' | grep BURNS: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]*//g")" export COPYI="$(cat ${CONFFILE} | grep -v '^#' | grep COPYI: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]*//g")" export COPYM="$(cat ${CONFFILE} | grep -v '^#' | grep COPYM: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]*//g")" export CALLS="$(cat ${CONFFILE} | grep -v '^#' | grep CALLS: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]*//g")" export TOOBIG="$(cat ${CONFFILE} | grep -v '^#' | grep TOOBIG: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]*//g")" export TMPJPG="$(cat ${CONFFILE} | grep -v '^#' | grep TMPJPG: | cut -d ":" -f 2- | sed -e "s/^[[:blank:]]*//g")" SDA="/misc/sda" SDB="/misc/sdb" SDC="/misc/sdc" SDD="/misc/sdd" SDE="/misc/sde" SDF="/misc/sdf" SDG="/misc/sdg" SDH="/misc/sdh" FIND="/usr/bin/find" IMAGES="( -iname *.jpg -o -iname *.tif )" MOVIES="( -iname *.avi -o -iname *.mpg -o -iname *.mpeg -o -iname *.mp3 -o -iname *.wav -o -iname *.mov )" # Test for files... # /dev/sda1 # Find all jpg's and tif's SDAFILES=`$FIND $SDA $IMAGES` # Set our counter to 0 FCNT=0 # Count the number of images found for i in $SDAFILES; do FCNT=`expr $FCNT + 1` done # If we have more than one picture, copy them if [ $FCNT -gt 0 ]; then # Keep track of what had files on it touch ${WORKDIR}/mount/sda echo $COPYI | festival --tts echo "Copying files from SDA..." cd ${WORKDIR}/temp for F in $SDAFILES; do echo "Copying $F to ${WORKDIR}/temp" cp $F ./ done # Find any extra movie files, or audio files SDAMOV=`$FIND $SDA $MOVIES` MCNT=0 for i in $SDAMOV; do MCNT=`expr $MCNT + 1` done if [ $MCNT -gt 0 ]; then # Make sure we know we found files if [ ! -e ${WORKDIR}/mount/sda ]; then touch ${WORKDIR}/mound/sda fi echo $COPYM | festival --tts cd ${BURNDIR} for M in $SDAMOV; do echo "Copying $M to ${BURNDIR}." cp $M ./ done fi #// end movie/audio copy fi # /dev/sdb1 SDBFILES=`$FIND $SDB $IMAGES` FCNT=0 for i in $SDBFILES; do FCNT=`expr $FCNT + 1` done if [ $FCNT -gt 0 ]; then touch ${WORKDIR}/mount/sdb echo $COPYI | festival --tts echo "Copying files from SDB..." cd ${WORKDIR}/temp for F in $SDBFILES; do echo "Copying $F to ${WORKDIR}/temp" cp $F ./ done # Find any extra movie files, or audio files SDBMOV=`$FIND $SDB $MOVIES` MCNT=0 for i in $SDBMOV; do MCNT=`expr $MCNT + 1` done if [ $MCNT -gt 0 ]; then if [ ! -e ${WORKDIR}/mount/sdb ]; then touch ${WORKDIR}/mount/sdb fi echo $COPYM | festival --tts cd ${BURNDIR} for M in $SDBMOV; do echo "Copying $M to ${BURNDIR}." cp $M ./ done fi #// end movie/audio copy fi # /dev/sdc1 SDCFILES=`$FIND $SDC $IMAGES` FCNT=0 for i in $SDCFILES; do FCNT=`expr $FCNT + 1` done if [ $FCNT -gt 0 ]; then touch ${WORKDIR}/mount/sdc echo $COPYI | festival --tts echo "Copying files from SDC..." cd ${WORKDIR}/temp for F in $SDCFILES; do echo "Copying $F to ${WORKDIR}/temp" cp $F ./ done # Find any extra movie files, or audio files SDCMOV=`$FIND $SDC $MOVIES` MCNT=0 for i in $SDCMOV; do MCNT=`expr $MCNT + 1` done if [ $MCNT -gt 0 ]; then if [ ! -e ${WORKDIR}/mount/sdc ]; then touch ${WORKDIR}/mount/sdc fi echo $COPYM | festival --tts cd ${BURNDIR} for M in $SDCMOV; do echo "Copying $M to ${BURNDIR}." cp $M ./ done fi #// end movie/audio copy fi # /dev/sdd1 # Find all jpg's and tif's, this search is NOT case sensitive SDDFILES=`$FIND $SDD $IMAGES` FCNT=0 for i in $SDDFILES; do FCNT=`expr $FCNT + 1` done if [ $FCNT -gt 0 ]; then touch ${WORKDIR}/mount/sdd echo $COPYI | festival --tts echo "Copying files from SDD..." cd ${WORKDIR}/temp for F in $SDDFILES; do echo "Copying $F to ${WORKDIR}/temp" cp $F ./ done # Find any extra movie files, or audio files SDDMOV=`$FIND $SDD $MOVIES` MCNT=0 for i in $SDDMOV; do MCNT=`expr $MCNT + 1` done if [ $MCNT -gt 0 ]; then if [ ! -e ${WORKDIR}/mount/sdd ]; then touch ${WORKDIR}/mount/sdd fi echo $COPYM | festival --tts cd ${BURNDIR} for M in $SDDMOV; do echo "Copying $M to ${BURNDIR}." cp $M ./ done fi #// end movie/audio copy fi # /dev/sde1 SDEFILES=`$FIND $SDE $IMAGES` FCNT=0 for i in $SDEFILES; do FCNT=`expr $FCNT + 1` done if [ $FCNT -gt 0 ]; then touch ${WORKDIR}/mount/sde echo $COPYI | festival --tts echo "Copying files from SDE..." cd ${WORKDIR}/temp for F in $SDEFILES; do echo "Copying $F to ${WORKDIR}/temp" cp $F ./ done # Find any extra movie files, or audio files SDEMOV=`$FIND $SDE $MOVIES` MCNT=0 for i in $SDEMOV; do MCNT=`expr $MCNT + 1` done if [ $MCNT -gt 0 ]; then if [ ! -e ${WORKDIR}/mount/sde ]; then touch ${WORKDIR}/mount/sde fi echo $COPYM | festival --tts cd ${BURNDIR} for M in $SDEMOV; do echo "Copying $M to ${BURNDIR}." cp $M ./ done fi #// end movie/audio copy fi # /dev/sdf1 SDFFILES=`$FIND $SDF $IMAGES` FCNT=0 for i in $SDFFILES; do FCNT=`expr $FCNT + 1` done if [ $FCNT -gt 0 ]; then touch ${WORKDIR}/mount/sdf echo $COPYI | festival --tts echo "Copying files from SDF..." cd ${WORKDIR}/temp for F in $SDFFILES; do echo "Copying $F to ${WORKDIR}/temp" cp $F ./ done # Find any extra movie files, or audio files SDFMOV=`$FIND $SDF $MOVIES` MCNT=0 for i in $SDFMOV; do MCNT=`expr $MCNT + 1` done if [ $MCNT -gt 0 ]; then if [ ! -e ${WORKDIR}/mount/sdf ]; then touch ${WORKDIR}/mount/sdf fi echo $COPYM | festival --tts cd ${BURNDIR} for M in $SDFMOV; do echo "Copying $M to ${BURNDIR}." cp $M ./ done fi #// end movie/audio copy fi # /dev/sdg1 SDGFILES=`$FIND $SDG $IMAGES` FCNT=0 for i in $SDGFILES; do FCNT=`expr $FCNT + 1` done if [ $FCNT -gt 0 ]; then touch ${WORKDIR}/mount/sdg echo $COPYI | festival --tts echo "Copying files from SDG..." cd ${WORKDIR}/temp for F in $SDGFILES; do echo "Copying $F to ${WORKDIR}/temp" cp $F ./ done # Find any extra movie files, or audio files SDGMOV=`$FIND $SDG $MOVIES` MCNT=0 for i in $SDGMOV; do MCNT=`expr $MCNT + 1` done if [ $MCNT -gt 0 ]; then if [ ! -e ${WORKDIR}/mount/sdg ]; then touch ${WORKDIR}/mount/sdg fi echo $COPYM | festival --tts cd ${BURNDIR} for M in $SDGMOV; do echo "Copying $M to ${BURNDIR}." cp $M ./ done fi #// end movie/audio copy fi # /dev/sdh1 SDHFILES=`$FIND $SDH $IMAGES` FCNT=0 for i in $SDHFILES; do FCNT=`expr $FCNT + 1` done if [ $FCNT -gt 0 ]; then touch ${WORKDIR}/mount/sdh echo $COPYI | festival --tts echo "Copying files from SDH..." cd ${WORKDIR}/temp for F in $SDHFILES; do echo "Copying $F to ${WORKDIR}/temp" cp $F ./ done # Find any extra movie files, or audio files SDHMOV=`$FIND $SDH $MOVIES` MCNT=0 for i in $SDHMOV; do MCNT=`expr $MCNT + 1` done if [ $MCNT -gt 0 ]; then if [ ! -e ${WORKDIR}/mount/sdh ]; then touch ${WORKDIR}/mount/sdh fi echo $COPYM | festival --tts cd ${BURNDIR} for M in $SDHMOV; do echo "Copying $M to ${BURNDIR}." cp $M ./ done fi #// end movie/audio copy fi if [ -f ${WORKDIR}/mount/sda ]; then echo "Something in sda" elif [ -f ${WORKDIR}/mount/sdb ]; then echo "Something in sdb" elif [ -f ${WORKDIR}/mount/sdc ]; then echo "Something in sdc" elif [ -f ${WORKDIR}/mount/sdd ]; then echo "Something in sdd" elif [ -f ${WORKDIR}/mount/sde ]; then echo "Something in sde" elif [ -f ${WORKDIR}/mount/sdf ]; then echo "Something in sdf" elif [ -f ${WORKDIR}/mount/sdg ]; then echo "Something in sdg" elif [ -f ${WORKDIR}/mount/sdh ]; then echo "Something in sdh" else echo "No files to process, removing pid and exiting..." rm -f ${WORKDIR}/po.pid exit fi #Get back into the temp dir cd ${WORKDIR}/temp IMG=`$FIND . -iname '*.jpg' -o -iname '*.tif'` for F in $IMG; do echo "Working on $NAME.$SUFFIX..." # Extract our filenames and types SUFFIX="`expr "$F" : '.*\.\([^./]*\)$'`" NAME="`expr "$F" : '\(.*\)\.[^./]*$' \| "$F"`" # Convert tiffs if [ $SUFFIX == "tif" -o $SUFFIX == "TIF" ]; then echo "$NAME.$SUFFIX will be converted." /usr/bin/tifftopnm -respectfillorder $F > ${WORKDIR}/temp/temp.pnm /usr/bin/pnmtojpeg ${WORKDIR}/temp/temp.pnm > $NAME.jpg rm -f ${WORKDIR}/temp/temp.pnm rm -f $F else echo "$F is a $SUFFIX, it will not be dealt with here." fi done FIMG=`$FIND . -iname '*.jpg'` I=${TMPJPG} for F in $FIMG; do # Rename files I=`expr $I + 1` TMP="image$I.jpg" mv $F $TMP done chmod 666 ${WORKDIR}/temp/* cp -a ${WORKDIR}/template/* ${WORKDIR}/burn cp -a ${WORKDIR}/temp/*.jpg ${WORKDIR}/burn/imgs rm -f ${WORKDIR}/temp/* # check the size of our directory CDSIZE=`du -s ${WORKDIR}/burn | awk '{print $1}'` if [ $CDSIZE -lt 713031680 ]; then cd ${WORKDIR} ${WORKDIR}/burnit.sh --data echo "burning cd..." else echo $TOOBIG | festival --tts exit fi
It sources this file, burnrc:
# location of cd writer: CDWRITER: ATAPI:0,0,0 # location of cdrom device file: CDROM: /dev/cdrom # location od cdrom mount point: CDMNT: /media/cdrom # the speed of your burner: SPEED: 8 # type of blanking BLANKING: disc # where files to be burned are located BURNDIR: /usr/local/copydisk/burn # the working dir WORKDIR: /usr/local/copydisk # number of template jpg's TMPJPG: 0 ######################################### # CD info # ######################################### COPYRIGHT: © CopyDisk DESCRIPTION: Vacation CD AUTHOR: My Vacation CD PUBLISHER: CopyDisk Corp NUMBEROFCDS: 1 CURRENTNUMBER: 1 LABEL: My Vacation - CopyDisk Corp NAMEOFPACKAGE: My Vacation - CopyDisk Corp ################################# # Misc Options # ################################# # use normalize or not. Default is no. NORMALIZE: no # driver options. For example burnsafe or swabaudio. # leave this blank if unsure. default is nothing. OPT_ONE: # whether BashBurn should support overburn. # default is no OVERBURN: no ################################# # Commands # ################################# BURNF: Your CD creation failed. There was either a blank, data, or no CD in the CD tray. Insert a blank CD and try again. BURNS: Your CD was successfully created. Please remove your CD and flash card. COPYI: Your pictures have been found and are being processed. Please do not remove the flash card and CD until you have been prompted. COPYM: Your movies have been found and are being processed. Please do not remove the flash card and CD until you have been prompted. CALLS: There has been an internal error. Please call technical support. TOOBIG: There are too many files on your disk to copy to the CD in one pass. Please edit your card and try again.You can see that the Festival package was used to actually tell the operator that the CD was done...or not, if they did something wrong.
When it gets all the files in the proper order, it calls the burnit.sh script to create the ISO and burn the CD. The burnit.sh script:
#!/bin/bash # Make our disk # This is a function to burn all files in /var/copydisk/burn/ as a data-CD. # if there is an .iso-file in the BURNDIR already, it 'll execute iso_burning # to burn it; if there isn't one, then it'll create an iso and then execute the other function. data_burning() { if [ "$(find ${BURNDIR} -iname '*iso' | sort)" != "" ]; then iso_burning else if eval "mkisofs -r -J -hide-joliet-trans-tbl -copyright \"${COPYRIGHT}\" -A \"${DESCRIPTION}\" -p \"${AUTHOR}\" -P \"${PUBLISHER}\" -volset \"${NAMEOFPACKAGE}\" -volset-size \"${NUMBEROFCDS}\" -volset-seqno \"${CURRENTNUMBER}\" -V \"${LABEL}\" -hfs -map \"${WORKDIR}\"/map -no-desktop -probe --macbin -o \"${BURNDIR}\"/photoopp.iso \"${BURNDIR}\""; then iso_burning else echo $CALLS | festival --tts echo "Something bad happened to the iso creation." rm -rf "${BURNDIR}"/* rm -f ${RUNDIR}/${PID} exit fi fi } # burn the .iso-file in the BURNDIR. iso_burning() { check_overburn # Check if overburn was enabled in configure if cdrecord dev=${CDWRITER} speed=${SPEED} ${OPT_ONE:+"driveropts=$OPT_ONE"} -eject ${OBURN} ${BURNDIR}/photoopp.iso; then # REMOVE AFTER TESTING #if [ -e ${BURNDIR}/photoopp.iso ]; then # mv ${BURNDIR}/photoopp.iso ${WORKDIR}/ # END REMOVE echo "The burn was successful, going to check_tempdel function for system cleanup..." check_tempdel else echo "The burn to CD failed, going to burn_failed function." burn_failed fi } # A function to see if files in temp dir should be deleted after burning is done # and an opportunity to burn more of the same iso check_tempdel() { ALLFILES="( -iname *.jpg -o -iname *.tif -o -iname *.avi -o -iname *.mpg -o -iname *.mpeg -o -iname *.mp3 -o -iname *.wav -o -iname *.mov )" #while true; do # echo "Do ya want another?" # read -t30 TEMP #if [ "$TEMP" == "y" -o "Y" ]; then # TEMP="" # iso_burning #else echo "Cleaning out our burn directory." rm -rf ${BURNDIR}/* rm -rf ${BURNDIR}/.* echo "Done." echo "Checking which drive was mounted..." if [ -e ${WORKDIR}/mount/sda ]; then echo "Removing files from sda..." SDA=`/usr/bin/find /misc/sda $ALLFILES` for F in $SDA; do rm -f $F done echo "Done." rm -f ${WORKDIR}/mount/sda elif [ -e ${WORKDIR}/mount/sdb ] then echo "Removing files from sdb..." SDB=`/usr/bin/find /misc/sdb $ALLFILES` for F in $SDB; do rm -f $F done echo "Done." rm -f ${WORKDIR}/mount/sdb elif [ -e ${WORKDIR}/mount/sdc ] then echo "Removing files from sdc..." SDC=`/usr/bin/find /misc/sdc $ALLFILES` for F in $SDC; do rm -f $F done echo "Done." rm -f ${WORKDIR}/mount/sdc elif [ -e ${WORKDIR}/mount/sdd ] then echo "Removing files from sdd..." SDD=`/usr/bin/find /misc/sdd $ALLFILES` for F in $SDD; do rm -f $F done echo "Done." rm -f ${WORKDIR}/mount/sdd elif [ -e ${WORKDIR}/mount/sde ] then echo "Removing files from sde..." SDE=`/usr/bin/find /misc/sde $ALLFILES` for F in $SDE; do rm -f $F done echo "Done." rm -f ${WORKDIR}/mount/sde elif [ -e ${WORKDIR}/mount/sdf ] then echo "Removing files from sdf..." SDF=`/usr/bin/find /misc/sdf $ALLFILES` for F in $SDF; do rm -f $F done echo "Done." rm -f ${WORKDIR}/mount/sdf elif [ -e ${WORKDIR}/mount/sdg ] then echo "Removing files from sdg..." SDG=`/usr/bin/find /misc/sdg $ALLFILES` for F in $SDG; do rm -f $F done echo "Done." rm -f ${WORKDIR}/mount/sdg elif [ -e ${WORKDIR}/mount/sdh ] then echo "Removing files from sdh..." SDH=`/usr/bin/find /misc/sdh $ALLFILES` for F in $SDH; do rm -f $F done echo "Done." rm -f ${WORKDIR}/mount/sdh fi # write to log file if [ ! -e ${WORKDIR}/log/log.txt ]; then echo "Log file not found...creating it." touch ${WORKDIR}/log/log.txt fi DATE=`date` echo "A successful CD was made on $DATE." >> ${WORKDIR}/log/log.txt echo "Log written." echo $BURNS | festival --tts echo "Removing copydisk PID file." rm -f /usr/local/copydisk/po.pid echo "Exiting program." exit #fi #done } # A function for responding to a cd containing data, or no cd in tray burn_failed() { #while true; do #play ${WORKDIR}/insertcd.wav echo "The burning to cd failed." eject #read -t30 TEMP #if [ "$TEMP" = "y" -o "$TEMP" = "Y" ]; then # TEMP="" # iso_burning #else echo "Cleaning out the burn directory and mount directory." rm -rf ${BURNDIR}/* rm -rf ${BURNDIR}/.* rm -rf ${WORKDIR}/mount/* # write to log file #if [ ! -e ${WORKDIR}/log/errorlog.txt ]; then # touch ${WORKDIR}/log/errorlog.txt #fi #DATE=`date` #echo "A CD failed on $DATE." >> ${WORKDIR}/log/errorlog.txt echo $BURNF | festival --tts echo "Removing copydisk PID file." rm -f /usr/local/copydisk/po.pid echo "Exiting program." exit #fi #done } #This function lets you swap cds if NUMDEV is set to 1 insert_new_CD() { while true; do echo "Insert blank cd and then press enter to go on" read TEMP if [ "$TEMP" = "" ]; then break else continue fi done } # A function to check if overburn is enabled check_overburn() { if [ "${OVERBURN}" = "yes" ]; then # Is overburn enabled? OBURN="-overburn" # yes it was else echo "Not enabling overburn..." # No it wasn't OBURN="" fi } # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = case "$1" in "--data") data_burning ;; "--iso") iso_burning ;; esac
I also found it was necessary to map some file types for Mac, or they wouldn't play the Flash Projector file, since it had no "association" with the Shockwave player. The map:
# EXTN Xlate Creator Type Comment # .1st Ascii 'ttxt' 'TEXT' "Text Readme" .669 Raw 'SNPL' '6669' "669 MOD Music " .8med Raw 'SCPL' 'STrk' "Amiga OctaMed music" .8svx Raw 'SCPL' '8SVX' "Amiga 8-bit sound " .Z Raw 'SITx' 'ZIVU' "Unix Compress Archive " .a Ascii 'ttxt' 'TEXT' "Assembly Source" .aif Raw 'SCPL' 'AIFF' "AIFF Sound" .aifc Raw 'SCPL' 'AIFC' "AIFF Sound Compressed " .aiff Raw 'SCPL' 'AIFF' "AIFF Sound" .al Raw 'SCPL' 'ALAW' "ALAW Sound" .ani Raw 'GKON' 'ANIi' "Animated NeoChrome" .apd Ascii 'ALD3' 'TEXT' "Aldus Printer Description " .appl Raw '????' 'APPL' "Executable file" .arc Raw 'SITx' 'mArc' "PC ARChive" .arj Raw 'DArj' 'BINA' "ARJ Archive" .arr Raw 'GKON' 'ARR ' "Amber ARR image" .art Raw 'GKON' 'ART ' "First Publisher" .asc Ascii 'ttxt' 'TEXT' "ASCII Text" .ascii Ascii 'ttxt' 'TEXT' "ASCII Text" .asf Raw 'Ms01' 'ASF_' "Netshow Player" .asm Ascii 'ttxt' 'TEXT' "Assembly Source" .asx Raw 'Ms01' 'ASX_' "Netshow Player" .au Raw 'TVOD' 'ULAW' "Sun Sound " .avi Raw 'TVOD' 'VfW ' "AVI Movie " .bar Raw 'S691' 'BARF' "Unix BAR Archive" .bas Ascii 'ttxt' 'TEXT' "BASIC Source" .bat Ascii 'ttxt' 'TEXT' "MS-DOS Batch File " .bga Raw 'ogle' 'BMPp' "OS/2 Bitmap" .bib Ascii 'ttxt' 'TEXT' "BibTex Bibliography" .bin Raw 'SITx' 'SIT!' "MacBinary " .binary Raw 'hDmp' 'BINA' "Untyped Binary Data" .bld Raw 'GKON' 'BLD ' "BLD" .bmp Raw 'ogle' 'BMPp' "Windows Bitmap" .boo Ascii 'ttxt' 'TEXT' "BOO encoded" .bst Ascii 'ttxt' 'TEXT' "BibTex Style" .bum Raw 'GKON' '.bMp' "QuickTime Importer(QuickDraw) GraphicConverter" .bw Raw 'GKON' 'SGI ' "SGI Image " .c Ascii 'CWIE' 'TEXT' "C Source" .cel Raw 'GKON' 'CEL ' "KISS CEL" .cgm Raw 'GKON' 'CGMm' "Computer Graphics Meta" .class Raw 'CWIE' 'Clss' "Java Class File" .clp Raw 'GKON' 'CLPp' "Windows Clipboard " .cmd Ascii 'ttxt' 'TEXT' "OS/2 Batch File" .cnf Ascii 'TEXT' 'KiSS' "KISS Config" .com Raw 'SWIN' 'PCFA' "MS-DOS Executable " .cp Ascii 'CWIE' 'TEXT' "C++ Source" .cpp Ascii 'CWIE' 'TEXT' "C++ Source" .cpt Raw 'SITx' 'PACT' "Compact Pro Archive" .csv Ascii 'XCEL' 'TEXT' "Comma Separated Vars" .ct Raw 'GKON' '..CT' "Scitex-CT " .cur Raw 'GKON' 'CUR ' "Windows Cursor" .cut Raw 'GKON' 'Halo' "Dr Halo Image " .cvs Raw 'DAD2' 'drw2' "Canvas Drawing" .cwj Raw 'cwkj' 'CWSS' "ClarisWorks Document" .dat Raw 'GKON' 'TCLl' "TCL image " .dbf Raw 'FOX+' 'COMP' "DBase Document" .dcx Raw 'GKON' 'DCXx' "Some PCX Images" .dif Ascii 'XCEL' 'TEXT' "Data Interchange Format" .diz Ascii 'R*Ch' 'TEXT' "BBS Descriptive Text" .dl Raw 'AnVw' 'DL ' "DL Animation" .dll Raw 'SWIN' 'PCFL' "Windows DLL" .doc Raw 'MSWD' 'WDBN' "Word Document " .dot Raw 'MSWD' 'sDBN' "Word for Windows Template " .dvi Raw 'xdvi' 'ODVI' "TeX DVI Document" .dwt Ascii 'DmWr' 'TEXT' "Dreamweaver Template" .dxf Ascii 'SWVL' 'TEXT' "AutoCAD 3D Data" .eps Raw 'vgrd' 'EPSF' "Postscript" .epsf Raw 'vgrd' 'EPSF' "Postscript" .etx Ascii 'ezVu' 'TEXT' "SEText" .evy Raw 'ENVY' 'EVYD' "Envoy Document" .exe Raw 'SWIN' 'PCFA' "MS-DOS Executable " .faq Ascii 'ttxt' 'TEXT' "ASCII Text" .fit Raw 'GKON' 'FITS' "Flexible Image Transport" .flc Raw 'TVOD' 'FLI ' "FLIC Animation" .fli Raw 'TVOD' 'FLI ' "FLI Animation " .fm Raw 'FMPR' 'FMPR' "FileMaker Pro Database" .for Ascii 'MPS ' 'TEXT' "Fortran Source" .fts Raw 'GKON' 'FITS' "Flexible Image Transport" .gem Raw 'GKON' 'GEM-' "GEM Metafile" .gif Raw 'ogle' 'GIFf' "GIF Picture" .gif Raw 'GIFf' 'MOSS' "GIF Image" .gl Raw 'AnVw' 'GL ' "GL Animation" .grp Raw 'GKON' 'GRPp' "GRP Image " .gz Raw 'SITx' 'SIT!' "Gnu ZIP Archive" .h Ascii 'CWIE' 'TEXT' "C Include File" .hcom Raw 'SCPL' 'FSSD' "SoundEdit Sound ex SOX" .hp Ascii 'CWIE' 'TEXT' "C Include File" .hpgl Raw 'GKON' 'HPGL' "HP GL/2" .hpp Ascii 'CWIE' 'TEXT' "C Include File" .hqx Ascii 'SITx' 'TEXT' "BinHex" .hr Raw 'GKON' 'TR80' "TSR-80 HR " .htm Ascii 'MOSS' 'TEXT' "HyperText " .html Ascii 'MOSS' 'TEXT' "HyperText " .i3 Ascii 'R*ch' 'TEXT' "Modula 3 Interface" .ic1 Raw 'GKON' 'IMAG' "Atari Image" .ic2 Raw 'GKON' 'IMAG' "Atari Image" .ic3 Raw 'GKON' 'IMAG' "Atari Image" .icn Raw 'GKON' 'ICO ' "Windows Icon" .ico Raw 'GKON' 'ICO ' "Windows Icon" .ief Raw 'GKON' 'IEF ' "IEF image " .iff Raw 'GKON' 'ILBM' "Amiga IFF Image" .ilbm Raw 'GKON' 'ILBM' "Amiga ILBM Image" .image Raw 'ddsk' 'dImg' "Apple DiskCopy Image" .img Raw 'GKON' 'IMGg' "GEM bit image/XIMG" .ini Ascii 'ttxt' 'TEXT' "Windows INI File" .iss Raw 'GKON' 'ISS ' "ISS" .java Ascii 'CWIE' 'TEXT' "Java Source File" .jfif Raw 'ogle' 'JPEG' "JFIF Image" .jif Raw 'GKON' 'JIFf' "JIF99a" .jpe Raw 'ogle' 'JPEG' "JPEG Picture" .jpeg Raw 'ogle' 'JPEG' "JPEG Picture" .jpg Raw 'ogle' 'JPEG' "JPEG Picture" .jpg Raw 'JPEG' 'MOSS' "JPEG Image" .latex Ascii 'OTEX' 'TEXT' "Latex " .lbm Raw 'GKON' 'ILBM' "Amiga IFF Image" .lwf Raw 'GKON' 'lwfF' "LuraWave(LWF) " .lzh Raw 'LHA ' 'LARC' "LHA Archive" .m1a Raw 'TVOD' 'MPEG' "MPEG-1 audiostream" .m1s Raw 'TVOD' 'MPEG' "MPEG-1 systemstream" .m1v Raw 'TVOD' 'M1V ' "MPEG-1 IPB videostream" .m2 Ascii 'R*ch' 'TEXT' "Modula 2 Source" .m2v Raw 'MPG2' 'MPG2' "MPEG-2 IPB videostream" .m3 Ascii 'R*ch' 'TEXT' "Modula 3 Source" .mac Raw 'ogle' 'PICT' "PICT Picture" .mak Ascii 'R*ch' 'TEXT' "Makefile" .mbm Raw 'GKON' 'MBM ' "PSION 5(MBM)" .mcw Raw 'MSWD' 'WDBN' "Mac Word Document " .me Ascii 'ttxt' 'TEXT' "Text Readme" .med Raw 'SCPL' 'STrk' "Amiga MED Sound" .mf Ascii '*MF*' 'TEXT' "Metafont" .mid Raw 'TVOD' 'Midi' "MIDI Music" .mid Raw 'Midi' 'ttxt' "MIDI Sequence" .midi Raw 'TVOD' 'Midi' "MIDI Music" .mif Ascii 'Fram' 'TEXT' "FrameMaker MIF" .mime Ascii 'SITx' 'TEXT' "MIME Message" .ml Ascii 'R*ch' 'TEXT' "ML Source " .mod Raw 'SCPL' 'STrk' "MOD Music " .mol Ascii 'RSML' 'TEXT' "MDL Molfile" .moov Raw 'TVOD' 'MooV' "QuickTime Movie" .mov Raw 'TVOD' 'MooV' "QuickTime Movie" .mp2 Raw 'hook' 'MPEG' "MPEG-1 audiostream" .mp3 Raw 'hook' 'MPG3' "MPEG-3 audiostream" .mpa Raw 'hook' 'MPEG' "MPEG-1 audiostream" .mpe Raw 'TVOD' 'MPEG' "MPEG Movie of some sort" .mpeg Raw 'TVOD' 'MPEG' "MPEG Movie of some sort" .mpg Raw 'TVOD' 'MPEG' "MPEG Movie of some sort" .msp Raw 'GKON' 'MSPp' "Microsoft Paint" .mtm Raw 'SNPL' 'MTM ' "MultiMOD Music" .mw Raw 'MWII' 'MW2D' "MacWrite Document " .mwii Raw 'MWII' 'MW2D' "MacWrite Document " .neo Raw 'GKON' 'NeoC' "Atari NeoChrome" .nfo Ascii 'ttxt' 'TEXT' "Info Text " .ngg Raw 'GKON' 'NGGC' "Mobile Phone(Nokia)Format " .nol Raw 'GKON' 'NOL ' "Mobile Phone(Nokia)Format " .nst Raw 'SCPL' 'STrk' "MOD Music " .obj Raw 'SWIN' 'PCFL' "Object (DOS/Windows)" .oda Raw 'ODA ' 'ODIF' "ODA Document" .okt Raw 'SCPL' 'OKTA' "Oktalyser MOD Music" .out Raw 'hDmp' 'BINA' "Output File" .ovl Raw 'SWIN' 'PCFL' "Overlay (DOS/Windows) " .p Ascii 'CWIE' 'TEXT' "Pascal Source " .pac Raw 'GKON' 'STAD' "Atari STAD Image" .pal Raw '8BIM' '8BCT' "Color Table" .pas Ascii 'CWIE' 'TEXT' "Pascal Source " .pbm Raw 'GKON' 'PPGM' "Portable Bitmap" .pc1 Raw 'GKON' 'Dega' "Atari Degas Image " .pc2 Raw 'GKON' 'Dega' "Atari Degas Image " .pc3 Raw 'GKON' 'Dega' "Atari Degas Image " .pcs Raw 'GKON' 'PICS' "Animated PICTs" .pct Raw 'ogle' 'PICT' "PICT Picture" .pcx Raw 'GKON' 'PCXx' "PC PaintBrush " .pdb Ascii 'RSML' 'TEXT' "Brookhaven PDB file" .pdf Raw 'CARO' 'PDF ' "Portable Doc Format" .pdf Raw 'CARO' 'PDF ' "Portable Document Format" .pdx Ascii 'ALD5' 'TEXT' "Printer Description" .pf Raw 'SITx' 'CSIT' "Private File" .pgc Raw 'GKON' 'PGCF' "PGC/PGF Atari Portfolio PCG" .pgm Raw 'GKON' 'PPGM' "Portable Graymap" .pi1 Raw 'GKON' 'Dega' "Atari Degas Image " .pi2 Raw 'GKON' 'Dega' "Atari Degas Image " .pi3 Raw 'GKON' 'Dega' "Atari Degas Image " .pic Raw 'ogle' 'PICT' "PICT Picture" .pics Raw 'GKON' 'PICS' "PICS-PICT Sequence" .pict Raw 'ogle' 'PICT' "PICT Picture" .pit Raw 'SITx' 'PIT ' "PackIt Archive" .pkg Raw 'SITx' 'HBSF' "AppleLink Package " .pl Ascii 'McPL' 'TEXT' "Perl Source" .plt Raw 'GKON' 'HPGL' "HP GL/2" .pm Raw 'GKON' 'PMpm' "Bitmap from xv" .pm3 Raw 'ALD3' 'ALB3' "PageMaker 3 Document" .pm4 Raw 'ALD4' 'ALB4' "PageMaker 4 Document" .pm5 Raw 'ALD5' 'ALB5' "PageMaker 5 Document" .png Raw 'PNG ' 'MOSS' "PNG Image" .png Raw 'ogle' 'PNG ' "Portable Network Graphic" .pntg Raw 'ogle' 'PNTG' "Macintosh Painting" .ppd Ascii 'ALD5' 'TEXT' "Printer Description" .ppm Raw 'GKON' 'PPGM' "Portable Pixmap" .prn Ascii 'R*ch' 'TEXT' "Printer Output File" .ps Ascii 'vgrd' 'TEXT' "PostScript" .psd Raw '8BPS' '8BIM' "Photoshop Image" .psd Raw '8BIM' '8BPS' "PhotoShop Document" .pt4 Raw 'ALD4' 'ALT4' "PageMaker 4 Template" .pt5 Raw 'ALD5' 'ALT5' "PageMaker 5 Template" .pxr Raw '8BIM' 'PXR ' "Pixar Image" .qdv Raw 'GKON' 'QDVf' "QDV image " .qt Raw 'TVOD' 'MooV' "QuickTime Movie" .qxd Raw 'XPR3' 'XDOC' "QuarkXpress Document" .qxt Raw 'XPR3' 'XTMP' "QuarkXpress Template" .raw Raw 'GKON' 'BINA' " Raw Image " .readme Ascii 'ttxt' 'TEXT' "Text Readme" .rgb Raw 'GKON' 'SGI ' "SGI Image " .rgba Raw 'GKON' 'SGI ' "SGI Image " .rib Ascii 'RINI' 'TEXT' "Renderman 3D Data " .rif Raw 'GKON' 'RIFF' "RIFF Graphic" .rle Raw 'GKON' 'RLE ' "RLE image " .rme Ascii 'ttxt' 'TEXT' "Text Readme" .rpl Raw 'REP!' 'FRL!' "Replica Document" .rsc Raw 'RSED' 'rsrc' "Resource File " .rsrc Raw 'RSED' 'rsrc' "Resource File " .rtf Ascii 'MSWD' 'TEXT' "Rich Text Format" .rtx Ascii 'R*ch' 'TEXT' "Rich Text " .s3m Raw 'SNPL' 'S3M ' "ScreamTracker 3 MOD" .scc Raw 'GKON' 'MSX ' "MSX pitcure" .scg Raw 'GKON' 'RIX3' "ColoRIX" .sci Raw 'GKON' 'RIX3' "ColoRIX" .scp Raw 'GKON' 'RIX3' "ColoRIX" .scr Raw 'GKON' 'RIX3' "ColoRIX" .scu Raw 'GKON' 'RIX3' "ColoRIX" .sea Raw '????' 'APPL' "Self-Extracting Archive" .sf Raw 'SDHK' 'IRCM' "IRCAM Sound" .sgi Raw 'ogle' '.SGI' "SGI Image " .sha Ascii 'UnSh' 'TEXT' "Unix Shell Archive" .shar Ascii 'UnSh' 'TEXT' "Unix Shell Archive" .shp Raw 'GKON' 'SHPp' "Printmaster Icon Library" .sit Raw 'SITx' 'SIT!' "StuffIt 1.5.1 Archive " .sithqx Ascii 'SITx' 'TEXT' "BinHexed StuffIt Archive" .six Raw 'GKON' 'SIXE' "SIXEL image" .slk Ascii 'XCEL' 'TEXT' "SYLK Spreadsheet" .smi Raw 'oneb' 'APPL' "Self Mount Image" .snd Raw 'SCPL' 'BINA' "Sound of various types" .spc Raw 'GKON' 'Spec' "Atari Spectrum 512" .sr Raw 'GKON' 'SUNn' "Sun Raster Image" .sty Ascii '*TEX' 'TEXT' "TeX Style " .sun Raw 'GKON' 'SUNn' "Sun Raster Image" .sup Raw 'GKON' 'SCRN' "StartupScreen " .svx Raw 'SCPL' '8SVX' "Amiga IFF Sound" .swf Raw 'SWF2' 'SWFL' "Macromedia Showckwave Flash " .syk Ascii 'XCEL' 'TEXT' "SYLK Spreadsheet" .sylk Ascii 'XCEL' 'TEXT' "SYLK Spreadsheet" .tar Raw 'SITx' 'TARF' "Unix Tape ARchive " .targa Raw 'GKON' 'TPIC' "Truevision Image" .taz Raw 'SITx' 'ZIVU' "Compressed Tape ARchive" .tex Ascii 'OTEX' 'TEXT' "TeX Document" .texi Ascii 'OTEX' 'TEXT' "TeX Document" .texinfo Ascii 'OTEX' 'TEXT' "TeX Document" .text Ascii 'ttxt' 'TEXT' "ASCII Text" .tga Raw 'GKON' 'TPIC' "Truevision Image" .tgz Raw 'SITx' 'Gzip' "Gnu ZIPed Tape ARchive" .tif Raw 'ogle' 'TIFF' "TIFF Picture" .tiff Raw 'ogle' 'TIFF' "TIFF Picture" .tny Raw 'GKON' 'TINY' "Atari TINY Bitmap " .tsv Ascii 'XCEL' 'TEXT' "Tab Separated Values" .tx8 Ascii 'ttxt' 'TEXT' "8-bit ASCII Text" .txt Ascii 'ttxt' 'TEXT' "ASCII Text" .txt Ascii 'TEXT' 'ttxt' "Text Document" .ul Raw 'TVOD' 'ULAW' "Mu-Law Sound" .url Raw 'Arch' 'AURL' "URL Bookmark" .uu Ascii 'SITx' 'TEXT' "UUEncode" .uue Ascii 'SITx' 'TEXT' "UUEncode" .vff Raw 'GKON' 'VFFf' "DESR VFF Greyscale Image" .vga Raw 'ogle' 'BMPp' "OS/2 Bitmap" .voc Raw 'SCPL' 'VOC ' "VOC Sound " .vpb Raw 'GKON' 'VPB ' "VPB QUANTEL" .w51 Raw 'WPC2' '.WP5' "WordPerfect PC 5.1 Doc" .wav Raw 'TVOD' 'WAVE' "Windows WAV Sound " .wbmp Raw 'GKON' 'WBMP' "WBMP" .wk1 Raw 'XCEL' 'XLBN' "Lotus Spreadsheet r2.1" .wks Raw 'XCEL' 'XLBN' "Lotus Spreadsheet r1.x" .wmf Raw 'GKON' 'WMF ' "Windows Metafile" .wp Raw 'WPC2' '.WP5' "WordPerfect PC 5.1 Doc" .wp4 Raw 'WPC2' '.WP4' "WordPerfect PC 4.2 Doc" .wp5 Raw 'WPC2' '.WP5' "WordPerfect PC 5.x Doc" .wp6 Raw 'WPC2' '.WP6' "WordPerfect PC 6.x Doc" .wpg Raw 'GKON' 'WPGf' "WordPerfect Graphic" .wpm Raw 'WPC2' 'WPD1' "WordPerfect Mac" .wri Raw 'MSWD' 'WDBN' "MS Write/Windows" .wve Raw 'SCPL' 'BINA' "PSION sound" .x-face Ascii 'GKON' 'TEXT' "X-Face " .x10 Raw 'GKON' 'XWDd' "X-Windows Dump" .x11 Raw 'GKON' 'XWDd' "X-Windows Dump" .xbm Raw 'GKON' 'XBM ' "X-Windows Bitmap" .xl Raw 'XCEL' 'XLS ' "Excel Spreadsheet " .xlc Raw 'XCEL' 'XLC ' "Excel Chart" .xlm Raw 'XCEL' 'XLM ' "Excel Macro" .xls Raw 'XCEL' 'XLS ' "Excel Spreadsheet " .xlw Raw 'XCEL' 'XLW ' "Excel Workspace" .xm Raw 'SNPL' 'XM ' "FastTracker MOD Music " .xpm Raw 'GKON' 'XPM ' "X-Windows Pixmap" .xwd Raw 'GKON' 'XWDd' "X-Windows Dump" .zip Raw 'SITx' 'ZIP ' "PC ZIP Archive" .zoo Raw 'Booz' 'Zoo ' "Zoo Archive"
This was a great project to work on.
Comments