Ho una grande lista di sottoreti in una rete memorizzata nel seguente layout. Viene utilizzato come tabella principale per archiviare le risorse che verranno utilizzate per analizzare automaticamente lo stato mediante uno script Python a intervalli regolari.PostgreSQL che espande il cidr in singoli indirizzi
CREATE TEMP TABLE tmp_networks (
network cidr PRIMARY KEY
);
lascia supporre il suo pieno di questi valori per il bene della manifestazione:
- 10.0.0.0/8
- 10.0.1.0/24
- 192.168.0.0/24
Quando eseguo lo script, lo script Python eseguirà la seguente query per rimuovere eventuali sovrapposizioni:
SELECT network
FROM tmp_networks
WHERE NOT EXISTS (
SELECT network
FROM tmp_networks n
WHERE n.network >> tmp_networks.network
);
Questo funziona benissimo, ad eccezione di un piccolo problema; Ho anche una lista di singoli indirizzi che dovrebbero essere esclusi dal lavoro. Questa è anche una tabella nel database:
CREATE TEMP TABLE tmp_except (
address inet PRIMARY KEY
);
lascia supporre questo contiene i seguenti indirizzi:
- 10.0.0.100
- 192.168.0.10
Ora, ho fallito trovare un buon metodo per rimuovere questi indirizzi spesific dall'output del database. Nei miei pensieri, la soluzione sarebbe qualcosa di simile:
- selezionare tutte le sottoreti
- eventuale indirizzo di eccezione si trova all'interno della sottorete, dividere la sottorete in pezzi più piccoli fino a quando l'indirizzo unica eccezione può essere rimosso e tutti gli altri restano gli indirizzi
Ho cercato di indagare se qualcosa di simile è possibile fare in PostgreSQL puro, ma non sono riuscito a trovare alcun modo per risolverlo. Qualche suggerimento su come questo dovrebbe essere risolto?
Qual è il risultato che ti aspetti dalla tua richiesta? È sempre * gli indirizzi (/ 32) * o è * gli indirizzi di rete se possibile e solo gli indirizzi, se c'è un'eccezione *? – Beryllium
Salve, I eccetto gli indirizzi di rete, se possibile, OR/32 se non esistono blocchi più grandi. – agnsaft