116 lines
5.5 KiB
Python
Executable File
116 lines
5.5 KiB
Python
Executable File
#!/usr/bin/python3
|
|
|
|
import re
|
|
import os
|
|
import sys
|
|
import net_tree
|
|
import requests
|
|
|
|
# массив выгружаемых списков
|
|
ip_list = {
|
|
'RU': [
|
|
{ 'url': 'https://stat.ripe.net/data/country-resource-list/data.json?resource=RU', 'type': 'ipv4' },
|
|
{ 'url': 'https://ipv4.fetus.jp/ru.txt', 'type': 'ipv4' },
|
|
{ 'url': 'https://github.com/ipverse/rir-ip/blob/master/country/ru/ipv4-aggregated.txt', 'type': 'ipv4' }
|
|
],
|
|
'GOOGLE': [
|
|
{ 'url': 'https://bgp.he.net/AS15169#_prefixes', 'type': 'ipv4' },
|
|
{ 'url': 'https://ipinfo.io/widget/demo/AS15169?dataset=asn', 'type': 'ipv4' },
|
|
{ 'url': 'https://api.hackertarget.com/aslookup/?q=AS15169', 'type': 'ipv4' },
|
|
{ 'url': 'https://www.gstatic.com/ipranges/goog.json', 'type': 'ipv4' }
|
|
],
|
|
'RKN': [
|
|
{ 'url': 'https://reestr.rublacklist.net/api/v3/ips/', 'type': 'ipv4' },
|
|
{ 'url': 'https://antifilter.network/download/ip.lst', 'type': 'ipv4' },
|
|
],
|
|
'MSFT': [
|
|
{ 'url': 'https://bgp.he.net/AS8075#_prefixes', 'type': 'ipv4' },
|
|
{ 'url': 'https://ipinfo.io/widget/demo/AS8075?dataset=asn', 'type': 'ipv4' },
|
|
{ 'url': 'https://api.hackertarget.com/aslookup/?q=AS8075', 'type': 'ipv4' },
|
|
],
|
|
'VALVE': [
|
|
{ 'url': 'https://bgp.he.net/AS32590#_prefixes', 'type': 'ipv4' },
|
|
{ 'url': 'https://ipinfo.io/widget/demo/AS32590?dataset=asn', 'type': 'ipv4' },
|
|
{ 'url': 'https://api.hackertarget.com/aslookup/?q=AS32590', 'type': 'ipv4' },
|
|
]
|
|
# 'AMAZONE': [
|
|
# { 'url': 'https://bgp.he.net/AS16509#_prefixes', 'type': 'ipv4' },
|
|
# { 'url': 'https://ipinfo.io/widget/demo/AS16509?dataset=asn', 'type': 'ipv4' },
|
|
# { 'url': 'https://api.hackertarget.com/aslookup/?q=AS16509', 'type': 'ipv4' },
|
|
# ]
|
|
}
|
|
|
|
def list_ip(c_list: dict = []):
|
|
for c_url in c_list:
|
|
try:
|
|
result = requests.get(c_url['url'])
|
|
if result.status_code == 200:
|
|
print(f"URL: {c_url['url']}")
|
|
# обработка ipv4
|
|
if c_url['type'] == 'ipv4':
|
|
# выполняем поиск по регулярному выражению ipv4
|
|
ipv4_list=re.finditer(r"[^0-9.](25[0-5]|2[0-4][0-9]|[1-9][0-9][0-9]?|[0-9])\.(25[0-5]|2[0-4][0-9]|[1-9][0-9][0-9]?|[0-9])\.(25[0-5]|2[0-4][0-9]|[1-9][0-9][0-9]?|[0-9])\.(25[0-5]|2[0-4][0-9]|[1-9][0-9][0-9]?|[0-9])(/([0-9]{1}[0-9]*))*[\r\n$\"',]+", result.text)
|
|
# строим дерево
|
|
Root = net_tree.Node(net_tree.Net(0,0), 0)
|
|
# пробегаем в цикле
|
|
for c in ipv4_list:
|
|
# готовим данные для добавление в дерево
|
|
ip = 0
|
|
for i in range(1, 5):
|
|
ip = ip * 256 + int(c.group(i))
|
|
if c.group(6):
|
|
mask_size = int(c.group(6))
|
|
else:
|
|
mask_size = 32
|
|
# добавляем запись в дерево
|
|
Root.addSubnet(net_tree.Node(net_tree.Net(ip, mask_size), 1))
|
|
|
|
Root.finishTreeFirst()
|
|
# жесткое сжатие в размер 30000 записей
|
|
#Root.collapseRoot(Root.real_ip_records_count - 30000)
|
|
# более мягкое сжатие
|
|
Root.collapse(1,Root.real_ip_records_count)
|
|
# возвращаем результат
|
|
res = Root.returnCollapsedTree('route {addr}/{masklen} blackhole;')
|
|
# рузультат поиска не пустой
|
|
if res:
|
|
print("Успешно")
|
|
return Root.real_ip_records_count, res
|
|
# результат поиска пустой
|
|
print("Список пуст")
|
|
# обработка ipv6
|
|
if c_url['type'] == 'ipv6':
|
|
return False
|
|
break;
|
|
# результат запроса к url пустой
|
|
print("Ошибка соединения")
|
|
except Exception as e:
|
|
# исключение
|
|
print(f"Ошибка: {e}")
|
|
return False, False
|
|
|
|
# главная фукция
|
|
if __name__ == "__main__":
|
|
# создаем дерриктори. для сохранения
|
|
outdir=os.path.join(os.path.dirname(os.path.realpath(__file__)), 'unloading')
|
|
if not os.path.exists(outdir):
|
|
os.makedirs(outdir,exist_ok=True)
|
|
# обходим массив списков для выкрузки
|
|
for list in ip_list:
|
|
# имя выходного файла
|
|
out_file=f"{outdir}/{list.lower()}.txt"
|
|
# вычисляем кол-во записей прошлой выгрузки
|
|
if os.path.isfile(out_file):
|
|
old_load_count = sum(1 for line in open(out_file))
|
|
else:
|
|
old_load_count = 0
|
|
# выполняем выгрузку
|
|
print(f"Выгружаю список IP: {list}")
|
|
load_count, load_list=list_ip(ip_list[list])
|
|
if load_count and load_list and load_count >= old_load_count * 0.7:
|
|
# сохраняем в файл
|
|
with open(out_file, "w") as file:
|
|
file.write(load_list)
|
|
print(f"Файл {out_file} сохранён")
|
|
print("")
|