Panggil notify-send dari aturan udev

13

Saya menggunakan Linux Mint 13 MATE, dan saya mencoba mengatur notifikasi ketika saya mencolokkan / mencabut perangkat.

Pertama-tama, saya menemukan paket udev-notify , tetapi sayangnya itu hampir tidak berfungsi untuk saya: ia bekerja untuk waktu yang sangat sedikit (1-2 menit), dan kemudian, jika saya menghubungkan / memutuskan perangkat apa pun, itu macet:

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

Saya belum menemukan solusi, jadi saya harus menghapusnya. ( laporkan bugreport juga)

Yang mengherankan, tidak ada utilitas serupa yang saya temukan sejauh ini. Lalu saya mencoba menulis aturan udev yang harus cocok dengan semua perangkat. Saya telah menambahkan file baru /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"

Dan dua skrip:

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 &

Itu bekerja, tetapi itu bekerja sangat bodoh. Pertanyaan saya adalah:

  1. Bagaimana cara mendapatkan judul perangkat yang sebenarnya terpasang, sama seperti yang saya lihat di lsusboutput? Saat ini, saya baru saja mendapat pemberitahuan seperti "dicolokkan" dan "tidak dicabut", dan saya tidak dapat menemukan bagaimana saya dapat mengambil nama perangkat dalam aturan udev saya (Jika saya bisa, maka saya akan meneruskannya ke skrip saya sebagai parameter)
  2. Saat ini, terlalu banyak pemberitahuan yang diaktifkan. Katakanlah, ketika saya memasang USB stick, saya mendapat sekitar 15 notifikasi! Tetapi, jika saya jalankan lsusb, stik USB yang terpasang ditampilkan sebagai hanya satu perangkat. Jadi, sepertinya saya harus menambahkan beberapa argumen lagi ke aturan filter, tetapi saya tidak dapat menemukannya.
  3. Mungkin ada beberapa solusi yang lebih baik untuk pemberitahuan plug-in / cabut perangkat? Tolong sarankan jika Anda tahu sesuatu.
Dmitry Frank
sumber

Jawaban:

9

Nah, setelah berjam-jam googling dan bertanya di forum, saya berhasil (sepertinya). Siapa pun yang ingin mendapatkan notifikasi visual dan / atau audio yang bagus ketika beberapa perangkat USB dicolokkan / dicabut dapat menginstal skrip saya, lihat detail instalasi di bawah ini.

Pertama-tama, jawablah pertanyaan saya sendiri.

1. Bagaimana cara mendapatkan judul perangkat yang sebenarnya terpasang, sama seperti yang saya lihat di lsusboutput?

Tidak ada judul seperti itu di kernel (dalam kasus umum). Ada file database dengan judul untuk banyak pasangan vendor_id:product_id, biasanya /usr/share/hwdata/usb.idsfile. Basis data ini dapat diperbarui oleh /usr/sbin/update-usbids.sh. Terima kasih kepada teman-teman dari linux.org.ru untuk info itu.

Saya tidak tahu apakah ada alat khusus untuk mendapatkan judul perangkat secara berpasangan vendor_id:product_id, jadi saya harus sedikit meretas dengan lsusbdan grep: misalnya,lsusb | grep '0458:003a'

2. Saat ini, terlalu banyak pemberitahuan yang diaktifkan. Katakanlah, ketika saya memasang stik USB saya, saya mendapat sekitar 15 notifikasi!

Saya harus mengakui bahwa saya belum menemukan cara untuk menulis aturan untuk ini, tetapi saya menemukan cara lain untuk menyaringnya.

udevmemungkinkan kita menggunakan beberapa pergantian untuk RUN+="...": katakanlah, kita bisa mendapatkan nomor bus dan nomor perangkat masing $attr{busnum}- $attr{devnum}masing. Pertama, dalam skrip saya, saya menyimpan daftar perangkat yang dilampirkan dalam file khusus, sehingga jika skrip mendapat acara "plug" baru, dan busnum dan devnum perangkat ini sudah disimpan dalam file kami, maka notifikasi tidak dihasilkan. Dan kedua, pergantian ini $attr{busnum}dan $attr{devnum}biasanya hanya tersedia untuk salah satu perangkat dari "seri" acara. Tapi bagaimanapun, algoritma yang dijelaskan harus mengatasinya dalam hal apa pun.


Halaman proyek saat ini: my-udev-notify .

Ini terlihat seperti ini:

masukkan deskripsi gambar di sini

Detail pemasangan.

Diuji pada Linux Mint 13, saya percaya itu harus bekerja pada Ubuntu dan turunan Ubuntu lainnya, dan saya harap ini akan bekerja pada sistem * nix manapun udev.

  • Buka halaman proyek , dapatkan sumber dari sana dan letakkan di suatu tempat. Hanya ada satu skrip utama di dalamnya my-udev-notify.sh:, tetapi arsip juga berisi suara untuk pemberitahuan plug / cabut, ditambah beberapa info lebih lanjut, lihat readme.txtdetailnya.
  • Buat file /etc/udev/rules.d/my-udev-notify.rulesdengan konten berikut: (jangan lupa untuk memodifikasi path ke path asli Anda di mana Anda membongkar 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}'"

Setelah ini, ini akan berfungsi untuk perangkat yang baru terpasang. Artinya, jika Anda mencabut beberapa perangkat, Anda tidak akan mendapatkan notifikasi. Tetapi ketika Anda pasang kembali, Anda akan melakukannya. (ya, bagi saya ini berfungsi tanpa udev memulai kembali. Jika tidak cocok untuk Anda, coba reboot)

Untuk membuatnya berfungsi untuk semua perangkat, cukup reboot sistem Anda. Perhatikan bahwa mungkin ada banyak pemberitahuan saat boot pertama (lihat masalah yang diketahui di readme.txt). Pada boot kedua, tidak akan ada pemberitahuan (kecuali jika Anda mencolokkan perangkat baru saat sistem mati)

Anda dapat menyesuaikannya (menghidupkan / mematikan notifikasi visual dan suara, atau mengubah suara), periksa readme.txt di arsip untuk detailnya.

Dmitry Frank
sumber
Mungkin Anda harus melihat pada pertanyaan / jawaban ini: stackoverflow.com/questions/469243/… Ini digunakan pyudevuntuk mendapatkan pemberitahuan, dan tidak memerlukan skrip tambahan di /etc/udev.
Denilson Sá Maia
Apakah pemberitahuan plug-in / cabut perangkat disembunyikan / tidak tersedia secara default?
gonzobrains
1
@gonzobrains, tidak, segera setelah Anda menambahkan aturan yang benar ke /etc/udeve/rules.d, itu akan berfungsi untuk perangkat yang baru saja terpasang.
Dmitry Frank
@DmitryFrank Yang saya maksudkan adalah apakah notifikasi ini secara otomatis ditampilkan secara default atau Anda harus melakukan langkah-langkah di atas untuk menunjukkannya? Untuk proyek saya, saya ingin menekan mereka (yaitu, tidak memiliki notifikasi yang ditampilkan secara default).
gonzobrains
1
@gonzobrains, jika Anda belum melakukan langkah-langkah di atas, dan Anda memiliki notifikasi yang ditampilkan ketika Anda mencolokkan / mencabut perangkat apa pun, maka skrip saya tidak ada hubungannya dengan itu. Beberapa program lain melakukan ini untuk Anda.
Dmitry Frank
0

Tambahkan baris berikut sebelum baris pemberitahuan visual Anda, untuk memberi skrip gambaran tentang tampilan X mana yang harus dijalankan notify-send(atau aplikasi X lainnya):

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

Tentu saja, Anda harus mengubah baris kedua sesuai dengan lingkungan desktop Anda (atau manajer tampilan). Baris ini berfungsi dengan baik untuk Ubuntu 16.04 yang menggunakan unity sebagai desktop dan lightdm sebagai display manager.

(dari pos ini )

MortezaE
sumber