From a6af2b17b281e60e33ba98d302772ace5b5ddbac Mon Sep 17 00:00:00 2001 From: ayurishchev Date: Sun, 29 Mar 2026 08:50:15 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D1=8B=D0=B9=20=D0=BC=D0=BE?= =?UTF-8?q?=D0=B4=D1=83=D0=BB=D1=8C=20=D0=B4=D0=BB=D1=8F=20=D0=B2=D0=B7?= =?UTF-8?q?=D0=B0=D0=B8=D0=BC=D0=BE=D0=B4=D0=B5=D0=B9=D1=81=D1=82=D0=B2?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=81=20GoBGP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Позволяет объявить вычисленные CIDR в статических анонсах GoBGP --- gobgp_loader_cli.py | 57 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 gobgp_loader_cli.py diff --git a/gobgp_loader_cli.py b/gobgp_loader_cli.py new file mode 100644 index 0000000..e0fb3b1 --- /dev/null +++ b/gobgp_loader_cli.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python3 +import json +import subprocess +import logging +import ipaddress + +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') +logger = logging.getLogger(__name__) + +def load_prefixes_from_file(filepath: str) -> dict: + with open(filepath, 'r', encoding='utf-8') as f: + return json.load(f) + +def add_prefix_cli(prefix: str, asn: str) -> bool: + """Добавляет префикс через CLI gobgp""" + try: + # Команда: gobgp global rib add + cmd = ['gobgp', 'global', 'rib', 'add', prefix] + result = subprocess.run(cmd, capture_output=True, text=True, timeout=5) + + if result.returncode == 0: + logger.info(f"[ASN {asn}] Добавлен префикс: {prefix}") + return True + else: + logger.error(f"[ASN {asn}] Ошибка: {result.stderr}") + return False + except Exception as e: + logger.error(f"[ASN {asn}] Исключение: {str(e)}") + return False + +def main(): + import argparse + parser = argparse.ArgumentParser(description='Загрузка префиксов в GoBGP (CLI)') + parser.add_argument('file', help='Путь к JSON файлу') + parser.add_argument('--ipv6', action='store_true', help='Добавлять IPv6') + args = parser.parse_args() + + data = load_prefixes_from_file(args.file) + total_added = 0 + + for asn, info in data.items(): + for prefix in info.get('prefixes', []): + # Проверка версии IP + try: + net = ipaddress.ip_network(prefix, strict=False) + if net.version == 6 and not args.ipv6: + continue + except ValueError: + continue + + if add_prefix_cli(prefix, asn): + total_added += 1 + + logger.info(f"Готово. Добавлено префиксов: {total_added}") + +if __name__ == '__main__': + main()