2017-05-08 33 views
8

Mam tabelę zakresów adresów IP i muszę wygenerować listę sieci do odrzucenia dla określonego kraju.Wybierz CIDR z zakresu IP w MySQL

Dzięki temu mogę wygenerować listę zakresów IP z mojej bazy danych.

SELECT 
     ip_from, 
     Inet_ntoa(ip_from), 
     ip_to, 
     Inet_ntoa(ip_to) 
FROM 
     ip_address_data 
WHERE 
     country_code = 'XX' 
LIMIT 1 

który generuje ten wynik

ip_from  inet_ntoa(ip_from) ip_to  inet_ntoa(ip_to) 
16777472 1.0.1.0    16778239 1.0.3.255 

Ale muszę to wyjście w formacie CIDR i czasami zakres będzie więcej niż jeden wiersz zwrócony w takim stanie.

1.0.1.0/24 
1.0.2.0/23 

Czy istnieje sposób dynamicznego generowania tych przy użyciu instrukcji select? Ta składnia byłaby niesamowita, ale zakładam, że będzie to procedura składowana, jeśli ma zwrócić więcej niż jeden wiersz wyjściowy na wiersz wejściowy.

SELECT 
    CONCAT('/sbin/route add -net ', CONVERT_TO_CIDR(ip_from,ip_to), ' reject;') AS command 
FROM 
    ip_info.ip_address_data 
WHERE 
    country_code='XX' 
+1

dlaczego upadł? Twój powód nie działa. Nie szukam opinii, to jest prosty problem matematyczny, z którym potrzebuję pomocy. – jbrahy

+0

Ta rozmowa może pomóc http://stackoverflow.com/questions/595748/is-there-way-to-match-ip-with-ipcidr-straight-z-select-query?rq=1 –

Odpowiedz

3

Oto skrypt Pythona do konwersji. Wystarczy przekonwertować to do procedury przechowywanej.

Conversion from IP Range to CIDR Mask

+0

Dzięki, że wygląda na pomocne . – jbrahy

+0

Daj nam znać, ile linii SP jest porównywane z Pythonem. –