Skip to content

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 09 Oct 07:47
· 40 commits to main since this release
298f6b2

Аудит безопасности и надёжности всего модуля, исправление записи PAC в поля-массивы, полная документация. Формат
сообщений Kafka, ключи и топики не менялись.

Что может задеть при обновлении

  • Конфигурация проверяется строже. Станция, в которой тег молча не работал бы, теперь останавливает запуск с понятным
    текстом (список ниже, раздел «Исправлено»). Конфигурации из репозитория проходят проверку; свою прогоните на тестовом
    запуске до выкладки.
  • Порты БД и Kafka в compose-стендах привязаны к 127.0.0.1: с других хостов они недоступны, пока привязку не заменят.
  • Подключение к БД по умолчанию — sslmode=prefer: TLS, если сервер его предлагает (раньше TLS не было вовсе). Чтобы
    требовать шифрование — sslmode=require или строже.

Безопасность

  • TLS к PostgreSQL. Раньше драйвер БД был собран без TLS, а sslmode в адресе молча отбрасывался: трафик шёл
    открытым текстом, даже если оператор написал sslmode=require. Теперь поддерживаются sslmode, sslrootcert,
    ssl=true|false и DB_SSLMODE/DB_SSLROOTCERT; неверное значение останавливает запуск. Проверено на настоящем
    PostgreSQL с УЦ (tests/db_tls.rs, scripts/pg_tls.sh, шаг в CI).
  • Команда со значением "NaN"/"inf" больше не доходит до ПЛК (REJECTED_TYPE_MISMATCH); значение для set_cmd PAC —
    только конечное число или bool, строки и NaN/inf отклоняются на месте подстановки в Lua-текст.
  • Адреса PAC (deviceName, fieldName) проверяются при запуске: кавычки, пробелы и управляющие символы запрещены.
  • Пароль БД и токен REST — тип Secret: в Debug и журнал не попадают.
  • Ошибки БД в REST не раскрывают адрес и SQL (подробности — в журнале шлюза); токен короче 16 символов — предупреждение.
  • Образ и CI: права задач по умолчанию — только чтение; cargo audit проверяет и симулятор, и ptusa-opcua; обоснование
    исключения RUSTSEC-2023-0071 (rsa) исправлено: оно ссылалось на «политику None», хотя защищённый канал поддерживается
    с v0.3.0. Порты БД и Kafka в compose-стендах привязаны к 127.0.0.1.
  • Чек-лист безопасности перед пуском на объекте — docs/OPERATIONS.md.

Исправлено

  • Запись PAC в поле-массив. Шлюз слал set_cmd('RT_PAR_F[62]', 1, v): настоящий ptusa принимает такую команду с кодом 0 и
    ничего не меняет, то есть запись выглядела выполненной (APPLIED). Теперь индекс идёт отдельным аргументом:
    set_cmd('RT_PAR_F', 62, v) (как у фасада ptusa-opcua).
  • Чтение RECMAN[n]. Менеджер рецептов лежит в снимке PAC массивом t.RECMAN[n]; тег с deviceName: "RECMAN[1]" читался
    как t["RECMAN[1]"] и всегда был BAD.
  • POST /api/events/{id}/acknowledge отвечал «ACKNOWLEDGED» и для несуществующего аларма — теперь 404; пустой или
    слишком длинный userId — 400.
  • Конфигурация, при которой тег молча не работал, останавливает запуск с понятным текстом: протокол тега не совпадает с
    контроллером (тег никто не опрашивал), два тега с одним nodeId (общий id в БД и общая история), Modbus-адрес вне
    40001…105536 (обрезался бы до чужого регистра), PAC-тег без deviceName/fieldName, разные modbusUnitId у тегов
    одного контроллера.
  • Тип контроллера определяется по схеме адреса, а не по вхождению: pac://modbus-gw:502 больше не принимается за Modbus.
  • Неверный пароль БД и непроверяемый сертификат показываются сразу, а не после 60 с повторов.
  • Зависший Lua-скрипт на большом числе каналов останавливал обработку контроллера (по timeout на канал за цикл): после
    3 превышений времени подряд скрипт отключается на 30 с, его каналы идут как BAD, остальные работают.
  • Мусор в топике команд усекается в журнале (300 символов) и экранируется.

Добавлено

  • Запись в менеджер рецептов RECMAN[n] в формате, который разбирает прошивка: __RECMAN[1]:set_cmd( "CMD", 1, 1001 )
    (двойные кавычки, пробелы, строка в кавычках, число без знака). Значение, которое прошивка молча проигнорировала бы
    (отрицательное число, кавычка в строке), отклоняется как REJECTED_TYPE_MISMATCH. Формат взят из описания прошивки
    (регулярное выражение ptusa_main), на настоящем контроллере с рецептами пока не проверен.
  • SIM_PAC_PORT: порт PAC в controllers.yaml и на хосте в docker-compose.yml настраивается, если 10000 занят настоящим
    ptusa_main.

Документация

  • README переписан: быстрый старт, схемы (mermaid), возможности, контракт с монитором, таблица документов.
  • Новые документы: docs/ARCHITECTURE.md (потоки данных, жизненный цикл, надзор, резервирование, песочницы Lua, принципы),
    docs/CONFIGURATION.md (все переменные окружения, controllers.yaml, scripts.yaml, проверки запуска),
    docs/DEVELOPMENT.md (сборка, тесты, CI, соглашения, как расширять, релиз), docs/TROUBLESHOOTING.md
    (симптом → причина → что делать), simulator/README.md.
  • Комментарии: каждый публичный элемент шлюза описан (#![warn(missing_docs)] проверяется в CI), описаны приватные
    функции, типы и поля во всех пакетах, у интеграционных тестов — сценарий, в неочевидных местах — пояснения «почему».
  • Примеры controllers.yaml в документации проверяются тестом, чтобы не устаревать.

Образ: docker pull ghcr.io/euzireael/scada_rust:v0.4.0