Добрре всем воемя суток!
Вот начал программировать под Linux, нужна ваша помощь.
Нужно написать программку которая бы смотрела USB и если находило совпадение (по виду пиду) то ОС работала бы дальше, а если не нашло то перегружала систему.
Вот у меня счас есть пару впоросов.
Как используя С++ получить инфу о USB?
Из консоли получить инфу о USB можно различными спосабами, lsusb... можно ли использовать команды консоли в С++ програмке и как?
Большое спасибо!
П.С. если можно то с маленькими примерчиками!
Работа с USB
спасибо, но может я не совсем правильно пояснил суть, попробую пояснить
есть зугрузочная флешка с Linux, сама ос грузиться в оперативку и работате нормально, нужно перегрузить, очитсь оперативку, если флешку вытянули....для проверки состояния USB портов нужно написать демон которуй и будет следить что туда подключено, но вот не знаю как само тело демана написать - не знаю какой функцией вытянуть инфу о USB в массив ((
ИМХО, тут даже программа - излишек. Есть такая вещь в системе - udev. Пишете правило, из которого запускается reboot. Главное, чтобы вашу флешку можно было однозначно идентифицировать, а с комбинацией VID/PID, насколько я понимаю, можно промахнуться...
спасибо!! счас будем пробовать)
Автомонтирование USB-устройств
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((
Как используя С++ получить инфу о USB?
смотрите в сторону libusb. как пример можно использовать тот же lsusb.
и в линуксе основной язык - Си.
Из консоли получить инфу о USB можно различными спосабами, lsusb... можно ли использовать команды консоли в С++ програмке и как?
man 3 exec; иногда man 3 system.
Но ИМХО это не правильный путь. проще самому покопаться в исходниках и вытянуть нужные части, чем парсить вывод. и париться с обёртками процесса.
ЗЫ: с udev ИМХО верное решение.
в моем случае в RUN+="" добавить путь к файлу в котором команда перезагрузки?
в общем да. ещё надо убрать ENV{dir_name}!="" - защита, позволяющая отмонтировать так только диски, которые udev и смонтировала.
только нужно ещё будет придумать какую-то проверку, что это именно та флешка.
ЗЫ: пользуйтесь тегом code
создал файл /etc/udev/rules.d/10-udev-my.rules в котором написал
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 создал скрипт
#!/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
что то мне кажется что я не так это все делаю(
Fogord, сдаётся мне, что не хватает DEV=$2.
echo b > /proc/sysrq-trigger
ИМХО лучше перезагружать цивилизованно, через reboot.
ЗЫ: покажите руководство, которым пользуетесь
ЗЗЫ: собственно отмонтирование выполнять необязательно.
ЗЗЗЫ: скрипт лучше переименовать во что-то соответствующее его действиям.
пользуюсь эти руководством
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
часть кода из руководства я не использовал, думал что оно для монтирования...
названия подправлю...
без размонтирования:
#!/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
DEV=`echo $2 | sed -n '/^sd[a-z][1-9]\?/p'`- зачем эта строчка не могу понять, но скорей всего ее и не хватает
DEV=`echo $2 | sed -n '/^sd[a-z][1-9]\?/p'`
ана пропускает только строки, содержащие соответствующий регэксп, иначе строка опустошается.
для начала достаточно просто DEV=$2.
ЗЫ: если не работает, то добавьте отладочную печать...
поробывал вывести отладочную информацию... не выводит
код сейчас такой:
правило с именем 00remove.rules
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"
скрипт быт сделан исполняемым
chmod u+x /etc/udev/scripts/udev-myflash-mount removeсам скрипт вот
#!/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 - пусто
гляньте своим опытным глазом)))
... RUN+="etc/ ...
пропущен /:
... RUN+="/etc/ ...
В вашем варианте скрипт мог быть вызван, только если текущим каталогом процесса udev (или кто там отрабатывает скрипты) являлся корень "/" (и только при условии, если относительные пути не запрещены в коде в целях безопасности).
поправил, но не получается, возможно и монтирование этой флешки нужно делать самому а другому скрипту? (сейчас попробую)
# udevadm monitor
показывает само наличие события с желанными параметрами?
Что не получается?
Скрипт вызывается?
программку которая бы смотрела USB и если находило совпадение (по виду пиду) то ОС работала бы дальше, а если не нашло то перегружала систему
#!/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
вот что мониторится
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)
счас ваш скрипт попробую )
счас ваш скрипт попробую
А ваше устройство в выводе lsusb присутствует в виде
# lsusb
... ID 8644:800b ...
?
на работе с другой флешкой работаю...
... ID 1307:0165 ...что то совсем без реакции, проблема может быть в том что я через виртуалку работаю? (мало возможно)
есть еще у кого идеи?
возможно я не там пишу правило или скрипт?
или как можно узнать какое правило обрабатывается перед моим?
что то меня все идеи покинули ((