Здравствуйте! Я являюсь разработчиком пакета MagiTrickle. В чате по моей программе неоднократно жаловались на проблему с автоматическим запуском программы после перезагрузки роутера. В свою очередь у меня же такой проблемы не наблюдалось и очень долго для меня было загадкой такое странное поведение программы.
Добавив скрипт на автоматический перезапуск роутера и также собирая логи, в один из перезапусков я получил от своей программы следующие ошибки:
Здесь сервис успел запуститься, а "error while fixing iptables in group" возникает на событие "/opt/etc/ndm/netfilter.d/***". Здесь по дублирующимся логам (вторая и третья ошибка) можно понять, что очистка IPTables вызывалась несколько раз за короткий промежуток времени, что и вызывало ошибку "iptables: No chain/target/match by that name", однако учитывая, что софт по итогу в любом случае получал событие "/opt/etc/ndm/netfilter.d/***" - я закрывал на это глаза.
По итогу, когда мне предоставили логи, возникающие во время запуска моей программы, до меня наконец дошло по какой причине моя программа не запускается должным образом:
Так совпало, что очистка IPTables со стороны Keenetic NDMS вызывалась в тот момент, когда моя программа только-только запускалась, т.е. по временной линии это выглядит как:
MagiTrickle создаёт цепочку в IPTables с названием MT_xxxxxxxx.
MagiTrickle наполняет цепочку MT_xxxxxxxx.
Keenetic NDMS в этот же момент очищает IPTables.
MagiTrickle упал в ошибку, ибо он все ещё наполнял цепочку, которой уже не стало.
Ошибки во время запуска я игнорировать не могу, ибо неправильное заполнение IPTables (когда iptables возвращает статус 1) подразумевает неправильную работу IPTables требующего постороннего вмешательства (например, если пакет установлен на другой роутер, предположим на AsusWRT, где может не быть какого-то модуля ядра Linux расширяющего функционал IPTables - Entware всё-таки не привязан к Keenetic; а собственно мой софт тоже).
Следует также помнить, что мой софт не является Bash скриптом - это исполняемый бинарный файл, который вызывается (автоматически) только один раз - во время запуска службы ("/opt/etc/init.d/***").
Из всего вышесказанного хотелось бы получить какое-то решение со стороны команды разработчиков Keenetic по поводу данной проблемы. Одни из вариантов:
В Keenetic NDMS перестать очищать IPTables (предположительно требует очень много работы со стороны команды разработчиков Keenetic, так что обрасывается);
Keenetic NDMS может сообщать по тем же эвентам о том, что он намеревается очистить IPTables за условные пол секунды до очистки, чтобы софт мог "подождать" работу Keenetic NDMS перед выполнением своих команд (предполагает добавление таймаутов, что будет являться костылём в Keenetic NDMS);
Добавить в Keenetic NDMS возможность блокировать очистку IPTables на условные 5 секунд, когда сама программа (а по факту скрипт запуска службы в файле "/opt/etc/init.d/***") будет сообщать Keenetic NDMS о том, что сейчас лучше не очищать IPTables и требуется подождать.
Буду рад ответу со стороны команды разработчиков Keenetic!