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()