LINUX.ORG.RU

Как отслеживать изменения в /sys/class/net?


0

1

Есть необходимость отслеживать состояние ethernet-подключения. Да, можно в консоли выполнить

cat /sys/class/net/eno1/carrier

и

cat /sys/class/net/eno1/operstate

и сделать выводы.

Можно сделать что-то вроде system("cat /sys/class/net/eno1/carrier"), но как-то это мне не нравится.

inotify не хочет работать с /sys.

Как это сделать лучше из программы? Я могу открыть файлы, прочитать из них данные и обработать их. Нормально ли открывать их раз в секунду? Может, есть еще какие-то способы?

★★

Можно сделать что-то вроде system(«cat /sys/class/net/eno1/carrier»), но как-то это мне не нравится.

Не понял к чему ты это написал. Зачем делать эту чушь когда файл можно открыть безо всяких system()?

Нормально ли открывать их раз в секунду?

Нет, но в линуксе так принято, так что открывай. Или жди пока туда inotify прикрутят.

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

Не понял к чему ты это написал. Зачем делать эту чушь когда файл можно открыть безо всяких system()?

Написал потому, что это тоже можно делать, но, по-моему, слишком нагрузит систему (embedded, да, не в чистом виде, но ресурсы ограничены).

braboar ★★
() автор топика

можно пасти syslog на предмет строк Link is Down/Link is Up

более правильный вариант - получать по netlink события NETDEV_UP/NETDEV_DOWN

в udev такое вроде не приходит, но можно попробовать

SUBSYSTEM=="net", RUN+="/path/to/udev-net-event.sh"

возможно это зависит от драйвера

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

Судя по:

The Linux Audit system provides a way to track security-relevant information on your system. Based on pre-configured rules, Audit generates log entries to record as much information about the events that are happening on your system as possible.

audit пишет в лог, а мне бы надо в программе смотреть состояние подключения. Или я чего-то не понял?

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

а, есть ещё ifplugd, который может что-то подёргать по этим событиям

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

По сути, не очень отличается от открыть файл->прочитать значение->закрыть файл, нет?

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

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

Существует аудит файловой системы, но скорее всего он под капотом этот inotify и использует. Возможно это можно как то хитрее, например событие_аудит SYSCALL отловить какое-нибудь.

P.S У меня аудитктл во всяком случае ошибок не выдал на вот это:

sudo auditctl -w /sys/class/net/eno1/carrier -p wa -k carrier_watch

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

Спасибо, завтра посмотрю, есть ли auditctl на хосте, и попробую.

braboar ★★
() автор топика

Если подписаться на события netlink, то будешь получать их максимально быстро.

Посмотри на ip mon

vel ★★★★★
()

Всем спасибо за помощь!

В итоге сделал:

struct ifreq ifr;
// socket initialization
ioctl(sock, SIOCGIFFLAGS, &ifr);

и проверяю флаги в ifr.

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

Ну сначала определить состояние интерфейса да, SIOCGIFFLAGS, а ждать изменение состояния можно через netlink.

Незнаю, умеет ли оно сообщать о потере линка.

Удаление сетевой карты это и выгрузка драйвера.

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

Спасибо, добрый человек! Исчерпывающая информация, очень кстати!

braboar ★★
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.