LINUX.ORG.RU
ФорумTalks

протестируйте велосипед udev+festival


0

0

Вообщем промелькнула тут как-то тема по сабжу, вот и захотелось мне 
поизвращаться, таксказать. Помогите протестировать на разных девайсах.
Нужен festival и, естественно, udev.

Вот этот скрипт 

$cat /usr/bin/boltalka.sh
#!/bin/sh

export PATH=/bin:/sbin:/usr/bin:/usr/sbin

FESTIVAL="festival --tts"
UDEVINFO="udevinfo"

DEVICE=$1

[ -z "$DEVICE" ] && exit
[ -z "$ACTION" ] && exit

function get_device_attr ()
{
	echo `udevinfo -a -n /dev/$1 | grep $2 | cut -f 2 -d '"'`
}

function get_device_name ()
{
	device=$1

	case $device in
		sd*[0-9])
			s=`get_device_attr $device "model"`
			[ -z $s ] && echo " some device" || echo " $s"
		;;
		sr*)
			echo "n optical drive"
		;;
		hd*)
			s=`get_device_attr $device "media"`
			echo " $s drive"
		;;
		*)
			exit
		;;
	esac
	
}

function say ()
{
	echo "A$1 is $2" | $FESTIVAL
	exit
}

name=`get_device_name $DEVICE`

if [ -n "$name" ]; then 
	case "$ACTION" in
		add)
		say "$name" "found"
		;;
		remove)
		say "$SUBSYSTEM device" "removed"		
		;;
		change)
		say "$name" "changed"
		;;
	esac
fi

и файл рулесов

$cat /etc/udev/rules.d/62-festival.rules
SUBSYSTEMS=="block", RUN+="/usr/bin/boltalka.sh %b"

который нужно засунуть в /etc/udev/rules.d или где
там в вашем дистре они лежат.

Положив их на место, можно испытать изобретение, вставив флешку или компакт. 

=======================================================================

Что надо сделать:
Сканеры, принтеры и прочие девайсы, которых у меня нет. Для этого нужно глядеть на вывод 

udevadm test (или udevtest) `udevinfo -q path -n /dev/$девайс`
и писать в case. Ну или отправлять мне на мыло.
★★★★★

мой знакомый делал что то похожее, но только для датчика движения внутри его thinkpad'а. Незнакомые люди пугались когда ноут при попытке его поднять ругался "куда понес сцуко?" :)

JB ★★★★★
()

Но вообще прикольная тема. Надо будет попробовать на ноуте (=

AnDoR ★★★★★
()

для самописных скриптов /usr/bin не Ъ. лучше /usr/local/bin

cobold ★★★★★
()

подключаю флешку - работает, подключаю телефон (как "запоминающее устройство") - молчит, диски не пробовал

Gentoo

Spacer
()

sorry for hijacking your thread, можно ликбез по фестивалю? как его заставить работать одновременно с плеером?

polachok
()

ubuntu 8.04.1 и обычная usb-флэшка - не работает.

1. $ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 2007-12-31 18:45 /bin/sh -> dash

не стоит писать /bin/sh в скрипте с bash-измами.
2. в строке 24 $s нужно взять в двойные кавычки иначе при подстановке в $s Flash Disk получается фигня

cobold ★★★★★
()
Ответ на: комментарий от cobold

> ubuntu 8.04.1 и обычная usb-флэшка - не работает.

chmod +x не забыл ?

Spacer
()

Есть предположение, что это место:
case $device in
		sd*[0-9])
не будет работать с устройствами, которые не имею цифру в названии, например /dev/sdb

Spacer
()

Моя темка была :)

А почему на русском не говорит? ;) Почему так мало сообщений? Да и читать все разделы диска - слишком долго :)

EmStudio
()
Ответ на: комментарий от polachok

>как его заставить работать одновременно с плеером?

(Parameter.set 'Audio_Command "aplay $FILE") (Parameter.set 'Audio_Method 'Audio_Command) (Parameter.set 'Audio_Required_Format 'snd)

в /etc/festiva.scm или /etc/festival/siteinit.scm

lester_dev ★★★★★
() автор топика
Ответ на: комментарий от Vanilin

>ubuntu 8.04.1 + DVD - не работает.

можно udevinfo -a -p `udevinfo -q path -n /dev/ваш_двд` и udevadm test `udevinfo -q path -n /dev/ваш_двд`?

lester_dev ★★★★★
() автор топика
Ответ на: комментарий от Spacer

>подключаю телефон (как "запоминающее устройство") - молчит, диски не пробовал

тут можно сделать так:

добавить cat "$DEVICE $ACTION" >> /tmp/test перед name=`get_device_name $DEVICE` и смотреть tail -f /tmp/test при подключении/отключении телефона. Возможно там хитрое навзание устройства. Или добавить заменить в 62-festival.rules SUBSYTEMS="block" на SUBSYTEMS="usb"

lester_dev ★★★★★
() автор топика
Ответ на: комментарий от lester_dev

> потому что русский в фестивале ужасен

А ты смотрел последние билды базы? Вроде очень даже ничего, по мне так вообще лучше английского варианту (понтов больше)

В крайнем случае можно найти блондинку с красивым голосом и записать готовые фразы

EmStudio
()

Где бы к энтому женский буржуйский голос нарыть

wfrr ★★☆
()
Ответ на: комментарий от lester_dev

> Возможно там хитрое навзание устройства.
хитрое устройство - это /dev/sdb
он как флеш-накопитель определяется.

работает после добавления в case этого

Spacer
()
Ответ на: комментарий от Spacer

sd*)
			s=`get_device_attr $device "model"`
			[ -z $s ] && echo " some device" || echo " $s"
		;;


P.S. Извиняюсь за разорванное сообщение, случайно нажал "поместить"

Spacer
()
Ответ на: комментарий от lester_dev

Первый с рулесами от второго, собстно из-за рулесов он и вызывается два раза , раз для раздела, второй раз для диска. В скрипте можно проигнорировать раздел.

wfrr ★★☆
()
Ответ на: комментарий от wfrr

>Первый с рулесами от второго, собстно из-за рулесов он и вызывается два раза

рулесы от второго используются только со вторым! Там я убрал привязку к блочным девайсам и оставил только usb хосты.

lester_dev ★★★★★
() автор топика
Ответ на: комментарий от wfrr

добавь cat "$DEVICE $ACTION" >> /tmp/test и смотри tail -f /tmp/test

lester_dev ★★★★★
() автор топика
Ответ на: комментарий от JB

> мой знакомый делал что то похожее, но только для датчика движения внутри его thinkpad'а. Незнакомые люди пугались когда ноут при попытке его поднять ругался "куда понес сцуко?" :)

Прям на русском? Я очень давно festival в последний раз видел - сейчас меня удивило, что он довольно прилично прочитал текст, правда с американским акцентом.

Сейчас надо покопаться в нем и голос другой поискать.

skwish ★★
()
Ответ на: комментарий от lester_dev

такая фигня получается: при подключении ковоновского плеера: (echo "$DEVICE $ACTION" >> /tmp/test)

1-7 add usbdev1.31_ep00 add 1-7:1.0 add host37 add usbdev1.31_ep02 add usbdev1.31_ep81 add 37:0:0:0 add 37:0:0:0 change 37:0:0:0 add 37:0:0:0 add sg6 add 37:0:0:0 add sdf add

соответственно get_device_attr по ноду 1-7 выдает такое: iAUDIO 7 EHCI Host Controller

ну и произносится все это в результате слитно =/

anonymous
()
Ответ на: комментарий от lester_dev

чертово форматирование =_=

такая фигня получается:
при подключении ковоновского плеера:
(echo "$DEVICE $ACTION" >> /tmp/test)

1-7 add
usbdev1.31_ep00 add
1-7:1.0 add
host37 add
usbdev1.31_ep02 add
usbdev1.31_ep81 add
37:0:0:0 add
37:0:0:0 change
37:0:0:0 add
37:0:0:0 add
sg6 add
37:0:0:0 add
sdf add

соответственно get_device_attr по ноду 1-7 выдает такое:
iAUDIO 7
EHCI Host Controller

ну и произносится все это в результате слитно =/

anonymous
()
Ответ на: комментарий от anonymous

>ну и произносится все это в результате слитно =/

да так и должно быть, девки млеют, когда слышут "и эйч си ай хоуст контроллэ ис фаунд"

lester_dev ★★★★★
() автор топика
Ответ на: комментарий от lester_dev

В каждом закоренелом лоровце кроется свой саныч…

wfrr ★★☆
()
Ответ на: комментарий от lester_dev

рррр, "доктор, меня все игнорируют..." на убунту не работает скрипт потому что там /bin/sh это ссылка на dash, а не bash и он не понимает синтаксис function bla(). самый простой выход для починки это написать #!/bin/bash вместо #!/bin/sh

cobold ★★★★★
()
Ответ на: комментарий от lester_dev

У меня работает только ветка "add", на "remove" -- молчит. Кроме того, более грамотными фразами будут:

function say () { echo "$1 $2" | $FESTIVAL exit }

name=`get_device_name $DEVICE`

if [ -n "$name" ]; then case "$ACTION" in add) say "$name" "was found" ;; remove) say "$SUBSYSTEM device" "has been removed" ;; change) say "$name" "was changed" ;; esac fi

annoynimous ★★★★★
()
Ответ на: комментарий от lester_dev

У меня работает только ветка "add", на "remove"  -- молчит. Кроме того, более грамотными фразами будут:

function say ()
{
        echo "$1 $2" | $FESTIVAL
        exit
}

name=`get_device_name $DEVICE`

if [ -n "$name" ]; then
        case "$ACTION" in
                add)
                say "$name" "was found"
                ;;
                remove)
                say "$SUBSYSTEM device" "has been removed"
                ;;
                change)
                say "$name" "was changed"
                ;;
        esac
fi

annoynimous ★★★★★
()
Ответ на: комментарий от annoynimous

Вот протокол полного цикла (втыкание-вытыкание) внешнего USB'шного диска:

5-5 add
5-5:1.0 add
usbdev5.80_ep00 add
host18 add
18:0:0:0 add
usbdev5.80_ep02 add
usbdev5.80_ep81 add
usbdev5.80 add
18:0:0:0 add
sg2 add
18:0:0:0 add
sdb add
sdb1 add
sdb2 add
sdb1 remove
sdb2 remove
5-5:1.0 remove
sdb remove

Но голос появляется только на втыкание, но не вытыкание

annoynimous ★★★★★
()
Ответ на: комментарий от wfrr

И еще я прикручивал espeak -vru+f2 звучит забавно, с женским голосом и металлическим ехом, один касяк при релоаде udev эта штука глючит.

wfrr ★★☆
()
Ответ на: комментарий от annoynimous

спасибо, английский никогда не был моей сильной стороной...

lester_dev ★★★★★
() автор топика
Ответ на: комментарий от annoynimous

>Тогда надо переделывать скрипт: ведь физическое устройство, подключение/отключение это sdb, а не контроллер

Что интересно, у меня-то оно работает. Тут с этим делом такая загвоздка - флешка это и юсб и блок девайс. А в рулесах прописано два правила и для тех и для других. В итоге оно будет два раза говорить.

lester_dev ★★★★★
() автор топика
Ответ на: комментарий от annoynimous

function get_device_attr ()
{
      path=`find /sys/devices -name $1`
      echo `$UDEVINFO -a -p \`udevinfo -q path -n /dev/$1\` | grep $2 | cut -f 2 -d '"'`
}

-----------------

case $device in
#      [0-9]-[0-9])
#       s=`get_device_attr $device "product"`
#       [ -z $s ] && echo " some device" || echo "$s"
#      ;;
       sd*)
        s=`get_device_attr $device "model"`
        [ -z $s ] && echo " some device" || echo " $s"
       ;;
-----------------

так будет работать для твоего случая (для моего, впрочем, тоже)
но не будет для других юсб-устройств. лестер таки пытался универсализировать.

anonymous
()
Ответ на: комментарий от lester_dev

sdg1 | remove | declare -x ACTION="remove"
declare -x DEVLINKS="/dev/disk/by-id/usb-._Audio_Player_00339070702092967313-0:0-part1 /dev/disk/by-path/pci-0000:00:02.1-usb-0:9:1.0-scsi-0:0:0:0-part1 /dev/disk/by-uuid/CC94-96F9"
declare -x DEVNAME="/dev/sdg1"
declare -x DEVPATH="/block/sdg/sdg1"
declare -x DEVTYPE="partition"
declare -x ID_BUS="usb"
declare -x ID_FS_LABEL=""
declare -x ID_FS_LABEL_ENC=""
declare -x ID_FS_LABEL_SAFE=""
declare -x ID_FS_TYPE="vfat"
declare -x ID_FS_USAGE="filesystem"
declare -x ID_FS_UUID="CC94-96F9"
declare -x ID_FS_UUID_ENC="CC94-96F9"
declare -x ID_FS_VERSION="FAT16"
declare -x ID_INSTANCE="0:0"
declare -x ID_MODEL="Audio_Player"
declare -x ID_PATH="pci-0000:00:02.1-usb-0:9:1.0-scsi-0:0:0:0"
declare -x ID_REVISION="0002"
declare -x ID_SERIAL="._Audio_Player_00339070702092967313-0:0"
declare -x ID_SERIAL_SHORT="00339070702092967313"
declare -x ID_TYPE="disk"
declare -x ID_VENDOR="."
declare -x MAJOR="8"
declare -x MINOR="97"
declare -x OLDPWD
declare -x PATH="/bin:/sbin:/usr/bin:/usr/sbin"
declare -x PHYSDEVBUS="scsi"
declare -x PHYSDEVPATH="/devices/pci0000:00/0000:00:02.1/usb2/2-9/2-9:1.0/host25/target25: 0:0/25:0:0:0"
declare -x PWD="/"
declare -x SEQNUM="6417"
declare -x SHLVL="1"
declare -x SUBSYSTEM="block"
declare -x UDEVD_EVENT="1"
declare -x UDEV_LOG="3"
sdh | remove | declare -x ACTION="remove"
declare -x DEVLINKS="/dev/disk/by-id/usb-._SD.MMC_Card_00339070702092967313-0:1 /dev/disk/by-path/pci-0000:00:02.1-usb-0:9:1.0-scsi-0:0:0:1"
declare -x DEVNAME="/dev/sdh"
declare -x DEVPATH="/block/sdh"
declare -x DEVTYPE="disk"
declare -x ID_BUS="usb"
declare -x ID_INSTANCE="0:1"
declare -x ID_MODEL="SD.MMC_Card"
declare -x ID_PATH="pci-0000:00:02.1-usb-0:9:1.0-scsi-0:0:0:1"
declare -x ID_REVISION="0002"
declare -x ID_SERIAL="._SD.MMC_Card_00339070702092967313-0:1"
declare -x ID_SERIAL_SHORT="00339070702092967313"
declare -x ID_TYPE="disk"
declare -x ID_VENDOR="."
declare -x MAJOR="8"
declare -x MINOR="112"
declare -x OLDPWD
declare -x PATH="/bin:/sbin:/usr/bin:/usr/sbin"
declare -x PHYSDEVBUS="scsi"
declare -x PHYSDEVPATH="/devices/pci0000:00/0000:00:02.1/usb2/2-9/2-9:1.0/host25/target25: 0:0/25:0:0:1"
declare -x PWD="/"
declare -x SEQNUM="6423"
declare -x SHLVL="1"
declare -x SUBSYSTEM="block"
declare -x UDEVD_EVENT="1"
declare -x UDEV_LOG="3"
2-9:1.0 | remove | declare -x ACTION="remove"
declare -x DEVICE="2-9:1.0"
declare -x DEVPATH="/devices/pci0000:00/0000:00:02.1/usb2/2-9/2-9:1.0"
declare -x DEVTYPE="usb_interface"
declare -x INTERFACE="8/6/80"
declare -x MODALIAS="usb:v0402p5661d0002dc00dsc00dp00ic08isc06ip50"
declare -x OLDPWD
declare -x PATH="/bin:/sbin:/usr/bin:/usr/sbin"
declare -x PRODUCT="402/5661/2"
declare -x PWD="/"
declare -x SEQNUM="6426"
declare -x SHLVL="1"
declare -x SUBSYSTEM="usb"
declare -x TYPE="0/0/0"
declare -x UDEVD_EVENT="1"
declare -x UDEV_LOG="3"
2-9 | remove | declare -x ACTION="remove"
declare -x BUSNUM="002"
declare -x DEVICE="2-9"
declare -x DEVNAME="/dev/bus/usb/002/022"
declare -x DEVNUM="022"
declare -x DEVPATH="/devices/pci0000:00/0000:00:02.1/usb2/2-9"
declare -x DEVTYPE="usb_device"
declare -x MAJOR="189"
declare -x MINOR="149"
declare -x OLDPWD
declare -x PATH="/bin:/sbin:/usr/bin:/usr/sbin"
declare -x PRODUCT="402/5661/2"
declare -x PWD="/"
declare -x SEQNUM="6428"
declare -x SHLVL="1"
declare -x SUBSYSTEM="usb"
declare -x TYPE="0/0/0"
declare -x UDEVD_EVENT="1"
declare -x UDEV_LOG="3"
sdg | remove | declare -x ACTION="remove"
declare -x DEVLINKS="/dev/disk/by-id/usb-._Audio_Player_00339070702092967313-0:0 /dev/disk/by-path/pci-0000:00:02.1-usb-0:9:1.0-scsi-0:0:0:0"
declare -x DEVNAME="/dev/sdg"
declare -x DEVPATH="/block/sdg"
declare -x DEVTYPE="disk"
declare -x ID_BUS="usb"
declare -x ID_INSTANCE="0:0"
declare -x ID_MODEL="Audio_Player"
declare -x ID_PATH="pci-0000:00:02.1-usb-0:9:1.0-scsi-0:0:0:0"
declare -x ID_REVISION="0002"
declare -x ID_SERIAL="._Audio_Player_00339070702092967313-0:0"
declare -x ID_SERIAL_SHORT="00339070702092967313"
declare -x ID_TYPE="disk"
declare -x ID_VENDOR="."
declare -x MAJOR="8"
declare -x MINOR="96"
declare -x OLDPWD
declare -x PATH="/bin:/sbin:/usr/bin:/usr/sbin"
declare -x PHYSDEVBUS="scsi"
declare -x PHYSDEVPATH="/devices/pci0000:00/0000:00:02.1/usb2/2-9/2-9:1.0/host25/target25: 0:0/25:0:0:0"
declare -x PWD="/"
declare -x SEQNUM="6418"
declare -x SHLVL="1"
declare -x SUBSYSTEM="block"
declare -x UDEVD_EVENT="1"
declare -x UDEV_LOG="3"

тем самым обрабатываем в рулесах ID_TYPE="disk" и получаем одно сообщение на диск. (плеер у меня с двумя дисками)

wfrr ★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.