Repository navigation
v0.4.0
Аудит безопасности и надёжности всего модуля, исправление записи 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_cmdPAC —
только конечное число или 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