Исправлена ошибка в сворочивание сетей с маский /32, /128 для ipv4, ipv6 соответственно.

This commit is contained in:
2025-12-01 17:00:08 +10:00
parent 4a6d2e3809
commit 7da6ef4624
2 changed files with 240 additions and 252 deletions

View File

@@ -123,7 +123,7 @@ def list_ip(c_list: list = []):
# пробегаем словарь выгрузки
for c_dict in c_list:
# если есть источник ссылка
# # если есть источник ссылка
if 'url' in list(c_dict):
# бежим весь список ссылок пока не код 200
for c_url in c_dict['url']:
@@ -150,48 +150,37 @@ def list_ip(c_list: list = []):
# пополняем словарь ipv6_list
ipv6_list.update(ipv6_find(str(c_dict['static6']),ipv6))
# если ключ не сжимать
if ipv4_list and not compress:
ipv4_list:str="".join([f"route {k} blackhole;\n" for k, v in ipv4_list.items() if isinstance(v, list)])
# сжимаем подсети ipv4
elif ipv4_list and compress:
# строим дерево
Root = net_tree.Node(net_tree.Net(0, 0), 0)
# пробегаем в цикле
for c in ipv4_list.values():
# добавляем запись в дерево
Root.addSubnet(net_tree.Node(net_tree.Net(c[0], c[1]), 1))
Root.finishTreeFirst()
# жесткое сжатие в размер 30000 записей
#Root.collapseRoot(Root.real_ip_records_count - 30000)
# более мягкое сжатие
Root.collapse(1,Root.real_ip_records_count)
# возвращаем результат
ipv4_list:str=Root.returnCollapsedTree('route {addr}/{masklen} blackhole;')
if ipv4_list:
# создаем дерево
Root = net_tree.Node(net_tree.Net(0, 0, 4))
# добавляем IPv4 подсети
for ip_int, mask in sorted(ipv4_list.values(), key=lambda x: x[0]):
Root.insert(net_tree.Net(ip_int, mask, 4))
# считаем статистику
Root.finalize()
# сжатие по CIDR, если ключ сжимать
if compress: Root.collapse()
# получаем результат
ipv4_list = Root.export('route {addr}/{masklen} blackhole;')
else:
ipv4_list:bool=False
# если ключ не сжимать
if ipv6_list and not compress:
ipv6_list:str="".join([f"route {k} blackhole;\n" for k, v in ipv6_list.items() if isinstance(v, list)])
# сжимаем подсети ipv6
elif ipv6_list and compress:
if ipv6_list:
# строим дерево
Root = net_tree.Node(net_tree.Net(1 << 127, 0), 0)
# пробегаем в цикле
for c in ipv6_list.values():
# добавляем запись в дерево
Root.addSubnet(net_tree.Node(net_tree.Net(c[0], c[1]), 1))
Root.finishTreeFirst()
# жесткое сжатие в размер 30000 записей
#Root.collapseRoot(Root.real_ip_records_count - 30000)
# более мягкое сжатие
Root.collapse(1,Root.real_ip_records_count)
# возвращаем результат
ipv6_list:str=Root.returnCollapsedTree('route {addr}/{masklen} blackhole;')
Root = net_tree.Node(net_tree.Net(1 << 127, 0, 6))
# добавляем IPv4 подсети
for ip_int, mask in sorted(ipv6_list.values(), key=lambda x: x[0]):
Root.insert(net_tree.Net(ip_int, mask, 6))
# считаем статистику
Root.finalize()
# сжатие по CIDR, если ключ сжимать
if compress: Root.collapse()
# получаем результат
ipv6_list = Root.export('route {addr}/{masklen} blackhole;')
else:
ipv6_list:bool=False
# возвращаем 2 списка маршрутов
return ipv4_list, ipv6_list
except Exception as e:
@@ -343,10 +332,10 @@ if __name__ == "__main__":
# проверяем, что временный файл конфигурации ipv4 не пустой, сохраняем в постоянный
if os.path.exists(ipv4_bird2_m4) and os.path.getsize(ipv4_bird2_m4) != 0:
os.replace(ipv4_bird2_m4, ipv4_bird2_m4.removesuffix(".tmp"))
os.system("systemctl reload bird.service")
#os.system("systemctl reload bird.service")
print(f"Новый файл конфигурации ipv4 применён")
# проверяем, что временный файл конфигурации ipv6 не пустой, сохраняем в постоянный
if os.path.exists(ipv6_bird2_m4) and os.path.getsize(ipv6_bird2_m4) != 0:
os.replace(ipv6_bird2_m4, ipv6_bird2_m4.removesuffix(".tmp"))
os.system("systemctl reload bird.service")
#os.system("systemctl reload bird.service")
print(f"Новый файл конфигурации ipv6 применён")