Определите тип оптического носителя (Audio CD, DVD, blu-ray) с помощью UDEV и скриптов
Я относительно новичок в Linux, сделав переход от Windows к безголовому медиацентру. Я запускаю KODIBuntu.
Я пытаюсь создать автоматизированную систему копирования для резервного копирования моей коллекции носителей. Мне понравилась концепция с linux, которая "если вы можете мечтать о том, что вы можете это сделать".
То, что я хочу достичь, - это то, что диск вставляется в дисковод, а script разрывает содержимое на моем диске.
например, диск вставлен → тип носителя определен → правильное копирование script run
Я использовал множество полезных веб-страниц с помощью поисковых запросов Google для создания скриптов, которые будут выполнять сама работа по копированию. Я проделал кучу чтения и указал на использование "HAL"... Затем я обнаружил, что его функция устарела и заменена udev. Я сделал кучу больше чтения и узнал, как использовать UDEV и создал следующее правило, которое я доказал, связывая напрямую с копированием script
ACTION=="change", SUBSYSTEMS=="scsi", KERNEL=="s[rg][0-9]*", ATTRS{vendor}=="TSSTcorp", MODE="0660", GROUP="optical", RUN+="/home/jlivin25/myscripts/DiscTypeTest.sh"
Я понял, что мне нужен промежуточный script, который будет выполнять "работу", чтобы определить, какой тип оптического носителя. Дальнейшее чтение заставило меня поверить, что мне нужно будет использовать какое-то выражение "IF".
вставлен диск IF
тогда
IF audio cd run rip script 1
IF DVD run rip script 2
IF blu-ray run rip script 3
ELSE no cd вставлен
Я сделал еще несколько поисковых запросов и нашел код в разных местах, в котором используются переменные среды. Однако из дополнительной информации о google кажется, что эти переменные не определены до тех пор, пока не будет указан UDEV?
Мой обычный подход состоит в том, чтобы построить строку кода, запустить в терминале, и если я получу то, что хочу, я поместил все строки в оболочку script?
Код, над которым я работаю в данный момент, приведен ниже. Я, хотя это логически, если бы я мог получить script для вывода того, что, по его мнению, находится в диске для файла/журнала, что половина битвы будет выиграна, и я мог бы просто заменить это для script местоположений, которые будут делать соответствующие ripping task... любые идеи людей о том, почему это не работает, как я хочу?
Я использовал эти страницы для получения информации:
https://pathar.tl/blog/the-ultimate-...pping-machine/
https://askubuntu.com/info/35985...on-of-dvd-disc
вот мой код:
#!/bin/bash
#
set -eu
#
# code below is derived from work by JimVanns, thanks
# https://github.com/jvanns/htpc/blob/master/dsc-trg-q
#
#
###########################################################################
### DEFINE VARIABLES HERE ###
### $HOME DOES NOT NEED DEFINING AS IT SEEMS TO BE BUILT INTO BASH FROM ###
### WHAT POSTS I HAVE READ RELATING TO USING WHAT I THINK ARE UDEV ###
### ENVIRONMENTAL VARIABLES E.G. $ID_CDROM_MEDIA_CD DO NOT APPEAR TO ###
### NEED DEFINING THEMSELVES, ALSO PART OF BASH OR LINUX COMMAND ###
### STRUCTURE CALLED BY BASH? ###
###########################################################################
#
MEDIA=
#
##############################################################################
### LEFT IN SO AS TO ALTER AS LITTLE AS POSSIBLE, I HAVE READ THAT DELAYS ###
### OFTEN IRON OUT KINKS IN CODE, PLUS ALSO FOUND IT USEFULL TO ALLOW A ###
### SMALL DELAY FOR CD-DRIVE TO DO ITS THING AFTER PUTTING DISK IN ###
##############################################################################
#
sleep 2
#
mkdir -p $HOME/myscripts/scriptlogs
#
#
if [ "$ID_CDROM_MEDIA_BD" = "1" ]
then
MEDIA=bluray
(
echo "$MEDIA" >> $HOME/myscripts/scriptlogs/DiscTypeTest.log
) &
if [ "$ID_CDROM_MEDIA_DVD" = "1" ]
then
MEDIA=dvd
(
echo "$MEDIA" >> $HOME/myscripts/scriptlogs/DiscTypeTest.log
) &
elif [ "$ID_CDROM_MEDIA_CD" = "1" ]
then
MEDIA=cdrom
(
echo "$MEDIA" >> $HOME/myscripts/scriptlogs/DiscTypeTest.log
) &
fi
Ответы
Ответ 1
Переменные не установлены нигде.
Обычно это asetting в правиле запуска udev (в /usr/lib/udev/rules.d/
) и выглядит несколько как
# ID_CDROM_MEDIA_BD = Bluray
# ID_CDROM_MEDIA_DVD = DVD
# ID_CDROM_MEDIA_CD = CD
SUBSYSTEM=="scsi", KERNEL=="sr0", ENV{ID_CDROM_MEDIA_BD}=="1", RUN+="/home/user/ripping_script.sh"
Так как udev
заранее не знает о медиа-типе, это вручную устанавливается как переменная среды. Но так как вы хотите автоматически запускать другой script при определенных условиях, это не полезно.
Однако вы можете определить и установить переменные mediatype в ripping script также:
сначала установите cdtool, он может предоставить вам некоторую информацию на аудио CD (с помощью cdir
).
sudo apt-get install cdtool
Добавьте это в начало вашего script:
#!/bin/bash
# ripping_script.sh
CDDVD=`cdir -vd /dev/sr0 2>&1 |grep -q "no_disc" || echo "cd"`
if [ $CDDVD ]; then
ID_CDROM_MEDIA_CD=1
echo "CD detected" >> $HOME/myscripts/scriptlogs/rip.log
else
ID_CDROM_MEDIA_DVD=1
echo "DVD detected" >> $HOME/myscripts/scriptlogs/rip.log
fi
# ... your rippingscript here
/dev/sr0
, скорее всего, ваш cd/dvd.
это только отличает аудиоCD и DVD. У меня нет тестов blu-ray для тестов.
Ответ 2
Решено!
Правило Udev выглядит следующим образом.
# ID_CDROM_MEDIA_BD = Bluray
# ID_CDROM_MEDIA_DVD = DVD
# ID_CDROM_MEDIA_CD = CD
ACTION=="change", SUBSYSTEMS=="scsi", KERNEL=="s[rg][0-9]*", ATTRS{vendor}=="TSSTcorp", ENV{ID_CDROM}=="?*", MODE="0660", GROUP="optical", RUN+="/usr/local/bin/DiscTypeTest3.sh"
и script для запуска сценариев копирования выглядят следующим образом:
#!/bin/bash
# ID_CDROM_MEDIA_BD = Bluray
# ID_CDROM_MEDIA_DVD = DVD
# ID_CDROM_MEDIA_CD = CD
MEDIA=
if [ $ID_CDROM_MEDIA_DVD = "1" ]
then
MEDIA=dvd
(
echo "$MEDIA" >> "/var/log/DiscTypeTest.log"
) &
elif [ $ID_CDROM_MEDIA_CD = "1" ]
then
MEDIA=cdrom
(
echo "$MEDIA" >> "/var/log/DiscTypeTest.log"
) &
fi
(set -o posix ; set) > "/var/log/DiscTypeTestVariables.log"
Это приводит к следующему выходу в файл журнала, когда вставлен аудио компакт-диск, а затем dvd
cdrom
cdrom
dvd
dvd
Замена эхо-линий на путь копирования сценариев должна приводить к автоматической системе без головных уборов
Кредит переходит к Jim Vanns для кода Keith_Helms и blm_ubunet на форумах ubuntu для кода posix и исправлений для операторов if и Ixer здесь для указателей переменных
Надеюсь, что это поможет
Джеймс