Skip to content

Добавить Node.js-style файловый API (глобальный объект fs)#187

Draft
evgeny-boger wants to merge 1 commit intomasterfrom
feature/SOFT-6668-fileops
Draft

Добавить Node.js-style файловый API (глобальный объект fs)#187
evgeny-boger wants to merge 1 commit intomasterfrom
feature/SOFT-6668-fileops

Conversation

@evgeny-boger
Copy link
Copy Markdown
Member

@evgeny-boger evgeny-boger commented Mar 1, 2026

Что происходит; кому и зачем нужно:

Добавляет глобальный объект fs в движок правил wb-rules, реализующий файловый API в стиле Node.js. Это позволяет пользователям читать/писать файлы, работать с директориями, симлинками и следить за изменениями файлов прямо из скриптов правил — без внешних утилит и exec-вызовов.

Типичные сценарии:

  • Чтение данных из sysfs (температура CPU, состояние GPIO)
  • Запись конфигурации и логов
  • Отслеживание изменений файлов через fs.watch()
  • Работа с символическими ссылками и правами доступа

Что поменялось для пользователей:

Появился глобальный объект fs со следующими функциями:

Синхронные:

  • fs.readFileSync(path) — чтение файла (до 10 МБ)
  • fs.writeFileSync(path, data) — запись файла
  • fs.appendFileSync(path, data) — дозапись в файл
  • fs.unlinkSync(path) — удаление файла
  • fs.mkdirSync(path [, {recursive}]) — создание директории
  • fs.rmdirSync(path [, {recursive}]) — удаление директории
  • fs.copyFileSync(src, dest) — копирование файла (потоковое, сохраняет права)
  • fs.existsSync(path) — проверка существования
  • fs.statSync(path) — получение информации о файле
  • fs.readdirSync(path) — список файлов в директории
  • fs.renameSync(oldPath, newPath) — переименование/перемещение
  • fs.accessSync(path [, mode]) — проверка прав доступа
  • fs.realpathSync(path) — разрешение симлинков
  • fs.readlinkSync(path) — чтение цели симлинка

Асинхронные (с callback):

  • fs.readFile, fs.writeFile, fs.appendFile, fs.unlink, fs.mkdir, fs.rmdir, fs.copyFile, fs.stat, fs.readdir, fs.rename, fs.access, fs.realpath, fs.readlink

Наблюдение за файлами:

  • fs.watch(path, callback) — возвращает объект {close()}, callback вызывается при изменении файла

Константы:

  • fs.constants.F_OK, fs.constants.R_OK, fs.constants.W_OK, fs.constants.X_OK

Лимит чтения файлов — 10 МБ. Защита от удаления корневых путей (/, .). Потоковое копирование через io.Copy.

Как проверял/а:

  • 75 unit-тестов на все функции (sync + async + error cases): go test -run TestFile -v
  • Сборка deb-пакета (WBDEV_TARGET=bullseye-arm64 wbdev cdeb)
  • Установка на контроллер WB, проверка демо-правила с мониторингом температуры CPU через sysfs
  • golangci-lint run — без замечаний
  • Все 191 существующих тестов проходят

@evgeny-boger evgeny-boger force-pushed the feature/SOFT-6668-fileops branch from 5202579 to fd3272d Compare March 1, 2026 12:28
@evgeny-boger
Copy link
Copy Markdown
Member Author

CI: Build wbgo.so failure

Эта ветка обновляет golang.org/x/sys с v0.15.0 до v0.22.0 (из-за добавления github.com/fsnotify/fsnotify). Из-за этого текущий wbgo.so не загружается — требуется пересборка плагина из wbgo-private с актуальными версиями зависимостей.

Codacy: 2 ложных срабатывания

  1. for-of loop suggestion (testrules_fileio.js:25) — Duktape — это ES5-движок, for-of не поддерживается
  2. w is assigned but never used (testrules_fileio.js:248) — переменная w нужна в тесте watchNonExistent, который проверяет что fs.watch() выбрасывает ошибку на несуществующем пути

@evgeny-boger evgeny-boger force-pushed the feature/SOFT-6668-fileops branch 5 times, most recently from b3aa52b to 37e6e97 Compare March 1, 2026 23:07
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@evgeny-boger evgeny-boger force-pushed the feature/SOFT-6668-fileops branch from 37e6e97 to 716680d Compare March 1, 2026 23:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant