--- flash-writer.sh.orig 2017-09-08 12:40:25.522768514 +0300 +++ flash-writer.sh 2017-09-08 12:36:07.253790563 +0300 @@ -1,11 +1,16 @@ #!/bin/sh # Утилита для копирования файлов-образов (*.iso) на диск /dev/sd* (чаще USB) +# v0.1 +# v0.2 Добавлена обработка файлов /dev/zero, /dev/urandom +# TODO: все сообщения либо по-русски, либо нет ERROR_USAGE=1 -ERROR_FILE_NOT_FOUND=2 -ERROR_DEVICE_NOT_FOUND=3 -ERROR_UNKNOWN_ENVIRONMENT=4 +ERROR_FILE_NOT_FOUND=21 +ERROR_FILE_NOT_ALLOWED=22 +ERROR_FILE_TOO_BIG=23 +ERROR_DEVICE_NOT_FOUND=31 +ERROR_UNKNOWN_ENVIRONMENT=91 if [ $# -ne 2 ]; then echo "Usage: $0 " @@ -28,6 +33,22 @@ exit ${ERROR_FILE_NOT_FOUND} fi +# проверка на специальные файлы и определение размера файла +case "${FILE}" in + "/dev/zero" | \ + "/dev/urandom") + echo "Используется специальный файл ${FILE}" + FILE_SIZE=-1 + ;; + "/dev/"*) + echo "Специальный файл ${FILE} недопустим" + exit ${ERROR_FILE_NOT_ALLOWED} + ;; + *) + FILE_SIZE=$(stat --printf="%s" "${FILE}") + ;; +esac + # проверка устройства # файл устройства существует if [ ! -e "${DEV}" ]; then @@ -39,7 +60,7 @@ if [ ! -b "${DEV}" -a "${DEV}" != "/dev/null" ]; then echo "Device is not special block device" exit ${ERROR_DEVICE_NOT_FOUND} -fi +fi #TODO: проверка на removable и USB case "${DEV}" in @@ -57,18 +78,36 @@ ;; esac +# определение размера блочного устройства +DEV_SIZE=$(blockdev --getsize64 "${DEV}") + +# а влезет ли файл? +if [ ${FILE_SIZE} -gt ${DEV_SIZE} ]; then + echo "This file does not fit to this device" + echo "(filesize=${FILE_SIZE}, devsize=${DEV_SIZE})" + exit ${ERROR_FILE_TOO_BIG} +fi + +# для специальных файлов размер определяется через размер блочного устройства +if [ ${FILE_SIZE} -eq -1 ]; then + echo "Special file has no size, use device size instead" + FILE_SIZE=${DEV_SIZE} +fi + TEXT="Copy '${FILE}' to ${DEV}, please wait..." # определения окружения - мы в консоли или в X-ах case "${TERM}" in "linux") echo "Console edition..." - (pv -n "${FILE}" | dd of=${DEV} bs=1M conv=notrunc,noerror) 2>&1 | + (pv -n -s ${FILE_SIZE} "${FILE}" | + dd of=${DEV} bs=1M conv=notrunc,noerror) 2>&1 | dialog --gauge "${TEXT}" 10 70 0 ;; "xterm") echo "X Server edition..." - (pv -n "${FILE}" | dd of=${DEV} bs=1M conv=notrunc,noerror) 2>&1 | + (pv -n -s ${FILE_SIZE} "${FILE}" | + dd of=${DEV} bs=1M conv=notrunc,noerror) 2>&1 | zenity --progress --auto-kill --auto-close --text="${TEXT}" ;; *) @@ -81,4 +120,4 @@ echo "Sync... " sync # пауза на всякий случай -sleep 3 \ В конце файла нет новой строки +sleep 3