Определение типа оптического носителя (Audio CD, DVD, blu-ray) с помощью UDEV и скриптов

Я относительно новичок в Linux, перейдя с Windows на безголовый медиацентр. Я использую KODIBuntu.

Я пытаюсь создать автоматизированную систему копирования для резервного копирования моей коллекции печатных носителей. Мне нравится концепция Linux: «Если вы можете мечтать об этом, вы можете воплотить это в жизнь».

Я стремлюсь добиться того, чтобы диск вставлялся в привод, а сценарий копировал содержимое на мой привод.

например, диск вставлен -> тип носителя определен -> правильный запуск сценария копирования

Я использовал множество полезных веб-страниц через поиск Google, чтобы создать скрипты, которые сами выполнят работу по копированию. Я много читал, и мне указали на использование «HAL»... Затем я обнаружил, что его функция устарела и заменена на udev. Я еще много прочитал и узнал, как использовать UDEV, и создал следующее правило, которое, как я доказал, работает, связав его напрямую со скриптом копирования.

    ACTION=="change", SUBSYSTEMS=="scsi", KERNEL=="s[rg][0-9]*", ATTRS{vendor}=="TSSTcorp", MODE="0660", GROUP="optical", RUN+="/home/jlivin25/myscripts/DiscTypeTest.sh"

Я понял, что мне нужен промежуточный сценарий, который бы выполнял «работу» по определению типа оптического носителя. Дальнейшее чтение привело меня к мысли, что мне нужно будет использовать какое-то выражение «ЕСЛИ».

ЕСЛИ диск вставлен, то, ЕСЛИ аудио компакт-диск, запустите сценарий копирования 1, ЕСЛИ DVD запустите сценарий копирования 2, ЕСЛИ blu-ray запустите сценарий копирования 3, ИНАЧЕ компакт-диск не вставлен

Я еще немного погуглил и нашел код в разных местах, который использует для работы переменные окружения. Однако из дополнительной информации в Google видно, что эти переменные не определены, пока на них не ссылается UDEV?

Мой обычный подход состоит в том, чтобы построить строку кода, запустить в терминале, и если я получу то, что хочу, тогда я соберу все строки вместе в сценарии оболочки?

Код, над которым я работаю, приведен ниже. Я подумал, что логически, если бы я мог заставить скрипт выводить то, что, по его мнению, находится на диске, в файл / журнал, то половина битвы была бы выиграна, и я мог бы просто заменить это местонахождением скрипта, который выполнял бы соответствующую задачу копирования. , есть идеи, почему это не работает так, как я хочу?

Я использовал эти страницы для получения информации от:

вот мой код:

#!/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

person Littlejeem    schedule 30.04.2015    source источник
comment
ссылки не работают.   -  person Alex    schedule 05.05.2015


Ответы (2)


Переменные нигде не заданы.

Обычно это устанавливается в правиле запуска 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 не знает заранее о типе носителя, он задается вручную как переменная среды. Но поскольку вы хотите автоматически запускать другой скрипт при определенных условиях, это бесполезно.

Однако вы также можете определить и установить переменные медиатипа в сценарии копирования:

сначала установите cdtool , он может дать вам некоторую информацию об аудио компакт-дисках (с cdir). sudo apt-get install cdtool

Добавьте это в начало вашего скрипта:

#!/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.

это только различает audioCD и DVD. У меня нет Blu-ray для тестов.

person Alex    schedule 05.05.2015
comment
привет, lxer, большое спасибо, что нашли время ответить. Я обязательно попробую то, что вы предлагаете, чтобы увидеть, даст ли это мне полезный результат, я не сталкивался с cdtool. Придерживаясь моего первого поста, есть идеи, почему переменные среды не работают для меня как есть? или даже как проверить, что не работает? - person Littlejeem; 07.05.2015
comment
переменные окружения не установлены. Я обновил обновленный ответ, чтобы включить его. - person Alex; 08.05.2015
comment
Спасибо, я действительно ценю объяснение ... Я думаю, что начинаю видеть свет в конце туннеля. Это то, что мне нужно немного скорректировать свое мышление, чтобы у меня было три правила udev. Допустим, 80-bluray.rule , 81-dvd.rule и 82-cd.rule затем используйте ваш пример для соответствующего заполнения правил udev. поэтому правило 80 будет SUBSYSTEM=="scsi", KERNEL=="sr0", ENV{ID_CDROM_MEDIA_BD}=="1", RUN+="/home/user/BLURip.sh" правилом 81 будет SUBSYSTEM=="scsi", KERNEL=="sr0", ENV{ID_CDROM_MEDIA_DVD}=="1", RUN+="/home/user/DVDRip.sh" и т.д.. - person Littlejeem; 09.05.2015
comment
да, но нет. Если вы сделаете это, то все 3 правила будут запускаться каждый раз, когда вы вставляете компакт-диск в устройство, а это не то, что вы хотите. (однако, если у вас есть 3 разных выделенных диска, вы можете это сделать, но вам также нужно будет установить sr0, sr1, sr2). Просто поместите мой код в начало вашего скрипта, тогда будет установлена ​​правильная переменная для медиатипа (ID_CDROM_MEDIA_DVD или ID_CDROM_MEDIA_CD). - person Alex; 10.05.2015
comment
ааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааатак11затемостальногоскрипта с закомментированными переменными, чтобы убедиться, что они доступны для использования скриптом? ...попробую сегодня вечером. Спасибо - person Littlejeem; 12.05.2015

Решено!

Правило Удева выглядит так.

# 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"

и скрипт для запуска скриптов копирования выглядит так:

#!/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 здесь для указателей переменных.

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

Джеймс

person Littlejeem    schedule 15.05.2015