]> git.wh0rd.org - home.git/blobdiff - .bin/backup-dvd
crostini-vapier-setup: helper for setting up new installs
[home.git] / .bin / backup-dvd
index a4dfdab68b2e9620283ec2cbc895163bcd1b27e1..d5b9d79ddb0fc2b7a43d6ac44a565d1e5df9f252 100755 (executable)
@@ -11,6 +11,7 @@ usage() {
         -n <volume name>    Defaults to volume on disk
 
        Commands:
+        --errors   Image the raw disc first w/ddrescue
         --backup   Back up the disc
         --modify   Tweak runtime settings (needs -n)
         --mkiso    Create an iso (needs -n)
@@ -25,8 +26,9 @@ out=${PWD}
 vol=
 
 unset doit_{backup,modify,mkiso}
+doit_errors=false
 
-eval set -- `getopt -l backup,modify,mkiso -- hi:n:o: "$@"`
+eval set -- `getopt -l errors,backup,modify,mkiso -- hi:n:o: "$@"`
 while [[ -n $1 ]] ; do
        case $1 in
                -h) usage;;
@@ -34,6 +36,7 @@ while [[ -n $1 ]] ; do
                -o) out=$2; shift 2;;
                -n) vol=$2; shift 2;;
 
+               --errors) doit_errors=true; shift;;
                --backup) doit_backup=true; shift;;
                --modify) doit_modify=true; shift;;
                --mkiso)  doit_mkiso=true;  shift;;
@@ -98,19 +101,37 @@ e() {
        "$@"
 }
 
+#
+# Mirror the disc w/ddrescue which tolerates errors.
+#
+raw_read_dvd() {
+       echo "Imaging disc"
+       local raw=".${Volume}.raw"
+       local log="${raw}.log"
+       local opts=(
+               -v -b 2048 ${dev} "${raw}" "${log}"
+       )
+       ddrescue -p -n "${opts[@]}"
+       ddrescue -d -r 3 "${opts[@]}"
+       ddrescue -d -r 3 -R "${opts[@]}"
+       dev=${raw}
+}
+
 #
 # Backup the disc.
 #
-opts=(
-       -i ${dev}
-       -o "${out}"
-       -n "${Volume}"
-)
 backup_dvd() {
        echo "Backing up: ${Volume}"
+       local opts=(
+               -i ${dev}
+               -o "${out}"
+               -n "${Volume}"
+       )
+       sync
        if ! e dvdbackup -M "${opts[@]}" ; then
                e dvdbackup -F "${opts[@]}" || exit 1
        fi
+       sync
 }
 
 #
@@ -167,7 +188,7 @@ check_changes() {
        local file=$1
        ./ifodump -f "${file}.bak" > "${file}.bak.dmp"
        ./ifodump -f "${file}" > "${file}.dmp"
-       diff -u "${file}.bak.dmp" "${file}.dmp" | sed -e 1d -e 2d > "${file}.diff"
+       vapier-diff "${file}.bak.dmp" "${file}.dmp" | sed -e 1d -e 2d > "${file}.diff"
        local out=$(
                grep '^[+-]' "${file}.diff" | \
                        grep -v \
@@ -298,6 +319,11 @@ modify_dvd() {
        local out_vts_dir="${out}/${Volume}/VIDEO_TS"
        local vmgi vtsi
 
+       if ${doit_errors} ; then
+               echo "skipping modifications due to possible errors in files"
+               return
+       fi
+
        for vmgi in "${out_vts_dir}"/VIDEO_TS.{IFO,BUP} ; do
                process_vmgi "${vmgi}"
                check_changes "${vmgi}" || exit 1
@@ -333,10 +359,15 @@ mkiso_dvd() {
        ) > "${sh}"
        chmod a+x "${sh}"
        "${sh}" || exit
+       sync
+       md5sum "${out}/${Volume}.iso" > "${out}/${Volume}.md5"
 
        du -h "${out}/${Volume}.iso"
+       sudo chattr +i "${out}/${Volume}.iso"
+       sync
 }
 
+${doit_errors} && raw_read_dvd
 ${doit_backup} && backup_dvd
 ${doit_modify} && modify_dvd
 ${doit_mkiso} && mkiso_dvd