import dfanotify; import std.stdio; import std.file : readLink; import std.format : format; import core.sys.posix.fcntl : AT_FDCWD; import core.sys.posix.unistd : close; import core.stdc.stdlib : exit; void main() { Fanotify fan; try { fan = new Fanotify( FAN_CLASS_NOTIF | FAN_CLOEXEC | FAN_REPORT_FID | FAN_REPORT_DIR_FID | FAN_REPORT_NAME); } catch (Exception e) { writeln(e.msg); exit(1); } auto eventMask = FAN_OPEN | FAN_MODIFY | FAN_CLOSE | FAN_CREATE | FAN_DELETE | FAN_EVENT_ON_CHILD; try { fan.mark(FAN_MARK_ADD | FAN_MARK_ONLYDIR, eventMask, AT_FDCWD, "/tmp/scripts"); } catch (Exception e) { writeln(e.msg); exit(1); } writeln("Мониторинг запущен для /tmp/scripts..."); while (true) { auto events = fan.readEvents(); foreach (ref e; events) { string path = e.name.length ? e.name : "unknown"; writefln("Событие: mask=0x%x, pid=%d, name/path=%s", e.mask, e.pid, path); if (e.isOpen) writeln(" - Открытие файла"); if (e.isModify) writeln(" - Модификация файла"); if (e.isCloseWrite) writeln(" - Закрытие после записи"); if (e.isCloseNoWrite) writeln(" - Закрытие без записи"); if (e.isCreate) writeln(" - Создание файла/директории"); if (e.isDelete) writeln(" - Удаление файла/директории"); } } }