#!/bin/sh # Write files/directories on CD or DVD # Load configuration informations about device . /etc/sysconfig/cdrecord # Maximum size in Mbytes CD_MEDIA_SIZE=700 DVD_MEDIA_SIZE=4400 GROWISOFS_OPTS="-dvd-compat" # Try to read ATIP infos for CD disks to estimate capacity... MEDIA_ATIP_INFOS=$(cdrecord dev=${MEDIA_DEV} -atip 2>&1) if echo ${MEDIA_ATIP_INFOS} | grep -q "ATIP info from disk"; then MEDIA_SIZE=${CD_MEDIA_SIZE} MEDIA_TYPE="CD" echo "CD disk detected" elif echo ${MEDIA_ATIP_INFOS} | grep -q "Found DVD media but"; then MEDIA_SIZE=${DVD_MEDIA_SIZE} MEDIA_TYPE="DVD" echo "DVD disk detected" elif echo ${MEDIA_ATIP_INFOS} | grep -q "cdrecord: No disk / Wrong disk"; then echo "No disk inserted, aborting" exit 1 else echo "Unable to determine disk capacity, aborting" exit 1 fi echo "Disk capacity is ${MEDIA_SIZE} Mbytes" BKP_TMP_DIR=${BKP_TMP_DIR:-"/tmp"} TMP_FILE="${BKP_TMP_DIR}/media-write-file$$" TMP_MOUNT="${BKP_TMP_DIR}/media-write-mount$$" print_usage() { echo "Usage: $(basename $0) files..." } evaluate_retval() { last_error=$? if [ ${last_error} -ne 0 ]; then exit ${last_error} fi } if [ $# = 0 ]; then print_usage exit 1 fi FILES_SIZE="0" FILES_WRITE_LIST=${*} for file in ${FILES_WRITE_LIST}; do if [ -d ${file} -o -f ${file} ]; then FILES_SIZE=$(expr ${FILES_SIZE} + `du -m ${file} -s | sed 's/\([0-9]*\).*/\1/g'`) else echo "$0: Directory or file ${file} not found." print_usage exit 1 fi done echo "Total size of files to backup is ${FILES_SIZE}Mbytes" # The ext2 filesystem is not as space-efficient as the reiser filesystem, # so we must add a few megabytes... FILES_SIZE=`expr $FILES_SIZE + 20` if [ ${FILES_SIZE} -gt ${MEDIA_SIZE} ]; then echo "Total size is greater than media capacity, aborting" exit 1 #####FILES_SIZE=${MEDIA_SIZE} fi # Create an empty file of $FILES_SIZE dd if=/dev/zero of=${TMP_FILE} bs=1024k count=${FILES_SIZE} if [ $? -ne 0 ]; then echo "Error while creating empty file..." rm -f ${TMP_FILE} exit 1 fi # Create an extended-2 filesystem on this file echo y | /sbin/mke2fs -m 0 -b 2048 ${TMP_FILE} if [ $? -ne 0 ]; then echo "Error creating file system on empty file..." rm -f ${TMP_FILE} exit 1 fi # Mount this empty file through the loopback device. mkdir -p ${TMP_MOUNT} mount -o loop -t ext2 ${TMP_FILE} ${TMP_MOUNT} if [ $? -ne 0 ]; then echo "Error mounting empty file..." rm -f ${TMP_FILE} rm -rf $TMP_MOUNT exit 1 fi # Removing lost+found directory rmdir ${TMP_MOUNT}/lost+found # Copy files to $TMP_MOUNT and umount it afterwards. echo "Copying files..." cp -a --parents ${FILES_WRITE_LIST} ${TMP_MOUNT} if [ $? -ne 0 ]; then echo "Error while copying files..." umount ${TMP_MOUNT} rm -rf ${TMP_MOUNT} rm -f ${TMP_FILE} exit 1 fi umount ${TMP_MOUNT} echo Press any key to burn files read #*************************************************** # Burning... #*************************************************** case "${MEDIA_TYPE}" in CD) cdrecord ${CDRECORD_OPTS} dev=${MEDIA_DEV} -data ${TMP_FILE} || exit 1 ;; DVD) growisofs ${GROWISOFS_OPTS} -Z /dev/dvd=${TMP_FILE} || exit 1 ;; *) echo "Unknown removable media type, aborting" exit 1 ;; esac # Mounting the media to verify burned capacity if ! grep -q ${MEDIA_DEV} /etc/mtab; then mount ${MEDIA_DEV} ${MEDIA_DIR} || exit 1 fi FILES_SIZE=$(du -m ${MEDIA_DIR} -s | sed 's/\([0-9]*\).*/\1/g') echo "Total size of files backed-up is ${FILES_SIZE}Mbytes" umount ${MEDIA_DIR} rmdir ${TMP_MOUNT} rm -f ${TMP_FILE} exit $?