Позвонить, уведомить-отправить из правила udev

13

Я использую Linux Mint 13 MATE и пытаюсь настроить уведомления при подключении / отключении устройств.

Прежде всего, я нашел пакет udev-notify , но, к сожалению, он почти не работает для меня: он работает очень мало времени (1-2 минуты), а затем, если я подключаю / отключаю любое устройство, он вылетает:

Traceback (most recent call last):
  File "./udev-notify.py", line 319, in <module>
    notification.show()
glib.GError: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name :1.1061 was not provided by any .service files

Я не нашел никакого решения, поэтому пришлось его удалить. (также подал отчет об ошибке )

Удивительно, но я не нашел подобных утилит. Затем я попытался написать правила udev, которые должны соответствовать всем устройствам. Я добавил новый файл /etc/udev/rules.d/notify.rules:

ACTION=="add",    RUN+="/bin/bash /home/dimon/tmp/device_plug.sh"
ACTION=="remove", RUN+="/bin/bash /home/dimon/tmp/device_unplug.sh"

И два сценария:

device_plug.sh:

#!/bin/bash

export DISPLAY=":0"
notify-send "device plugged"

/usr/bin/play -q /path/to/plug_sound.wav &

device_unplug.sh:

#!/bin/bash

export DISPLAY=":0"
notify-send "device unplugged"

/usr/bin/play -q /path/to/unplug_sound.wav &

Это работает, но работает очень глупо. Мои вопросы:

  1. Как получить фактическое название подключенного устройства, так же, как я вижу в lsusbвыводе? В настоящее время я только что получил уведомления, такие как «подключен» и «отключен», и я не могу найти, как я могу получить имя устройства в своем правиле udev (Если я могу, то я передам его в свой сценарий как параметр)
  2. В настоящее время слишком много уведомлений активировано. Скажем, когда я подключаю флешку, я получаю около 15 уведомлений! Но, если я запускаю lsusb, подключенный USB-накопитель отображается как одно устройство. Так что, похоже, мне нужно добавить еще несколько аргументов в фильтр правил, но я не могу это выяснить.
  3. Возможно, есть какое-то лучшее решение для уведомлений о подключении / отключении устройства? Пожалуйста, предложите, если вы что-то знаете.
Дмитрий Франк
источник

Ответы:

9

Что ж, после многих часов поисков в Google и форумов я все заработал (кажется). Любой, кто хочет получить хорошее визуальное и / или звуковое уведомление, когда какое-либо USB-устройство подключено / отключено, может установить мой сценарий, см. Подробности установки ниже.

Прежде всего, ответы на мои вопросы.

1. Как получить фактическое название подключенного устройства, так же, как я вижу в lsusbвыводе?

В ядре таких заголовков нет (в общем случае). Существует файл базы данных с заголовками для многих пар vendor_id:product_id, обычно это /usr/share/hwdata/usb.idsфайл. Эта база данных может быть обновлена ​​с помощью /usr/sbin/update-usbids.sh. Спасибо ребятам из linux.org.ru за эту информацию.

Я не знаю, есть ли какой-нибудь специальный инструмент для получения названия устройства по паре vendor_id:product_id, поэтому мне пришлось немного взломать с помощью lsusbи grep: например,lsusb | grep '0458:003a'

2. В настоящее время активировано слишком много уведомлений. Скажем, когда я подключаю флешку, я получаю около 15 уведомлений!

Должен признать, что я не понял, как написать правило для этого, но я нашел другой способ отфильтровать его.

udevпозволяет нам использовать некоторые замены для RUN+="...": скажем, мы можем получить номер шины и номер устройства по $attr{busnum}и $attr{devnum}соответственно. Во-первых, в моем сценарии я храню список подключенных устройств в специальном файле, так что если сценарий получил новое событие «plug», а busnum и devnum этого устройства уже сохранены в нашем файле, уведомление не генерируется. А во-вторых, эти замены $attr{busnum}и $attr{devnum}обычно доступны только для одного из устройств из «серии» событий. Но в любом случае объясненный алгоритм должен разобраться в любом случае.


Текущая страница проекта: my-udev-notify .

Это выглядит так:

введите описание изображения здесь

Детали установки.

Испытано на Linux Mint 13, я считаю, что оно должно работать на Ubuntu и других производных Ubuntu, и я надеюсь, что оно будет работать на любой системе * nix с udev.

  • Перейдите на страницу проекта , найдите источники и разместите их где-нибудь. В нем есть только один основной сценарий:, my-udev-notify.shно архив также содержит звуки для уведомлений о подключении / отключении, а также дополнительную информацию, см. readme.txtПодробности.
  • Создайте файл /etc/udev/rules.d/my-udev-notify.rulesсо следующим содержимым: (не забудьте изменить путь к реальному пути, куда вы распаковали my-udev-notify.sh!)

 ACTION=="add",    RUN+="/bin/bash /path/to/my-udev-notify.sh -a add    -p '%p' -b '$attr{busnum}' -d '$attr{devnum}'"
 ACTION=="remove", RUN+="/bin/bash /path/to/my-udev-notify.sh -a remove -p '%p' -b '$attr{busnum}' -d '$attr{devnum}'"

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

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

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

Дмитрий Франк
источник
Возможно, вам стоит взглянуть на этот вопрос / ответ: stackoverflow.com/questions/469243/… Он используется pyudevдля получения уведомлений и не требует дополнительных скриптов /etc/udev.
Денилсон Са Майя
Уведомления о подключении / отключении устройства по умолчанию скрыты / недоступны?
gonzobrains
1
@gonzobrains, нет, как только вы добавите правильные правила в /etc/udeve/rules.d, он должен работать для вновь подключенных устройств.
Дмитрий Франк
@DmitryFrank Я имел в виду, были ли эти уведомления автоматически показываться по умолчанию, или вам нужно выполнить описанные выше шаги, чтобы их показать? Для моего проекта я хотел бы подавить их (т.е. не показывать уведомления по умолчанию).
gonzobrains
1
@gonzobrains, если вы не выполнили описанные выше шаги, и у вас есть уведомления, отображаемые при подключении / отключении любого устройства, тогда мой сценарий не имеет к этому никакого отношения. Некоторые другие программы делают это для вас.
Дмитрий Франк
0

Добавьте следующие строки перед строками визуальных уведомлений, чтобы дать сценарию представление о том, на каком экране X он должен запускаться notify-send(или в любом другом приложении X):

export DISPLAY=:0
export XAUTHORITY=/var/lib/lightdm/.Xauthority

Конечно, вы должны изменить вторую строку в соответствии с вашей рабочей средой (или менеджером отображения). Эта строка отлично работает для Ubuntu 16.04, которая использует Unity в качестве рабочего стола и Lightdm в качестве диспетчера отображения.

(из этого поста )

MortezaE
источник