Как добавить произвольное действие при подключении устройства

Изображение пользователя dm.

Когда флешка или любое другое устройство подключается в kde4 это отображается на виджете "подключаемые устройства". Так же там предлагается выбрать действия для подключенного устройства.

Создадим действие синхронизация для конкретной флешки.

Сначала посмотрим как solid (подсистема ответственная за аппаратуру в KDE 4) видит нашу флешку.

solid-hardware list

наша флешка имеет udi = '/org/freedesktop/UDisks/devices/sdb1'

solid-hardware details /org/freedesktop/UDisks/devices/sdb1

получаем примерно такой вывод:

parent = '/org/freedesktop/UDisks/devices/sdb'  (string)
  vendor = 'Multiple'  (string)
  product = 'Card  Reader'  (string)
  description = '3,7 GiB Removable Media'  (string)
  Block.major = 8  (0x8)  (int)
  Block.minor = 17  (0x11)  (int)
  Block.device = '/dev/sdb1'  (string)
  StorageAccess.accessible = false  (bool)
  StorageAccess.filePath = ''  (string)
  StorageAccess.ignored = false  (bool)
  StorageVolume.ignored = false  (bool)
  StorageVolume.usage = 'FileSystem'  (0x2)  (enum)
  StorageVolume.fsType = 'vfat'  (string)
  StorageVolume.label = ''  (string)
  StorageVolume.uuid = '5a8d-08b0'  (string)
  StorageVolume.size = 3964552704  (0xec4e4600)  (qulonglong)

Вот и uuid - им можно уникально идентифицировать нашу флешку.
Создаем файл в ~/.kde/share/apps/solid/actions, например Синхронизировать.desktop:

[Desktop Action open]
Exec=/usr/bin/unison-gtk
Icon=ktip
Name=Синхронизировать

[Desktop Entry]
Actions=open;
Type=Service
X-KDE-Action-Custom=true
X-KDE-Solid-Predicate=[[StorageVolume.usage == 'FileSystem' AND StorageVolume.ignored == 'false'] AND StorageVolume.uuid == '5a8d-08b0']

Теперь, при подключении флешки в USB разьем, в списке действий появляется новый пункт: Синхронизировать.

Так же действия для подключаемых устройств можно добавить через K -> "Параметры системы" -> "Действия для устройств"

Файлы системных действий находятся в папке /usr/share/kde4/apps/solid/actions/

Комментарии (26)

0
dyug - 6 Сентябрь, 2011 - 16:06

О, это хорошо... :-)
Люблю такие извращения. :-)
Я их правда, обычно через юдев делал, оно как то чаще описывается.. :-)

0
taliano - 6 Сентябрь, 2011 - 16:56
Изображение пользователя taliano.

Ох какие шикарные возможности открываются
Спасибо за информацию!

0
Гость - 13 Сентябрь, 2011 - 02:48

а что за темка на скринах которая ?

0
dm - 13 Сентябрь, 2011 - 10:32
Изображение пользователя dm.

QtCurve + Agua II

0
ost-nikolaj - 26 Сентябрь, 2011 - 16:04

Интересненько, особенно не великим гуру, а таким как я ламеристам

0
DarkneSS - 16 Октябрь, 2011 - 19:49
Изображение пользователя DarkneSS.

Можно ли создать пункт для действия типа:sudo -i
echo noop > /sys/block/sdc/queue/scheduler

+1
mft - 16 Октябрь, 2011 - 20:37

можно
вот только команда будет выглядеть как-то так
kdesudo -c "echo noop > /sys/block/sdc/queue/scheduler"

0
DarkneSS - 16 Октябрь, 2011 - 20:36
Изображение пользователя DarkneSS.

Пускай я создам десктоп-файл для скрипта и разрешу его выполнять без ввода пароля, но я не понимаю, как сделать подставление вместо sdc адреса именно этой флешки.

+1
mft - 16 Октябрь, 2011 - 21:15

да легко))
Например на выходе этой команды
a=`echo /dev/sda3 | grep -o -P 'sd[a-z]'`; echo /sys/block/$a/queue/scheduler
получится
/sys/block/sda/queue/scheduler

+1
mft - 16 Октябрь, 2011 - 21:15

Ну или для твоего случая
kdesudo -c "a=`echo %d | grep -o -P 'sd[a-z]'`; echo noop > /sys/block/$a/queue/scheduler"

0
DarkneSS - 16 Октябрь, 2011 - 21:20
Изображение пользователя DarkneSS.

Оно будет применяться именно к той флешке, на которую я буду тыкать?

+1
mft - 16 Октябрь, 2011 - 21:45

Да, если всё делать через параметры системы/Действия для устройств... там в строку "команда" надо ввести то что я написал.
%d - это и есть выбранное устройство, например /dev/sdc0

0
DarkneSS - 16 Октябрь, 2011 - 22:18
Изображение пользователя DarkneSS.

Круть! Пробую.

0
DarkneSS - 16 Октябрь, 2011 - 22:32
Изображение пользователя DarkneSS.
Не появляется в меню...
0
DarkneSS - 16 Октябрь, 2011 - 22:33
Изображение пользователя DarkneSS.

%25 пофиксил

+1
mft - 17 Октябрь, 2011 - 15:49

Как-то так попробуй.

[Desktop Action open]
Exec=kdesudo -c "a=`echo %d | grep -o -P 'sd[a-z]'`; echo noop > /sys/block/$a/queue/scheduler"
Icon=face-devilish
Name=Noop
X-Ubuntu-Gettext-Domain=desktop_kdebase-workspace

[Desktop Entry]
Actions=open;
Type=Service
X-KDE-Action-Custom=true
X-KDE-Solid-Predicate=IS StorageAccess

А что делает эта команда -
echo noop > /sys/block/sda/queue/scheduler??

0
DarkneSS - 17 Октябрь, 2011 - 18:51
Изображение пользователя DarkneSS.

Меняет планировщик ввода-вывода для конкретного устройства.

0
DarkneSS - 17 Октябрь, 2011 - 19:03
Изображение пользователя DarkneSS.

Действия появилось, но не отрабатывает, как надо:

+1
mft - 17 Октябрь, 2011 - 19:25

Кавычки одинарные надо было.
[Desktop Action open]
Exec=kdesudo -c 'a=`echo %d | grep -o -P 'sd[a-z]'`; echo noop > /sys/block/$a/queue/scheduler'
Icon=face-devilish
Name=Noop
X-Ubuntu-Gettext-Domain=desktop_kdebase-workspace

[Desktop Entry]
Actions=open;
Type=Service
X-KDE-Action-Custom=true
X-KDE-Solid-Predicate=IS StorageAccess

0
DarkneSS - 17 Октябрь, 2011 - 20:15
Изображение пользователя DarkneSS.

Спасибо! Всё работает =)

0
kantim - 19 Октябрь, 2011 - 13:13
Изображение пользователя kantim.

А что Синхронизируем, какую-то папку?

0
dm - 19 Октябрь, 2011 - 16:20
Изображение пользователя dm.

Синхронизация - это все го лишь пример возможного действия.

0
khlop - 27 Январь, 2012 - 03:47
Изображение пользователя khlop.

Интересно, а где про общие принципы посмотреть можно, пока нашел только "Linux Desktop Hacks" незабвенного O'Reilly.

0
DarkneSS - 27 Январь, 2012 - 07:35
Изображение пользователя DarkneSS.

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

0
zaznet - 25 Октябрь, 2013 - 23:05

Не работает на 13.10. Все по инструкции сделал в перечне действий пункт есть а когда подключаешь устройство он не появляется

0
Michael72 - 27 Февраль, 2015 - 16:55
Изображение пользователя Michael72.

...solid (подсистема ответственная за аппаратуру в KDE 4)...
В своё время я написал скрипт, предназначенный для автозапуска сменных носителей (см. статью Автоматизированный запуск компакт-дисков). Недавно попытался проделать тоже самое в Gnome (Ubuntu 11.04) и натолкнулся на некоторые трудности. Не подскажите, что по аналогии с solid ответственное за аппаратуру в Gnome?

Отправить комментарий

CAPTCHA на основе изображений
Введите цифры