Определите тип оптического носителя (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 здесь для указателей переменных

Надеюсь, что это поможет

Джеймс