Промежуток 1

This commit is contained in:
Alexander Zhirov 2025-08-29 00:10:11 +03:00
parent ed0d2780c3
commit cb3f40deee
Signed by: alexander
GPG key ID: C8D8BE544A27C511
2 changed files with 171 additions and 57 deletions

View file

@ -1,56 +1,77 @@
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 {
try
{
fan = new Fanotify(
FAN_CLASS_NOTIF | FAN_CLOEXEC | FAN_REPORT_FID | FAN_REPORT_DIR_FID | FAN_REPORT_NAME);
} catch (Exception e) {
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;
auto eventMask = FAN_OPEN | FAN_MODIFY | FAN_CLOSE | FAN_CREATE | FAN_DELETE | FAN_EVENT_ON_CHILD | FAN_ACCESS;
try {
try
{
fan.mark(FAN_MARK_ADD | FAN_MARK_ONLYDIR, eventMask, AT_FDCWD, "/tmp/scripts");
} catch (Exception e) {
}
catch (Exception e)
{
writeln(e.msg);
exit(1);
}
writeln("Мониторинг запущен для /tmp/scripts...");
writeln(
"Мониторинг с разрешениями запущен для /tmp/scripts...");
while (true)
{
auto events = fan.readEvents();
foreach (ref e; events)
foreach (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(" - Удаление файла/директории");
// Обработка permission-события
if (e.isOpenPerm)
{
writeln(" - Запрос на открытие файла. Отклоняем (предполагаем попытку записи).");
e.respond(FAN_DENY); // Отклонить (для FAN_ALLOW используйте FAN_ALLOW)
}
else
{
// Обычные уведомления (не permission)
if (e.isOpen)
writeln(" - Открытие файла");
if (e.isAccess)
writeln(" - Доступ к файлу");
if (e.isModify)
writeln(" - Модификация файла");
if (e.isCloseWrite)
writeln(" - Закрытие после записи");
if (e.isCloseNoWrite)
writeln(" - Закрытие без записи");
if (e.isCreate)
writeln(" - Создание файла/директории");
if (e.isDelete)
writeln(" - Удаление файла/директории");
}
// Опционально: вызов постобработки
e.postProcess();
}
}
}