У меня есть большой список подсетей в сети, хранящийся в следующем макете. Она используется в качестве главной таблицы для хранения активов, которые будут использоваться для автоматической проверки состояния скриптом Python через регулярные промежутки времени.
CREATE TEMP TABLE tmp_networks (
network cidr PRIMARY KEY
);
Предположим, что он заполнен этими значениями для демонстрации:
- 10.0.0.0/8
- 10.0.1.0/24
- 192.168.0.0/24
Когда я запускаю скрипт, Python-скрипт выполнит следующий запрос, чтобы удалить любые перекрытия:
SELECT network
FROM tmp_networks
WHERE NOT EXISTS (
SELECT network
FROM tmp_networks n
WHERE n.network >> tmp_networks.network
);
Это прекрасно работает, за исключением одной крошечной проблемы; У меня также есть список отдельных адресов, которые следует исключить из работы. Это также таблица в базе данных:
CREATE TEMP TABLE tmp_except (
address inet PRIMARY KEY
);
Предположим, что он содержит следующие адреса:
- 10.0.0.100
- 192.168.0.10
Теперь мне не удалось найти хороший способ удалить эти конкретные адреса из вывода базы данных. На мой взгляд, решение будет примерно таким:
- выбрать все подсети
- если в подсети обнаружен какой-либо адрес исключения, разделите подсеть на более мелкие части, пока единственный адрес исключения не будет удален, а все остальные адреса останутся
Я пытался выяснить, можно ли сделать что-то подобное в чистом PostgreSQL, но не нашел способа решить эту проблему. Любые указатели на то, как это должно быть решено?