diff --git a/download.py b/download.py index 19e7595..04fa010 100755 --- a/download.py +++ b/download.py @@ -160,11 +160,6 @@ if __name__ == "__main__": print(f"Ошибка: {e}", file=sys.stderr) sys.exit(1) - # если передан аргумент(ы) запуска, - # значит пытаемся обновить только указанные списки - if len(sys.argv) > 1: - ip_list = {k: v for k, v in ip_list.items() if k in sys.argv[1:]} - # проверяем на пустой список выгрузки if (not ip_list): print(f"Список выгрузки пустой", file=sys.stderr) @@ -174,42 +169,53 @@ 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) - # создаём временный файл, перед выгрузкой - open(ipv4_out_file := f"{outdir}/bird2_v4.m4.tmp", "w").close() - open(ipv6_out_file := f"{outdir}/bird2_v6.m4.tmp", "w").close() + # создаём временный файл экспортируемой конфигурации, перед выгрузкой + open(ipv4_bird2_m4 := f"{outdir}/bird2_v4.m4.tmp", "w").close() + open(ipv6_bird2_m4 := f"{outdir}/bird2_v6.m4.tmp", "w").close() # обходим массив списков для выкрузки for clist in ip_list: - # выполняем выгрузку - print(f"Выгружаю список IP: {clist}") - ipv4_list, ipv6_list=list_ip(ip_list[clist]['list']) - # сохраняем ipv4 - if ipv4_list: - # собираем комьюнити маршрутов - bgp_community=str() - for c in str(ip_list[clist]['community']).split(","): - bgp_community+=f"bgp_community.add(({str(c).replace(':',',')})); " - # сохраняем в файл - with open(ipv4_out_file, "a") as file: - file.write(f"protocol static static_{clist.lower()} {{\n ipv4 {{ import filter {{ {bgp_community}accept; }}; }};\n{ipv4_list}}}\n") - print(f"Файл {ipv4_out_file} дополнен") - # сохраняем ipv6 - if ipv6_list: - # собираем комьюнити маршрутов - bgp_community=str() - for c in str(ip_list[clist]['community']).split(","): - bgp_community+=f"bgp_community.add(({str(c).replace(':',',')})); " - # сохраняем в файл - with open(ipv6_out_file, "a") as file: - file.write(f"protocol static static_{clist.lower()} {{\n ipv6 {{ import filter {{ {bgp_community}accept; }}; }};\n{ipv6_list}}}\n") - print(f"Файл {ipv6_out_file} дополнен") - print("") - # проверяем, что временный файл ipv4 не пустой, сохраняем в постоянный - if os.path.exists(ipv4_out_file) and os.path.getsize(ipv4_out_file) != 0: - os.replace(ipv4_out_file, ipv4_out_file.removesuffix(".tmp")) + # имена выходых файлов + ipv4_out_file=f"{outdir}/{clist.lower()}_v4.txt" + ipv6_out_file=f"{outdir}/{clist.lower()}_v6.txt" + # если передан аргумент(ы) запуска, + # значит пытаемся обновить только указанные списки + if len(sys.argv)==1 or clist in sys.argv[1:]: + print("") + # вычисляем кол-во записей прошлой выгрузки + ipv4_count_old = sum(1 for line in open(ipv4_out_file)) if os.path.isfile(ipv4_out_file) else 0 + ipv6_count_old = sum(1 for line in open(ipv6_out_file)) if os.path.isfile(ipv6_out_file) else 0 + # выполняем выгрузку + print(f"Выгружаю список IP: {clist}") + ipv4_list, ipv6_list=list_ip(ip_list[clist]['list']) + # сохраняем ipv4 + if ipv4_list and len(ipv4_list.splitlines()) >= ipv4_count_old * 0.5: + # сохраняем в файл + with open(ipv4_out_file, "w") as file: + file.write(ipv4_list) + print(f"Файл выгрузки {ipv4_out_file} сохранён") + # сохраняем ipv6 + if ipv6_list and len(ipv6_list.splitlines()) >= ipv6_count_old * 0.5: + # сохраняем в файл + with open(ipv6_out_file, "w") as file: + file.write(ipv6_list) + print(f"Файл выгрузки {ipv6_out_file} сохранён") + # собираем комьюнити маршрутов + bgp_community=str() + for c in str(ip_list[clist]['community']).split(","): + bgp_community+=f"bgp_community.add(({str(c).replace(':',',')})); " + # обновляем временный файл конфигурации ipv4 + with open(ipv4_bird2_m4, "a") as file: + file.write(f"protocol static static_{clist.lower()} {{\n ipv4 {{ import filter {{ {bgp_community}accept; }}; }}; include \"{ipv4_out_file}\"; }}\n") + # обновляем временный файл конфигурации ipv6 + with open(ipv6_bird2_m4, "a") as file: + file.write(f"protocol static static_{clist.lower()} {{\n ipv6 {{ import filter {{ {bgp_community}accept; }}; }}; include \"{ipv6_out_file}\"; }}\n") + # проверяем, что временный файл конфигурации 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") - print(f"Новый файл выгрузки ipv4 применён") - # проверяем, что временный файл ipv6 не пустой, сохраняем в постоянный - if os.path.exists(ipv6_out_file) and os.path.getsize(ipv6_out_file) != 0: - print(f"Новый файл выгрузки ipv6 применён") - os.replace(ipv6_out_file, ipv6_out_file.removesuffix(".tmp")) + 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") + print(f"Новый файл конфигурации ipv6 применён")