#!/bin/bash # script to help recover/backup optical media # -a for audio cd # requires ddrescue (sometimes packaged as gddrescue) and cdparanoia # usage: cdrec -f mydisc # creates directory named mydisc and starts recovery into it Z_APP=$(echo "${0}" | rev | cut -d'/' -f1 | rev | cut -d'.' -f1) Z_APPPATH=$(dirname "$(realpath "${0}")") source "${Z_APPPATH}/ansihelper.sh" # https://pastebin.com/M44TmzAE function appmsg() { echo "$(str_color green '[')$(str_color cyan "${Z_APP}")$(str_color green ']') ${@}" } function cleanup() { if [ ! -z "${Z_TEMPDIR}" ]; then appmsg "Removing previously created temporary project directory \"${Z_PROJECT}\"" rmdir "${Z_PROJECT_DIR}" 2>/dev/null fi } function apperr() { local exitcode=${1}; shift; appmsg "$(str_color lred '[')$(str_color red ERROR )$(str_color lred ']') ${@}" cleanup exit ${exitcode}; } while getopts "abf:" opts; do case "${opts}" in a) Z_AUDIO=1; shift; ;; b) Z_BROWSE=1; shift; ;; f) Z_PROJECT=${OPTARG}; shift 2; ;; esac done if [ -z "${Z_PROJECT}" ] && [ -z "${Z_BROWSE}" ]; then apperr 1 "Usage: ${Z_APP} [-a] [-b] -f projectname" fi if [ -z "${Z_PROJECT}" ] && [ ! -z "${Z_BROWSE}" ]; then Z_TEMPDIR=1 Z_PROJECT=zdisc appmsg "Using temporary project directory \"${Z_PROJECT}\"" fi Z_PROJECT_DIR="$(realpath "$(dirname "${0}")")/${Z_PROJECT}" if [ ! -d "${Z_PROJECT_DIR}" ]; then appmsg "Creating ${Z_PROJECT_DIR}" mkdir "${Z_PROJECT_DIR}" fi if [ "${Z_AUDIO}" ]; then CMD=(cdparanoia -z -B --) elif [ "${Z_BROWSE}" ]; then Z_NOCD=1 CMDS=3 CMD1=(sudo mount /dev/sr0 "${Z_PROJECT_DIR}") CMD2=(mc "${Z_PROJECT_DIR}") CMD3=(sudo umount "${Z_PROJECT_DIR}") else CMD=(ddrescue -d --sector-size=2048 --retry-passes=-1 "${@}" /dev/sr0 "${Z_PROJECT}.iso" "${Z_PROJECT}.map") fi if [ -z "${Z_NOCD}" ]; then appmsg "Entering ${Z_PROJECT_DIR}" cd "${Z_PROJECT_DIR}" fi if [ ! -z "${CMDS}" ]; then for n in $(seq 1 "${CMDS}"); do Z_CMD=($(eval 'echo ${CMD'$n'[@]}')) appmsg "Executing command ${n} of ${CMDS}: ${Z_CMD[@]}" "${Z_CMD[@]}" Z_EC=$? if [ ${Z_EC} -ne 0 ]; then apperr ${Z_EC} "Command failed with error code ${Z_EC}" fi done else appmsg "Executing command: ${CMD[@]}" "${CMD[@]}" Z_EC=$? fi cleanup