fix(memory): ограничить чтения неограниченного вывода в память

На роутере со 128 МБ несколько мест читали в память вывод, размер которого
ничем не ограничен. Распаковка gzip подписки шла через пайп с чтением целиком:
скачивание curl ограничено 15 МБ, но коэффициент сжатия base64-текста высокий,
так что пик доходил до десятков мегабайт. Оба вызывающих места передают файл и
ждут файл, поэтому распакованный поток теперь уходит редиректом сразу в
выходной файл, а успех определяется по коду возврата и ненулевому размеру.

Таблица nftables содержит сеты с десятками тысяч элементов из списков, и
`nft list table` печатает их все. Проба контроллера делала это каждый тик,
хотя ищет только имена цепочек и правил; четыре проверки доктора и вывод
чужих меток из полного рулесета — то же самое. Везде добавлен grep на
источнике, отбирающий только те строки, которые код потом и разбирает.

Два просмотра логов читали кольцевой буфер syslog целиком, чтобы показать
несколько сотен строк; теперь количество строк ограничено на стороне logread.
This commit is contained in:
Dushnilin
2026-08-08 23:02:18 +03:00
parent e6e3853f05
commit 106ce9352a
3 changed files with 16 additions and 19 deletions
@@ -630,8 +630,8 @@ function controller(bus, opts) {
let nft_table = getenv("NFT_TABLE_NAME") || "TachyonTable";
let routing_mode = setting("routing_mode", "nftables");
// One `nft list` serves both the table check and the QoS check.
let out_nft = command_output_from_args(["nft", "list", "table", "inet", nft_table]);
let out_nft = command_output_from_args(["sh", "-c",
"nft list table inet " + nft_table + " | grep -E 'chain|tproxy|priority_rules|dscp'; exit 0"]);
if (routing_mode == "nftables") {
if (index(out_nft, "tproxy") < 0 || index(out_nft, "priority_rules") < 0) {