LinuxForum.Fans
Тема

Работа с USB

Автор: Fogord 39 сообщений 7243 просмотров
#244910

Добрре всем воемя суток!
Вот начал программировать под Linux, нужна ваша помощь.

Нужно написать программку которая бы смотрела USB и если находило совпадение (по виду пиду) то ОС работала бы дальше, а если не нашло то перегружала систему.
Вот у меня счас есть пару впоросов.
Как используя С++ получить инфу о USB?
Из консоли получить инфу о USB можно различными спосабами, lsusb... можно ли использовать команды консоли в С++ програмке и как?



Большое спасибо!

П.С. если можно то с маленькими примерчиками!

#244913

Поковыряйте V-USB. Хоть она и предназначена для работы с микроконтроллерами AVR, думаю, это вам поможет.

#244916

спасибо, но может я не совсем правильно пояснил суть, попробую пояснить

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

#244919

ИМХО, тут даже программа - излишек. Есть такая вещь в системе - udev. Пишете правило, из которого запускается reboot. Главное, чтобы вашу флешку можно было однозначно идентифицировать, а с комбинацией VID/PID, насколько я понимаю, можно промахнуться...

#244928

спасибо!! счас будем пробовать)

#244936

Автомонтирование USB-устройств

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

IMPORT{program}="/sbin/blkid -o udev -p %N" ENV{ID_FS_LABEL}!="", ENV{dir_name}="%E{ID_FS_LABEL}" ENV{ID_FS_LABEL}=="", ENV{dir_name}="usbhd-%k"

ACTION=="add", RUN+="/bin/mkdir -p /media/%E{dir_name}", RUN+="/bin/mount -t auto -o rw,relatime,noexec,nodev,utf8 /dev/%k /media/%E{dir_name}"

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

LABEL="auto_mount_end"

Вот эта строка - правило для извличения, розмотирования (как я понимаю)

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

в моем случае в RUN+="" добавить путь к файлу в котором команда перезагрузки? подскажите...
не работал с udev((

#244942
"Fogord" написал:
Как используя С++ получить инфу о USB?

смотрите в сторону libusb. как пример можно использовать тот же lsusb.
и в линуксе основной язык - Си.

"Fogord" написал:
Из консоли получить инфу о USB можно различными спосабами, lsusb... можно ли использовать команды консоли в С++ програмке и как?

man 3 exec; иногда man 3 system.
Но ИМХО это не правильный путь. проще самому покопаться в исходниках и вытянуть нужные части, чем парсить вывод. и париться с обёртками процесса.
ЗЫ: с udev ИМХО верное решение.

"Fogord" написал:
в моем случае в  RUN+="" добавить путь к файлу в котором команда перезагрузки?

в общем да. ещё надо убрать ENV{dir_name}!="" - защита, позволяющая отмонтировать так только диски, которые udev и смонтировала.
только нужно ещё будет придумать какую-то проверку, что это именно та флешка.

ЗЫ: пользуйтесь тегом code

#245016

создал файл /etc/udev/rules.d/10-udev-my.rules в котором написал

text

BUS=="usb", SUBSYSTEM=="block", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="14ad", KERNEL=="sd*", ACTION=="remove", RUN+="/etc/udev/scripts/udev-myflash-mount remove %k"

/etc/udev/scripts/udev-myflash-mount создал скрипт

text

#!/bin/bash

LOG="/var/log/udev" sleep 3 if [ "$1" = "remove" ]; then if [ "$DEV" != "" ]; then echo "--- `date` ---" >> $LOG echo "Unmounting /dev/$DEV" >> $LOG umount /dev/$DEV >> $LOG 2>&1 rm -rf /mnt/$DEV >> $LOG 2>&1 echo b > /proc/sysrq-trigger fi fi

что то мне кажется что я не так это все делаю(

#245031

Fogord, сдаётся мне, что не хватает DEV=$2.

"Fogord" написал:
echo b > /proc/sysrq-trigger

ИМХО лучше перезагружать цивилизованно, через reboot.

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

#245035

пользуюсь эти руководством

http://ru.gentoo-wiki.com/wiki/HOWTO_Udev_%D0%B8_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%BE%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D1%81%D0%B8%D1%82%D0%B5%D0%BB%D0%B5%D0%B9

часть кода из руководства я не использовал, думал что оно для монтирования...

названия подправлю...

без размонтирования:

text
#!/bin/bash

LOG="/var/log/udev"

sleep 3

DEV=`echo $2 | sed -n '/^sd[a-z][1-9]\?/p'`

if [ "$1" == "remove" ]; then echo b > /proc/sysrq-trigger fi

text
DEV=`echo $2 | sed -n '/^sd[a-z][1-9]\?/p'`

- зачем эта строчка не могу понять, но скорей всего ее и не хватает

#245041
"Fogord" написал:
DEV=`echo $2 | sed -n '/^sd[a-z][1-9]\?/p'`

ана пропускает только строки, содержащие соответствующий регэксп, иначе строка опустошается.
для начала достаточно просто DEV=$2.

ЗЫ: если не работает, то добавьте отладочную печать...

#245144

поробывал вывести отладочную информацию... не выводит
код сейчас такой:
правило с именем 00remove.rules

text

BUS=="usb", KERNEL=="sd", SUBSYSTEM=="block", ATTRS{idVendor}=="8644", ATTRS{idProduct}=="800b", ACTION=="remove", RUN+="etc/udev/scripts/udev-myflash-mount remove %k"

idV, idP взял с помошью "lsusb"

скрипт быт сделан исполняемым

text
chmod u+x /etc/udev/scripts/udev-myflash-mount remove

сам скрипт вот

text

#!/bin/bash
LOG="/var/log/udev/log.log"
echo $1 >> $LOG
sleep 3
DEV=$2
if [ "$1" == "remove" ]; then
     echo b > /proc/sysrq-trigger 
fi

/var/log/udev/log.log - пусто

гляньте своим опытным глазом)))

#245171

... RUN+="etc/ ...
пропущен /:
... RUN+="/etc/ ...

В вашем варианте скрипт мог быть вызван, только если текущим каталогом процесса udev (или кто там отрабатывает скрипты) являлся корень "/" (и только при условии, если относительные пути не запрещены в коде в целях безопасности).

#245192

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

#245195

# udevadm monitor
показывает само наличие события с желанными параметрами?
Что не получается?
Скрипт вызывается?

#245199
"Fogord" написал:
программку которая бы смотрела USB и если находило совпадение (по виду пиду) то ОС работала бы дальше, а если не нашло то перегружала систему
text

#!/bin/bash
VID=8644
PID=800b
while ((1)); do
    if ! /usr/bin/lsusb | /usr/bin/grep "ID $VID:$PID" &> /dev/null
    then /sbin/reboot
    fi
    sleep 30s
done

;-D

#245201

вот что мониторится

text

monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent

KERNEL[1334099582.859273] remove /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/host6/target6:0:0/6:0:0:0/bsg/6:0:0:0 (bsg) KERNEL[1334099582.859329] remove /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/host6/target6:0:0/6:0:0:0/scsi_device/6:0:0:0 (scsi_device) KERNEL[1334099582.859341] remove /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/host6/target6:0:0/6:0:0:0/scsi_disk/6:0:0:0 (scsi_disk) KERNEL[1334099582.859350] remove /devices/virtual/bdi/8:16 (bdi) KERNEL[1334099582.859362] remove /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/host6/target6:0:0/6:0:0:0/block/sdb (block) KERNEL[1334099582.859373] remove /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/host6/target6:0:0/6:0:0:0 (scsi) KERNEL[1334099582.859382] remove /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/host6/target6:0:0 (scsi) KERNEL[1334099582.859391] remove /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/host6/scsi_host/host6 (scsi_host) KERNEL[1334099582.859399] remove /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/host6 (scsi) KERNEL[1334099582.860604] remove /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0 (usb) KERNEL[1334099582.860619] remove /devices/pci0000:00/0000:00:06.0/usb1/1-2/usb_device/usbdev1.7 (usb_device) KERNEL[1334099582.860638] remove /devices/pci0000:00/0000:00:06.0/usb1/1-2 (usb) UDEV [1334099582.863685] remove /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/host6/target6:0:0/6:0:0:0/scsi_device/6:0:0:0 (scsi_device) UDEV [1334099582.866179] remove /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/host6/target6:0:0/6:0:0:0/bsg/6:0:0:0 (bsg) UDEV [1334099582.868427] remove /devices/pci0000:00/0000:00:06.0/usb1/1-2/usb_device/usbdev1.7 (usb_device) UDEV [1334099582.870144] remove /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/host6/scsi_host/host6 (scsi_host) UDEV [1334099582.870660] remove /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/host6/target6:0:0/6:0:0:0/block/sdb (block) UDEV [1334099582.871176] remove /devices/virtual/bdi/8:16 (bdi) UDEV [1334099582.871686] remove /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/host6/target6:0:0/6:0:0:0/scsi_disk/6:0:0:0 (scsi_disk) UDEV [1334099582.873250] remove /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/host6/target6:0:0/6:0:0:0 (scsi) UDEV [1334099582.874872] remove /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/host6/target6:0:0 (scsi) UDEV [1334099582.876394] remove /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/host6 (scsi) UDEV [1334099582.879153] remove /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0 (usb) UDEV [1334099582.882123] remove /devices/pci0000:00/0000:00:06.0/usb1/1-2 (usb)

счас ваш скрипт попробую )

#245203
"Fogord" написал:
счас ваш скрипт попробую

А ваше устройство в выводе lsusb присутствует в виде

text
# lsusb
... ID 8644:800b ...

?

#245205

на работе с другой флешкой работаю...

text
... ID 1307:0165 ...

что то совсем без реакции, проблема может быть в том что я через виртуалку работаю? (мало возможно)

есть еще у кого идеи?

#245262

возможно я не там пишу правило или скрипт?
или как можно узнать какое правило обрабатывается перед моим?

что то меня все идеи покинули ((

Войдите или зарегистрируйтесь, чтобы ответить.