LINUX.ORG.RU

[udev] автоподключение фотика


0

1

Есть фотик Canon SX130, но он при подключении к компу никак не детектится. Digikam нормально его определяет и автодетектом и вручную работает. Можно ли как-нибудь сделать чтобы при появлении фотика udev предлагал открыть его в digikam? В смысле кеды чтобы предлагали так же как флешку предлагают открыть в дельфине? Посоветуйте что для этого надо сделать?

Еще читал про gphoto2, пока не пробовал, но думаю он тоже правила для удева сам прописывать не станет.

Еще было бы интересно тоже как сделать также в lxde. У меня на втором компе lxde и хотелось бы чтобы при подключении фотика автоматом digikam открывался.

★★★★★

Ответ на: комментарий от drBatty
usb 1-1.3: new high-speed USB device number 8 using ehci_hcd
usb 1-1.3: New USB device found, idVendor=04a9, idProduct=3211
usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-1.3: Product: Canon Digital Camera
usb 1-1.3: Manufacturer: Canon Inc.
usb 1-1.3: SerialNumber: FB855A57EA6F4DA2B7613E6802B83F76

Да, вот что в dmesg

Я скорее всего вообще неправильно вопрос поставил чувствую. Но лучше сформулировать не вышло

Loki13 ★★★★★ ()

Еще было бы интересно тоже как сделать также в lxde.

Милейший, скрипт на питоне слушающий udisks через dbus, вас спасет.

belous_k_a ()

Это через udev не делается. udev работает от рута и предпринимает общесистемные действия, а пользователей может быть много залогинено, и он о них не знает.

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

Они по дефолту так делают.

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

Они по дефолту так делают.

Фотик не как накопитель определяется, а как фотик.(Mass storage camera disk:/mnt/smbnet почему-то)

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

скрипт на питоне слушающий udisks

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

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

Фотик не как накопитель определяется, а как фотик.

Ну так, мой iPod touch тоже так определяется (протокол ptp2), и KDE показывает его в плазмоиде подключённых устройств, и оттуда можно открыть всякие программы.

(Mass storage camera disk:/mnt/smbnet почему-то)

А /mnt/smbnet — это существующий каталог? Mass storage camera почему-то намекает не на ptp2 вовсе, и девайсы, доступные по ptp2, не монтируются в VFS Линукса.

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

А /mnt/smbnet — это существующий каталог?

Да, существующий, но это вообще винда соседская в локалке

и девайсы, доступные по ptp2, не монтируются в VFS Линукса.

Оно у меня никуда и не смонтировалось. В настройках камеры в digikam:

Canon PowerShot SX130 IS
Тип порта камеры USB
Путь к порту камеры usb:
Точка монтирования /

Это наверное digikam сам смонтировать может, но мне бы как нибудь в обратном порядке. Чтобы не digikam монтировал фотик, а фотик инициировал digikam

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

если фотик как диск не выглядит?

Сударь вы по «значкам» судите?

Запустите

% dbus-monitor --system "sender='org.freedesktop.UDisks'" 
signal sender=org.freedesktop.DBus -> dest=:1.47 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
   string ":1.47"
signal sender=:1.18 -> dest=(null destination) serial=6153 path=/org/freedesktop/UDisks; interface=org.freedesktop.UDisks; member=DeviceAdded
   object path "/org/freedesktop/UDisks/devices/sdg"
signal sender=:1.18 -> dest=(null destination) serial=6232 path=/org/freedesktop/UDisks; interface=org.freedesktop.UDisks; member=DeviceAdded
   object path "/org/freedesktop/UDisks/devices/sdg1"
signal sender=:1.18 -> dest=(null destination) serial=6486 path=/org/freedesktop/UDisks; interface=org.freedesktop.UDisks; member=DeviceRemoved
   object path "/org/freedesktop/UDisks/devices/sdg1"
signal sender=:1.18 -> dest=(null destination) serial=6487 path=/org/freedesktop/UDisks; interface=org.freedesktop.UDisks; member=DeviceRemoved
   object path "/org/freedesktop/UDisks/devices/sdg"
и скорее всего при подключении фотокамеры узреете нечто подобное.

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

Не подскажу, знаю как его написать, но где найти готовый?

belous_k_a ()
Ответ на: комментарий от belous_k_a
[alexv@myhost ~]$ dbus-monitor --system "sender='org.freedesktop.UDisks'" 
signal sender=org.freedesktop.DBus -> dest=:1.66 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
   string ":1.66"

Появляется при выполнении. При подключении фотика - тишина, при отключении аналогично

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

Мне бы просто отлавливать момент что он подключен и инициировать запрос с вопросом запустить digikam. По идее это возможно, т.к. в dmesg же падает что-то. Вот только как это сделать я не очень представляю

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

ну можешь убрать строчку «sender='org.freedesktop.UDisks'» и посмотреть что будет падать в лог, скорее всего ничего.

Тут два пути - писать rule для udev или попытаться заставить камеру работать как простую флешку (это должно быть в настройках) тогда это можно без ковыряния под root ловить через dbus

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

писать rule для udev

Вот в принципе об этом этот тред и есть :)

попытаться заставить камеру работать как простую флешку (это должно быть в настройках)

В этой камере нет такой возможности. Настроек соединения с компом в ней вообще нет

Loki13 ★★★★★ ()

Запускаем

udevadm monitor
подключаем фотоаппарат; смотрим, что выскакивает. Если что-то появляется, то записываем идентификатор фотоаппарата и пишем правило для udev, которое будет запускать digikam. Вот только проблема появится, если пользователей компьютера несколько: надо будет как-то определить, кто же является текущим пользователем.

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

Кстати, как вариант - завести отдельного пользователя для digicam и запускать это приложение при подключении фотоаппарата в отдельной X-сессии при помощи sudo.

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

завести отдельного пользователя для digicam и запускать это приложение при подключении фотоаппарата в отдельной X-сессии при помощи sudo.

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

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

А, нет: можно написать простенький самопальный монитор, который будет отлавливать подключение фотоаппарата и запускать при необходимости digikam. И воткнуть его в автозапуск DE/WM.

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

>Вот только проблема появится, если пользователей компьютера несколько: надо будет как-то определить, кто же является текущим пользователем.

может быть можно в правилах udev'a посылать что-нибудь по dbus, а в сессии пользователя ловить и реагировать. А если послать что-то стандартное, то можно наверное и отклик ДЕ получить

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

PTP устройства тоже попадают в категорию org.freedesktop.UDisks?

Или ты сам должен man udisks ?

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

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

Можно потыкать consolekit, который это знает.

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

Проблема в том, что определяется по порту usb тупо и никакой инфы об устройстве чтобы его идентифицировать :(

[alexv@myhost ~]$ udevadm monitor
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent

KERNEL[851.820094] add      /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1.3 (usb)
KERNEL[851.822403] add      /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1.3/1-1.3:1.0 (usb)
UDEV  [852.031492] add      /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1.3 (usb)
UDEV  [852.032628] add      /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1.3/1-1.3:1.0 (usb)

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

никакой инфы об устройстве чтобы его идентифицировать :(

лолчто? обрабатывай конкретный ATTRS, например ATTRS{model}, ATTRS{vendor}+ATTRS{device} или ATTRS{serial}
оно же есть в твоём dmesg, facepalm
и кури это http://reactivated.net/writing_udev_rules.html
+доки удева

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

Нашел уже инфу.

[alexv@myhost ~]$ udevadm info -a -p /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1.2

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1.2':
    KERNEL=="1-1.2"
    SUBSYSTEM=="usb"
    DRIVER=="usb"
    ATTR{configuration}==""
    ATTR{bNumInterfaces}==" 1"
    ATTR{bConfigurationValue}=="1"
    ATTR{bmAttributes}=="c0"
    ATTR{bMaxPower}=="  2mA"
    ATTR{urbnum}=="12"
    ATTR{idVendor}=="04a9"
    ATTR{idProduct}=="3211"
    ATTR{bcdDevice}=="0002"
    ATTR{bDeviceClass}=="00"
    ATTR{bDeviceSubClass}=="00"
    ATTR{bDeviceProtocol}=="00"
    ATTR{bNumConfigurations}=="1"
    ATTR{bMaxPacketSize0}=="64"
    ATTR{speed}=="480"
    ATTR{busnum}=="1"
    ATTR{devnum}=="8"
    ATTR{devpath}=="1.2"
    ATTR{version}==" 2.00"
    ATTR{maxchild}=="0"
    ATTR{quirks}=="0x0"
    ATTR{avoid_reset_quirk}=="0"
    ATTR{authorized}=="1"
    ATTR{manufacturer}=="Canon Inc."
    ATTR{product}=="Canon Digital Camera"
    ATTR{serial}=="FB855A57EA6F4DA2B7613E6802B83F76"

Буду курить как правило написать

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

Что минимально достаточно для того чтобы правило удевом подхватилось?

Написал в /etc/udev/rules.d/00-canon.rules
SUBSYSTEM==«usb», ATTRS{product}==«Canon Digital Camera», SERIAL==«FB855A57EA6F4DA2B7613E6802B83F76», RUN+=«digikam»

Не хочет вообще ничего делать. тишина.

Loki13 ★★★★★ ()

Создай /etc/udev/rules.d/11-media-by-label-auto-mount.rules

KERNEL!="sd[a-z][0-9]", GOTO="media_by_label_auto_mount_end"

# Import FS infos
IMPORT{program}="/sbin/blkid -o udev -p %N"

# Get a label if present, otherwise specify one
ENV{ID_FS_LABEL}!="", ENV{dir_name}="%E{ID_FS_LABEL}"
ENV{ID_FS_LABEL}=="", ENV{dir_name}="usbhd-%k"

# Global mount options
ACTION=="add", ENV{mount_options}="noatime,nodiratime,noexec"
# Filesystem-specific mount options
ACTION=="add", ENV{ID_FS_TYPE}=="vfat|ntfs", ENV{mount_options}="$env{mount_options},utf8,gid=100,umask=002"

# Mount the device
ACTION=="add", RUN+="/bin/mkdir -p /media/%E{dir_name}", RUN+="/bin/mount -o $env{mount_options} /dev/%k /media/%E{dir_name}"

# Clean up after removal
ACTION=="remove", ENV{dir_name}!="", RUN+="/bin/umount -l /media/%E{dir_name}", RUN+="/bin/rmdir /media/%E{dir_name}"

# Exit
LABEL="media_by_label_auto_mount_end"
После перезапуска udev все должно заработать, потом поудаляешь лишние строчки (если будет желание).

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

Ну я не настолько деревянный. Я udev вообще перезапустил :) Но толку 0

Может правило где кривое? или написал его не там где надо? смущает что в этой папке кроме этого правила еще только одно

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

Так тут для дискового устройства вроде...
добавил
ACTION==«add»,

к

SUBSYSTEM==«usb», ATTRS{product}==«Canon Digital Camera», SERIAL==«FB855A57EA6F4DA2B7613E6802B83F76», RUN+=«digikam»

Ничего не изменилось

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

У меня тоже фотик, тоже кенон, ВР именно с этим правилом (лень было править под конкретный фотик, поэтому сделал общий). С данными на фотике можно работать как с обычной флешкой.

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

У меня тоже фотик, тоже кенон

Может кэноны разные? у меня SX 130. Мой и в венде тоже не как накопитель, а как устройство определяется

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

ну во-первых, что за ересь:
SERIAL==«FB855A57EA6F4DA2B7613E6802B83F76»
нужно же
ATTRS{serial}==«FB855A57EA6F4DA2B7613E6802B83F76»

во-вторых, у удева пользователь root и, вероятно, пустой env

поэтому, вместо
RUN+=«digikam»
нужно
RUN+=«/bin/su <user> -с bash… export DISPLAY=0….
итд. для начала попробуй что попроще, напр.
RUN+=»/bin/bash -c 'echo 111 >/home/вася/666'"

у меня с флешкой работает

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

Без правила определяется как устройство, с правилом - как накопитель. И вообще, о чем спор? Подкинь мое правило и проверь, не заработает или не понравится - просто удалишь и всего делов.

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

вот это работает, есличо:

SUBSYSTEM==«usb», ACTION==«add», ATTRS{product}==«Mass Storage Device», ATTRS{serial}==«G0KJDCRV», RUN+=«/bin/bash -c 'echo 111 >/home/вася/666'»

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

Создай /etc/udev/rules.d/11-media-by-label-auto-mount.rules

ты херню написал
у него девайс не подхватывается как usb-storage

facepalm один за другим

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

Милейший, проблема в том что правило срабатывает от рута, а иксы запускаются у вас от пользователя, и в большинстве дистрибутивов digikam не сможет подключиться к иксам, тем более что там даже переменная дисплея не настроена.

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

Отлично. Получилось. Спасибо. Теперь буду думать как сделать чтобы оно 2 раза не отрабатывало и чтобы грамотно к кедам прикрутить, но тут уже дело техники

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

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

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

А что может тут не так быть?

ACTION=="add", ACTION=="add",  SUBSYSTEM=="usb", DRIVER=="usb", ATTRS{product}=="Canon Digital Camera", ATTRS{serial}=="FB855A57EA6F4DA2B7613E6802B83F76", RUN+="/bin/su -c /bin/bash -       c 'export DISPLAY=0&/usr/bin/digikam' alexv"

Если просто от рута запускаю
/bin/su -c /bin/bash - c 'export DISPLAY=0&/usr/bin/digikam' alexv
то все работает

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

чтобы оно 2 раза не отрабатывало

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

udevadm info --path=/devices/pci0000:00/0000:00:02.1/usb1/1-1/1-1:1.0/host11/target11:0:0/11:0:0:0/block/sdb --attribute-walk
...
looking at device '/devices/pci0000:00/0000:00:02.1/usb1/1-1/1-1:1.0/host11/target11:0:0/11:0:0:0/block/sdb':
KERNEL==«sdb»
SUBSYSTEM==«block»
...
дял моей флехи я взял SUBSYSTEM==«block» срабатывающее в самом конце и ATTRS{serial} чтобы дифференцировать от других дивайсов:
SUBSYSTEM==«block», ATTRS{serial}==«G0KJDCRV», RUN+=«/usr/bin/aplay -D plughw:0,0 /usr/share/sounds/alsa/Front_Center.wav»
это правило отрабатывает один раз при вставке

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

А что может тут не так быть?

кроме кууучи опечаток? :D

у меня работает так:

RUN+=«/bin/su -c 'export DISPLAY=:0; /usr/bin/geany' вася»

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

а, и если «&» в конец добавить, тоже всё ок

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