Skip to content

v2.4.42

Choose a tag to compare

@fildunsky fildunsky released this 02 Sep 12:28
· 8 commits to master since this release

Команды по SMS больше не выполняются из чужой переписки

Смена SIM отдаёт модему переписку новой карты за месяцы. Память «выполненного» у команд и «виденного» у бота была привязана к модему, а сообщения приезжают с картой — для обоих списков вся её переписка выглядела новой. На практике это значило: полугодовалое reboot с только что вставленной SIM выполнялось как свежая команда.

Четыре независимых слоя, каждый закрывает свой класс отказа:

  • Список выполненных команд привязан к ICCID карты. Идентификатор берётся из снимка метрик, без единого обращения к модему. Незнакомая карта = первая встреча: её переписка молча помечается обработанной, команды не выполняются. Если ICCID прочитать не удалось — откат на прежнюю привязку к модему, функция не отваливается.
  • Срок годности команды (cmd_max_age, сутки). Метку времени ставит SMSC, поэтому команда, застрявшая у оператора на трое суток, тоже не выполнится — обстановка за это время изменилась.
  • Кулдаун на повтор (cmd_cooldown, 5 минут). Десять копий reboot с разными метками времени давали по перезагрузке на копию: первая уводила роутер в ребут, остальные не успевали пометиться выполненными. Файл кулдауна лежит на флеше — в /tmp он исчезал бы вместе с самим /tmp.
  • sync сразу после пометки. При потере питания в момент выполнения запись иначе не доезжает до флеша, и после подъёма команда выполняется заново.

Бот не пересылает архив новой карты

Окно свежести tg_first_hours работало только при первой встрече с модемом. Теперь оно применяется всегда: сообщение старше окна молча помечается виденным и остаётся во «Входящих» и в архиве, а в журнал идёт строка с причиной. Тот же эффект давала карта из телефона и очищенная память модема.

Защитный код по умолчанию — secret

Пустое поле рядом со «словом в SMS» ничего не объясняло, их постоянно путали. Заполненное отвечает на вопрос само: команда выглядит как secret reboot, и роли обоих слов видны сразу. Подпись поля просит сменить код на свой. Код ставится только вместе с заготовками команд — тому, кто уже завёл свои и шлёт их без кода, внезапный код сломал бы всё работающее.