v2.4.42
Команды по SMS больше не выполняются из чужой переписки
Смена SIM отдаёт модему переписку новой карты за месяцы. Память «выполненного» у команд и «виденного» у бота была привязана к модему, а сообщения приезжают с картой — для обоих списков вся её переписка выглядела новой. На практике это значило: полугодовалое reboot с только что вставленной SIM выполнялось как свежая команда.
Четыре независимых слоя, каждый закрывает свой класс отказа:
- Список выполненных команд привязан к ICCID карты. Идентификатор берётся из снимка метрик, без единого обращения к модему. Незнакомая карта = первая встреча: её переписка молча помечается обработанной, команды не выполняются. Если ICCID прочитать не удалось — откат на прежнюю привязку к модему, функция не отваливается.
- Срок годности команды (
cmd_max_age, сутки). Метку времени ставит SMSC, поэтому команда, застрявшая у оператора на трое суток, тоже не выполнится — обстановка за это время изменилась. - Кулдаун на повтор (
cmd_cooldown, 5 минут). Десять копийrebootс разными метками времени давали по перезагрузке на копию: первая уводила роутер в ребут, остальные не успевали пометиться выполненными. Файл кулдауна лежит на флеше — в/tmpон исчезал бы вместе с самим/tmp. syncсразу после пометки. При потере питания в момент выполнения запись иначе не доезжает до флеша, и после подъёма команда выполняется заново.
Бот не пересылает архив новой карты
Окно свежести tg_first_hours работало только при первой встрече с модемом. Теперь оно применяется всегда: сообщение старше окна молча помечается виденным и остаётся во «Входящих» и в архиве, а в журнал идёт строка с причиной. Тот же эффект давала карта из телефона и очищенная память модема.
Защитный код по умолчанию — secret
Пустое поле рядом со «словом в SMS» ничего не объясняло, их постоянно путали. Заполненное отвечает на вопрос само: команда выглядит как secret reboot, и роли обоих слов видны сразу. Подпись поля просит сменить код на свой. Код ставится только вместе с заготовками команд — тому, кто уже завёл свои и шлёт их без кода, внезапный код сломал бы всё работающее.