4.8 KiB
intersection.php — сидер ключей replace.cidr4
Одноразовый PHP-скрипт: проходит по всем конфигам порталов в
config/<группа>/<портал>.json, и для каждого портала, чей cidr4
содержит любую зону из файла cidr4.txt, добавляет эту зону как
ключ в replace.cidr4 с пустым значением [].
Используется чтобы массово разметить порталы, которые делят «широкие»
CIDR-зоны (типа 172.217.0.0/16 у google/yandex) — см. подробности
о самой фиче в ../REPLACE.md.
Что именно делает скрипт
- Читает
cidr4.txt— по одной CIDR-зоне на строку. Пустые строки и строки, начинающиеся на#, пропускаются. - Рекурсивно обходит
config/*/*.json. - Для каждого портала: если
cidr4содержит зоны из списка, добавляет их вreplace.cidr4с пустым[]в значении (если ключа ещё нет). - Дополнительно создаёт каноническую форму
replace: {cidr4: {...}, cidr6: {}}, если поля раньше не было. - Переписывает JSON портала в том же порядке ключей, в котором его
пишет сам сервер через
Site::saveConfig.
Идемпотентно. Повторный запуск — no-op. Уже заполненные
value-массивы (которые успел нарастить reload) не затираются.
Запуск
Запускать из корня проекта:
# Напрямую
php docs/intersection/intersection.php
# Через docker compose
docker compose run --rm app php docs/intersection/intersection.php
Порог памяти в скрипте поднят до 4 ГБ (ini_set('memory_limit', '4048M'))
для чтения тяжёлых конфигов вроде Adobe / Amazon с тысячами доменов.
Формат cidr4.txt
Одна CIDR-зона на строку в точно той форме, в которой она встречается
в cidr4 порталов (сравнение строкой байт-в-байт, без
нормализации). Пустые строки и #-комментарии пропускаются:
# Akamai
23.32.0.0/11
23.192.0.0/11
104.64.0.0/10
# Google
172.217.0.0/16
216.58.192.0/19
Что происходит после запуска
Перезапустите сервер. На следующем reload-цикле при
SYS_REPLACE_ESCALATE_IPS=true (дефолт) пустые value-массивы ключей
будут заполнены /32 адресами портала, попавшими в ключевую зону.
Если дополнительно включён SYS_REPLACE_AGGREGATE_SUBNETS=true и
пороги SYS_REPLACE_COLLAPSE_THRESHOLD_* — сработают агрегация и
плотностное схлопывание. Подробности — в ../REPLACE.md.
Защиты от кривого ввода
- Файл конфига с корнем не
object— пропуск + сообщение вstderr. replace,replace.cidr4,replace.cidr6не-object— пропуск + сообщение. Вручную ломать структуру не стоит, но скрипт не затрёт её молча.- Пустой
cidr4портала или отсутствующий — портал не трогается. - Зона из
cidr4.txt, которой нет ни у одного портала — тихо игнорируется.
Когда НЕ стоит запускать
- Если
cidr4.txtсейчас редактируется/под версионным контролем с правками — дождитесь, пока список стабилизируется. - Если на сервере параллельно идёт
reload-цикл крупного портала — скрипт может записать конфиг поверх свежей эскалации. Лучше остановить сервис перед запуском или дождаться тихого момента. - Многократные прогоны «просто на всякий случай» — скрипт
идемпотентен, но
mtimeфайлов сдвигается.