#!/bin/sh # $Id$ # # bcd - Backup on CD # My NEC 7800B: 16x10x40 # ПЕРЕМЕННЫЕ ПАРАМЕТРЫ: # 1. SCSI ID устройства. Можно получить по команде: # cdrecord -scanbus devid=0,0,0 # 2. Файл устройства devname=/dev/cdrom # 3. Точка монтирования устройства, прописанная в /etc/fstab mountpoint=/mnt/cdrom # 4. Потолок скорости записи дисков R и RW Rspeed=16 RWspeed=10 # 5. Метод очистки CD-RW blank=fast # 6. Объём FIFO-буфера. Чем больше, тем меньше вероятность прерывания # при записи fifo=8m # 7. Корневая директория на CD, в которую будет запись. Строится # из текущей даты и времени - чтобы избежать идентичности # путей при дописывании. rootdir=`date +%d%m%y-%H.%M` #------------------- tf=/tmp/cdwrite.$$ status=1 paths="" # # РАЗБОР КОМАНДНОЙ СТРОКИ # if [ $# -lt 1 ]; then echo "Usage:" echo echo "$0 [-v] dir1 dir2 ... dirn" exit 1 fi CMD=`getopt -o v -- "$@"` if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi eval set -- "$CMD" while true ; do case "$1" in -v) verify=on shift ;; --) shift ; break ;; esac done doptions="--no-shadow --backtitle \"Запись на компакт-диск\"" for dn in $* ; do if [ -d $dn ]; then paths="$paths $rootdir/$dn=$dn" else eval dialog $doptions --title \"Предупреждение\" \ --msgbox \"$dn не директория и потому записан не будет.\" 7 30 fi done # # ЗАПИСЬ # while eval dialog $doptions --msgbox \"Установите компакт-диск в дисковод \ и нажмите Enter.\" 7 33 ; do cmd="fs=$fifo dev=$devid" rw=`cdrecord -atip dev=$devid 2>/dev/null | grep "Is erasable"` msinfo=`cdrecord -msinfo dev=$devid 2>$tf` newcd=`grep "cdrecord: Cannot read session offset" $tf` if [ -z "$rw" ]; then # диск однократной записи speed=$Rspeed if [ -z "$msinfo" ]; then if [ -n "$newcd" ]; then # еще нетронутая болванка eval dialog $doptions --title Предупреждение \ --yesno \"Диск не перезаписываемый. После выполнения записи на \ него потом можно будет только дописывать данные. Продолжать ?\" 7 50 if [ $? -ne 0 ]; then eject $devname continue else blankmode="c" fi else # уже один раз записан и закрыт для дописывания eject $devname eval dialog $doptions --title Помилка \ --msgbox \"Диск не перезаписываемый и дописывать на нього тоже нельзя.\" 7 50 continue fi else # открыт для дописывания eval dialog $doptions --title Предупреждение \ --yesno \"Диск не перезаписываемый. Дописывать в конец ?\" 7 50 if [ $? -ne 0 ]; then eject $devname continue else blankmode="a" fi fi else # CD-RW speed=$RWspeed if [ -z "$newcd" ]; then # уже что-то записывалось eval dialog $doptions --radiolist \"Диск перезаписываемый.\" \ 10 40 2 \ c \"Стереть старые записи\" on \ a \"Дописать\" off \ 2> $tf if [ $? -ne 0 ]; then continue fi blankmode=`cat $tf` else # первая запись blankmode="c" fi if [ "$blankmode" = "c" ]; then cmd="$cmd blank=$blank" fi fi clear isocmd="-R -D" if [ "$blankmode" = "a" ]; then isocmd="$isocmd -C $msinfo -M $devid" fi size=`mkisofs -print-size -quiet $isocmd -graft-points $paths 2>/dev/null` cmd="$cmd speed=$speed -multi -tsize=${size}s" #echo "mkisofs $isocmd -graft-points $paths" #echo "cdrecord $cmd -v - " #read aaa if [ $UID -eq 0 ]; then # работаем root'ом - поднимем приоритет (меньше вероятность прерывания) if nice --18 mkisofs $isocmd -graft-points $paths 2>/dev/null \ | cdrecord -overburn $cmd -v - 2>$tf ; then status=0 break else break fi else # обычный пользователь - работаем с обычным приоритетом if mkisofs $isocmd -graft-points $paths 2>/dev/null \ | cdrecord $cmd -v - 2>$tf ; then status=0 break else break fi fi done # # ПРОВЕРКА # while [ $status -eq 0 -a "$verify" = "on" ]; do until eject $devname ; do sleep 1 done status=1 eval dialog $doptions --infobox \"Проверка записи, ждите...\" 7 30 mount $mountpoint 2>$tf || break for dn in $* ; do if [ -d $dn ]; then diff -r $dn $mountpoint/$rootdir/$dn >/dev/null 2>$tf status=$? if [ $status -ne 0 ]; then echo "Неудачная проверка директории $dn" >> $tf break fi fi done umount $mountpoint break done if [ $status -eq 0 ]; then eval dialog $doptions --title OK \ --infobox \"Операция успешно завершена.\" 7 30 sleep 1 eject else diag="Ошибка записи. Диагностика: `cat $tf`" eval dialog $doptions --title Ошибка \ --msgbox \"$diag\" 10 60 fi rm -f $tf exit $status